一种确定文本可能语言的算法

4
我正在寻找一个简单的算法或开源库(PHP),可以估计文本主要使用哪种语言。我发现了与Python相关的以下答案,这可能是正确方向的引导。但是,能够立即在PHP中使用的东西会更好。
当然,像n-gram估计器这样的东西并不难实现,但它也需要参考数据库。
需要解决的实际问题如下。我运行了一个WordPress博客,目前被SPAM淹没了。博客是用德语编写的,几乎所有的反向链接垃圾邮件都是用英语编写的。我的想法是立即将所有看起来是英语的反向链接垃圾邮件标记为垃圾邮件。但是,我不能使用标记词,因为我不想标记错别字或引用。
我的解决方案:
使用这个问题的答案,我实现了一个解决方案,通过简单的停用词比率检测德语。任何评论必须包含至少25%的德语停用词,如果它有一个链接。所以你仍然可以评论类似于“酷文章”的东西,它根本没有停用词,但是如果你放一个链接,你应该写正确的语言。
不幸的是,NLTK中的停用词是不正确的。该列表包含在德语中不存在的单词。所以我使用了snowball列表。使用Perl正则表达式优化器,我将整个列表压缩成一个单一的正则表达式,并使用preg_match_all()计算停用词数。整个过滤器有25行,是生成从列表中产生正则表达式的Perl代码的三分之一。让我们看看它在实际应用中的表现如何。
感谢您的帮助。

为什么不使用Akismet? - jraede
1
你可以从项目古腾堡下载各种语言的大量数据。然而,你正在寻找的是垃圾邮件分类器——这取决于你通过博客收集了多少垃圾邮件,这可能是一个相当容易的任务。也许你想用更多这些信息更新你的问题。 - Thomas Jungblut
@jraede Akismet存在法律问题。我不想通过任何外国服务器传递合法的评论。否则,我将不得不在评论表单中放置隐私声明,这可能会吓跑真正的评论者。 - Lars Hanke
@ThomasJungblut 目前的垃圾邮件/正常邮件比率约为35!我担心贝叶斯解决方案可能会倾向于误报。我也不想垃圾评论中包含任何典型的药品名称。真实的评论者很可能使用这些词语。而且我想立即清除这些评论。我目前将它们放在审核中,但每天踢出60条评论是一项枯燥的任务。 - Lars Hanke
相关问题:如何计算字母频率相似度 - Wesley Baugh
2个回答

1
我同意@Thomas的观点,您需要的是垃圾邮件分类器而不是语言检测算法。尽管如此,我认为这种语言检测解决方案足够简单且开箱即用。基本上,如果您计算文档中不同语言的停用词数量并选择其中停用词数量较高的语言,则可以得到一个简单但非常有效的语言分类器。
现在,最好的部分是您几乎不需要编写任何代码,因为您可以使用标准停用词列表和处理软件包(例如nltk)来处理信息。这里是使用Python和nltk从头开始实现它的示例。
希望这能帮助到您。

一个不错的链接。从Python中提取停用词列表并在PHP中实现算法应该不难。如果直到周末还没有更简单的解决方案,我会试一试。 - Lars Hanke
你应该能够从PHP中调用Python实现并解析结果。这可能比重新实现更快。 - miguelmalvarez
也许是个好主意。我的托管服务商官方并不提供Python,但我可以从shell中运行Python。这将取决于我需要在本地安装多少模块。 - Lars Hanke
如果您真的不想使用除PHP以外的任何东西,仅关注检测英语(就我所了解的而言),我的建议是从这里下载停止词列表,并通过PHP检查这些词的出现次数。然后您可以决定如果文档中出现特定数量的这些单词,将其分类为英语。 - miguelmalvarez

0

如果你只想识别英语,那么有一个非常简单的技巧。如果你只检查帖子中的字母,英语是唯一完全在纯ASCII范围内的语言之一。这很不专业,但我认为这是一个相当简化的方法,可以解决一个非常困难的问题。

根据我的猜测,在几个法国和德国博客上进行快速计算,准确率约为85%,虽然不是绝对可靠,但考虑到其简单性,已经相当不错了。


1
许多评论往往很短,我有一些有效的德语评论,它们是纯ASCII码。我不想让它们被视为垃圾邮件而被忽略。 - Lars Hanke

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接