我正在尝试编写方法:
- (NSDictionary *)wordFrequencyFromString:(NSString *)string {}
返回的字典将包含单词以及它们在提供的字符串中使用的频率。不幸的是,我似乎无法找到一种方法来迭代字符串中的单词来分析每一个字符 - 只有每个字符似乎比必要的工作更多。有什么建议吗?
答案 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"将是最常见的词。