chndata的专栏

背景

在当今社会,哪家企业拥有更多的客户数据,哪家企业就会拥有更多的潜在客户,从而能在市场占领大片江山。然而,要让这些客户成为潜在客户,就要对客户数据进行数据分析。随着客户的全球化,分析客户数据的第一步,也是最重要的一步,就是语言检测。那什么是语言检测呢?顾名思义,就是识别该数据是哪种语言。能检测出数据是哪种语言了,接下来就能“认识”这个数据,从而理解该数据语义,从而获得该数据的价值。

目前市场上开源的项目有两个,一个是Apache Tika,一个是googlecode上的软件包,这两个项目大家都应该比较了解,我们稍微介绍下google code吧, 貌似是日本的产品,, 在使用前先载入语言包,然后构建自己的词汇表,然后调用detect方法,就能检测所要检测的语言了,这个准确度,与你载入的语言包有关系,你的各个语言的样本越多,检测出的准确率就越高了。本文接下来介绍我在开发公司的某个实体解析的产品中关于语言检测的相关实现与经验。

困难与挑战

每种语言都有相应字典,匹配到相应字典,就能知道相应的语言。但问题来了,首先这个字典会很大,大概是千亿级别的,因为全球有5651种语言,用得很普遍的语言有49种,所以这条路显然是行不通的。

语言种类越多,语言检测的难度显然越大,准确率低,这个众所周知。

另外每种语言还会有字/词的变形和合成缩写等,这是也是语言检测的的一个难点,比如英语:

Corporation –>Corp

还有些不同语言之间还会有共同的字,比如日语里面就有很多汉字,法语里面也有很多英语单词,这就会影响语言检测的准确度。

假如待检测的数据很短,这也很难准确地检测这是那种语言。比如只有一个“山”,就不能确定这是日语还是汉语。

检测的结果

数据

结果

Language detection

英语

语言检测

汉语

detección de idioma

西班牙语

sprog afslring

丹麦语

sprkgjenkjenning

挪威语

阿拉伯语

言語検出

日语

波斯语

韩语

乌尔都语

detecció d’idioma

加泰罗尼亚语

Prepoznavanje jezika

克罗地亚语

détection de la langue

法语

deteksi basa

爪哇语

rilevamento della lingua

意大利语

泰米尔语

otkrivanje jezika

波斯尼亚语

先了解两个算法

1.N-Gram

N-Gram是大词汇连续语言识别的一种语言模型,该模型利用上下文中相邻的词间搭配的信息,在需要把连续的文字转换成语句时,可以计算出具有最大概率的句子。也就是说该模型可以利用上下文中相邻文字间的搭配,计算出下个字出现的概率。

该模型基于这样一种假设,第n个词的出现只与前面n-1个词相关,而与其它任何词都不相关,整句的概率就是各个词出现概率的乘积。这些概率可以通过直接从语料库中统计的n个词同时出现的次数得到的。下图是常见的一元的Gram和二元的Bi-Gram和三元的Tri-Gram。

一元Gram就是各个字母在语料库中的概率;二元Gram用图上的例子来说,就是字母T出现在开头的概率,字母h出现在字母T后面的概率。三元的就不再举例。

下面我们来看一个三元语言模型的的综合格式:

上图中第一项pro_1,pro_2,pro_3表示N-Gram的条件概率,就是P(wordN| word1,word2,。。。,wordN-1)。

第二项word1,word2,word3表示N-Gram的词。

最后一项back_pro1,back_pro2表示回退权重。

举例来说,对于三个连续的词来说,我们计算三个词一起出现的概率:

P(word3|word1,word2)

表示word1和word2出现的情况下word3出现的概率,比如P(大|习,大)的意思是已经出现了“习大”两个字,后面是”大”的概率,这个概率这么计算:

if(存在(word1,word2,word3)的三元模型){

returnpro_3(word1,word2,word3) ;

}else if(存在(word1,word2)二元模型){

returnback_pro2(word1,word2)*P(word3|word2) ;

}else{

returnP(word3 | word2);

}

而上面的计算又集中在计算P(word3 | word2)的概率上,就是如果不存在”习大大”的三元模型,此时不管何种路径,都要计算P(word3 |word2) 的概率,计算如下:

if(存在(word1,word2,word3)的三元模型){

returnpro_3(word1,word2,word3) ;

}else if(存在(word1,word2)二元模型){

returnback_pro2(word1,word2)*P(word3|word2) ;

}else{

returnP(word3 | word2);

}

这样,不同的语言,同样的字组合起来的概率基本都是不一样的,我们就可以根据不同语料库,计算出每种语言里面组合概率最大但在其他任何语言里面组合概率很小的关键字或词。

生活是一段奇妙的旅行,就在那一去无返的火车上。

chndata的专栏

相关文章:

你感兴趣的文章:

标签云: