Objective-C: NSLinguisticTagger "new york" vs "New York"



我刚刚开始玩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

我对语言学完全陌生。

进一步讨论这个主题NSLinguisticTagger需要正确的名字和姓氏大写来识别姓名。

经过几个小时的沮丧,我决定用大写、小写和大写的大小写单词创建各种测试。

NSLinguisticTagger在几乎所有的测试中都有不同的结果

当NSLinguisticTagger解析大写字符串时,几乎所有名词都被标记为personalName。wtf?

这非常令人沮丧。

我想分享的教训是,NSLanguage标记者可以猜测它在单词上放置的标记,但最终它只是对单词的语法评估。评估取决于适当的语言结构,如单词的位置以及单词是否大写。

我仍然觉得这是一门有用的课程,但这篇文章的寓意是"得体"。

在解析文本时,有时我们程序员倾向于使用大写和小写来简化我们的工作。我们仍然可以这样做,但请记住,单词大小写确实会改变NSLinguisticTagger的结果

这已经在评论中提到了,但无论如何都想指出这一点。NSLinguisticTagger认为"纽约"one_answers"纽约"是不同的,因为它们是不同的。大写N告诉它是一个专有名词。据我所知,NSLinguisticTagger中没有任何内容可以改变这种行为。

但是,您可以依靠iOS自动更正。只需确保输入值的文本字段已启用自动更正,并且应自动将"new york"更正为"new york",以及类似的情况。如果自动更正没有捕捉到这一点,那么我会尝试寻找其他的语言分析库。

追溯自动更正已经包含在iOS中(在一定程度上),所以这应该足以将"纽约"更正为"纽约"。如果你想纠正整句话(即"weekend in new york"到"weekend in new york"),你需要自己实现这个功能。这应该不是很难,因为你只需要遵循一些简单的语法规则,而且很多东西都会被自动更正。

希望这能有所帮助,如果你需要更多信息,请告诉我。

最新更新