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

时间:2012-01-21 20:13:08

标签: java r postgresql language-agnostic language-detection

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

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

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

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

我需要更精确的东西。

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

6 个答案:

答案 0 :(得分:7)

您可以将PL/PerlCREATE 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";

功能:

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 ::识别自己(它的开源)或者您可以尝试其他库。我找到了this one,这是商业化但看起来很有希望。

答案 1 :(得分:5)

试试这些:

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

答案 2 :(得分:4)

Naive Bayes classifiers非常擅长language identification。您可以找到所有主要语言的实现,或者您可以自己实现,但这并不是非常困难。维基百科条目也很有趣:https://en.wikipedia.org/wiki/Naive_Bayes_classifier

答案 3 :(得分:3)

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

但是有一些要考虑的要点:

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

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

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

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

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

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

答案 4 :(得分:2)

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

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

答案 5 :(得分:0)

还有一个语言检测网络服务,它在http://detectlanguage.com

提供免费和高级服务

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