【问题标题】:How to retrieve all variants of a lexeme in Java?如何在 Java 中检索词位的所有变体?
【发布时间】:2015-07-30 12:19:49
【问题描述】:

我正在寻找一种方法来检索特定单词的所有词位变体。

例子:running -> (run, runs, ran, running…)

我根据this post 试用了斯坦福 NLP。但是,引理注释器仅检索引理(运行 -> 运行),而不是完整的变体集。有没有办法使用斯坦福 NLP 或其他 Java Lib/Framework 来做到这一点?

澄清:我不搜索词干分析器。另外,我想避免从头开始编写新算法来爬取 WordNet 或类似的字典。

【问题讨论】:

    标签: java nlp stanford-nlp lemmatization


    【解决方案1】:

    简短的回答是标准的 NLP 库或工具包不太可能解决这个问题。与斯坦福 NLP 一样,大多数库仅提供来自 word --> lemma 的映射。请注意,这是一个多对一函数,即反函数在单词空间中没有明确定义。然而,它是一个从词空间到词集空间的定义明确的函数(即,它是词空间中的一对多映射)。

    如果不维护某种形式的显式映射,就不可能从给定的引理生成所有变体。这在理论上是不可能的,因为词形还原是一种有损的单向函数。

    但是,您可以生成lemma --> set-of-words 的映射而无需大量编码(当然也无需编码新算法):

    // Java
    Map<String, Set<String>> inverseLemmaMap = new HashMap<>();
    
    // Guava
    Multimap<String, String> inverseLemmaMap = HashMultimap.create();
    

    然后,当您使用斯坦福 NLP 注释您的语料库时,您可以获得引理及其相应的标记,并填充上述映射(或多映射)。这样,在您的数据集单次通过后,您将获得所需的反向词形还原。

    请注意,这将仅限于您正在使用的语料库/数据集,并非所有英语单词都会包括在内。

    另一个注意事项是,人们通常认为语调是由词性唯一决定的。这是不正确的:

    String s = "My running was beginning to hurt me. I was running all day."
    

    running 的第一个实例标记为 NN,而第二个实例是动词的现在进行时,标记为 VBG。这就是我在前面的回答中所说的“有损单向函数”的意思。

    【讨论】:

    • 谢谢。很高兴知道搜索一些反向词元化功能是没有用的。我会试试你的建议。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-22
    • 2015-12-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-25
    相关资源
    最近更新 更多