Wykrywanie języka NSString

Ktoś mi powiedział o zajęciach z rozpoznawania języka w kakao. Czy ktoś wie,który to?

To jest nie działa:

NSSpellChecker *spellChecker = [NSSpellChecker sharedSpellChecker];
[spellChecker setAutomaticallyIdentifiesLanguages:YES];
NSString *spellCheckText = @"Guten Tag Herr Mustermann. Dies ist ein deutscher Text. Bitte löschen Sie diesen nicht.";
[spellChecker checkSpellingOfString:spellCheckText startingAt:0];
NSLog(@"%@", [spellChecker language]);

Wynikiem jest 'en', ale powinno być 'de'.

Author: rmaddy, 2011-06-13

5 answers

W cocoa dostępne jest API do sprawdzania języka łańcucha znaków i zawsze najlepiej jest używać Foundation zamiast CoreFoundation, gdy tylko jest to możliwe.

NSArray *tagschemes = [NSArray arrayWithObjects:NSLinguisticTagSchemeLanguage, nil];
NSLinguisticTagger *tagger = [[NSLinguisticTagger alloc] initWithTagSchemes:tagschemes options:0];
[tagger setString:@"Das ist ein bisschen deutscher Text. Bitte löschen Sie diesen nicht."];
NSString *language = [tagger tagAtIndex:0 scheme:NSLinguisticTagSchemeLanguage tokenRange:NULL sentenceRange:NULL];

Alternatywnie, jeśli masz tekst w języku mieszanym, możesz użyć interfejsu API enumerateLinguisticTagsInRange, aby uzyskać język każdego słowa w tekście.

 42
Author: Jennifer,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-12-09 01:35:59

Wynik:

- (NSString *)languageForString:(NSString *) text{

     if (text.length < 100) {
         return (NSString *) CFStringTokenizerCopyBestStringLanguage((CFStringRef)text, CFRangeMake(0, text.length));
     } else {
         return (NSString *)CFStringTokenizerCopyBestStringLanguage((CFStringRef)text, CFRangeMake(0, 100));
     }
}
 13
Author: Andreas Prang,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-01-06 11:56:52

Możesz zamiast tego użyć -requestCheckingOfString:…. NSTextCheckingTypeOrthography próbuje zidentyfikować język używany w łańcuchu, a obsługa dopełnienia otrzymuje parametr NSOrthography, który może być użyty do uzyskania informacji o ortografii w łańcuchu, w tym jego języku dominującym.

Następujący przykład wyjścia dominant language = de:

NSSpellChecker *spellChecker = [NSSpellChecker sharedSpellChecker];
[spellChecker setAutomaticallyIdentifiesLanguages:YES];
NSString *spellCheckText = @"Guten Herr Mustermann. Dies ist ein deutscher Text. Bitte löschen Sie diesen nicht.";

[spellChecker requestCheckingOfString:spellCheckText
    range:(NSRange){0, [spellCheckText length]}
    types:NSTextCheckingTypeOrthography
    options:nil
    inSpellDocumentWithTag:0
    completionHandler:^(NSInteger sequenceNumber, NSArray *results, NSOrthography *orthography, NSInteger wordCount) {
        NSLog(@"dominant language = %@", orthography.dominantLanguage);
}];
 8
Author: ,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-06-12 22:44:09

Szybkie rozszerzenie ciągu Dla odpowiedzi Jennifer:

extension String {
    func language() -> String? {
        let tagger = NSLinguisticTagger(tagSchemes: [NSLinguisticTagSchemeLanguage], options: 0)
        tagger.string = self
        return tagger.tagAtIndex(0, scheme: NSLinguisticTagSchemeLanguage, tokenRange: nil, sentenceRange: nil)
    }
}

Użycie:

let language = "What language is this?".language()
 6
Author: Simon,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-04-26 19:38:25

Od iOS 11 możesz użyć dominantLanguage(for:)/dominantLanguageForString: metoda klasy NSLinguisticTagger.

Swift:

extension String {
    var language: String? {
        return NSLinguisticTagger.dominantLanguage(for: self)
    }
}

print("Good morning".language)
print("Buenos días".language)

Objective-C:

@interface NSString (Tagger)

@property (nonatomic, readonly, nullable) NSString *language;
@end

@implementation NSString (Tagger)

- (NSString *)language {
    return [NSLinguisticTagger dominantLanguageForString:self];
}

@end

NSLog(@"%@", @"Good morning".language);
NSLog(@"%@", @"Buenos días".language);

Wyjście (dla obu):

En
es

 0
Author: rmaddy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-07-31 01:06:48