8

鉴于此数据(两种语言的相对字母频率):

spanish => 'e' => 13.72, 'a' => 11.72, 'o' => 8.44, 's' => 7.20, 'n' => 6.83,
english => 'e' => 12.60, 't' => 9.37, 'a' => 8.34, 'o' => 7.70, 'n' => 6.80,

然后计算字符串“这是一个测试”的字母频率给了我:

"t"=>21.43, "s"=>14.29, "i"=>7.14, "r"=>7.14, "y"=>7.14, "'"=>7.14, "h"=>7.14, "e"=>7.14, "l"=>7.14

那么,将给定的字符串字母频率与语言匹配(并尝试检测语言)的好方法是什么?我已经看到(并测试过)一些使用 levenshtein distance 的示例,并且在添加更多语言之前它似乎工作正常。

"this is a test" gives (shortest distance:) [:english, 13] ...
"esto es una prueba" gives (shortest distance:) [:spanish, 13] ...
4

3 回答 3

11

您是否考虑过使用余弦相似度来确定两个向量之间的相似度? 余弦相似度公式

第一个向量是从测试字符串中提取的字母频率(待分类),第二个向量是针对特定语言的。

您当前正在提取单个字母频率(unigrams)。我建议提取更高阶的 n-gram,例如二元组或三元组(如果你有足够的训练数据,甚至更大)。例如,对于二元组,您将计算“aa”、“ab”、“ac”...“zz”的频率,这将允许您提取比仅考虑单个字符频率更多的信息。

Be careful though, because you need more training data when you use higher order n-grams otherwise you will have many 0-values for character combinations you haven't seen before.

In addition, a second possibility is to use tf-idf (term-frequency inverse-document-frequency) weightings instead of pure letter (term) frequencies.

Research

Here is a good slideshow on language identification for (very) short texts, which uses machine learning classifiers (but also has some other good info).

Here is a short paper A Comparison of Language Identification Approaches on Short, Query-Style Texts that you might also find useful.

于 2013-03-29T20:57:49.870 回答
1

你给出的例子每个都包含一个简短的句子。统计数据表明,如果您的输入较长(例如一段,则应该更容易识别独特的频率。

如果您不能依赖用户提供更长的输入,那么如果字母频率匹配,也许还要寻找语言中的常用词(例如,is、as、and、but ...)?

于 2013-03-29T19:49:17.967 回答
1

n-graphs 肯定会对短文本有所帮助,并且有很大帮助。对于任何合理长度的文本(一段?),简单的字母频率都可以很好地工作。作为一个例子,我写了一个简短的演示,你可以从http://georgeflanagin.com/free.code.php下载源代码

这是页面上的最后一个示例。

于 2013-05-15T17:54:08.533 回答