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

时间:2011-09-11 19:31:48

标签: objective-c nsstring nsdictionary

我正在尝试编写方法:

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

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

4 个答案:

答案 0 :(得分:8)

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

答案 1 :(得分:3)

您可以使用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"]);

如果您愿意更改方法签名,则只需返回计数集即可。

答案 2 :(得分:2)

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

答案 3 :(得分:0)

我使用以下方法从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"是我的字符串,我必须从中得到最频繁/常用的单词。对象在数组的第0个索引" sortedArrayOfWord"将是最常见的词。