2010-02-24 53 views
25

假设我们有内容的文本文件: “济猪链球菌未情郎HOMME ......”如何判断写入纯文本文件的语言是什么?

另一个具有: “我是一个勇敢的人”

第三,在德国的文本: “Guten morgen。Wie geht's?”

我们如何编写一个函数来告诉我们:第一个 文件中的文本是英文的,第二个文件是法文文件?

欢迎链接到图书/开箱即用的解决方案。我用Java编写,但如果需要,我可以学习Python。

我的评论

  1. 有一个小评论,我需要补充。文本可能包含不同语言的短语,作为整体的一部分或作为错误的结果。在经典文学中,我们有很多例子,因为贵族成员是多种语言的。所以概率更好地描述了情况,因为文本的大部分都是用一种语言编写的,而其他的可能是用另一种语言编写的。
  2. Google API - Internet连接。我不想使用远程功能/服务,因为我需要自己做或使用可下载的库。我想对这个话题进行研究。
+0

@EugeneP:法国人会更多“但是一个语言检测器不太可能发现那个错误(或者至少非常罕见的用法)。 – SyntaxT3rr0r 2010-02-24 13:03:41

+0

@WizardOfOdds Je suis un bonhomme alors,merci,quand meme;) – EugeneP 2010-02-24 13:06:53

+2

另外,希望你已经检查过这个:http://stackoverflow.com/questions/1383503/how-to-determine-the-natural-language-of- a-document – 2010-02-24 13:40:15

回答

19

有一个叫JLangDetect包,它似乎做你想要什么:

langof("un texte en français") = fr : OK 
langof("a text in english") = en : OK 
langof("un texto en español") = es : OK 
langof("un texte un peu plus long en français") = fr : OK 
langof("a text a little longer in english") = en : OK 
langof("a little longer text in english") = en : OK 
langof("un texto un poco mas largo en español") = es : OK 
langof("J'aime les bisounours !") = fr : OK 
langof("Bienvenue à Montmartre !") = fr : OK 
langof("Welcome to London !") = en : OK 
// ... 

编辑:凯文指出,没有在Nutch project类似的功能由包org.apache.nutch.analysis.lang提供。

+0

为什么没有德国的例子? – Chris 2010-02-24 13:07:32

+0

@克里斯嗯,一个很好的问题。我只知道一个短语,让我们看看我能否正确写下它。 – EugeneP 2010-02-24 13:12:05

+0

我不知道,但德国被列为支持的语言 – 2010-02-24 13:13:22

0

你有没有连接到互联网,如果你不那么谷歌语言的API将是您的最佳选择。

// This example request includes an optional API key which you will need to 
// remove or replace with your own key. 
// Read more about why it's useful to have an API key. 
// The request also includes the userip parameter which provides the end 
// user's IP address. Doing so will help distinguish this legitimate 
// server-side traffic from traffic which doesn't come from an end-user. 
URL url = new URL(
    "http://ajax.googleapis.com/ajax/services/search/web?v=1.0&" 
    + "q=Paris%20Hilton&key=INSERT-YOUR-KEY&userip=USERS-IP-ADDRESS"); 
URLConnection connection = url.openConnection(); 
connection.addRequestProperty("Referer", /* Enter the URL of your site here */); 

String line; 
StringBuilder builder = new StringBuilder(); 
BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream())); 
while((line = reader.readLine()) != null) { 
builder.append(line); 
} 

JSONObject json = new JSONObject(builder.toString()); 
// now have some fun with the results... 

如果您还没有其他方法。

3

查找马尔可夫链。

基本上,您需要统计学上有意识的语言样本。当您得到一个新文件时,请查看特定音节或音素的频率,并比较预先计算的样本。选择最接近的一个。

5

对于文本较大的文本,通常使用字母,二合字母和三字母的分布,并与您想要检测的语言的已知分布进行比较。

但是,单个句子很可能太短而不能产生任何有用的统计度量。然后,你可能会有更多的运气来匹配单词与字典。

2

虽然比您想要的更复杂的解决方案,但您可以使用Vowpal Wabbit并使用不同语言的句子进行训练。

从理论上讲,您可以获取文档中每个句子的语言。

http://hunch.net/~vw/

(不要被“联机”项目的副标题所迷惑 - 这只是mathspeak用于获悉,而无需在内存整个学习材料)

+0

谢谢你的回答。 – EugeneP 2010-02-24 13:44:57

4

NGramJ似乎有点更先进的日期:

http://ngramj.sourceforge.net/

它也有两个字符为导向,面向字节的配置文件,所以它应该是能够识别的字符集了。

对于多种语言的文档,您需要识别字符集(ICU4J有一个CharsetDetector可以做到这一点),然后将文本分割为像多行换行符或段落(如果文本被标记)等。

+0

谢谢你的回答。 – EugeneP 2010-02-24 13:44:37

4

尝试Nutch的Language Identifier。它使用n-gram语言配置文件进行培训,可用语言配置文件与输入文本匹配。有趣的是,如果你需要,你可以添加更多的语言。

+0

我们使用nutch的语言标识符,结果非常好。这是一个适用于共享字符集的语言的bigram模型的标准实现。 – 2010-02-25 08:23:03

2

如果您对可以执行语言检测的机制感兴趣,我会参考以下article(基于python),它使用(非常)天真的方法,但是特别适合介绍此问题,并且机器学习(只是一个大词)。

对于java实现,其他海报建议的JLangDetect和Nutch非常好。也请看看Lingpipe,JTCLNGramJ


对于您有多个语言在同一个页面上的问题,你可以用一个句子边界探测器砍页面到句子,然后试图找出每个句子的语言。假设一个句子只包含一种(主要)语言,您仍然应该使用上述任何一种实现获得良好的结果。

注意:句子边界检测器(SBD)在理论上是语言特定的(鸡蛋问题,因为您需要另一个)。但对于基于拉丁语脚本的语言(英语,法语,德语等),主要使用句点(除惊叹号等)作为句子分隔符号,即使使用专为英语设计的SBD,也会得到可接受的结果。我写了一个基于规则的英语SBD,对法语文本非常有效。有关实现,请参阅OpenNLP

使用SBD的替代选项是使用说10个标记(空格分隔)的滑动窗口来创建伪句(PS),并尝试识别语言更改的边界。这有一个缺点,如果你的整个文档有n个标记,你将对每个长度为10个标记的字符串执行大约n-10次分类操作。在另一种方法中,如果平均句子有10个标记,则您将执行大约n/10个分类操作。如果文档中n = 1000个字,则您将比较990个操作与100个操作:一个数量级差异。


如果您有简短的短语(少于20个字符),则根据我的经验,语言检测的准确性会很差。特别是在专有名词以及像“巧克力”这样的语言相同的名词中。例如。如果出现在法语的句子中,“纽约”是英语单词还是法语单词?

0

bigram模型运行良好,编写简单,培训简单,只需要少量文本进行检测。 nutch语言标识符是我们发现的一个java实现,并与一个薄包装器一起使用。

我们对于混合CJK和英文文本的bigram模型存在问题(即推文大多是日文,但只有一个英文单词)。从数学的角度来看,这是显而易见的(日语有更多的字符,所以任何给定字符的概率都很低)。我认为你可以通过一些更复杂的对数线性比较来解决这个问题,但我欺骗并使用了一种基于特定语言的字符集的简单过滤器(例如,如果它只包含统一的汉语,那么它是中文的,如果它包含一些日本的假名和统一的汉族,然后是日语)。