2014-09-06 72 views
-2

我正在寫一個程序來計算字符串中的句子數。 我計算'。'的數量。 '?' '!'。不過,有博士夫人。博士.....情況。請幫忙嗎?如何統計字符串中的句子數?

int number_of_sentences = 0; 
    for(unsigned int i=0; i <= text.length()-1; i++){ 
    if(text[i] == '.' || text[i] == '?' ||text[i] == '!'){ 
     ++number_of_sentences; 
    } 
    } 
    return number_of_sentences; 
+0

爲這些詞添加例外。完成。 – usr2564301 2014-09-06 16:30:18

+0

我需要閱讀的文字很長,這些文字只是一個例子。文中有一些縮寫,我不能在這裏列出。 – 2014-09-06 16:35:11

+0

「請幫忙嗎?」並不是一個簡潔的問題。這不是一對結對的編程服務。 – 2014-09-06 18:07:22

回答

5

你不能這樣做。您需要一個完整的自然語言解析器來處理它,並且準確無誤。

丟棄您提到的詞語並不能解決問題。考慮:

我對這位博士留下了深刻的印象。詹姆斯被授予。

我對這個博士印象深刻。詹姆斯在2001年被授予它。

只有你對英語語義的理解告訴你,第一個是一個句子,第二個是兩個句子。但是,如果不考慮單詞的含義,您將無法分辨差異。你試圖在純粹的句法層面上解決問題,但是沒有考慮到語義,文本中沒有足夠的信息。

最好的近似值可能是說,當你得到一個「。」,「!」時你會得到一個新的句子。要麼 」?」下一個字以大寫字母開頭。但這仍然只是大致正確的。它會讓這些例子中的第一個錯誤,第二個錯誤。

+0

它也會在大多數堆棧溢出問題上失敗。 – 2014-09-06 18:08:09

0

提示。你爲什麼不把字符串拆分成令牌?然後,每次有夫人,先生等詞語倒數倒數。

或用空格替換特殊詞,然後計算沒有問題。

std::string RemoveWords(const std::string& source, const std::string& chars) { 
    std::string result=""; 
    for (unsigned int i=0; i<source.length(); i++) { 
     bool foundany=false; 
     for (unsigned int j=0; j<chars.length() && !foundany; j++) { 
     foundany=(source[i]==chars[j]); 
     } 
     if (!foundany) { 
     result+=source[i]; 
     } 
    } 
    return result; 
} 

int number_of_sentences = 0; 
text = RemoveWords(text); 
for(unsigned int i=0; i <= text.length()-1; i++){ 
    if(text[i] == '.' || text[i] == '?' ||text[i] == '!'){ 
    ++number_of_sentences; 
    } 
} 
return number_of_sentences; 

將上述溶液將省略在第二個參數字符串傳遞的每個字符。例如:

std::string result=RemoveWords("Mrs. Rease will play to football. ByeBye", "Mrs."); 
+0

沒錯。但它並不完整! – 2014-09-06 17:00:02

+0

作爲未來職位的提示:您不必發佈不完整的答案或問題來保存他們_。草稿版本由系統自動保存。 – 2014-09-06 17:02:39

+0

好的,謝謝你! – 2014-09-07 10:46:04