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

sda*_*das 8 python string nlp bayesian

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

你好,我的名字是乔治.

Das brot ist gut.

...等

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

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

Ray*_*ger 8

一个贝叶斯分类器将成为这个任务的一个不错的选择:

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

  • 如果你有合理数量的训练数据和适度大的样本,这可能会有效:但是,语言识别通常使用字符n-gram模型.这是因为他们只需要几个单词即可获得准确的答案,而且不需要太多培训(关键是他们不依赖于培训和测试文档之间的重复单词).如果你很好奇,我可以扩展到一个答案 (4认同)

Ben*_*son 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模型的分布,而不是朴素贝叶斯/多项式).

关于语言建模有很多地方可以阅读:在Josh Goodman的史诗中可以找到一个非常好的教程(虽然它现在有点过时了,但这些想法保持不变并且对你的目的来说已经足够了).您可以查看维基百科页面,在那里您将看到unigram模型等同于多项分布.

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