一个贝叶斯分类器将成为这个任务的一个不错的选择:
>>> 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)
我知道答案已被接受,但是...通常语言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.
| 归档时间: |
|
| 查看次数: |
1162 次 |
| 最近记录: |