确定句子是英语的概率的相对简单的方法是什么?

时间:2013-02-08 04:23:51

标签: python string nlp bayesian

我有许多字符串(字符集合)代表不同语言的句子,比如说:

  
    

你好,我的名字是乔治。

         

Das brot ist gut。

         

......等等。

  

我想分配每个分数(从0 ... 1),表明它们是英语句子的可能性。是否有可接受的算法(或Python库)来执行此操作?

注意:我不在乎英语句子的语法是否完美。

3 个答案:

答案 0 :(得分:8)

bayesian classifier对于此任务来说是个不错的选择:

>>> from reverend.thomas import Bayes
>>> g = Bayes()    # guesser
>>> g.train('french','La souris est rentrée dans son trou.')
>>> g.train('english','my tailor is rich.')
>>> g.train('french','Je ne sais pas si je viendrai demain.')
>>> g.train('english','I do not plan to update my website soon.')

>>> print g.guess('Jumping out of cliffs it not a good idea.')
[('english', 0.99990000000000001), ('french', 9.9999999999988987e-005)]

>>> print g.guess('Demain il fera très probablement chaud.')
[('french', 0.99990000000000001), ('english', 9.9999999999988987e-005)]

答案 1 :(得分:6)

我知道答案已被接受,但是...通常语言ID是用字符n-gram模型完成的,而不是雷蒙德建议的词袋模型。这与在分类器中使用n-gram特征不同(实际上,通常不使用分类器,或者实际上是必需的,至少不是传统意义上的分类器)。这样做的原因是,通常只需要几个字符就足以进行语言识别,而基于词袋的分类器(以及更多的natsms)需要使用相同的单词或短语。训练。另一方面,基于字符的模型可以在很少训练的情况下使用,几乎没有数据可用于识别。

这是它的工作原理。我们将字符串视为它包含的字符序列(包括空格和标点符号)。我们建立了这些字符序列的n-gram语言模型,其中n = 3应该足够,但是使用n = 5或n = 6可以获得更高的准确度(代价是需要进行适当的平滑,这可能是可能并不容易取决于你最终如何做到这一点)!假设我们有一个字符n-gram模型,其中n = 3,对于两种语言,法语和英语。在这个模型下,字符串的概率:

c = c_1,c_2 ... c_n

其中每个c_i是字符(包括空格,标点符号等)是:

p(c)= p(c_1)* p(c_2 | c_1)* p(c_3 | c_2,c_1)... p(c_n | c_n-1,c_n-2)

现在,如果我们有法语和英语的模型,那么这将转化为每种语言的此分布的一组参数。这些实际上只是给出c_i给定条件概率的表(c_i-1,c_i-2),其中最大似然估计是:

count(c_i-2,c_i-1,c)/ count(c_i-2,c_i-1)

尽管由于获得0概率的问题,基本上从未对语言建模进行最大似然估计,但上述似然函数将在参数估计中起很大作用(它只需要平滑)。

所以,你所做的就是决定字符串 c 所在的语言,在你训练过的语言模型下评估你感兴趣的语言的概率,并判断字符串从模型中分配最高概率(这相当于贝叶斯分类器,在类上具有统一的先验,即语言,但假设分布是n-gram模型的分布, Naive Bayes / multinomial)。

有一些很多的地方可以阅读有关语言建模的内容:在Josh Goodman's epic中可以找到一个非常好的教程(虽然它现在有点过时了,但这些想法保持不变,将足以满足您的目的)。你可以看一下wikipedia page,你会看到unigram模型等同于多项分布。

最后,如果您正在寻找语言模型的Python实现,可能使用最广泛的是NLTK

答案 2 :(得分:2)

您可以找到有关python库herehere的一些建议。

另一个简单的算法,如果你有每种语言的语料库,你可以通过单词频率表中的简单查找来检测句子语言。