java - 如何在 Java 中检索词素的所有变体?

标签 java nlp stanford-nlp lemmatization

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

示例:运行 ->(运行、运行、运行、运行...)

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

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

最佳答案

简单来说,标准 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。这就是我在前面的回答中所说的“有损单向函数”的意思。

关于java - 如何在 Java 中检索词素的所有变体?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31723623/

相关文章:

java - 我正在尝试从文本中提取语义信息

java - Python 用于运行 Java JAR,ClassNotFoundException

java - MetaClass 无法使用参数 [sutime,{}] 创建公共(public) edu.stanford.nlp.time.TimeExpressionExtractorImpl(java.lang.String,java.util.Properties)

linux - 用oracle jdk安装jitsi

java - 将字符串输出到系统输出的最快方法是什么?

open-source - 目前正在开发的机器翻译应用程序/库有哪些示例?

python - 使用NLTK、Python在StanfordDependencyParser中设置几个corenlp_options

java - 如何使用泛型函数存储类的每个变量的值?

java - 返回方法值的类

正则表达式模式以随机\n或\n\n作为换行符计算诗歌中的行数