8

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

你好,我的名字是乔治。

Das brot ist 肠道。

... ETC。

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

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

4

3 回答 3

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)]
于 2013-02-08T04:25:56.887 回答
6

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

这是它的工作原理。我们将字符串视为它包含的字符序列(包括空格和标点符号)。我们为这些字符序列构建了一个 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) 的条件概率的表,其中最大似然估计量只是:

计数(c_i-2,c_i-1,c)/计数(c_i-2,c_i-1)

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

所以,你要做的就是决定字符串c是哪种语言,在你为你感兴趣的语言训练的语言模型下评估它的概率,并判断这个字符串来自分配它最高概率的模型(这相当于一个贝叶斯分类器,在类(即语言)上具有统一的先验,但假设分布是 n-gram 模型的分布,而不是朴素贝叶斯/多项式)。

很多地方可以阅读有关语言建模的内容:可以在Josh Goodman 的史诗中找到一个非常好的教程(虽然现在有点过时了,但这些想法保持不变,并且足以满足您的目的)。您可以查看wikipedia page,在那里您会看到一元模型等效于多项分布。

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

于 2013-02-11T10:07:38.517 回答
2

你可以在这里这里找到一些关于 python 库的建议。

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

于 2013-02-08T04:44:53.687 回答