2011-09-11 27 views
6

Tôi cố gắng để viết một phương pháp:Objective-C Tìm những từ phổ biến nhất được sử dụng trong một NSString

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

nơi điển trở lại sẽ có những lời và mức độ thường xuyên được sử dụng trong chuỗi cung cấp. Thật không may, tôi dường như không thể tìm cách lặp lại thông qua các từ trong một chuỗi để phân tích từng từ - chỉ mỗi ký tự có vẻ như hoạt động nhiều hơn một chút so với cần thiết. Bất kỳ đề xuất?

+2

Hãy nhớ rằng điều này có thể là một chút công việc hơn bạn đoán nếu bạn muốn nó là bất cứ điều gì nhưng vô cùng đơn giản. Dấu gạch ngang có đánh dấu sự kết thúc của các từ không? Emdashes? Còn the Nhật thì sao? – Chuck

Trả lời

8

NSString có -enumerateSubstringsInRange: phương pháp cho phép liệt kê tất cả các từ trực tiếp, cho phép api tiêu chuẩn để làm tất cả những thứ cần thiết để xác định ranh giới từ vv:

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

Trong khối liệt kê bạn có thể sử dụng một trong hai NSDictionary với các từ như phím và NSNumber là số lượng của chúng hoặc sử dụng NSCountedSet cung cấp chức năng cần thiết cho số lượng.

2

Tách chuỗi thành một mảng từ bằng cách sử dụng -[NSString componentsSeparatedByCharactersInSet:] trước tiên. (Sử dụng [[NSCharacterSet letterCharacterSet] invertedSet] làm đối số để phân chia tất cả các ký tự không phải chữ cái.)

+0

Sau đó, chỉ cần sử dụng các từ (phần tử) trong mảng làm khóa và NSNumber làm giá trị cho từ điển của bạn. Điều này đơn giản hóa công việc của bạn so sánh các chuỗi - NSDictionary sau đó sẽ làm điều này cho bạn. – FeifanZ

3

Bạn có thể sử dụng componentsSeparatedByCharactersInSet: để chia chuỗi và NSCountedSet sẽ đếm từ cho bạn.

1) Tách chuỗi thành chữ sử dụng một sự kết hợp của các dấu chấm câu, khoảng trắng và ký tự dòng mới đặt:

NSMutableCharacterSet *separators = [NSMutableCharacterSet punctuationCharacterSet]; 
[separators formUnionWithCharacterSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]]; 

NSArray *words = [myString componentsSeparatedByCharactersInSet:separators]; 

2) Đếm lần xuất hiện của từ (nếu bạn muốn bỏ qua viết hoa, bạn có thể làm NSString *myString = [originalString lowercaseString]; trước khi tách chuỗi thành các thành phần):

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

Nếu bạn sẵn sàng để thay đổi phương pháp chữ ký của bạn, bạn chỉ có thể trở lại tập tính.

0

Tôi đã sử dụng cách tiếp cận sau đây để nhận được từ phổ biến nhất từ ​​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" là chuỗi của tôi mà từ đó tôi phải nhận được nhiều từ thông dụng nhất. Đối tượng tại chỉ mục thứ 0 của mảng "sortedArrayOfWord" sẽ là từ phổ biến nhất.

Các vấn đề liên quan