Python中文词频统计
- 一、注意事项
- 二、代码
- 三、运行结果
一、注意事项
二、代码
- 代码改编自mooc上嵩天老师的Python课程;
- 需要pip安装用于中文词频统计的jieba库;
- 代码简单,注释详细,就不过多解释代码了,虽然注释凌乱;
- 调试过程中,修改代码后,部分无关紧要的注释没有更改;
- 唯一需要注意的是,需要创建一个.txt文件,存放需要统计的文本.然后去main函数里找到’filename’变量,修改代码为该文本存放的路径;
- 完成第5步后,代码可直接运行.
- 英文的词频统计就更简单了,如果不涉及中文,只需要用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()
三、运行结果
文章图片
文章图片
推荐阅读
- shell curl 与 python requests的一次对比
- gem5|WSL 安装 gem5
- jupyter|Jupyter Notebook the sql module is not an ipython extension
- 测试|自动化测试selenium基础篇——webdriverAPI
- 聊聊 Jmeter 如何并发执行 Python 脚本
- spinning|强化学习入门项目spinning up(1)安装
- python|【Python数据科学快速入门系列 | 01】Numpy初窥——基础概念
- 语义分割|【语义分割项目实战】制作语义分割数据集,并使用U-Net进行实战检测
- python|GUI 应用(socket 网络聊天室)