Python|Python使用turtle库+jieba库完成简易中文词频统计,附代码


Python中文词频统计

  • 一、注意事项
  • 二、代码
  • 三、运行结果
【Python|Python使用turtle库+jieba库完成简易中文词频统计,附代码】
一、注意事项
  1. 代码改编自mooc上嵩天老师的Python课程;
  2. 需要pip安装用于中文词频统计的jieba库;
  3. 代码简单,注释详细,就不过多解释代码了,虽然注释凌乱;
  4. 调试过程中,修改代码后,部分无关紧要的注释没有更改;
  5. 唯一需要注意的是,需要创建一个.txt文件,存放需要统计的文本.然后去main函数里找到’filename’变量,修改代码为该文本存放的路径;
  6. 完成第5步后,代码可直接运行.
  7. 英文的词频统计就更简单了,如果不涉及中文,只需要用str.split()用split函数利用英文词与词之间的空格分词即可,连jieba库都不需要用到。
二、代码
import turtle import jieba ##全局变量## #词频排列显示个数 #去除符号---去除无意义的词汇 count = 19 #单词频率数组-作为y轴数据 data = https://www.it610.com/article/[] #单词数组-作为x轴数据 words = []yScale = 1 #两个相邻频数每相差1,柱体就在y轴上高yScale个像素。y轴显示放大倍数-可以根据频数大小进行调节xScale = 30 #两个相邻词之间相距的像素距离,x轴显示放大倍数-可以根据count数量进行调节banC=['的','而','是','好','着','了','又','在','一个','是的','可以','说','有','如','之','于','以','也','这','这样','\u3000','或', '和','新','等','为','要']#忽略统计的无用词 ################# Turtle Start#################### #从点(x1,y1)到(x2,y2)绘制线段 def drawLine(t, x1, y1, x2, y2):#(x1,y1)是起始点,(x2,y2)为终止点,其间路径为所画线条 t.penup() t.goto (x1, y1) t.pendown() t.goto (x2, y2)# 在坐标(x,y)处写文字 def drawText(t, x, y, text): t.penup() t.goto (x, y) t.pendown() t.write(text)def drawGraph(t): #绘制x/y轴线 drawLine (t, 0, 0,580 , 0)#从(0,0)画到(360,0)的x轴线 drawLine (t, 0, 380, 0, 0)#从点(0,300)逆向画到(0,0)的y轴线#x轴: 坐标及描述 for x in range(count): x=x+1 #向右移一位,为了不画在原点或轴线上上 drawText(t, x*xScale-4, -20, (words[x-1]))#在x轴下方20像素处添加文字。words[]是存放有前十高频词的列表,因为x避免原点+1所以还要-1,横坐标首先于count全局变量 drawText(t, x*xScale-4, data[x-1]*yScale+10, data[x-1]) #在柱体上方10个像素处添加文字描述。data[]是存有频数的列表。 drawBar(t)#绘制一个柱体 def drawRectangle(t, x, y): x = x*xScale y = y*yScale#放大倍数显示 drawLine(t, x-5, 0, x-5, y) drawLine(t, x-5, y, x+5, y) drawLine(t, x+5, y, x+5, 0) drawLine(t, x+5, 0, x-5, 0)#绘制多个柱体 def drawBar(t): for i in range(count): drawRectangle(t, i+1, data[i]) ################# Turtle End#####################对文本的每一行计算词频的函数 def processLine(line, wordCounts): #替换标点符号,用获得的该行内容做参数传递给替换符号函数,增添空格。 line = replacePunctuations(line)"""从每一行获取每个词,无符号的字符串words = line.split()#分词成以每个字符串单词为元素的列表"""#这句是英文分词的,我们用了jieba所以用不到words=jieba.lcut(line)words=replaceWords(words)#去掉空格分隔符,每个词作为一个列表元素,每个元素都是一个字符串for word in words: #遍历列表,word抽象指列表里的一个元素,即一个词,字符串类型 if word in wordCounts: #字典的判断操作,word代表字符类型的键,如果有这个键,值加1,没有则添加字点元素,并赋值为一。 wordCounts[word] += 1# 键是字符类型,值是数字类型,梳子类型才能值加1 else: wordCounts[word] = 1#给字典添加一项#空格替换标点的函数 def replacePunctuations(line): for ch in line: if ch in "~@#$%^&*()_-+=<>?/,.:; {}[]|\',。/《》?;‘:“【】{}()——+-=*&……%¥#@!:/、|~!。..`~·~、——-() ’”“:~· \n""": line = line.replace(ch, "") return line#这是删除常见介词、连词、代词的函数,注意修改的是列表,而列表是可变的,参数不需要return来传递 def replaceWords(words): words1=words[:] for word in words: if word in banC: words1.remove(word) words=words1 return wordsdef main(): filename = 'D:\Python的文件\Code\中文词频统计并画表.txt' infile = open(filename, "r")#建立用于计算词频的空字典 wordCounts = {} for line in infile: #一行行的数据处理 processLine(line.lower(), wordCounts) #传递一行元素数据(带标点),以及一个空字典,对数据进行处理,由于字典是可变类型,子函数里改变会影响主函数#从字典中获取数据对,键值对的列表,是所有内容的pairs = list(wordCounts.items())#虽然.items()得到的不完全是列表类型,用了list()转化。但似乎多此一举,因为下面的列表解析式[[x,y]for (y,x)in pairs] 强制得到一个元素为二元列表(键和值是元)的列表。#列表中的数据对交换位置,数据对排序 items = [[x,y]for (y,x)in pairs] #列表解析式,得到一个元素为二元(值与键)列表的列表 items.sort() #换序的原因是sort根据第一元来排序,所以把数字放到首位,由小到大排序。#输出count个数词频结果 for i in range(len(items)-1, len(items)-count-1, -1):#从高位len(items)-1到低位len(items)-count-1(不包括该位),以-1逐级递减,倒序,共count个数字,高位减低位个。(高频率,到低频率) print(items[i][1]+"\t"+str(items[i][0]))#打印格式如下:(高频词名‘\t’ 频数 )共统计打印十(count)个词 data.append(items[i][0])#创建data列表,并将10个频数添加进去 words.append(items[i][1])#创建words列表,并将10个词添加进去infile.close()#根据词频结果绘制柱状图 turtle.title('词频结果柱状图') turtle.setup(1920,1060, 0, 0) t = turtle.Turtle()#设置画笔对线t t.hideturtle() t.width(3) drawGraph(t)#调用main()函数main()

三、运行结果 Python|Python使用turtle库+jieba库完成简易中文词频统计,附代码
文章图片

Python|Python使用turtle库+jieba库完成简易中文词频统计,附代码
文章图片

    推荐阅读