本文共 2000 字,大约阅读时间需要 6 分钟。
本文尝试用python进行词频统计,待统计的文章如下:
python3源代码如下:
#引入turtle模块,用于绘制结果图
import turtle
#全局变量 #词频排列显示个数,我们只显示出现次数最多的11个单词 count=11 #单词频率数组--作为y轴数据 numbers=[] #单词数组--作为x轴数据 words=[] #y轴显示放大倍数--可以根据词频数量进行调节 yScale=15 #x轴放大倍数--可以根据count数量进行调节 xScale=36 #Turtle Start #从点(x1,y1)到(x2,y2)绘制线段 def drawLine(t,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,420,0) drawLine(t,0,280,0,0) #x轴:坐标及描述 for x in range(count): x=x+1#向右移一位,为了不画在原点上 drawText(t,x*xScale-5,-16,words[x-1]) drawText(t,x*xScale-3,numbers[x-1]*yScale+2,numbers[x-1]) drawBar(t) #绘制一个柱体 def drawRectangle(t,x,y): x=x*xScale y=y*yScale#放大倍数显示 drawLine(t,x-8,0,x-8,y) drawLine(t,x-8,y,x+8,y) drawLine(t,x+8,y,x+8,0) #drawLine(t,x+8,0,x-8,0) #绘制多个柱体 def drawBar(t): for i in range(count): drawRectangle(t,i+1,numbers[i]) #Turtle End #处理文本的每一行,计算每一行的词频 def processLine(line,wordCounts): #用空格替换标点符号 line=replacePunctuations(line) #从每一行获取每个词 words=line.split() for word in words: if word in wordCounts: wordCounts[word]+=1 else: wordCounts[word]=1 #用空格替换掉标点符号 def replacePunctuations(line): for ch in line: if ch in '~@#$%^()_-+=<>?/,.:;{}[]|""': line=line.replace(ch,' ') return line def main(): #用户输入一个文件名 filename=input('enter a filename:').strip() f=open(filename,'r') #建立用于计算词频的空字典,单词为键,出现次数为值 wordCounts={} #处理文本中的每一行 for line in f: processLine(line.lower(),wordCounts) #从字典中获取数据对 pairs=list(wordCounts.items()) #列表中的数据对交换位置,数据对排序 items=[[x,y] for (y,x) in pairs] items.sort()#按照单词出现次数排序(由小到大) #输出最大的count个词频结果(列表中最后count个元素最大) for i in range(len(items)-1,len(items)-count-1,-1): print(items[i][1]+'\t'+str(items[i][0])) numbers.append(items[i][0]) words.append(items[i][1]) f.close() #根据词频结果绘制柱状图 turtle.title('词频结果柱状图') turtle.setup(900,750,0,0) t=turtle.Turtle() t.color('red') t.hideturtle() t.width(2) drawGraph(t) #调用main()函数 if __name__=='__main__': main()运行程序,输入输出如下:
绘制的柱状图如下:
至此,我们完成了词频统计的工作。。。