Распределение Zipf: Как измерить Распределение Zipf
Как мне измерить или найти распределение Zipf? Например, у меня есть корпус английских слов. Как мне найти дистрибутив Zipf? Мне нужно найти распределение Zipf, а затем построить его график. Но я застрял в первом шаге, который должен найти распределение Zipf.
Редактировать: из подсчета частоты каждого слова ясно, что оно подчиняется закону Ципфа. Но моя цель - построить график распределения zipf. Я понятия не имею о том, как рассчитать данные для графика распределения
1 ответ
Я не претендую на понимание статистики. Однако, основываясь на чтении с сайта scipy, здесь наивная попытка python
,
Данные сборки
Сначала мы получаем наши данные. Например, мы загружаем данные из файла ASCII Национальной медицинской библиотеки MeSH ( заголовок медицинского предмета) d2016.bin (28 МБ).
Далее открываем файл, конвертируем в строку.
open_file = open('d2016.bin', 'r')
file_to_string = open_file.read()
Затем мы находим отдельные слова в файле и выделяем слова.
words = re.findall(r'(\b[A-Za-z][a-z]{2,9}\b)', file_to_string)
Наконец, мы готовим слова с уникальными словами в качестве ключа и количеством слов в качестве значений.
for word in words:
count = frequency.get(word,0)
frequency[word] = count + 1
Сборка zipf-данных о распространении
В целях скорости мы ограничиваем данные до 1000 слов.
n = 1000
frequency = {key:value for key,value in frequency.items()[0:n]}
После этого мы получаем частоту значений, конвертируем в numpy
массив и использование numpy.random.zipf
функция рисования образцов из zipf
распределение.
Параметр распределения a =2.
как образец, поскольку он должен быть больше 1. Для наглядности мы ограничиваем данные до 50 точек выборки.
s = frequency.values()
s = np.array(s)
count, bins, ignored = plt.hist(s[s<50], 50, normed=True)
x = np.arange(1., 50.)
y = x**(-a) / special.zetac(a)
И, наконец, график данных.
Собираем все вместе
import re
from operator import itemgetter
import matplotlib.pyplot as plt
from scipy import special
import numpy as np
#Get our corpus of medical words
frequency = {}
open_file = open('d2016.bin', 'r')
file_to_string = open_file.read()
words = re.findall(r'(\b[A-Za-z][a-z]{2,9}\b)', file_to_string)
#build dict of words based on frequency
for word in words:
count = frequency.get(word,0)
frequency[word] = count + 1
#limit words to 1000
n = 1000
frequency = {key:value for key,value in frequency.items()[0:n]}
#convert value of frequency to numpy array
s = frequency.values()
s = np.array(s)
#Calculate zipf and plot the data
a = 2. # distribution parameter
count, bins, ignored = plt.hist(s[s<50], 50, normed=True)
x = np.arange(1., 50.)
y = x**(-a) / special.zetac(a)
plt.plot(x, y/max(y), linewidth=2, color='r')
plt.show()