返回给定字符串语言的最佳方法

时间:2008-12-21 01:12:57

标签: python algorithm string

更具体地说,我正在尝试检查给定的字符串(句子)是否为土耳其语。

我可以检查字符串是否包含土耳其字符,例如Ç,Ş,Ü,Ö,Ğ等。但是这不是很可靠,因为在收到字符串之前可能会转换为C,S,U,O,G

另一种方法是在土耳其语中使用100个最常用的单词,并检查句子是否包含这些单词中的任何/一些。我可以结合这两种方法并使用点系统。

您认为在Python中解决我的问题的最有效方法是什么?

相关问题:(human) Language of a document(Perl,Google翻译API)

3 个答案:

答案 0 :(得分:13)

一种选择是使用贝叶斯分类器,例如Reverend。牧师主页给出了一个天真的语言检测器的建议:

from reverend.thomas import Bayes
guesser = Bayes()
guesser.train('french', 'le la les du un une je il elle de en')
guesser.train('german', 'der die das ein eine')
guesser.train('spanish', 'el uno una las de la en')
guesser.train('english', 'the it she he they them are were to')
guesser.guess('they went to el cantina')
guesser.guess('they were flying planes')
guesser.train('english', 'the rain in spain falls mainly on the plain')
guesser.save('my_guesser.bay')

使用更复杂的令牌集进行训练可以增强结果。有关贝叶斯分类的更多信息,请see herehere

答案 1 :(得分:10)

我之前使用的一种简单的统计方法:

以您想要检测的语言获取大量样本培训文本。将其分成三字符,例如

三元组中的“你好foobar”是:  'Hel','ell','llo','lo','o f','fo','foo','oob','oba','bar'

对于所有源数据,计算每个三元组的出现频率,可能是在一个字典中,其中key = trigram和value = frequency。如果需要,您可以将此限制为前300个最常见的3个字母组合或其他内容。在某个地方把这个词汇剔除。

要判断新文本样本是否使用相同语言编写,请对示例文本重复上述步骤。现在,您所要做的就是计算样本三元组频率和训练三元组频率之间的相关性。你需要稍微玩一下来选择一个阈值相关性,你愿意考虑输入是否土耳其。

这种方法已被证明是高度准确的,超越了更复杂的方法,参见

Cavnar & Trenkle (1994): "N-Gram-Based Text Categorization"

使用trigrams解决了使用单词列表的问题,因为在任何给定的语言中都有大量的单词,特别是在给定不同的语法排列的情况下。我试过寻找常用词,问题是他们经常对其他语言给出误报,或者他们自己有很多排列。统计方法不需要大量存储空间,也不需要复杂的解析。顺便说一下,这种方法只适用于带有语音书写系统的语言,如果使用的是使用表意语言的语言(即中文,日文,韩文),它的效果很差。

或者,维基百科在its handy language recognition chart.

中有关于土耳其语的部分

答案 2 :(得分:-1)

为什么不使用现有的拼写检查库? 对多种语言进行拼写检查,选择错误次数最少的语言。