Python:根据每个字母的频率确定文本语言的最佳方法是什么?

时间:2018-01-10 18:47:27

标签: python-2.7

我在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

1 个答案:

答案 0 :(得分:1)

我认为结构为{'English': {'a': ..., 'b': ..., ... }, 'French': {...}, ...}的词典更有意义,原因有两个:

  1. 您可以立即获得一个字典,其结构与示例文本的频率字典完全相同。

  2. 每种语言都可以有不同的字符集。

  3. 一旦你这样做,一个好的起点是计算你的采样频率和每种语言的频率之间的“距离”。有几个“距离”指标,包括曼哈顿距离和欧几里德距离。尝试其中几个来获取多个数据点来测量“接近度”。