语言检测如何工作?

Gau*_*nha 12 algorithm nlp pattern-matching

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

agu*_*iva 12

以英语获取维基百科.检查字母'a'在'a'之后出现的概率是多少(例如)并且对所有字母组合执行该操作的概率,最终会得到一个概率矩阵.

如果您使用不同语言对维基百科执行相同操作,则每种语言都会得到不同的矩阵.

要检测语言,只需使用所有这些矩阵并使用概率作为分数,假设用英语你会得到这样的概率:

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

英语矩阵获胜,因此必须是英语.


tob*_*gue 11

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

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

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


Ale*_*nze 7

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

  • 次要补充:如果它太短,则统计数据和字典都不起作用.简单的例子:"计算机"..至少有十几种语言包含这个单词,没有统计数据或字典可以解决这个问题,只给出了单词本身. (3认同)

Dr.*_*ius 5

一个实现示例.

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"}
Run Code Online (Sandbox Code Playgroud)

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

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

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

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}, ...}
Run Code Online (Sandbox Code Playgroud)