如何计算文本字符串中的单词?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何计算文本字符串中的单词?相关的知识,希望对你有一定的参考价值。

ios上,如何计算特定文本字符串中的单词?

答案

比分割更有效的方法是逐字符检查字符串。

int word_count(NSString* s) {
  CFCharacterSetRef alpha = CFCharacterSetGetPredefined(kCFCharacterSetAlphaNumeric);
  CFStringInlineBuffer buf;
  CFIndex len = CFStringGetLength((CFStringRef)s);
  CFStringInitInlineBuffer((CFStringRef)s, &buf, CFRangeMake(0, len));
  UniChar c;
  CFIndex i = 0;
  int word_count = 0;
  Boolean was_alpha = false, is_alpha;
  while (c = CFStringGetCharacterFromInlineBuffer(&buf, i++)) {
    is_alpha = CFCharacterSetIsCharacterMember(alpha, c);
    if (!is_alpha && was_alpha)
      ++ word_count;
    was_alpha = is_alpha;
  }
  if (is_alpha)
    ++ word_count;
  return word_count;
}

@ennuikiller's solution相比,计算一个1,000,000字的字符串需要:

  • 0.19秒构建字符串
  • 使用我的方法构建字符串+计数0.39秒。
  • 1.34秒使用ennuikiller的方法构建字符串+计数。

我的方法的最大缺点是它不是一个单行。

另一答案
 [[stringToCOunt componentsSeparatedByCharactersInSet: [NSCharacterSet whitespaceCharacterSet] count]
另一答案

我认为这种方法更好:

__block int wordCount = 0;
NSRange range = {0,self.text.length };
[self.text enumerateSubstringsInRange:range options:NSStringEnumerationByWords usingBlock:^(NSString *substring, NSRange substringRange, NSRange enclosingRange, BOOL *stop) {
    wordCount++;
}];

作为参考,请查看WWDC 2012会话215的视频:Douglas Davidson撰写的文本和语言分析

另一答案

单线精确解决方案:

return [[self componentsSeparatedByCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]] filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"length > 0"]].count;

以上是关于如何计算文本字符串中的单词?的主要内容,如果未能解决你的问题,请参考以下文章

如何通过C#中的特定片段从句子中提取整个单词?

查询以计算单词 SQLite 3

如何提取 MySQL 字符串中的第 n 个单词并计算单词出现次数?

C语言一个简单的问题:输入一段文本,计算其中每个单词的出现频率:下面是代码

如何使循环计算更快

如何使用 C++ 计算字符串中的某个单词