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

     在前篇文章中提出的問題,後來在那本經典教程《C++ Primer》的第六章裏有相關的解決方案。雖然之前早聞這是本好書,並下載了電子版,比較隨意的看了幾個章節,沒完全看完,畢竟是本很厚的書,借這次機會認真的看了第六章,感覺真的寫的不錯,即使不是初學者,一樣有很多地方值得體會。代碼寫的很優美,讀着就是種享受,作者的思維很周密。作者也在文中寫到:“後綴問題很難完全解決,但是完美的實現會顯著改善我們查詢單詞集合的質量和大小”,他說的後綴問題就是我上次說的語法問題。下面就是相關的解決方法:

       符號問題的處理:

void filtrate_word(string& word)//處理字符串中的標點符號
{
static string filter( "/",.;:!?)(
///" );//要過濾的標點符號集,也可以自己加如其他的符號
string::size_type pos = 0;

// 對於找到的符合過濾的符號, 將其刪除
while (( pos = word.find_first_of( filter, pos )) != string::npos )
{
   word.erase(pos,1);
}
}

   順便把單詞中的大小寫也統一一下,很簡單:

void strip_cap( string& word)//將單詞中的大寫字母轉化成小寫字母
{
static string caps( "ABCDEFGHIJKLMNOPQRSTUVWXYZ" );
string::size_type pos = 0;

while (( pos = word.find_first_of( caps, pos )) != string::npos )
{
   word[ pos ] = tolower( word[pos] );
}
}

    兩處處理都用到string類的函數find_first_of(),有幾個重載,它是查找與被搜索字符串中任意一個字符相匹配的第一次出現,並返回它的索引位置。

      語法問題的處理,書中是分成幾類來處理,處理分s、ed、ly、ing等後綴處理,如可以定義成suffix_s();suffix_ed(); suffix_ly; suffix_ing()等函數,而s的後綴有幾種情況來處理,如果單詞以ies 結尾如babies 和cries 則我們需要用y 代替ies。

void suffix_s(string& word)//後綴s的處理
{
string::size_type pos3 = word.size()-3;
string ies( "ies" );
if ( ! word.compare( pos3, 3, ies ))
   word.replace( pos3, 3, 1, 'y' );

//其他情況處理
}

void suffix_word(string& word )//後綴的處理比如ed ing ly 等
{
//後綴s的處理
if ( word[ word.size ()-1 ] == 's' )
   suffix_s( word );
// 其他處理
}

   感覺這樣處理後綴,容易考慮不周全,會考慮不到一些特殊情況,作者也是這樣認爲。如果要有比較好的效果估計要寫很多的後綴處理函數。

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