我在Python 2中编写一个函数,它根据字母频率返回字符串的语言。
我正在使用来自维基百科的名为“其他语言的字母相对频率”的表格。 (https://en.wikipedia.org/wiki/Letter_frequency)
我已经确定了给定文本中每个字母的频率,这是以字典的形式表示的值(键的出现次数/字母总数)。
{'a': 0.2, 'b': 0.05, 'c': 0.01, ...}
我还将表格转换为字典词典,
{'a': {'English': 0.08167, 'French': 0.07363, ...}, 'b': {'English': 0.01492, 'French': 0.0901, ...}, ...}
比较这些值以确定基于频率的语言有哪些好的过程?
解决了 - 这是更新后的代码:
# freq_reference is a dictionary with structure {'English': {'a': freq, 'b': freq, ...}, 'French': {'a': freq, 'b': freq, ...}}
# freq is a dictionary with key = letter, and value = frequency of the letter that appears in the input text
# Manhattan
dis_man = {}
for lang in freq_reference:
dis_man[lang] = 0.0
for key in freq_reference[lang]:
dis_man[lang] += abs(freq_reference[lang][key] - freq[key])
# Euclidean
dis_euc = {}
for lang in freq_reference:
sum = 0.0
for key in freq_reference[lang]:
sum += (freq_reference[lang][key] - freq[key])**2
dis_euc[lang] = sum**(1/2.0)
# find the lang with minimum Manhattan dis
min_man = 100
for lang in dis_man:
if dis_man[lang] < min_man:
min_man = dis_man[lang]
min_lang_man = lang
# find the lang with minimum Eucliedian dis
min_euc = 100
for lang in dis_euc:
if dis_euc[lang] < min_euc:
min_euc = dis_euc[lang]
min_lang_euc = lang
答案 0 :(得分:1)
我认为结构为{'English': {'a': ..., 'b': ..., ... }, 'French': {...}, ...}
的词典更有意义,原因有两个:
您可以立即获得一个字典,其结构与示例文本的频率字典完全相同。
每种语言都可以有不同的字符集。
一旦你这样做,一个好的起点是计算你的采样频率和每种语言的频率之间的“距离”。有几个“距离”指标,包括曼哈顿距离和欧几里德距离。尝试其中几个来获取多个数据点来测量“接近度”。