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

时间:2013-02-18 14:43:01

标签: ios objective-c ios5

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

我对这种语言学事物完全陌生。

2 个答案:

答案 0 :(得分:3)

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

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

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

当NSLinguisticTagger以大写字母大小分析字符串时,几乎所有名词都被标记为personalName 。跆拳道?

非常令人沮丧。

我要分享的教训是,NSLinguistic标记器可以猜测它放在单词上的标签,但最后它只是对单词的语法评估。评估取决于正确的语言结构,例如单词放置以及单词是否大写。

我仍然认为这是一个有用的课程,但这篇文章的寓意是“Be Proper”

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

答案 1 :(得分:2)

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

但是,您可以做的是依靠iOS自动更正。只需确保输入值的文本字段已启用自动更正,并且应自动将“new york”更正为“纽约”,以及类似的事件。如果自动更正没有捕获到这一点,那么我会尝试找一些其他库进行语言分析。

追溯自动更正已经包含在iOS中(在某种程度上),因此应该足以将“纽约”更正为“纽约”。如果你想纠正整个句子(即“纽约周末”到“纽约周末”),你需要自己实现这个功能。这应该不是非常困难,因为您必须遵循一些简单的语法规则,并且许多事情将通过自动更正来获取。

希望这有帮助,如果您需要更多信息,请与我们联系。

相关问题