检测具有相同词根的单词。

3
我正在使用Java开发一款自动化的pdf文件索引生成器。目前的概念很简单:我遍历pdf中的每个单词,与忽略列表(例如该语言中最常见的10000个单词)进行比较,然后将其添加到一个com.google.common.collect.HashMultimap中,其中包含单词作为字符串和出现该单词的页面的哈希集合。
这个方法工作得很好,但是我仍然会在索引中得到不同的单词形式。我曾考虑过只比较这些单词的相对子字符串,但例如在德语中(该程序的目标语言),由于其所有不规则性,这种方法的效果非常有限。
是否有其他想法、库或正则表达式可以解决这个问题呢? 谢谢!

4
Lucene有不同的变体: org.tartarus.snowball.ext.German2Stemmerorg.apache.lucene.analysis.de.GermanLightStemmer。默认的分析器(default analyzer)使用轻量级词干提取器,然后采用德语化的snowball算法。 - dhke
对于自然语言处理任务,您应该搜索包含语言数据和规则的NLP库。要求别人为此构建正则表达式就像要求别人重新发明轮子并为您进行研究一样。 - nhahtdh
我并不是在寻求正则表达式或任何预先构建的解决方案,只是想要一个提示来指引我正确的方向。也许我的问题没有表述清楚,对此我感到抱歉。但是,感谢其他回答,我会在今晚查看它们。 - Jonas Bausch
2个回答

2
将文本缩减为其共同词根的过程称为词形还原。一个词形还原器将像 eaten, eatsate 这样的单词映射为 eat
我对德语不是很熟悉,但是有不同的库可用于执行此任务,例如 Stanford CoreNLP 是一个全功能的 NLP 库,提供许多其他功能。它可能也支持德语,但我不确定。
否则,通过谷歌搜索 "German lemmatizer" 将提供足够的结果。
您也可以使用词干提取器,这是一种比较简单的词形还原方法。词干提取器通常是基于规则的组件,能够将单词缩减为共同的词根,但输出单词并不总是有效的:例如单词 engine 可能被提取为 engin。如果您要求操作后单词仍然有效,则词形还原是更好的解决方案,否则提取词干可能更好,因为执行速度更快。

我尝试了一下Stanford CoreNLP,至少对于英文文本它的效果还行。 - Jonas Bausch

0
你可以从http://danielnaber.de/morphologie/获取德语的屈折数据。这也是例如LanguageTool在其分析中内部使用的。(声明:此处链接了我的项目)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接