我一直在使用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); }];
输出是:
I ((null)) : OtherWord am ((null)) : OtherWord hungry ((null)) : OtherWord
解决方法
quite some time in chat之后我们发现了这个问题:
The sentence does not contain enough information to determine its language.
要解决此问题,您可以:
在你的实际句子之后用你选择的语言添加一个演示句.这应该保证您的首选语言被检测到.
要么
[tagger setOrthography:[NSOrthography orthographyWithDominantScript:@"Latn" languageMap:@{@"Latn" : @[@"en"]}] range:NSMakeRange(0,input.length)];
在枚举调用之前.通过这种方式,您可以明确告诉标记器您希望文本使用哪种语言,在本例中,englisch(en)是拉丁语主导语言(Latn)的一部分.
如果您不确定该语言,那么如果将单词标记为OtherWord意味着无法检测到该语言,那么将这些方法中的任何一种仅用作后备可能是有用的.