您的位置:首页 > 编程语言 > Python开发

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

2020-06-01 04:36 344 查看

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

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

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

[code]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方法

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

[code]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

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

[code]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)

[code]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

最终输出效果如下:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: