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

时间:2015-07-30 12:19:49

标签: java nlp stanford-nlp lemmatization

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

示例:running - > (跑,跑,跑,跑...)

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

澄清:我不寻找一个词干分析器。另外,我想避免从头开始编写新算法来抓取WordNet或类似的词典。

1 个答案:

答案 0 :(得分:1)

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

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

然而,您可以生成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。这就是我所说的&#34;有损,单向函数&#34;在我的回答中。