Jos*_*hua 8 cocoa nlp linguistics objective-c ios
我一直在使用NSLinguisticTagger句子,并且遇到了一个奇怪的问题,例如"我饿了"或"我喝醉了".虽然人们会期望'我'被标记为代词,'是'作为动词而'饥饿'作为形容词,但他们不是.相反,它们都被标记为OtherWord.
有什么我做错了吗?
NSString *input = @"I am hungry";
NSLinguisticTaggerOptions options = NSLinguisticTaggerOmitWhitespace;
NSLinguisticTagger *tagger = [[NSLinguisticTagger alloc] initWithTagSchemes:[NSLinguisticTagger availableTagSchemesForLanguage:@"en"] options:options];
tagger.string = input;
[tagger enumerateTagsInRange:NSMakeRange(0, input.length) scheme:NSLinguisticTagSchemeNameTypeOrLexicalClass options:options usingBlock:^(NSString *tag, NSRange tokenRange, NSRange sentenceRange, BOOL *stop) {
NSString *token = [input substringWithRange:tokenRange];
NSString *lemma = [tagger tagAtIndex:tokenRange.location
scheme:NSLinguisticTagSchemeLemma
tokenRange: NULL
sentenceRange:NULL];
NSLog(@"%@ (%@) : %@\n", token, lemma, tag);
}];
Run Code Online (Sandbox Code Playgroud)
输出是:
I ((null)) : OtherWord
am ((null)) : OtherWord
hungry ((null)) : OtherWord
Run Code Online (Sandbox Code Playgroud)
luk*_*302 11
经过一段时间的聊天,我们发现了这个问题:
该句子没有足够的信息来确定其语言.
要解决此问题,您可以:
在你的实际句子之后用你选择的语言添加一个演示句.这应该可以保证您的首选语言被检测到.
要么
告诉标记器使用哪种语言:添加行
[tagger setOrthography:[NSOrthography orthographyWithDominantScript:@"Latn" languageMap:@{@"Latn" : @[@"en"]}] range:NSMakeRange(0, input.length)];
Run Code Online (Sandbox Code Playgroud)
在enumerate通话之前.通过这种方式,您可以明确地告诉标记器您希望文本使用哪种语言,在这种情况下,englisch(en)作为拉丁主导语言(Latn)的一部分.
如果你不确定这种语言,那么如果单词被标记为OtherWord无法检测到语言,那么将这两种方法中的任何一种方法用作后备可能是有用的.