本教程演示如何使用Python处理Zipf定律这一统计概念,并展示Python在处理该定律时读取和排序大型文本文件的效率。
您可能想知道Zipf分布这个术语是什么意思。要理解这个术语,我们首先需要定义Zipf定律。别担心,我会尽量简化说明。
Zipf定律简单来说就是:在一个大型自然语言语料库中,最频繁出现的词的出现频率大约是第二频繁词的两倍,是第三频繁词的三倍,是第四频繁词的四倍,以此类推。
让我们来看一个例子。如果您查看美国英语的Brown语料库,您会注意到最频繁出现的词是“the”(出现69,971次)。第二频繁出现的词“of”出现了36,411次。
“the”约占Brown语料库词汇的7%(100万多个词中的69,971个)。而“of”约占语料库的3.6%(大约是“the”的一半)。因此,我们可以看到Zipf定律适用于这种情况。
因此,Zipf定律试图告诉我们,少量项目通常占据我们观察到的活动的大部分。例如,少数疾病(癌症、心血管疾病)占死亡人数的大部分。这也适用于在文学作品中占据大部分词频的词语,以及我们生活中许多其他的例子。
在继续之前,让我向您介绍我们将在此教程中使用的实验数据。我们的数据来自Project Gutenberg网站上提供的《德古拉》文本版。
在下载上一节中的数据后,让我们开始构建Python脚本,它将查找dracula.txt中数据的Zipf分布。
第一步是使用read()
函数读取文件。
由于我们将查找模式(即单词),因此正则表达式派上用场。我们将使用Python的b[A-Za-z][a-z]{2,9}b
来去除任何不是传统意义上单词的词语。例如,它不会匹配robotics_89、40_pie_40和BIGmango。“BIGmango”不匹配是因为它开头包含多个大写字母。
这个正则表达式基本上告诉我们查找所有以字母(大写或小写)开头,后跟至少2个字符且不超过9个字符的字母序列的单词。换句话说,输出中包含的单词大小范围为3到10个字符。
在Python中,这可以表示为:
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
在这里,如果单词尚未在单词列表中找到,我们使用enumerate()
函数遍历值,以便我们还可以跟踪不同单词的索引位置,而不是引发for循环错误。
然后将最频繁单词的频率除以其他单词的频率来计算它们的比率。这使我们能够查看Zipf定律的遵循程度。
在了解了程序的不同构建块之后,让我们看看它们是如何组合在一起的:
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分布中,我们可以验证Zipf定律,即一些词(高频词)代表大部分词,例如“the”、“and”、“that”、“was”和“for”。
在本教程中,我们看到了Python如何简化对Zipf定律等统计概念的处理。特别是当处理大型文本文件时,Python非常方便,如果我们手动查找Zipf分布,则需要大量时间和精力。正如我们所看到的,我们能够快速加载、解析并找到大小为28 MB的文件的Zipf分布。并且由于Python的字典,排序输出也很简单。
此文章已更新,并包含Monty Shokeen的贡献。Monty是一位全栈开发人员,他还喜欢编写教程和学习新的JavaScript库。
以上是如何使用Python查找文本文件的ZIPF分布的详细内容。更多信息请关注PHP中文网其他相关文章!