【问题标题】:Objective-C Find the most commonly used words in an NSStringObjective-C 查找 NSString 中最常用的词
【发布时间】:2011-09-11 19:31:48
【问题描述】:

我正在尝试写一个方法:

- (NSDictionary *)wordFrequencyFromString:(NSString *)string {}

返回的字典将包含单词以及它们在提供的字符串中的使用频率。不幸的是,我似乎无法找到一种方法来遍历字符串中的单词来分析每个单词 - 只有每个字符看起来比必要的工作多一点。有什么建议吗?

【问题讨论】:

  • 请记住,如果您希望它变得非常简单,那么这可能比您想象的要多一些工作。连字符是否标记单词的结尾?破折号?日本的は呢?

标签: objective-c nsstring nsdictionary


【解决方案1】:

NSString 有-enumerateSubstringsInRange: 方法,允许直接枚举所有单词,让标准api 做所有必要的事情来定义单词边界等:

[s enumerateSubstringsInRange:NSMakeRange(0, [s length])
                      options:NSStringEnumerationByWords
                   usingBlock:^(NSString *substring, NSRange substringRange, NSRange enclosingRange, BOOL *stop) {
                       NSLog(@"%@", substring);
                   }];

在枚举块中,您可以使用 NSDictionary,将单词作为键,将 NSNumber 作为计数,或者使用为计数提供所需功能的NSCountedSet

【讨论】:

    【解决方案2】:

    您可以使用componentsSeparatedByCharactersInSet: 拆分字符串,NSCountedSet 将为您计算字数。

    1) 使用标点符号、空格和换行符的组合将字符串拆分为单词:

    NSMutableCharacterSet *separators = [NSMutableCharacterSet punctuationCharacterSet];
    [separators formUnionWithCharacterSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];
    
    NSArray *words = [myString componentsSeparatedByCharactersInSet:separators];
    

    2) 统计单词的出现次数(如果要忽略大小写,可以在将字符串拆分为组件之前执行NSString *myString = [originalString lowercaseString];):

    NSCountedSet *frequencies = [NSCountedSet setWithArray:words];
    NSUInteger aWordCount = [frequencies countForObject:@"word"]);
    

    如果你愿意改变你的方法签名,你可以只返回计数集。

    【讨论】:

      【解决方案3】:

      首先使用-[NSString componentsSeparatedByCharactersInSet:] 将字符串拆分为单词数组。 (使用[[NSCharacterSet letterCharacterSet] invertedSet] 作为参数来分割所有非字母字符。)

      【讨论】:

      • 然后,只需使用数组中的单词(元素)作为键,使用 NSNumber 作为字典的值。这简化了您比较字符串的工作——NSDictionary 将为您完成这项工作。
      【解决方案4】:

      我使用以下方法从 NSString 中获取最常用的单词。

      -(void)countMostFrequentWordInSpeech:(NSString*)speechString
      {
          NSString     *string     = speechString;
          NSCountedSet *countedSet = [NSCountedSet new];
          [string enumerateSubstringsInRange:NSMakeRange(0, [string length])
                                     options:NSStringEnumerationByWords | NSStringEnumerationLocalized
                                  usingBlock:^(NSString *substring, NSRange substringRange, NSRange enclosingRange, BOOL *stop){
      
                                          [countedSet addObject:substring];
                                  }];
          // NSLog(@"%@", countedSet);
          //Sort CountedSet & get most  frequent common word at 0th index of resultant array
          NSMutableArray *dictArray = [NSMutableArray array];
          [countedSet enumerateObjectsUsingBlock:^(id obj, BOOL *stop) {
              [dictArray addObject:@{@"object": obj,
                                     @"count": @([countedSet countForObject:obj])}];
          }];
      
          NSArray *sortedArrayOfWord= [dictArray sortedArrayUsingDescriptors:@[[NSSortDescriptor sortDescriptorWithKey:@"count" ascending:NO]]];
          if (sortedArrayOfWord.count>0)
          {
              self.mostFrequentWordLabel.text=[NSString stringWithFormat:@"Frequent Word: %@", [[sortedArrayOfWord[0] valueForKey:@"object"] capitalizedString]];
          }
      }
      

      "speechString" 是我的字符串,我必须从中获取最常用/最常用的单词。数组“sortedArrayOfWord”的第 0 个索引处的对象将是最常见的单词。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-09-27
        • 1970-01-01
        • 1970-01-01
        • 2010-10-28
        • 2017-10-13
        • 2011-03-12
        相关资源
        最近更新 更多