Python+jieba+wordcloud实现文本分词、词频统计、条形图绘制及不同主题的词云图绘制

目录

  • 序言:第三方库及所需材料
  • 函数模块介绍
    • 分词
    • 词频统计
    • 条形图绘制
    • 词云绘制
    • 主函数
  • 效果预览
  • 全部代码

序言:第三方库及所需材料

编程语言:Python3.9。
编程环境:Anaconda3,Spyder5。
使用到的主要第三方库:jieba-0.42.1,wordcloud-1.8.2.2,matplotlib-3.5.1。

  • 文本数据:txt格式,本文以2023年内蒙古自治区政府工作报告为例,命名为“2023.txt”。
  • 停用词:“cn_stopwords.txt”,网络下载
  • 字体文件:tff格式,本文使用方正粗黑宋简体,命名为“fzch.tff”
  • 主题背景图片:本文使用白底内蒙古自治区地图,命名为“R-C.png”

以上文件置于py文件的同级目录下,使用相对路径读取。

函数模块介绍

具体的代码可见全部代码部分,这部分只介绍思路和相应的函数模块

分词

在主函数中读取文本数据,调用分词函数cutWord,使用jieba分词库和停用词表对文本进行分词操作,并返回词语组成的列表。

def cutWord(text):     
    words=jieba.cut(text)
    stopwords = {}.fromkeys([ line.rstrip() for line in open('cn_stopwords.txt',encoding='utf-8') ])
    finalwords = []
    for word in words:
        if word not in stopwords:
            if (word != "。" and word != ",") :
                finalwords.append(word) 
    return finalwords

词频统计

将词语列表传入词频统计函数countWord,去除单字词和换行符后,统计各词语出现的频率,并返回各词语的频数列表。

def countWord(text):
    counts={}
    for word in text: 
        if len(word) == 1 or word=='\n':#单个词和换行符不计算在内
            continue
        else:
            if word not in counts.keys():
                counts[word]=1
            else:
                counts[word]+=1
    return counts

条形图绘制

将词频字典传入高频词条形图绘制函数drawBar,根据注释传入参数,选择前RANGE项词语和图像横竖

def drawBar(countdict,RANGE, heng):
    #函数来源于:https://blog.csdn.net/leokingszx/article/details/101456624,有改动
    #dicdata:字典的数据。
    #RANGE:截取显示的字典的长度。
    #heng=0,代表条状图的柱子是竖直向上的。heng=1,代表柱子是横向的。考虑到文字是从左到右的,让柱子横向排列更容易观察坐标轴。
    by_value = sorted(countdict.items(),key = lambda item:item[1],reverse=True)
    print(by_value[:20])
    x = []
    y = []
    plt.figure(figsize=(9, 6))
    for d in by_value:
        x.append(d[0])
        y.append(d[1])
    if heng == 0:
        plt.bar(x[0:RANGE], y[0:RANGE])
        plt.show()
        return 
    elif heng == 1:
        plt.barh(x[0:RANGE], y[0:RANGE])
        plt.show()
        return 
    else:
        return "heng的值仅为0或1!"

词云绘制

将词语列表传入词云绘制函数drawWordCloud,绘制词云图。进一步地,将词语列表传入词云绘制函数drawWordCloudwithMap,以内蒙古自治区地图为背景绘制词云图。

def drawWordCloud(textList):
    wc = WordCloud(font_path ="fzch.ttf",background_color="white",width=1800,height=1200).fit_words(countdict)
    plt.figure(figsize=(18, 12))
    plt.imshow(wc)
    plt.axis("off")
    plt.show()
    
def drawWordCloudwithMap(textList):
    d = path.dirname(__file__)
    map_coloring = np.array(Image.open(path.join(d, "R-C.png")))  
    wc = WordCloud(font_path ="fzch.ttf",mask=map_coloring,background_color="white",width=1800,height=1200).fit_words(countdict)
    plt.figure(figsize=(18, 12))
    plt.imshow(wc)
    plt.axis("off")
    plt.show()

主函数

