产生实词的词干算法
nlp
php
11
0

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

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

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

在某种程度上,这是可行的,但不会返回“真实”单词。上面的示例源于“ commun”。

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

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

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

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

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

参考资料:
Stack Overflow
收藏
评论
共 3 个回答
高赞 时间 活跃

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

收藏
评论

此处的核心问题是,词干提取算法仅根据语音的拼写规则在语音基础上进行操作,而它们所使用的语言没有任何实际了解。要生成真实词,您可能必须将词干提取器的输出与某种形式的查找功能合并,以将词干转换回真实词。我基本上可以看到两种可能的方法:

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

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

收藏
评论

如果我理解正确,那么您所需的不是词干分析器,而是造词器。 Lemmatizer是关于像-ies结局,-ed等知识的工具,像特殊的词形等,等Lemmatizer输入wordform映射到其引理,这是保证是一个“实”字。

英语有很多词形morpha不过我只用了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获取语素

收藏
评论
新手导航
  • 社区规范
  • 提出问题
  • 进行投票
  • 个人资料
  • 优化问题
  • 回答问题