#英文单词词频统计 import turtle #引入turtle库 ##定义全局变量## #词频排列显示个数 count=10 #单词频率数组——作为y轴数据 data=[] #单词数组——作为x轴数据 words=[] #y轴显示放大倍数——可以词频数量进行调节 yscale=10 #x轴显示放大倍数——可以根据count数量进行调节 xscale=60 ######################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) ###以上两个函数中t是用于绘制的turtle对象 ####定义drawgraph()实现完整的统计图绘制 def drawgraph(t): #绘制x/y轴线 drawline(t,0,0,700,0) drawline(t,0,360,0,0) #x轴:坐标及描述 for x in range(count): x=x+1#向右移一位,为了不画在原点上 drawtext(t,x*xscale-4,-20,words[x-1]) drawtext(t,x*60-4,data[x-1]*yscale+10,data[x-1]) drawbar(t) #绘制一个柱体 def drawrectangle(t,x,y): x=x*xscale y=y*yscale #以上是显示放大倍数 drawline(t,x-10,0,x-10,y) drawline(t,x-10,y,x+10,y) drawline(t,x+10,y,x+10,0) drawline(t,x+10,0,x-10,0) #绘制多个柱体 def drawbar(t): for i in range(count): drawrectangle(t,i+1,data[i]) ####定放对文本的每一行计算词频的函数 processline() def processline(line,wordcounts): #用空格替换标点符号 line=replacepunctuations(line) #从每一行获取每个词 words=line.split() for word in words: if word in wordcounts:#对每个出现的词在字典wordcounts中查找 wordcounts[word]+=1#如果该词出现过,为计数器加1 else: wordcounts[word]=1#否则为字典增加新的一项 """字典的键是单词的字符串类型,字典的值为单词出现的频率""" ###定义用空格替换标点的函数replaceunctuations() def replacepunctuations(line): for ch in line: if ch in "~@#$%^&*()!_-+=<>?/,.:;{}[]|\'""": line=line.replace(ch," ") return line def main(): #用户输入一个文件名 filename=input("Enter a filename:").strip()#用strip方法去掉开头结尾处的空格 infile=open(filename,"r") #建立用于词频统计的空字典 wordcounts={}#此处要用{ } for line in infile: processline(line.lower(),wordcounts) #lower()将所有大写字母都变为小写,processline()写入字典 #从字典中获取数据对 parirs=list(wordcounts.items())#从字典中获取数据对,存入列表pairs #列表中的数据对交换位置,数据对排序 items=[[x,y] for (y,x) in parirs] #字典中是键值对,交换位置目的是把值放在前面 items.sort()#用sort()对数据进行排序,按值进行排序 #输出count个数词频结果 for i in range(len(items)-1,len(items)-count-1,-1): """range(start, stop, step) 参数说明: start: 计数从 start 开始。默认是从 0 开始。例如range(5)等价于range(0, 5); stop: 计数到 stop 结束,但不包括 stop。例如:range(0, 5) 是[0, 1, 2, 3, 4]没有5 step:步长,默认为1。例如:range(0, 5) 等价于 range(0, 5, 1)""" print(items[i][1],'\t',str(items[i][0])) data.append(items[i][0]) words.append(items[i][1]) #根据词频结果绘制柱状图 turtle.title('词频结果柱状图') turtle.setup(900,750,0,0)#建立图形窗口 t=turtle.Turtle()#初始化画笔 t.hideturtle()#隐藏画笔形状 t.width(3)#定义画笔宽度 drawgraph(t)#调用自己定义的绘制图形函数 #调用main()函数 main()