用于生成真实单词的词干算法

时间:2008-10-10 10:43:29

标签: php nlp stemming snowball porter-stemmer

我需要一段文字并从中提取一个“标签”列表。其中大部分都很直接。但是我现在需要一些帮助来阻止生成的单词列表以避免重复。示例:社区/社区

我使用了Porter Stemmer算法的实现(顺便说一句,我是用PHP编写的):

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

这一点有效,但不会返回“真实”字样。上面的例子被称为“commun”。

我尝试过“Snowball”(在另一个Stack Overflow线程中建议)。

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

对于我的例子(社区/社区),Snowball源于“社区”。

问题

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

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

3 个答案:

答案 0 :(得分:47)

如果我理解正确,那么你需要的不是一个词干分析器而是一个词形变换器。 Lemmatizer是一个工具,具有关于 -ies -ed 等结尾的知识,以及像等特殊字形,Lemmatizer映射输入字形到它的引理,这被保证是一个“真正的”字。

英语有许多词形,但我只使用了morpha Morpha 只是一个很大的lex文件,可以编译成可执行文件。 用法示例:

$ 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

答案 1 :(得分:16)

这里的核心问题是词干算法纯粹基于语言的拼写规则在语音基础上运行 ,而没有真正理解他们正在使用的语言。要生成真正的单词,您可能必须将词干分析器的输出与某种形式的查找函数合并,以将词干转换回真实单词。我基本上可以看到两种可能的方法:

  1. 找到或创建一个大型词典,将每个可能的词干映射回实际的词。 (例如,社区 - >社区)
  2. 创建一个函数,将每个词干与减少到词干的单词列表进行比较,并尝试确定哪个最相似。 (例如,将“社区”与“社区”和“社区”进行比较,以便“社区”将被视为更相似的选项)
  3. 就我个人而言,我认为我这样做的方式将是#1的动态形式,通过记录所检查的每个单词及其所包含的内容来构建自定义词典数据库,然后假设最常见的单词是一个应该使用。 (例如,如果我的源文本主体比“社区”更频繁地使用“社区”,那么映射社区 - >社区。)基于字典的方法一般会更准确,并且基于词干分析器输入将构建它根据您的文本定制的结果,主要缺点是所需的空间,这一天通常不是问题。

答案 2 :(得分:13)

嘿,我不知道这可能为时已晚,但只有一个PHP词干生成真正的单词:http://phpmorphy.sourceforge.net/ - 我花了很长时间才找到它。所有其他词干分析器都必须进行编译,甚至在此之后它们只能根据Porter算法工作,该算法产生词干,而不是lemmas(即community = communiti)。 PhpMorphy可以很好地工作,它易于安装和初始化,并且有英语,俄语,德语,乌克兰语和爱沙尼亚语词典。它还附带了一个脚本,您可以使用它来编译其他字典。该文档是俄文版,但通过谷歌翻译,它应该很容易。