Détecter la langue de NSString

Quelqu'un m'a parlé d'un cours de reconnaissance linguistique dans Cocoa. Quelqu'un sait qui c'est?

C'est pas travailler:

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

Le résultat est 'fr', mais devrait être 'de'.

38
demandé sur rmaddy 2011-06-13 02:19:09

5 réponses

Il y a une API dans cocoa disponible pour vérifier le langage d'une chaîne, et il est toujours préférable d'utiliser Foundation sur CoreFoundation chaque fois que possible.

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

Sinon, si vous avez un texte en langue mixte, vous pouvez utiliser l'API enumerateLinguisticTagsInRange pour obtenir la langue de chaque mot dans le texte.

42
répondu Jennifer 2012-12-09 01:35:59

C'est le résultat:

- (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
répondu Andreas Prang 2016-01-06 11:56:52

, Vous pouvez utiliser -requestCheckingOfString:… à la place. NSTextCheckingTypeOrthography tente d'identifier la langue utilisée dans la chaîne, et le gestionnaire d'achèvement reçoit un paramètre NSOrthography qui peut être utilisé pour obtenir des informations sur l'orthographe dans la chaîne, y compris sa langue dominante.

L'exemple suivant génère 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
répondu 2011-06-12 22:44:09

Une extension de Chaîne swift pour la réponse de 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)
    }
}

Utilisation:

let language = "What language is this?".language()
6
répondu Simon 2016-04-26 19:38:25

, Comme d'iOS 11, vous pouvez utiliser le dominantLanguage(for:)/dominantLanguageForString: méthode de la classe de NSLinguisticTagger.

Swift:

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

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

Objectif-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);

Sortie (pour les deux):

Fr
es

0
répondu rmaddy 2018-07-31 01:06:48