产生真实词汇的词干algorithm
我需要一段文字,并从中提取“标签”列表。 这大部分是非常简单的。 不过,我现在需要一些帮助来阻止结果的单词列表,以避免重复。 示例:社区/社区
我已经使用了一个Porter Stemmeralgorithm的实现(我正在用PHP编写):
http://tartarus.org/~martin/PorterStemmer/php.txt
这有效,但不返回“真实”的话。 上面的例子是“通信”。
我试过“雪球”(在另一个堆栈溢出线程内build议)。
http://snowball.tartarus.org/demo.php
对于我的例子(社区/社区)来说,雪球起源于“communiti”。
题
有没有其他的干扰algorithm可以做到这一点? 有没有人解决了这个问题?
我目前的想法是,我可以使用干扰algorithm来避免重复,然后select我遇到的最短的单词作为显示的实际单词。
这里的核心问题是,干扰algorithm纯粹基于语言的拼写规则在语音基础上进行操作,而没有真正理解他们正在使用的语言。 为了产生真实的单词,你可能不得不把词干的输出与某种forms的查找function合并,以便将词干转换回真正的单词。 我基本上可以看到两种可能的方法来做到这一点:
- find或创build一个大的字典,将每个可能的词干映射回实际的词。 (如社区 – >社区)
- 创build一个函数,将每个词干与一个被简化为词干的词汇列表进行比较,并尝试确定哪一个词最相似。 (例如,将“社区”与“社区”和“社区”进行比较,使“社区”被认为是更相似的select)
就我个人而言,我认为我会这样做的方式是一个dynamic的forms#1,build立一个自定义字典数据库,logging每个单词检查与它的原因,然后假设最常见的单词是应该用过的。 (例如,如果我的源文本体比“社区”更频繁地使用“社区”,那么映射共同体 – >社区)。基于字典的方法将会更准确一些,基于stemmerinputbuild立它将提供结果根据您的文本进行定制,主要缺点是所需的空间,现在这一般不是问题。
如果我理解正确,那么你需要的不是一个干部而是一个退化者。 Lemmatizer是一个具有类似-ies , -ed等结尾的知识的工具,以及诸如书写等特殊的字形.Lemmatizer将input的字形映射到它的引理,这是一个“真正的”字。
有很多英文的morpha
,我只用了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
嘿,我不知道这是否太迟了,但只有一个PHP的生成脚本生成真正的单词: http : //phpmorphy.sourceforge.net/ – 它花了我很长时间才find它。 所有其他的词干都需要编译,甚至在此之后,他们只能根据产生词干的Porteralgorithm,而不是引理(即community = communiti)。 PhpMorphy的工作非常好,安装和初始化很容易,并且有英语,俄语,德语,乌克兰语和爱沙尼亚语字典。 它还附带了一个脚本,可以用来编译其他字典。 该文档是俄文,但通过谷歌翻译,它应该很容易。