9

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

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

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

我想识别的文本来自网络,大多数是葡萄牙语,但Lingua::Identify被归类为法语、意大利语和西班牙语,它们是相似的语言。

我需要更精确的东西。

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

4

6 回答 6

10

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

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::Identify 自己(它是开源的),或者您可以尝试另一个库。我找到了这个,它是商业的,但看起来很有希望。

于 2012-01-21T22:34:12.767 回答
6

试试这些:

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

于 2012-01-28T19:08:02.007 回答
4

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

于 2012-01-21T20:25:48.837 回答
3

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

不过这里有几点需要考虑:

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

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

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

如果你有一个朴素贝叶斯分类器,你必须决定一组特征。大多数情况下,每种语言的字母频率都非常具有特征,因此这是第一个猜测。只需先尝试在这些频率上训练您的分类器。朴素贝叶斯分类器用于垃圾邮件过滤器,因此您可以像其中之一一样训练它。让它在样本集上运行,每当你得到错误分类时,将分类器更新为正确的分类。一段时间后,它会越来越少出错。

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

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

于 2012-01-27T18:40:41.633 回答
2

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

它也是用 Perl 编写的,因此如果您确实想使用它,filiprem的答案中的方法将是一个很好的起点。

于 2012-01-25T22:49:41.757 回答
0

还有一个语言检测网络服务,它在http://detectlanguage.com上提供免费和高级服务

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

于 2013-01-21T21:58:07.627 回答