使用PostgreSQL中的数据进行语言检测

我在PostgreSQL中有一个表,其中列是文本。 我需要一个能够识别每个文本语言的库或工具以用于测试目的。

不需要PostgreSQL代码,因为我在安装语言时遇到问题,但是任何可以连接到数据库,检索文本并识别它的语言都是受欢迎的。

我在Perl脚本的答案中使用了Lingua::Identify ,它有效,但结果不准确。

我想要识别的文本来自网络,大多数是葡萄牙语,但Lingua::Identify将法语,意大利语和西class牙语分类为类似的语言。

我需要更精确的东西。

我添加了javar标签,因为我在系统中使用的语言和使用它们的解决方案很容易实现,但欢迎使用任何语言的解决方案。

试试这些:

这篇博客文章分享了一些测试,以比较2个库(以及第3个 – Apache Tika的语言识别模块,它实际上是一个完整的文本分析工具包)。

您可以将PL / Perl ( CREATE FUNCTION langof(text) LANGUAGE plperlu AS ... )与Lingua :: Identify CPAN模块一起使用。

Perl脚本:

 #!/usr/bin/perl use Lingua::Identify qw(langof); undef $/; my $textstring = <>; ## warning - slurps whole file to memory my $a = langof( $textstring ); # gives the most probable language print "$a\n"; 

function:

 create or replace function langof( text ) returns varchar(2) immutable returns null on null input language plperlu as $perlcode$ use Lingua::Identify qw(langof); return langof( shift ); $perlcode$; 

适合我:

 filip@filip=# select langof('Pójdź, kiń-że tę chmurność w głąb flaszy'); langof -------- pl (1 row) Time: 1.801 ms 

Windows上的PL / Perl

PL / Perl语言库(plperl.dll)预装在postgres的最新Windows安装程序中。

但是要使用PL / Perl,您需要Perl解释器本身。 具体来说,Perl 5.14(撰写本文时)。 最常见的安装程序是ActiveState,但它不是免费的。 免费的一个来自StrawberryPerl 。 确保你有PERL514.DLL

安装Perl后,登录到postgres数据库并尝试运行

 CREATE LANGUAGE plperlu; 

语言识别库

如果您关心质量,您可以选择:您可以改进Lingua ::识别自己(它是开源的)或者您可以尝试另一个库。 我发现了这个 ,它是商业的,但看起来很有希望。

朴素贝叶斯分类器非常擅长语言识别 。 您可以找到所有主要语言的实现,或者您可以自己实现,但这并不是非常困难。 维基百科条目也很有趣: https : //en.wikipedia.org/wiki/Naive_Bayes_classifier 。

语言检测的问题是,它永远不会完全精确。 我的浏览器经常错误地识别语言,这是由谷歌完成的,他可能会为这些任务投入很多精力。

不过这里有一些要考虑的要点:

我不确定Perls Lingua::Identify模块究竟在使用什么,但是大多数情况下这些任务都是由Naive Baysian模型处理的,正如有人在另一个答案中指出的那样。 Baysian模型使用概率分类为多个类别,在您的情况下,这些类别将是不同的语言。 现在,这些概率都是依赖概率,即每个类别出现某个特征的频率,以及独立(先验)概率,即每个类别总共出现的频率。

由于使用了这两种信息,因此当先验错误时,您很可能会获得较低的预测质量。 我猜Linua::Identify大部分都是通过在线文档语料库进行培训的,因此最高级的语言很可能是英语。 这意味着, Lingua::Identify很可能将您的文档归类为英语,除非有其他相信的严重理由(在您的情况下,它很可能有严重的原因,因为您说您的文档被错误分类为意大利语,法语和西class牙)。

这意味着如果可能的话,您应该尝试重新训练模型。 Lingua::Identify可能有一些方法可以帮助您解决这个问题。 如果没有,我建议你编写自己的朴素贝叶斯分类器(实际上它非常简单)。

如果你有朴素贝叶斯分类器,你必须决定一组function。 大多数情况下,字母的频率对于每种语言都是非常有特色的,所以这将是第一次猜测。 试着先在这些频率上训练你的分类器。 朴素贝叶斯分类器用于垃圾邮件filter,因此您可以像其中一个一样训练它。 让它在样本集上运行,并且每当您得到错误分类时,将分类器更新为正确的分类。 过了一会儿,它会变得越来越不对。

如果单个字母的频率没有给你足够好的结果,你可以尝试使用n-gram代替(但要注意这将引入的组合爆炸)。 我不建议尝试超过3克的任何东西。 如果这仍然不能给您带来好的结果,请尝试手动识别每种语言中唯一的常用单词并将其添加到您的function集中。 我相信一旦你开始尝试这个,你会得到更多的function想法尝试。

使用贝叶斯分类器的方法的另一个好处是,您可以随时添加新信息,以防更多文档进入,与训练数据不匹配。 在这种情况下,您可以重新分类一些新文档,类似于垃圾邮件filter,分类器将适应不断变化的环境。

我找到了一个名为TextCat的库,可以在LGPL下找到。 我不能说它的识别质量是什么,但它有一个在线演示表格,所以也许你可以在决定它是否值得下载之前抛出一些文字。

它也是用Perl编写的,所以如果你想使用它, filiprem的答案中的方法将是一个很好的起点。

此外,还有一个语言检测Web服务,可在http://detectlanguage.com上提供免费和高级服务

它有Ruby和PHP客户端,但可以从任何语言简单的Web请求访问。 输出是JSON。