齐普夫定律的验证

编程入门 行业动态 更新时间:2024-10-24 18:25:30

齐普夫<a href=https://www.elefans.com/category/jswz/34/1765475.html style=定律的验证"/>

齐普夫定律的验证

本次作业采用的数据集是1956年至1960年的人民日报数据集。数据集链接:  密码:3g7v




齐普夫定律验证

齐普夫定律是美国学者G.K.齐普夫于20世纪40年代提出的词频分布定律。它可以表述为:如果把一篇较长文章中每个词出现的频次统计起来,按照高频词在前、低频词在后的递减顺序排列,并用自然数给这些词编上等级序号,即频次最高的词等级为1,频次次之的等级为2,……,频次最小的词等级为D。若用f表示频次,r表示等级序号,则有fr=C(C为常数)。人们称该式为齐普夫定律。

一.使用汉字验证齐普夫定律。

实验代码如下


  
files_path = file_name(r'D:\pycharm\pycharmProject2\自然语言处理\齐普夫定律验证\PeoplePaper1946-1949')
res = getCharacter(files_path)
showPlt(res)

# -*- coding: utf-8 -*-
# author: Yufeng Song
from nltk import FreqDist
import os
import matplotlib
import matplotlib.pyplot as pltdef file_name(file_dir):L = []for root, dirs, files in os.walk(file_dir):for file in files:if os.path.splitext(file)[1] == '.txt':L.append(os.path.join(root, file))return Ldef getCharacter(files_path):res = {}for i in range(1, len(files_path)):path = files_path[i]for x in open(path, 'rb').read().decode('utf-8'):if 19968 <= ord(x) <= 40869:res[x] = res.get(x, 0) + 1def showPlt(res):res1 = sorted(res.items(), key=lambda x: x[1], reverse=True)  # 不是在原来上修改ranks = []freqs = []for rank, value in enumerate(res1):  # 0 ('的', 87343)ranks.append(rank + 1)freqs.append(value[1])rank += 1plt.loglog(ranks, freqs)plt.xlabel('汉字频数', fontsize=14, fontweight='bold', fontproperties='SimHei')plt.ylabel('汉字名次', fontsize=14, fontweight='bold', fontproperties='SimHei')plt.grid(True)plt.show()files_path = file_name(r'D:\pycharm\pycharmProject2\自然语言处理\齐普夫定律验证\PeoplePaper1946-1949')
res = getCharacter(files_path)
showPlt(res)

实验结果如图:

 

图 1

可以看出实验结果基本满足齐普夫定律。

这是统计的字的结果;

可以看出“的”,“一”的频率最高,在图1的前面一小段中是非常符合齐普夫定律的。

可以看出有大量出现一次的字,这是导致图1后半部分误差较大的可能原因啊。

 

 

二.使用词语验证齐普夫定律

代码如下:

# -*- coding: utf-8 -*-
# author: Yufeng Song
# -*- coding: utf-8 -*-
from nltk import FreqDist
import os
import matplotlib
import matplotlib.pyplot as plt
import jieba#返回目录下文件所有的绝对路径,不管是子目录还是孙目录,
def file_name(file_dir):L = []for root, dirs, files in os.walk(file_dir):for file in files:if os.path.splitext(file)[1] == '.txt':L.append(os.path.join(root, file))return L#得到所有的词语,以字典的方式存储起来
def getChineseTerms(files_path):res = {}for i in range(len(files_path)):filename = files_path[i]with open(filename, 'rb') as f:mytext = f.read().decode('utf-8')mytext = " ".join(jieba.cut(mytext))#得到具体的词语# print(mytext)myword = [i for i in mytext.strip().split() if len(i) >= 2]  # split默认将所有的空格删除# print(myword)for j in myword:res[j] = res.get(j, 0) + 1return res#画图显示
def showPlt(res):# res1 = sorted(res.items(), key=lambda x: x[1], reverse=True)  # 不是在原来上修改# print(res1)ranks = []freqs = []for rank, value in enumerate(res1):  # 0 ('的', 87343)ranks.append(rank + 1)freqs.append(value[1])rank += 1plt.loglog(ranks, freqs)plt.xlabel('词语频数', fontsize=14, fontweight='bold', fontproperties='SimHei')plt.ylabel('词语名次', fontsize=14, fontweight='bold', fontproperties='SimHei')plt.grid(True)plt.show()if __name__ == '__main__':files_path = file_name(r'D:\pycharm\pycharmProject2\自然语言处理\齐普夫定律验证\PeoplePaper1946-1949')# files_path = file_name(r'D:\pycharm\pycharmProject2\自然语言处理\齐普夫定律验证\PeoplePaper1946-1949\1946')res = getChineseTerms(files_path)res1 = sorted(res.items(), key=lambda x: x[1], reverse=True)print(res1)showPlt(res1)

实验结果如下:

可以看出使用词语比使用汉字有更好的结果。这可能与汉语较多使用词语表达意思有关。

这是统计的词语的部分结果。

三.结论与思考

词频分布规律是有较为丰富内涵的,学术界认为正态分布是描述自然科学的典型分布,而齐普夫分布将成为揭示社会科学规律的典型分布。

目前针对齐普夫定律有两个主要的假说:

1.“省力法则”假说。提出这一假说的是齐普夫。他认为,在语言交流过程中,“省力法则”同时体现在说话人和听话人身上。说话人希望组成语言的词少,而且一词多义,以节省其精力。听话人认为最好是一词一义,使听到的词与其确切涵义容易匹配,减少他理解的功夫。这2种节省精力的倾向最后平衡的结果,便是词频的那种双曲线型分布。

2.“成功产生成功”假说。这方面以H.A.西蒙的研究最为著名。西蒙构造了一个概率模型,他所作的一个重要假说是:在文献中,一词使用的次数越多,则再次使用的可能性越大。该模型最后导出的分布与齐普夫分布相当接近, 普赖斯后来建立了一个相类似的模型,又明确地提出了“成功产生成功”的假说。

更多推荐

齐普夫定律的验证

本文发布于:2024-03-13 10:38:32,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1733797.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:定律   齐普夫

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!