統計文章中單詞出現的次數

      最近看到一本好書《C++ Cookbook》,不是C++語言入門教程,是一本關於c++程序設計日常問題的珍貴解決方案。裏面的收集了大量C++比較現實的問題解決方案,如數字計算、日期和時間、字符串和文本操作、多線程和數學編程等等,並且還介紹了Boost庫(裏面有些問題解決也是用這個庫)。裏面講的問題都比較實際,代碼實現也很規範,不過也有些問題偏簡單,在之前學習語言就知道了。

 

 

 

     舉其中的一個例子,如果要統計文章中單詞的次數問題,書中是用STL庫中的map來實現的,感覺寫的比較簡潔,自己修改了一下代碼如下:

     解決方案

//統計文本文件中每個單詞的出現次數

#include <iostream>
#include <map>
#include <string>
#include <fstream>
using namespace std;

typedef map<string,int> StrIntMap;

void CountWords(istream& in, StrIntMap& words)
{
string s;
while(in >> s )
{
   ++words[s];
}
}

int main()
{
ifstream in("in.txt");
StrIntMap w;

CountWords(in, w);

for(StrIntMap::iterator p = w.begin(); p != w.end(); ++p)
{
   cout << p->first << " occured " << p->second << " times." <<endl;
}
   return 0;
}

     問題存在:

      但是這個解決方案也存在問題,就是沒對單詞進行判斷,如文件中有“I love this game.” , 程序運行結果是 “game.” 算一次,單詞後面的句號也被當成單詞的一部分。後來網上查看了些相關資料,大多是用hash table來實現,但也有些問題出現。
例如符號問題: "Jack's book." 中 的 Jack's 算是單詞嗎?我覺得Jack 纔算?。
例如語法問題(詞的變化形式,包括複數、不規則、過去分詞、現在分詞、比較級和最高級):“It's getting warmer.” 中 It's 算是單詞嗎? 我覺得是 It 和 is;還有getting 和 warmer 應該算進 原形的 get 和 warm 中呢還是 另外算。
網上很多資料都是不把語法問題考慮進去,而符號問題是把符號當成空格處理(Jack's 就會有 Jack:1次, s: 1次)。不過有個國內軟件“英語詞頻統計2.7”,好像有解決語法問題。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章