如何计算字母频率相似度?

时间:2013-03-29 19:38:52

标签: text nlp levenshtein-distance letter

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

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距离的一些例子,它似乎在你添加更多语言之前工作正常。

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

3 个答案:

答案 0 :(得分:11)

您是否考虑过使用cosine similarity来确定两个向量之间的相似程度? cosine similarity formula

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

您目前正在提取单字母频率(unigrams)。我建议提取高阶n-grams,例如bigrams或trigrams(如果你有足够的训练数据,甚至更大)。例如,对于双字母,您可以计算" aa"," ab"," ac" ..." zz",与您考虑单个字符频率相比,它可以提取更多信息。

但要小心,因为当你使用更高阶的n-gram时你需要更多的训练数据,否则你将有很多0值用于你以前见过的角色组合。

此外,第二种可能性是使用tf-idf(term-frequency inverse-document-frequency)加权而不是纯字母(term)频率。

研究

这是language identification for (very) short texts上的一个很好的幻灯片,它使用机器学习分类器(但也有一些其他好的信息)。

以下是您可能会觉得有用的简短论文A Comparison of Language Identification Approaches on Short, Query-Style Texts

答案 1 :(得分:1)

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

如果您不能依赖用户提供更长的输入,或者如果字母频率匹配,也可以在语言中查找常用词(例如,as,as,和...)?

答案 2 :(得分:1)

n-graph肯定会有助于短文,并提供很多帮助。使用任何合理长度的文本(段落?),简单的字母频率效果很好。作为一个例子,我写了一个简短的演示,您可以在http://georgeflanagin.com/free.code.php

下载源代码

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