Mat*_*lde 8 text nlp letter levenshtein-distance
鉴于此数据(两种语言的相对字母频率):
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,
Run Code Online (Sandbox Code Playgroud)
然后计算字符串"这是一个测试"的字母频率给了我:
"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
Run Code Online (Sandbox Code Playgroud)
那么,将给定的字符串字母频率与语言匹配(并尝试检测语言)的好方法是什么?我已经看过(并已经测试过)使用levenshtein距离的一些例子,它似乎工作正常,直到你添加更多的语言.
"this is a test" gives (shortest distance:) [:english, 13] ...
"esto es una prueba" gives (shortest distance:) [:spanish, 13] ...
Run Code Online (Sandbox Code Playgroud)
Wes*_*ugh 11
您是否考虑过使用余弦相似度来确定两个向量之间的相似度?

第一个矢量是从测试字符串中提取的字母频率(待分类),第二个矢量是特定语言.
您目前正在提取单个字母频率(unigrams).我建议提取更高阶的n-gram,例如bigrams或trigrams(如果你有足够的训练数据,甚至更大).例如,对于双字母,您可以计算"aa","ab","ac"......"zz"的频率,这样您就可以提取比仅考虑单个字符频率时更多的信息.
但是要小心,因为当你使用更高阶的n-gram时你需要更多的训练数据,否则你将有许多0值用于你以前没见过的字符组合.
另外,第二种可能性是使用tf-idf(term-frequency inverse-document-frequency)加权而不是纯字母(term)频率.
这是一个关于(非常)短文本语言识别的好幻灯片,它使用机器学习分类器(但也有一些其他好的信息).
这是一篇简短的论文"短语,查询样式文本的语言识别方法比较",您可能也会发现它很有用.