【问题标题】:Word Stemming in iOS - Not working for single wordiOS中的词干提取 - 不适用于单个词
【发布时间】:2014-08-15 15:32:04
【问题描述】:

我正在使用NSLinguisticTagger 进行词干提取。我可以得到一个句子中单词的词干,但不能得到一个词的词干。

以下是我正在使用的代码,

    NSString *stmnt = @"i waited";
    NSLinguisticTaggerOptions options = NSLinguisticTaggerOmitWhitespace | NSLinguisticTaggerOmitPunctuation | NSLinguisticTaggerJoinNames;

    NSLinguisticTagger *tagger = [[NSLinguisticTagger alloc] initWithTagSchemes:@[NSLinguisticTagSchemeLemma] options:options];
    tagger.string = stmnt;
    [tagger enumerateTagsInRange:NSMakeRange(0, [stmnt length]) scheme:NSLinguisticTagSchemeLemma options:options usingBlock:^(NSString *tag, NSRange tokenRange, NSRange sentenceRange, BOOL *stop) {
        NSString *token = [stmnt substringWithRange:tokenRange];
        NSLog(@"%@: %@", token, tag);
    }];

为此,我正确地退出了:

i: i
waited: wait

但是如果stmnt = @"waited";上面的代码无法识别词干

非常感谢任何帮助

【问题讨论】:

    标签: ios iphone objective-c linguistics


    【解决方案1】:

    以下代码对我有用,

    NSString *stmt = @"waited";
    NSRange stringRange = NSMakeRange(0, stmt.length);
    NSDictionary* languageMap = @{@"Latn" : @[@"en"]};
    [stmt enumerateLinguisticTagsInRange:stringRange
                                           scheme:NSLinguisticTagSchemeLemma
                                          options:NSLinguisticTaggerOmitWhitespace
                                      orthography:[NSOrthography orthographyWithDominantScript:@"Latn" languageMap:languageMap]
                                       usingBlock:^(NSString *tag, NSRange tokenRange, NSRange sentenceRange, BOOL *stop) {
                                           // Log info to console for debugging purposes
                                           NSString *currentEntity = [stmt substringWithRange:tokenRange];
                                           NSLog(@"%@ is a %@, tokenRange (%d,%d)",currentEntity,tag,tokenRange.length,tokenRange.location);
                                       }];
    

    【讨论】:

    • 如果语言中不包含该词,则访问不正确。例如,只需尝试使用“abcd”。我正在使用 swift 进行尝试。有什么想法吗?
    • 也给了我不好的访问权限。不知道我做错了什么。
    • stackoverflow.com/questions/48768919/… 有没有机会在这里提供帮助?物理设备不一样:\
    • 如果语言不包含该单词,仍然会提供错误的访问权限。斯威夫特 4.2 和 iOS 12.0 :(.
    【解决方案2】:

    已接受的答案转换为 Swift 以供需要的人使用:

        let stmt = "waited"
        let options: NSLinguisticTaggerOptions = .OmitWhitespace
        let stringRange = NSMakeRange(0, stmt.length)
        let languageMap = ["Latn":["en"]]
        let orthography = NSOrthography(dominantScript: "Latn", languageMap: languageMap)
    
        stmt.enumerateLinguisticTagsInRange(
            stringRange,
            scheme: NSLinguisticTagSchemeLemma,
            options: options,
            orthography: orthography)
            { (tag, tokenRange, sentenceRange, _) -> () in
                let currentEntity = stmt.substringWithRange(tokenRange)
                println(">\(currentEntity):\(tag)")
        }
    

    【讨论】:

    • 我得到了一些 NSRange 不能转换为 Range 的错误,所以我只是先将字符串转换为 NSString(“let nsstmt : NSString = stmt as NSString”)并使用 nsstmt 运行所有内容。不知道有没有更好的办法。
    • 我可以确认,在使用 String 方法时,单个单词的词干提取失败,但使用 NSString 等效项可以按预期工作(至少在我尝试过的复数上)。奇怪!基于块的enumerateTags(in:scheme:options:using:) 也出现错误,但linguisticTags(in:) 替代方案按预期工作。
    • stackoverflow.com/questions/48768919/… 有没有机会在这里提供帮助?物理设备不一样:\
    【解决方案3】:

    它不适用于单个单词,因为没有足够的信息来确定它在句子中的作用。

    在我们的例子中,当用户在我们的自然语言解析器中输入单个单词时,我们假设它是一个事物的名称,因此是一个名词。

    所以我们只是构造一个句子,暗示输入的单词是这样的名词:

    let str = "please show me \(word)"
    

    然后像往常一样通过NSLinguisticTagger 运行它。

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-17
    • 1970-01-01
    • 1970-01-01
    • 2010-12-12
    • 2018-05-23
    • 2021-05-02
    相关资源
    最近更新 更多