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

Python中文词频统计

  • 一、注意事项
  • 二、代码
  • 三、运行结果

一、注意事项

  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 = []
    #单词数组-作为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 words
     
def 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使用turtle库+jieba库完成简易中文词频统计,附代码_第1张图片
Python使用turtle库+jieba库完成简易中文词频统计,附代码_第2张图片

你可能感兴趣的:(Python,python)