如何计算字符串中的句子数?

时间:2014-09-06 16:26:35

标签: c++

我正在编写一个计算字符串中句子数量的程序。 我算了'。'的数量。 '?' '!'。但是,有博士夫人。博士.....情况。有什么帮助吗?

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;

2 个答案:

答案 0 :(得分:5)

你无法做到。您需要一个完整的自然语言解析器才能准确处理它。

丢弃您提及的字词不会解决问题。考虑:

  

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

     

那位博士给我留下了深刻的印象。詹姆斯于2001年获奖。

只有你对英语语义的理解才能告诉你第一个是一个句子而第二个是两个句子。但是,如果不考虑单词的含义,你就无法区分它们。您试图在纯粹的语法层面解决问题,但文本中没有足够的信息而不考虑语义。

最好的近似可能就是说,每当你得到一个&#34;。#34;,&#34;!&#34;或&#34;?&#34;下一个单词以大写字母开头。但这仍然只是大致正确。它会使第一个例子错误,第二个错误。

答案 1 :(得分: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.");