确定一个句子是英语的概率的相对简单的方法是啥?
Posted
技术标签:
【中文标题】确定一个句子是英语的概率的相对简单的方法是啥?【英文标题】:What is a relatively simple way to determine the probability that a sentence is in English?确定一个句子是英语的概率的相对简单的方法是什么? 【发布时间】:2013-01-23 19:25:31 【问题描述】:我有许多字符串(字符集合)代表不同语言的句子,比如:
你好,我叫乔治。
Das brot ist gut.
...等等
我想为它们中的每一个分配分数(从 0 到 1),表明它们是英语句子的可能性。是否有公认的算法(或 Python 库)可以用来执行此操作?
注意:我不在乎英语句子的语法是否完美。
【问题讨论】:
【参考方案1】: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)]
【讨论】:
太棒了 - 如果可能的话,我会留下一些建议,但我现在就试试。 如果您有合理数量的训练数据和中等大小的样本,这可能会起作用:但是,语言识别通常使用字符 n-gram 模型完成。这是因为他们只需几个单词就可以得到准确的答案,并且不需要太多的培训(至关重要的是,他们不依赖于在训练和测试文档之间重复单词)。如果您好奇,我可以扩展为答案 @BenAllison 是的,我是!昨晚我做了一些阅读,我的印象是你使用训练文本的三元组作为特征来训练你的分类器。这是不正确的吗?【参考方案2】:您可以找到一些关于 python 库 here 和 here 的建议。
另一个简单的算法,如果你有每种语言的语料库,你可以通过在词频表中的简单查找来检测句子语言。
【讨论】:
【参考方案3】:我知道答案已被接受,但是...通常语言 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) 的条件概率的表格,其中最大似然估计量只是:
count(c_i-2, c_i-1, c) / count(c_i-2, c_i-1)
尽管由于概率为 0 的问题,语言建模基本上从未进行过最大似然估计,但上面的似然函数将在参数估计中发挥重要作用(它只需要平滑)。
所以,你要做的就是决定字符串 c 是哪种语言,在你为感兴趣的语言训练的语言模型下评估它的概率,并判断字符串来自为其分配最高概率的模型(这相当于一个贝叶斯分类器,其在类(即语言)上具有统一的先验,但假设分布是 n-gram 模型的分布,不是朴素贝叶斯/多项式)。
很多关于语言建模的地方可以阅读:一个非常好的教程可以在 Josh Goodman's epic 找到(虽然现在有点过时了,但想法保持不变,将足以满足您的目的)。你可以看看wikipedia page,在那里你会看到一元模型等价于多项分布。
最后,如果您正在寻找语言模型的 Python 实现,可能最广泛使用的是NLTK。
【讨论】:
我在 langid.py 库(也可在 pypi 上获得)也取得了巨大成功,它比 NLTK 更容易独立运行。以上是关于确定一个句子是英语的概率的相对简单的方法是啥?的主要内容,如果未能解决你的问题,请参考以下文章