如何在 Java 中检索词素的所有变体?
How to retrieve all variants of a lexeme in Java?
我正在寻找一种方法来检索特定单词词素的所有变体。
示例:运行ning -> (运行, 运行s, 运行, 运行ning…)
我根据 this post 尝试了 Stanford NLP。但是,引理注释器仅检索引理 (运行ning -> 运行),而不是完整的变体集。有没有办法用 Stanford NLP 或另一个 Java Lib/Framework?
澄清:我不搜索词干分析器。另外,我想避免从头开始编写新算法来抓取 WordNet 或类似词典。
简短的回答是标准的 NLP 库或工具包不太可能解决这个问题。与 Stanford NLP 一样,大多数库只会提供 word --> lemma
的映射。请注意,这是一个多对一的函数,即反函数在一个词space中没有明确定义。然而,它是一个定义良好的函数,从单词的 space 到单词集的 space(即,它是单词-space 中的一对多映射)。
如果不维护某种形式的显式映射,就不可能生成来自给定引理的所有变体。这在理论上是不可能的,因为词形还原是一种有损的单向函数。
但是,您可以生成 lemma --> set-of-words
的映射而无需太多编码(当然也无需编码新算法):
// Java
Map<String, Set<String>> inverseLemmaMap = new HashMap<>();
// Guava
Multimap<String, String> inverseLemmaMap = HashMultimap.create();
然后,当您使用 Stanford NLP 注释您的语料库时,您可以获得引理及其对应的标记,并填充上述映射(或多映射)。这样,在单次遍历数据集后,您将获得所需的逆词形还原。
请注意,这将仅限于您正在使用的 corpus/dataset,并且不会包括所有英语单词。
另一个注意事项是,人们通常认为词形变化是由词性唯一确定的。这是不正确的:
String s = "My running was beginning to hurt me. I was running all day."
running
的第一个实例标记为 NN
,而第二个实例是动词的现在进行时,标记为 VBG
。这就是我之前回答中 "lossy, one-way function" 的意思。
我正在寻找一种方法来检索特定单词词素的所有变体。
示例:运行ning -> (运行, 运行s, 运行, 运行ning…)
我根据 this post 尝试了 Stanford NLP。但是,引理注释器仅检索引理 (运行ning -> 运行),而不是完整的变体集。有没有办法用 Stanford NLP 或另一个 Java Lib/Framework?
澄清:我不搜索词干分析器。另外,我想避免从头开始编写新算法来抓取 WordNet 或类似词典。
简短的回答是标准的 NLP 库或工具包不太可能解决这个问题。与 Stanford NLP 一样,大多数库只会提供 word --> lemma
的映射。请注意,这是一个多对一的函数,即反函数在一个词space中没有明确定义。然而,它是一个定义良好的函数,从单词的 space 到单词集的 space(即,它是单词-space 中的一对多映射)。
如果不维护某种形式的显式映射,就不可能生成来自给定引理的所有变体。这在理论上是不可能的,因为词形还原是一种有损的单向函数。
但是,您可以生成 lemma --> set-of-words
的映射而无需太多编码(当然也无需编码新算法):
// Java
Map<String, Set<String>> inverseLemmaMap = new HashMap<>();
// Guava
Multimap<String, String> inverseLemmaMap = HashMultimap.create();
然后,当您使用 Stanford NLP 注释您的语料库时,您可以获得引理及其对应的标记,并填充上述映射(或多映射)。这样,在单次遍历数据集后,您将获得所需的逆词形还原。
请注意,这将仅限于您正在使用的 corpus/dataset,并且不会包括所有英语单词。
另一个注意事项是,人们通常认为词形变化是由词性唯一确定的。这是不正确的:
String s = "My running was beginning to hurt me. I was running all day."
running
的第一个实例标记为 NN
,而第二个实例是动词的现在进行时,标记为 VBG
。这就是我之前回答中 "lossy, one-way function" 的意思。