Как добавить кривую zipf к гистограмме частоты слов? - PullRequest
0 голосов
/ 04 мая 2020
plt.figure()
plt.bar([key for val,key in lst], [val for val,key in lst])
plt.xlabel("Terms")
plt.ylabel("Counts")
plt.show()

У меня есть список кортежей (count, term), который был отсортирован в порядке убывания count (т. Е. Сколько раз термин появляется в этом документе), и я строю данные, как указано выше. Теперь предположим, что я хочу показать, что распределение терминов нарушает закон Ципфа в компьютерной лингвистике. Могу ли я добавить кривую Ципфа (f = c / rank) к этому графику без изменения оси x? Как?

1 Ответ

1 голос
/ 04 мая 2020

Внутри категориальная ось x пронумерована 0,1,2,.... Чтобы построить кривую в тех же положениях, используйте range(len(lst)) для значений x. Поскольку закон Ципфа вычисляет его значения, начиная с 1, соответствующие значения y можно рассчитать как zipf.pmf(p, alpha), где p равно 1,2,3,..., а alpha - это параметр zipf. Для выравнивания с ненормализованным гистограммой эти значения необходимо умножить на сумму. Этот пост можно использовать, чтобы найти наиболее подходящую альфу.

import matplotlib.pyplot as plt
from scipy.stats import zipf

lst = [(60462, 'Italy'), (46755, 'Spain'), (10423, 'Greece'), (10197, 'Portugal'), (8737, 'Serbia'), (4105, 'Croatia'),
       (3281, 'Bosnia and\nHerzegovina'), (2878, 'Albania'), (2083, 'North\nMacedonia'), (2079, 'Slovenia'),
       (628, 'Montenegro'), (442, 'Malta'), (77, 'Andorra'), (34, 'San Marino'), (34, 'Gibraltar'), (1, 'Holy See')]

plt.bar([key for val, key in lst], [val for val, key in lst], color='limegreen')
alpha = 1.37065874
total = sum([p for p, c in lst])
plt.plot(range(len(lst)), [zipf.pmf(p, alpha) * total for p in range(1, len(lst) + 1)], color='crimson', lw=3)
plt.ylabel("Population")
plt.xticks(rotation='vertical')
plt.tight_layout()
plt.show()

resulting plot

...