Распределение 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()

участок
введите описание изображения здесь

Другие вопросы по тегам