产生真实单词的词干提取算法

36
我需要从一段文本中提取“标签”列表。大部分很简单。然而,我现在需要帮助来对结果词汇表进行词干提取以避免重复。例如:Community / Communities。
我已经使用了Porter Stemmer算法的实现(顺便说一下,我是用PHP编写的)。

http://tartarus.org/~martin/PorterStemmer/php.txt

这个方法有一定效果,但是不能返回“真实”的单词。上面的例子被截断成了“commun”。
我尝试过“Snowball”(在另一个Stack Overflow线程中建议使用)。

http://snowball.tartarus.org/demo.php

对于我的示例(社区/社区),Snowball的词干是“communiti”。

问题

是否有其他可以做到这一点的词干算法?有其他人解决了这个问题吗?

我目前的想法是,我可以使用一个词干算法来避免重复,并选择遇到的最短单词作为要显示的实际单词。


我认为最简单的方法就是同时存储完整单词和词干。 - VirtuosiMedia
将单词进行词干提取、标准化处理、获取元音编码,最后还需保留完整单词的副本。使用这四种方法,将其与其他单词进行比较,你应该能够找到匹配项。 - Xeoncross
3个回答

50
如果我理解正确,你需要的不是词干提取器而是词形还原器。词形还原器包含有关结尾(如-ies-ed等)和特殊单词形式(如written等)的知识。词形还原器将输入的单词形式映射到它的引用形式,该形式保证是一个“真正”的单词。

对于英语有许多词形还原器,我只使用过morphaMorpha只是一个大型词汇文件,可以编译成可执行文件。 用法示例:

$ cat test.txt 
Community
Communities
$ cat test.txt | ./morpha -uc
Community
Community

您可以从http://www.informatics.sussex.ac.uk/research/groups/nlp/carroll/morph.html获取Morpha。


我是一个初学者,请不要介意如果我错了。我只想知道它是否适用于将集合转换为collect(我希望你明白我试图传达的意思 - 将单词转换为更一般/更短的形式)。 - CTsiddharth
1
如果您计划从Java应用程序中使用它,UW已将morpha stemmer上传到Maven中央库 - schmmd
2
有没有Python的词形变化库? - sumid
NLTK是Python的自然语言处理工具包:https://dev59.com/HnRA5IYBdhLWcg3w8iol - camino
2
这是正确的答案。被接受的答案是不正确的,任何来到这个页面的人都应该遵循这个建议。 - Slater Victoroff
显示剩余2条评论

16
核心问题在于词干算法纯基于语言的拼写规则而非实际理解语言。为了生成真实单词,你可能需要将词干提取器的输出与某种查找函数相结合,以将词干转换回真实单词。我可以看到两种潜在的方法:
1. 找到或创建一个大字典,将每个可能的词干映射回一个实际的单词。(例如,communiti -> community) 2. 创建一个函数,将每个词干与被缩减为该词干的单词列表进行比较,并尝试确定哪个更相似。(例如,将"communiti"与"community"和"communities"进行比较,以便"community"被认为是更相似的选项)
我个人认为我会选择第一种方法的动态形式,通过记录每个检查过的单词及其词干来构建定制的字典数据库,然后假设最常用的单词是应该使用的单词。(例如,如果我的源文本中更经常使用"communities"而不是"community",那么将communiti映射到communities。) 基于字典的方法通常更准确,在词干提取器输入的基础上构建它将提供针对您的文本定制的结果,主要缺点是所需的空间,但这在今天通常不是问题。

这似乎是个好主意。我认为拥有一个自动化系统将会很有益处,因此在工作中使用“最常见”的单词似乎是一个简单的解决方案 - 并且易于实现。非常感谢。 - Dave
3
这种方法不错,我过去也用过。不过须知,词干算法通常不是基于语音处理的,它们是根据语言的语法编写的,而非单词发音。如需了解详情,建议您阅读http://snowball.tartarus.org/texts/introduction.html,尤其是第二部分——“一些概念支持下的词干提取”。 - Richard Boulton
啊,没错。我在使用"音标"这个词上有点马虎,我已经编辑了我的回答,明确说明它是基于拼写规则的。 - Dave Sherohman
好主意!是否有一个包含单词词干版本与原始或稳定版本之间映射的数据库?提供这样一个数据库的链接将非常有帮助! - CTsiddharth

15

嘿,我不知道是否太晚了,但只有一个 PHP 词干提取脚本可以生成真实单词:http://phpmorphy.sourceforge.net/ - 我花费了很长时间才找到它。所有其他的词干器都需要编译,即使在那之后它们也只按照 Porter 算法工作,这会产生词干而非词形(例如 community = communiti)。PhpMorphy 很好地完成了这项工作,易于安装和初始化,并且拥有英语、俄语、德语、乌克兰语和爱沙尼亚语字典。它还附带一个可用于编译其他字典的脚本。文档是俄语的,但将其放入 Google 翻译中应该很容易。


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