【问题标题】:Best way to return the language of a given string返回给定字符串语言的最佳方法
【发布时间】:2010-09-27 21:23:54
【问题描述】:
更具体地说,我正在尝试检查给定的字符串(一个句子)是否是土耳其语。
我可以检查字符串是否包含土耳其语字符,例如 Ç、Ş、Ü、Ö、Ğ 等。但这不是很可靠,因为在我收到字符串之前,这些字符可能会转换为 C、S、U、O、G .
另一种方法是使用土耳其语中最常用的 100 个单词,并检查句子是否包含这些单词中的任何/一些。我可以结合这两种方法并使用积分系统。
你认为用 Python 解决我的问题最有效的方法是什么?
相关问题:(human) Language of a document (Perl, Google Translation API)
【问题讨论】:
标签:
python
algorithm
string
【解决方案1】:
一种选择是使用贝叶斯分类器,例如Reverend。 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 here 和 here。
【解决方案2】:
我之前用过的一个简单的统计方法:
以您想要检测的语言获取大量样本训练文本。将其拆分为三元组,例如
“Hello foobar”在 trigrams 中是:
'Hel'、'ell'、'llo'、'lo'、'of'、'fo'、'foo'、'oob'、'oba'、'bar'
对于所有源数据,计算每个三元组出现的频率,大概在一个字典中,其中键=三元组,值=频率。如果需要,您可以将其限制为前 300 个最常见的 3 字母组合或其他内容。在某处腌制字典。
要判断新的文本示例是否以相同的语言编写,请对示例文本重复上述步骤。现在,您所要做的就是计算样本三元组频率和训练三元组频率之间的相关性。您需要尝试一下以选择一个阈值相关性,高于该阈值您愿意将输入视为土耳其语。
这种方法已被证明是高度准确的,击败了更复杂的方法,请参阅
Cavnar & Trenkle (1994): "N-Gram-Based Text Categorization"
使用三元组可以解决使用单词列表的问题,因为在任何给定的语言中都有大量的单词,尤其是在不同的语法排列的情况下。我试过寻找常用词,问题是它们经常对其他语言给出误报,或者它们本身有很多排列。统计方法不需要大量的存储空间,也不需要复杂的解析。顺便说一下,这种方法只适用于具有语音书写系统的语言,如果完全适用于使用表意语言的语言(即中文、日语、韩语),它的效果很差。
另外,维基百科在 its handy language recognition chart. 中有一个关于土耳其语的部分
【解决方案3】:
为什么不直接使用现有的拼写检查库?
多种语言的拼写检查,选择错误计数最低的语言。