续集:【多线程实现】python使用tkinter库实现自定义的词云图和top10词频统计

上一篇已经介绍了整体实现过程,这一篇主要是介绍多线程的知识点。

https://blog.csdn.net/dhjabc_1/article/details/105387870

Python提供了 _thread 和 threading 两个线程模块,_thread 是低级模块,threading 对 _thread 进行了封装,提高了 _thread 原有功能的易用性以及扩展了新功能,通常我们只需要使用 threading 模块。

import threading
def run(n):
  print('运行线程',n)
for i in range(5):     # 创建5个线程
    t = threading.Thread(target=run, args=(i,))    # 线程运行的函数和参数
    t.setDaemon(True)   # 设置为守护线程(在主线程线程结束后自动退出,默认为False即主线程线程结束后子线程仍在执行)
    t.start()   # 启动线程

相关参数如下:

start   线程准备就绪,等待CPU调度

setName  为线程设置名称

getName 获取线程名称

setDaemon 设置为后台线程或前台线程(默认)

如果是后台线程,主线程执行过程中,后台线程也在进行,主线程执行完毕后,后台线程不论成功与否,均停止

如果是前台线程,主线程执行过程中,前台线程也在进行,主线程执行完毕后,等待前台线程也执行完成后,程序停止

join 逐个执行每个线程,执行完毕后继续往下执行,该方法使得多线程变得无意义

run 线程被cpu调度后自动执行线程对象的run方法

这种方式,无法实现获取函数的返回值,如果需要获取返回值,那么就需要使用继承的方式实现,本案例通过继承的方式实现。

import threading
class base_run(threading.Thread):
    def __init__(self, arg1,arg2,arg3):
        super(base_run, self).__init__()
        self.arg1 = arg1   #原始文件
        self.arg2 = arg2   #图像文件
        self.arg3 = arg3   #输出词云文件
        self.result = []
        self.flag = True
    def run(self):
        self.result,self.flag = base(self.arg1,self.arg2,self.arg3)
        print(self.result)
        print(self.flag)
    def get_result(self):
        return self.result
    def get_flag(self):
        return self.flag

实现整体的词频统计和词云图生成的核心代码:

def base(source_file,source_image,result_image):
    try:
        fn = open(source_file, encoding="utf-8")  # 打开文件
        text = fn.read()  # 读出整个文件
        # print(text)
        fn.close()  # 关闭文件
    except:
        try:
            fn = open(source_file, encoding="gbk")  # 打开文件
            text = fn.read()  # 读出整个文件
            # print(text)
            fn.close()  # 关闭文件
        except:
            print('无法打开文件')

    # 文本预处理
    # 定义正则表达式匹配模式,将符合模式的字符去除
    pattern = re.compile(u'\t|\n|\.|-|:|;|\)|\(|\?|"|、|,|。| |”|“|;')
    text = re.sub(pattern, '', text)

    # 进行词频统计
    text_list = jieba.cut(text, cut_all=False)
    # 定义去除词典
    stop_words = [u'的',u'多',u'把', u',', u'和', u'是', u'随着', u'对于', u'对', u'等', u'能', u'都', u'。',
                  u' ', u'、', u'中', u'在', u'了', u'通常', u'如果', u'我们', u'需要']  # 自定义去除词库

    new_text_list = []
    for word in text_list:  # 循环读出每个分词
        if word not in stop_words:  # 如果不在去除词库中
            new_text_list.append(word)  # 分词追加到列表
            # print(word)
    # 按照去重词库更新词频统计
    text_list = collections.Counter(new_text_list)  # 对分词做词频统计
    word_counts_top10 = text_list.most_common(10)  # 获取前10最高频的词

    mask = np.array(Image.open(source_image))  # 定义词频背景
    # mask = ImageColorGenerator(back_img)
    w_cloud = WordCloud(
        font_path="c:\windows\Fonts\simhei.ttf",
        background_color='white',
        width=1000,
        height=600,
        mask=mask).generate_from_frequencies(text_list)
    # 输出成图片:
    w_cloud.to_file(result_image)

    return word_counts_top10,False

最终该多线程的核心代码为:(保存的文件名为:base_final.py)

import jieba
import collections
import re # 正则表达式库
from wordcloud import ImageColorGenerator
from wordcloud import WordCloud
from PIL import Image # 图像处理库
import numpy as np # numpy数据处理库
import threading
class base_run(threading.Thread):
    def __init__(self, arg1,arg2,arg3):
        super(base_run, self).__init__()
        self.arg1 = arg1   #原始文件
        self.arg2 = arg2   #图像文件
        self.arg3 = arg3   #输出词云文件
        self.result = []
        self.flag = True
    def run(self):
        self.result,self.flag = base(self.arg1,self.arg2,self.arg3)
        print(self.result)
        print(self.flag)
    def get_result(self):
        return self.result
    def get_flag(self):
        return self.flag
def base(source_file,source_image,result_image):
    try:
        fn = open(source_file, encoding="utf-8")  # 打开文件
        text = fn.read()  # 读出整个文件
        # print(text)
        fn.close()  # 关闭文件
    except:
        try:
            fn = open(source_file, encoding="gbk")  # 打开文件
            text = fn.read()  # 读出整个文件
            # print(text)
            fn.close()  # 关闭文件
        except:
            print('无法打开文件')

    # 文本预处理
    # 定义正则表达式匹配模式,将符合模式的字符去除
    pattern = re.compile(u'\t|\n|\.|-|:|;|\)|\(|\?|"|、|,|。| |”|“|;')
    text = re.sub(pattern, '', text)

    # 进行词频统计
    text_list = jieba.cut(text, cut_all=False)
    # 定义去除词典
    stop_words = [u'的',u'多',u'把', u',', u'和', u'是', u'随着', u'对于', u'对', u'等', u'能', u'都', u'。',
                  u' ', u'、', u'中', u'在', u'了', u'通常', u'如果', u'我们', u'需要']  # 自定义去除词库

    new_text_list = []
    for word in text_list:  # 循环读出每个分词
        if word not in stop_words:  # 如果不在去除词库中
            new_text_list.append(word)  # 分词追加到列表
            # print(word)
    # 按照去重词库更新词频统计
    text_list = collections.Counter(new_text_list)  # 对分词做词频统计
    word_counts_top10 = text_list.most_common(10)  # 获取前10最高频的词

    mask = np.array(Image.open(source_image))  # 定义词频背景
    # mask = ImageColorGenerator(back_img)
    w_cloud = WordCloud(
        font_path="c:\windows\Fonts\simhei.ttf",
        background_color='white',
        width=1000,
        height=600,
        mask=mask).generate_from_frequencies(text_list)
    # 输出成图片:
    w_cloud.to_file(result_image)

    return word_counts_top10,False

最终输出效果如下:

发布了15 篇原创文章 · 获赞 16 · 访问量 447

猜你喜欢

转载自blog.csdn.net/dhjabc_1/article/details/105391740
今日推荐