36

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

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

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

这在一定程度上有效,但不会返回“真实”单词。上面的例子源于“commun”。

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

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

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

问题

有没有其他的词干算法可以做到这一点?有没有其他人解决过这个问题?

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

4

3 回答 3

50

如果我理解正确,那么您需要的不是词干分析器,而是词形还原器。Lemmatizer 是一个了解诸如-ies-ed等结尾以及诸如written等特殊词形的知识的工具。Lemmatizer 将输入词形映射到它的引理,这保证是一个“真实”的词。

英语有很多词形还原器,但我只使用过morphaMorpha只是一个大的 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

于 2009-03-05T15:26:20.830 回答
16

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

  1. 找到或创建一个大字典,将每个可能的词干映射回一个实际的单词。(例如,communiti -> 社区)
  2. 创建一个函数,将每个词干与简化为该词干的单词列表进行比较,并尝试确定哪个最相似。(例如,将“communiti”与“community”和“communities”进行比较,以使“community”被认为是更相似的选项)

就个人而言,我认为我会做的方式是#1的动态形式,通过记录检查的每个单词及其词干,然后假设最常见的单词是应该的单词来建立自定义词典数据库用过的。(例如,如果我的源文本主体使用“communities”比“community”更频繁,则映射communiti -> community。)基于字典的方法通常会更准确,并且基于词干输入构建它会提供结果根据您的文本定制,主要缺点是所需的空间,现在这通常不是问题。

于 2008-10-10T11:22:12.283 回答
15

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

于 2012-06-06T11:52:39.527 回答