if __name__ == "__main__":
    with open('2023.txt','r',encoding='utf-8') as f:
        text=f.read()#读取文本
        cutText=cutWord(text)#jieba分词
        countdict=countWord(cutText)#生成词频字典
        drawBar(countdict,10,0)#绘制词语出现次数前10的竖向条形图 
        drawBar(countdict,20,1)#绘制词语出现次数前20的横向条形图        
        drawWordCloud(cutText)#绘制词云图
        drawWordCloudwithMap(cutText)#以地图为背景绘制词云图

效果预览

Python+jieba+wordcloud实现文本分词、词频统计、条形图绘制及不同主题的词云图绘制_第1张图片
Python+jieba+wordcloud实现文本分词、词频统计、条形图绘制及不同主题的词云图绘制_第2张图片
Python+jieba+wordcloud实现文本分词、词频统计、条形图绘制及不同主题的词云图绘制_第3张图片

Python+jieba+wordcloud实现文本分词、词频统计、条形图绘制及不同主题的词云图绘制_第4张图片

全部代码

# -*- coding: utf-8 -*-
# @Time    : 2023/11/22
# @Author  : Ryo_Yuki
# @Software: Spyder

import jieba
import jieba.analyse
from wordcloud import WordCloud
import matplotlib.pyplot as plt
import numpy as np
from PIL import Image
from os import path
plt.rcParams['font.sans-serif'] = ['SimHei']  # 用来正常显示中文标签

def cutWord(text):     
    words=jieba.cut(text)
    stopwords = {}.fromkeys([ line.rstrip() for line in open('cn_stopwords.txt',encoding='utf-8') ])
    finalwords = []
    for word in words:
        if word not in stopwords:
            if (word != "。" and word != ",") :
                finalwords.append(word) 
    return finalwords

def countWord(text):
    counts={}
    for word in text: 
        if len(word) == 1 or word=='\n':#单个词和换行符不计算在内
            continue
        else:
            if word not in counts.keys():
                counts[word]=1
            else:
                counts[word]+=1
    return counts

def drawBar(countdict,RANGE, heng):
    #函数来源于:https://blog.csdn.net/leokingszx/article/details/101456624,有改动
    #dicdata:字典的数据。
    #RANGE:截取显示的字典的长度。
    #heng=0,代表条状图的柱子是竖直向上的。heng=1,代表柱子是横向的。考虑到文字是从左到右的,让柱子横向排列更容易观察坐标轴。
    by_value = sorted(countdict.items(),key = lambda item:item[1],reverse=True)
    print(by_value[:20])
    x = []
    y = []
    plt.figure(figsize=(9, 6))
    for d in by_value:
        x.append(d[0])
        y.append(d[1])
    if heng == 0:
        plt.bar(x[0:RANGE], y[0:RANGE])
        plt.show()
        return 
    elif heng == 1:
        plt.barh(x[0:RANGE], y[0:RANGE])
        plt.show()
        return 
    else:
        return "heng的值仅为0或1!"

def drawWordCloud(textList):
    wc = WordCloud(font_path ="fzch.ttf",background_color="white",width=1800,height=1200).fit_words(countdict)
    plt.figure(figsize=(18, 12))
    plt.imshow(wc)
    plt.axis("off")
    plt.show()
    
def drawWordCloudwithMap(textList):
    d = path.dirname(__file__)
    map_coloring = np.array(Image.open(path.join(d, "R-C.png")))  
    wc = WordCloud(font_path ="fzch.ttf",mask=map_coloring,background_color="white",width=1800,height=1200).fit_words(countdict)
    plt.figure(figsize=(18, 12))
    plt.imshow(wc)
    plt.axis("off")
    plt.show()
    
#主函数
if __name__ == "__main__":
    with open('2023.txt','r',encoding='utf-8') as f:
        text=f.read()#读取文本
        cutText=cutWord(text)#jieba分词
        countdict=countWord(cutText)#生成词频字典
        drawBar(countdict,10,0)#绘制词语出现次数前10的竖向条形图 
        drawBar(countdict,20,1)#绘制词语出现次数前20的横向条形图        
        drawWordCloud(cutText)#绘制词云图
        drawWordCloudwithMap(cutText)#以地图为背景绘制词云图

你可能感兴趣的:(Python,python,词频统计,词云绘制)