Objective-C:NSLinguisticTagger“纽约”vs“纽约”

我刚刚开始玩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识别名字的要求

经过几个小时的挫折之后 ,我决定用大写,小写和大写字母来创build各种testing。

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

当NSLinguisticTagger在大写的情况下parsing一个string时,几乎所有的名词都被标记为personalName 。 跆拳道?

这是非常令人沮丧的。

我想分享的一个教训是,NSLinguistic标记器可以猜测它放在单词上的标签,但最后它只是对单词的语法评估。 评估依赖于适当的语言结构,如单词的放置和单词是否大写。

我仍然认为这是一个有用的课程,但这篇文章的道德是“适当”

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

这在评论中已经提到过,但是也想指出这一点。 NSLinguisticTagger认为“纽约”和“纽约”是不同的 – 因为它们是。 大写字母N表示它是一个专有名词。 据我所知,NSLinguisticTagger中没有任何东西可以改变这种行为。

但是,你可以做的是依靠iOS自动更正。 只要确保input值的文本字段已经启用了自动更正,它应该自动将“纽约”更正为“纽约”,以及类似的情况。 如果自动更正没有抓住这一点,那么我会试图find一些其他库进行语言分析。

追溯自动更正已经包含在iOS中(在某种程度上),所以应该足以将“纽约”改正为“纽约”。 如果你想改正整个句子(即“纽约周末”到“纽约周末”),你需要自己实现这个function。 这不应该是非常困难的,因为你必须遵循一些简单的语法规则,很多东西会被自动更正。

希望这有助于,让我知道如果你需要更多的信息。