2011-09-11 21 views
6

我試圖寫一個方法:Objective-C中找到最常用的詞在一個NSString

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

在字典返回將有字以及多久,他們提供的字符串中使用。不幸的是,我似乎無法找到一種方法來遍歷字符串中的單詞來分析每一個字符 - 只有每個字符看起來有點不必要。有什麼建議麼?

+2

請記住,這可能比您猜測的要多一點工作,如果您想讓它變得非常簡單而又非常簡單。連字符是否標記了單詞的結尾? Emdashes?那麼日本人呢? – Chuck

回答

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爲計數提供所需的功能。

2

首先使用-[NSString componentsSeparatedByCharactersInSet:]將字符串拆分爲單詞數組。 (使用[[NSCharacterSet letterCharacterSet] invertedSet]作爲參數來分割所有非字母字符。)

+0

然後,只需使用數組中的單詞(元素)作爲鍵,並使用NSNumber作爲字典的值。這簡化了比較字符串的工作 - NSDictionary將爲你做這件事。 – FeifanZ

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"]); 

如果你願意改變你的方法簽名,你可以只返回計數集。

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」將是最常用的單詞。