语言检测如何工作?

时间:2011-10-06 04:57:44

标签: algorithm nlp pattern-matching

我一直想知道Google如何翻译(或者可能是假设的翻译)从“from”字段中输入的字符串中检测语言。我一直在考虑这个问题,我唯一能想到的就是在输入字符串中查找语言所特有的单词。另一种方法可以是检查句子形成或除关键词之外的其他语义。但考虑到不同的语言及其语义,这似乎是一项非常困难的任务。我做了一些研究,发现有一些方法可以使用n-gram序列并使用一些统计模型来检测语言。非常感谢高层答案。

5 个答案:

答案 0 :(得分:11)

用英文维基百科。检查在字母“a”变为“b”之后的概率是多少(例如)并对所有字母组合执行该操作的概率,最终会得到一个概率矩阵。

如果您使用不同语言为维基百科做同样的事情,您将获得每种语言的不同矩阵。

要检测语言,只需使用所有这些矩阵并将概率用作分数,假设您用英语获得此概率:

t-> h = 0.3h-> e = .2

在西班牙语矩阵中你会得到那个

t-> h = 0.01h-> e = .3

使用英文矩阵,'the'这个词可以给你0.3 + 0.2 = 0.5的分数 并使用西班牙语:0.01 + 0.3 = 0.31

英语矩阵赢得必须是英语。

答案 1 :(得分:10)

如果你想用你选择的编程语言实现一个轻量级语言猜测器,你可以使用'Cavnar和Trenkle '94:基于N-Gram的文本分类'的方法。您可以在Google学术搜索上找到论文,这非常简单。

他们的方法为每种语言建立了一个N-Gram统计量,它应该能够从该语言的某些文本中猜出。然后,对未知文本构建此类统计数据,并通过简单的异地测量与之前训练的统计数据进行比较。 如果你使用Unigrams + Bigrams(可能是+ Trigrams)并比较100-200最频繁的N-Grams,如果猜测的文本不是太短,你的命中率应该超过95%。 有一个可用的演示here,但目前似乎没有用。

还有其他语言猜测方法,包括计算N-Grams概率和更高级的分类器,但在大多数情况下,Cavnar和Trenkle的方法应该能够充分发挥作用。

答案 2 :(得分:7)

您不必对文本进行深入分析,以了解其所使用的语言。统计数据告诉我们,每种语言都有特定的字符模式和频率。这是一个非常好的一阶逼近。当文本使用多种语言时会变得更糟,但它仍然不是非常复杂的东西。 当然,如果文字太短(例如单个单词,更糟糕的是,单个短文),统计数据不起作用,则需要字典。

答案 3 :(得分:4)

一个实施示例。

Mathematica非常适合实施此功能。它以下列语言识别(即有几个词典)单词:

dicts = DictionaryLookup[All]
{"Arabic", "BrazilianPortuguese", "Breton", "BritishEnglish", \
"Catalan", "Croatian", "Danish", "Dutch", "English", "Esperanto", \
"Faroese", "Finnish", "French", "Galician", "German", "Hebrew", \
"Hindi", "Hungarian", "IrishGaelic", "Italian", "Latin", "Polish", \
"Portuguese", "Russian", "ScottishGaelic", "Spanish", "Swedish"}

我建立了一个小而天真的函数来计算每种语言中句子的概率:

f[text_] := 
 SortBy[{#[[1]], #[[2]] / Length@k} & /@ (Tally@(First /@ 
       Flatten[DictionaryLookup[{All, #}] & /@ (k = 
           StringSplit[text]), 1])), -#[[2]] &]

所以,只要在字典中查找单词,你就可以得到一个很好的近似值,也可以用于短句:

f["we the people"]
{{BritishEnglish,1},{English,1},{Polish,2/3},{Dutch,1/3},{Latin,1/3}}

f["sino yo triste y cuitado que vivo en esta prisión"]
{{Spanish,1},{Portuguese,7/10},{Galician,3/5},... }

f["wszyscy ludzie rodzą się wolni"]
{{"Polish", 3/5}}

f["deutsch lernen mit jetzt"]
{{"German", 1}, {"Croatian", 1/4}, {"Danish", 1/4}, ...}

答案 4 :(得分:2)

您可能对The WiLI benchmark dataset for written language identification感兴趣。您可以在论文中找到的高级答案如下:

  • 清理文字:删除你不想要/不需要的东西;通过应用普通形式使unicode不明确。
  • 特征提取:计算n-gram,创建tf-idf特征。像这样的东西
  • 训练关于特征的分类器:神经网络,SVM,朴素贝叶斯,......无论你认为什么都可以。