18

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

我对这个语言学的东西完全陌生。

4

2 回答 2

3

让这个话题更进一步。名字和姓氏的正确大写是NSLinguisticTagger 识别名字的要求。

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

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

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

这非常令人沮丧。

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

我仍然发现它是一个有用的课程,但这篇文章的寓意是“正确”

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

于 2013-12-02T21:42:28.060 回答
2

评论中已经提到了这一点,但无论如何还是想指出这一点。NSLinguisticTagger 认为“New York”和“new york”是不同的——因为它们是不同的。大写 N 表示它是专有名词。据我所知,NSLinguisticTagger 中没有任何东西可以改变这种行为。

但是,您可以做的是依靠 iOS 自动更正。只需确保输入值的文本字段启用了自动更正,它应该自动将“纽约”更正为“纽约”,以及类似的情况。如果自动更正没有发现这一点,那么我会尝试寻找其他一些库进行语言分析。

iOS 中已经包含追溯自动更正(在一定程度上),因此应该足以将“纽约”更正为“纽约”。如果您想更正整个句子(即“纽约周末”为“纽约周末”),您需要自己实现该功能。这应该不是很困难,因为您必须遵循一些简单的语法规则,并且自动更正会发现很多东西。

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

于 2013-02-23T21:44:37.437 回答