Objective-C 查找 NSString 中最常用的词

Posted

技术标签:

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

我正在尝试写一个方法:

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

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

【问题讨论】:

请记住,如果您希望它变得非常简单,那么这可能比您想象的要多一些工作。连字符是否标记单词的结尾?破折号?日本的は呢? 【参考方案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 个索引处的对象将是最常见的单词。

【讨论】:

以上是关于Objective-C 查找 NSString 中最常用的词的主要内容,如果未能解决你的问题,请参考以下文章

Objective-C 中的空字符

Objective-C 中的 NSString 标记化

objective-c 中数据类型之二 字符串(NSString)

NSURL为null,而在Objective-C中NSString是正确的

正确填充 NSString 的 Objective-c 代码?

在objective-c中从“JSON-style” NSString中获取正确的值