产生真实单词的词干算法

2022-08-30 13:06:01

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

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

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

这在一定程度上是有效的,但不会返回“真实”的单词。上面的例子被归结为“commun”。

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

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

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

问题

有没有其他词干分析算法可以做到这一点?还有其他人解决这个问题吗?

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


答案 1

如果我理解正确,那么你需要的不是词干分析器,而是词形分析器。Lemmatizer是一个工具,具有关于-ies-ed等结尾的知识,以及诸如书面等特殊单词形式的知识。词形分析器将输入词形映射到其引理,引理保证是“真实”的词。

英语有很多词形还原器,我只用过。Morpha只是一个大的lex文件,你可以编译成一个可执行文件。用法示例:morpha

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

你可以从 http://www.informatics.sussex.ac.uk/research/groups/nlp/carroll/morph.html


答案 2

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

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

就个人而言,我认为我这样做的方式将是#1的动态形式,通过记录检查的每个单词以及它所包含的内容来建立一个自定义字典数据库,然后假设最常见的单词是应该使用的单词。(例如,如果我的源文本正文更频繁地使用“社区”而不是“社区”,那么地图communiti ->社区。基于字典的方法通常更准确,并且基于词干分析器输入构建它将提供根据您的文本自定义的结果,主要缺点是所需的空间,这在当今通常不是问题。


推荐