如何测量或找到Zipf分布?例如,我有一个英语单词的语料库。如何找到Zipf分布?我需要找到Zipf的分布,然后绘制一个图表。但我陷入了寻找Zipf分布的第一步。
编辑:从每个单词的频率计数来看,它显然遵守Zipf定律。但我的目的是绘制一个zipf分布图。我不知道如何计算分布图的数据

最佳答案

我不假装懂统计数字。然而,基于对scipy site的阅读,这里有一个在python中的天真尝试。
生成数据
首先我们得到数据。例如,我们从国家医学图书馆MeSH(医学主题标题)ASCII文件d2016.bin (28 MB)下载数据。
接下来,我们打开文件,转换成字符串。

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)

最后,我们准备了一个dict,其中独特的单词作为关键字,单词计数作为值。
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()

情节
python - Zipf分布:如何测量Zipf分布-LMLPHP

09-04 14:38