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

8 投票
3 回答
2002 浏览
提问于 2025-04-17 15:12

我有一些字符串(就是一堆字符组合),它们表示不同语言的句子,比如:

你好,我叫乔治。

面包很好。

……等等。

我想给每个句子打个分(从0到1),表示它们是英语句子的可能性。有没有什么公认的算法(或者Python库)可以用来实现这个呢?

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

3 个回答

2

你可以在这里找到一些关于Python库的建议,点击这里这里

还有一个简单的方法,如果你有每种语言的语料库(就是一些文本资料),你可以通过查看单词出现的频率表来判断句子的语言。

6

我知道这个答案已经被接受了,不过……通常语言识别是通过字符n-gram模型来实现的,而不是像Raymond所建议的那样使用词袋模型。这两者是不一样的。使用n-gram特征的分类器并不是常见的做法,实际上也不是特别必要。原因是,通常只需要几个字符就足以进行语言识别,而基于词袋的分类器(尤其是基于n-gram的词袋)需要使用在训练时看到的相同单词或短语。相反,基于字符的模型可以用很少的训练和几乎没有数据来进行识别。

那么,它是怎么工作的呢?我们把一个字符串看作是它包含的字符序列(包括空格和标点符号)。我们为这些字符序列构建一个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的经典教程中找到(虽然现在有点过时,但其中的思想依然适用,足以满足你的需求)。你也可以看看维基百科页面,你会看到单元模型等同于多项分布。

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

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)]

撰写回答