当前位置: 代码迷 >> java >> 如何在Java中检索lexeme的所有变体?
  详细解决方案

如何在Java中检索lexeme的所有变体?

热度:21   发布时间:2023-07-17 20:38:35.0

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

示例:运行->(运行,运行,运行,运行中…)

根据我尝试了斯坦福大学NLP。 但是,引理注释器仅检索引理(运行->运行),而不检索变量的完整集合。 有没有办法用Stanford NLP或其他Java库/框架来做到这一点?

澄清:我不是在寻找词干。 另外,我想避免从头开始编写新算法以爬网WordNet或类似词典。

简短的答案是,标准的NLP库或工具包不太可能解决此问题。 与Stanford NLP一样,大多数库将仅提供word --> lemma的映射。 请注意,这是一个多对一函数,即,逆函数在单词空间中定义不明确。 但是,它是从单词空间到单词集空间的定义明确的函数(即,它是单词空间中的一对多映射)。

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

但是,您可以生成lemma --> set-of-words的映射lemma --> set-of-words而无需进行太多编码(并且绝对不需要对新算法进行编码):

// Java
Map<String, Set<String>> inverseLemmaMap = new HashMap<>();

// Guava
Multimap<String, String> inverseLemmaMap = HashMultimap.create();

然后,当您使用Stanford NLP注释主体时,可以获得引理及其相应的标记,并填充上面的地图(或多地图)。 这样,在对数据集进行一次遍历之后,您将具有所需的逆词条定容。

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

另一个要注意的是,人们经常认为,词尾变化是词性唯一决定的。 这是不正确的:

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

running的第一个实例被标记为NN ,而第二个实例是动词的当前连续时态,被标记为VBG 这就是我早些时候回答的“有损单向功能”的意思。

  相关解决方案