我刚开始使用NSLinguisticTagger
在我的博客上发布我的代码:NSLinguisticTagger @ NSHipster.com
NSLinguisticTaggerOptions options = NSLinguisticTaggerOmitWhitespace | NSLinguisticTaggerOmitPunctuation | NSLinguisticTaggerJoinNames;
NSLinguisticTagger *tagger = [[NSLinguisticTagger alloc] initWithTagSchemes: [NSLinguisticTagger availableTagSchemesForLanguage:@"en"] options:options];
tagger.string = question;
[tagger enumerateTagsInRange:NSMakeRange(0, [question length]) scheme:NSLinguisticTagSchemeNameTypeOrLexicalClass options:options usingBlock:^(NSString *tag, NSRange tokenRange, NSRange sentenceRange, BOOL *stop) {
NSString *token = [question substringWithRange:tokenRange];
NSLog(@"%@: %@", token, tag); }];
当我使用question = @"Weekend in New York"
运行时,"New York"
会被标记为PlaceName
,这很棒。但是当我使用question = @"Weekend in new york"
运行时,"new"
被标记为"Adjective"
而"york"
被标记为PlaceName
。有没有办法解决这个问题,"New York"
和"new york"
都被标记为PlaceName
?
我对这种语言学事物完全陌生。
答案 0 :(得分:3)
进一步讨论这个话题。 NSLinguisticTagger识别名称需要正确的名字和姓氏大写。
经过几个小时的挫折后,我决定用大写,小写和大写单词创建各种测试。
NSLinguisticTagger几乎在所有测试中都有不同的结果
当NSLinguisticTagger以大写字母大小分析字符串时,几乎所有名词都被标记为personalName 。跆拳道?
非常令人沮丧。
我要分享的教训是,NSLinguistic标记器可以猜测它放在单词上的标签,但最后它只是对单词的语法评估。评估取决于正确的语言结构,例如单词放置以及单词是否大写。
我仍然认为这是一个有用的课程,但这篇文章的寓意是“Be Proper”。
在解析文本时,有时我们程序员倾向于使用大写和小写来简化我们的工作。我们仍然可以这样做,但请记住,单词大小写会改变NSLinguisticTagger结果。
答案 1 :(得分:2)
评论中已经提到过这一点,但无论如何都想指出这一点。 NSLinguisticTagger认为“纽约”和“纽约”是不同的 - 因为它们是。首都N告诉它它是一个专有名词。据我所知,NSLinguisticTagger中没有任何内容可以改变这种行为。
但是,您可以做的是依靠iOS自动更正。只需确保输入值的文本字段已启用自动更正,并且应自动将“new york”更正为“纽约”,以及类似的事件。如果自动更正没有捕获到这一点,那么我会尝试找一些其他库进行语言分析。
追溯自动更正已经包含在iOS中(在某种程度上),因此应该足以将“纽约”更正为“纽约”。如果你想纠正整个句子(即“纽约周末”到“纽约周末”),你需要自己实现这个功能。这应该不是非常困难,因为您必须遵循一些简单的语法规则,并且许多事情将通过自动更正来获取。
希望这有帮助,如果您需要更多信息,请与我们联系。