NSLinguisticTagger 在 Mac 和 iOS 上给出不同的输出

Posted

技术标签:

【中文标题】NSLinguisticTagger 在 Mac 和 iOS 上给出不同的输出【英文标题】:NSLinguisticTagger giving different outputs on Mac vs iOS 【发布时间】:2013-09-02 12:29:16 【问题描述】:

我正在尝试使用 NSLinguisticTagger 来隔离句子中的动词,但遇到了一个问题,即根据代码是在 ios 程序还是在 MacOS 程序中运行,输出会有所不同。

我的代码如下:

NSString* text = @"The person is a 50 year old gentleman with a book who presents us with a conundrum.";
NSLinguisticTaggerOptions options = NSLinguisticTaggerOmitWhitespace | NSLinguisticTaggerOmitPunctuation | NSLinguisticTaggerJoinNames;
NSLinguisticTagger* tagger = [[NSLinguisticTagger alloc] initWithTagSchemes:@[NSLinguisticTagSchemeNameTypeOrLexicalClass]
                                                                    options:options];
tagger.string = text;
[tagger enumerateTagsInRange:NSMakeRange(0, [tagger.string length])
                      scheme:NSLinguisticTagSchemeNameTypeOrLexicalClass
                     options:options
                  usingBlock:^(NSString *tag, NSRange tokenRange, NSRange sentenceRange, BOOL *stop) 
                      NSString *token = [text substringWithRange:tokenRange];
                      NSLog(@"%@: %@", token, tag);
                  ];

OSX 程序中运行此代码 sn-p,我正确地得到以下输出(“presents” 被正确识别为动词):

[                    AppDelegate (0x101b0bcb0)]: The: Determiner
[                    AppDelegate (0x101b0bcb0)]: person: Noun
[                    AppDelegate (0x101b0bcb0)]: is: Verb
[                    AppDelegate (0x101b0bcb0)]: a: Determiner
[                    AppDelegate (0x101b0bcb0)]: 50: Number
[                    AppDelegate (0x101b0bcb0)]: year: Noun
[                    AppDelegate (0x101b0bcb0)]: old: Adjective
[                    AppDelegate (0x101b0bcb0)]: gentleman: Noun
[                    AppDelegate (0x101b0bcb0)]: with: Preposition
[                    AppDelegate (0x101b0bcb0)]: a: Determiner
[                    AppDelegate (0x101b0bcb0)]: book: Noun
[                    AppDelegate (0x101b0bcb0)]: who: Pronoun
[                    AppDelegate (0x101b0bcb0)]: presents: Verb
[                    AppDelegate (0x101b0bcb0)]: us: Pronoun
[                    AppDelegate (0x101b0bcb0)]: with: Preposition
[                    AppDelegate (0x101b0bcb0)]: a: Determiner
[                    AppDelegate (0x101b0bcb0)]: conundrum: Noun

但是,iOS 程序中相同的代码块会导致以下输出(“presents” 被错误地识别为名词):

[                      AppDelegate (0x8d2f000)]: The: Determiner
[                      AppDelegate (0x8d2f000)]: person: Noun
[                      AppDelegate (0x8d2f000)]: is: Verb
[                      AppDelegate (0x8d2f000)]: a: Determiner
[                      AppDelegate (0x8d2f000)]: 50: Number
[                      AppDelegate (0x8d2f000)]: year: Noun
[                      AppDelegate (0x8d2f000)]: old: Adjective
[                      AppDelegate (0x8d2f000)]: gentleman: Noun
[                      AppDelegate (0x8d2f000)]: with: Preposition
[                      AppDelegate (0x8d2f000)]: a: Determiner
[                      AppDelegate (0x8d2f000)]: book: Noun
[                      AppDelegate (0x8d2f000)]: who: Pronoun
[                      AppDelegate (0x8d2f000)]: presents: Noun
[                      AppDelegate (0x8d2f000)]: us: Pronoun
[                      AppDelegate (0x8d2f000)]: with: Preposition
[                      AppDelegate (0x8d2f000)]: a: Determiner
[                      AppDelegate (0x8d2f000)]: conundrum: Noun

有谁知道我为什么会得到不同的输出,以及如何正确让 iOS 程序将 presents 识别为动词?

【问题讨论】:

【参考方案1】:

标注器是随机的,即它总是会出错。由于 iOS 设备资源有限,底层语言模型不如 OS X 版本精确。如果您想要更高的准确性,请使用基于规则的解析器。不过,您必须处理歧义。

【讨论】:

以上是关于NSLinguisticTagger 在 Mac 和 iOS 上给出不同的输出的主要内容,如果未能解决你的问题,请参考以下文章

如何将名称添加到 NSLinguisticTagger?

我们如何在 iOS 中制作自定义的 NSLinguisticTagger tagSchemes?

IOS/Objective-C:用于识别命名实体的 NSLinguisticTagger

NSLinguisticTagger enumerateTagsInRange 在具有 NSLinguisticTagSchemeNameTypeOrLexicalClass 的设备上不起作用

iOS NSLinguisticTagger 在获取引理词干时总是返回 null

“NSLinguisticTag”类型的值没有成员“范围”