我需要一段文字并从中提取一个"标签"列表.其中大部分都很直接.但是我现在需要一些帮助来阻止生成的单词列表以避免重复.示例:社区/社区
我已经使用了Porter Stemmer算法的实现(顺便说一下我在PHP中编写):
http://tartarus.org/~martin/PorterStemmer/php.txt
这可以达到一定程度,但不会返回"真实"的单词.上面的例子被称为"commun".
我尝试过"Snowball"(在另一个Stack Overflow线程中建议).
http://snowball.tartarus.org/demo.php
对于我的例子(社区/社区),Snowball源于"社交".
题
有没有其他干扰算法可以做到这一点?还有其他人解决了这个问题吗?
我目前的想法是,我可以使用词干算法来避免重复,然后选择我遇到的最短词是要显示的实际词.
如果我理解正确,那么你需要的不是一个词干分析器而是一个变形器.Lemmatizer是一个工具,具有关于结尾的知识,如-ies,-ed等,以及特殊的字形,如书写等.Lemimatizer将输入字形映射到其引理,这被保证是一个"真实"字.
英语有许多词形,我只是用过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的动态形式,通过记录所检查的每个单词及其所包含的内容来构建自定义词典数据库,然后假设最常见的单词应该是用过的.(例如,如果我的源文本主体比"社区"更频繁地使用"社区",那么映射社区 - >社区.)基于字典的方法通常会更准确,并且基于词干输入构建它将提供结果根据您的文本定制,主要缺点是所需的空间,这些日子通常不是问题.
嘿,我不知道这可能为时已晚,但只有一个PHP源代码脚本可以产生真正的单词:http://phpmorphy.sourceforge.net/ - 我花了很长时间才找到它.所有其他的词干分析器必须被编译,甚至在此之后它们只能根据波特算法工作,该算法产生词干,而不是词条(即社区=社区).PhpMorphy可以很好地工作,它易于安装和初始化,并且有英语,俄语,德语,乌克兰语和爱沙尼亚语词典.它还附带了一个脚本,您可以使用它来编译其他字典.该文档是俄语,但通过谷歌翻译,它应该很容易.