PySide2、nltk、wordcloud、gensim、sklearn、pyinstaller实现词嵌入可视化、绘制词云图、制作GUI并打包的踩坑总结

2023-05-16

最近有个英语词汇学的期末作业,老师说可以写论文也可以写一个小程序。作为一个学物理的兔子,当然选择写程序啦(误)。不过其中遇到了不少坑,就来总结一下。

首先说一下这个程序的设计思路。其实就是做一个图形界面,主要功能有两个:1用gensim读取模型,搜索相似词,然后用sklearn的TSNE降维,最后用matplotlib画图;2读取一个txt文本,用nltk的tokenizer分词,再做一下词形还原和去除停用词,然后文本分析,最后用wordcloud画一张词云图。代码总体的逻辑还是很简单的,因此就不贴出来了。最后再用pyinstaller打了一个包,主要是怕老师那边没有运行环境。

在这个过程中遇到了不少问题,因此就在这记录一下。

1nltk_data要自己下载,不要通过nltk里的downloader。下载后要放在正确的位置。一般放在C:/或者D:/的根目录下就行。只解压需要用到的压缩包,不要一股脑全解压了。怎么判断需要用?其实很简单,就是在开发环境中看看console里面的报错。缺哪个解压哪个。最关键的来了!如果需要用pyinstaller打包,请把nltk_data中不用的文件都删掉,因为pyinstaller会把nltk_data中的全部文件都复制到dist目录里,然后打包的时间就会很长。最后文件就会很大。特别是corpora里的,解压出来好几个GB,一开始还一脸懵,想为啥打包时间这么长,后面发现大半时间在复制…

2如果要用word2vec,建议直接用预训练模型,比如googlenews-vectors-negative300,因为自己训练的话文本量太少了,模型效果就会很差。不过官方下载需要连接Google drive,我没法连上,最后是找了个网盘链接下载下来的。另外在nltk_data里似乎也有一个模型,在models/word2vector_samples目录下,不过我没用过。好像腾讯也有一些预训练模型,可以自行搜索。如果要针对特别的文本(比如特定体裁或是专业文献)进行分析,可能就需要使用针对性更强的预训练模型,还需要进行增量训练。

3gensim是一次性将模型读入内存的,这导致读取时间很长,也会占用很多内存。我在想能不能用更好的算法,只读入一部分进入内存。不过这样还能找到最类似的词吗(即调用model.wv.most_similar方法)?没有深入研究过源码,因此这点还不能确定。

4一定要用logging写日志。我没大型程序的开发经验,一开始没有写日志。在开发环境中还好,直接看console就行,结果到了发布版就懵逼了,根本不知道错在哪。另外,一开始用pyinstaller打包时不要加-w,因为这样不显示命令行了,然后nltk加载nltk_data失败的信息并没有写到logging里,是只在console里显示的,然后也不报异常,一开始搞得我不知所措。

5打包wordcloud时尤其要注意,其目录下的一个.ttf字库和一个stopwords文件没有被拷贝到dist/…/wordcloud文件夹下,然后在import wordcloud阶段就会直接闪退。看了下源码,它有几个全局的地址常量(我也不知道是不是这么叫的,反正都是大写的字母,按我的理解也许类似java中的static final String,或者类似C里面的宏,不过每个语言的细节都不一样,不能简单类比,而且这里的常量不属于任何一个类),然后或许在import wordcloud时就会把它们加载到内存里?

FILE = os.path.dirname(__file__)
FONT_PATH = os.environ.get('FONT_PATH', os.path.join(FILE, 'DroidSansMono.ttf'))
STOPWORDS = set(map(str.strip, open(os.path.join(FILE, 'stopwords')).readlines()))

因为找不到这个文件,结果就导致程序闪退。我真的…一开始我开发环境中好好的,咋打包后就不行了。搞了半天,最后用了个很傻的办法:打包时不加-w,保留命令行,然后用录屏软件,看闪退前一瞬间命令行的信息。最后才发现是import的问题。难不成以后还要…

tryimport wordcloud
except Exception as e:
	logger.exception("%s", e)

因此我后来就没有在pyinstaller 后面加 -F,这样就不会把它给打包成单个exe文件,然后手动拷贝以上两个文件到dist/…/wordcloud。

6用UIDesigner的时候,别忘了保存。建议最后点一下窗口里的空白部分,然后再ctrl+s,不然如果停留在修改过的对象上,ctrl+s后可能没有将全部修改保存。另外,由于是ui文件,pycharm不会给代码提示,在UIDesigner用的实例名称直接复制过来,自己打可能会打错,IDE也检查不了。另外,ui文件也要拷贝到打包后的根目录下

7用pyinstaller打包,要用纯净的虚拟环境,只pip要用的包。每打一次新的包,记得把dist、build文件夹和.spec文件删掉。不然可能会出现奇奇怪怪的问题,或者打出来的包过大。我还试了一下pipenv,感觉用起来不如pycharm自带的virtualenv来得顺手,而且有一些问题,是什么原因我最后也懒得研究了(ddl要到了)。我中间还试了一下用docker的pyinstaller镜像打包,好像还可以,不过好像也遇到了问题,具体是什么也忘了,因为后来直接放弃了(同样,ddl要到了)。
然后悲催的事情来了,因为装docker,开了Hyper-V啥的,我的MuMu打不开了(一开就蓝屏),试了半天都不行,包括在控制面板中关闭Hyper-V功能,在计算机管理里停止Hyper-V和VMware服务,或者在BOIS里打开VT。最后我放弃了,直接下载了最新版的MuMu,它提示检测到Hyper-V,需要关闭,我点确认,然后…就成功了。哎…昨晚痛失30勾玉。

8绘制降维后的聚类图,除了向TSNE算法输入要显示的词向量外,还要输入若干(至少1000吧)个无需在图中显示的词向量(也不要把模型中的词向量全部输入了,不然算不过来),这样才能展现出较好的聚类效果,否则就是一张均匀散布的散点图,没啥实际价值。

        self.text = self.ui.VocabularyInput.text().split(" ")
        self.text = [i for i in self.text if i != ""]
        for word in self.text:
            try:
                self.vectorList.append(self.model[word])  # 在模型中获取向量
            except Exception:  # 如果模型中没有这个词,就在窗口中显示没找到
                self.signal_load.text.emit(self.ui.textBrowser, word, 0)
            else:  # 如果找到了这个词,就记录下这个词和词向量
                self.wordList.append(word)  
                self.signal_load.text.emit(self.ui.textBrowser, word, 1)
            sleep(0.1)
        count = 0
        for word in self.model.index_to_key:  # 额外加入2000个在无需图中显示的词向量!!!!
            if word not in self.text:
                self.vectorList.append(self.model[word])
                count += 1
            if count >= 2000:
                break
  		self.signal_info.text.emit(self.ui.textBrowser, "loading finished")
      	self.signal_info.text.emit(self.ui.textBrowser, "正在计算中,请稍候...")
      	tsne_model = TSNE(perplexity=30, n_components=2, init='pca', n_iter=1000, random_state=23)  # 初始化模型参数
        new_values = tsne_model.fit_transform(self.vectorList)  # 用TSNE对这些高维向量降维
        for value in new_values[:len(self.wordList)]:  # 只将需要显示的二维向量输出
            self.plotX.append(value[0])
            self.plotY.append(value[1])

这段代码部分参考了“带鱼工作室”大佬的博文。链接如下:http://t.csdn.cn/tbET7
最后的效果还是很明显的。
大图局部1
局部2

9最后,I/O密集或者CPU密集时,要开新的子线程io或计算,主线程用来更新图形界面,线程之间用信号与槽函数通信。这其实是一个很简单的问题,系统学过qt的话应该都了解的。但我之前没学过,发现io时图形界面没反应,也纳闷了半天,最后懂了。哈哈,也趁此机会学了一些线程相关的知识。

刚刚发现有些内容没有加粗,后面发现是因为句末的标点符号出现在了****内。现在都改过来了。

抱歉审核大哥,辛苦了

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

PySide2、nltk、wordcloud、gensim、sklearn、pyinstaller实现词嵌入可视化、绘制词云图、制作GUI并打包的踩坑总结 的相关文章

  • 数据挖掘期末考试

    1理解概念 1 1数据挖掘 1 2关联规则 1 3数据预处理 1 4置信度 1 5聚类 1 6KNN 1 7SVM 2 分类器设计的三个过程 3 分类时常将样本怎样划分 xff1f 4 评估分类器性能的常用指标 5 数据挖掘常用技术有哪些
  • npm超时

    有时使用npm下载很慢出现超时 xff0c 可以尝试使用cnpm xff0c 国内镜像 安装 npm install cnpm g registry 61 https registry npm taobao org 测试是否成功 cnpm
  • 机试第一节

    问题 xff1a 1 6中的n的阶乘太大时发生溢出怎么处理 分割线 1 双精度浮点类型的定义 xff1a double 输出 lf 单精度浮点类型的定义 xff1a float 输出 xff1a f 2鸡兔同笼问题 xff0c 判断所给样例
  • Python小技巧之——巧用with语句实现异常处理

    Python的异常处理语句try except大家都很熟悉了 xff0c 例如 xff1a try 1 0 except Exception as ex print ex integer division or modulo by zero
  • 将lwip1.4.1工程移植至lwip2.1.2记录

    将lwip1 4 1工程移植至lwip2 1 2记录 1 ip addr结构体2 etharp h3 cc h与arch h4 tcp impl h 关于二者文件 功能等差异网上已有很多文章介绍 xff0c 类似这个文档有简单说了下这两个版
  • 在Windows和Ubuntu上安装VNC连接远程服务器

    如果你是公用的服务器的管理员需要添加一些用户 xff0c 并配置VNC服务以便远程访问 xff0c 简要介绍一下配置方法 具体的命令可以参照命令手册去查看 man span class hljs command span class hlj
  • 变频器的工作原理及其电路分析

    变频器简单的说就是结合了变频技术和微电子技术研制出来的可以改变输入电源的频率得到另外一种频率电源输出的设备 其输入的电源就是我们工业上面使用的电源 xff0c 一般都是电压和频率都固定不变的交流电 240v或者380v交流电 通过内置的一些
  • 欠拟合、过拟合及其解决方法

    在我们机器学习或者训练深度神经网络的时候经常会出现欠拟合和过拟合这两个问题 xff0c 但是 xff0c 一开始我们的模型往往是欠拟合的 xff0c 也正是因为如此才有了优化的空间 xff0c 我们需要不断的调整算法来使得模型的表达能拿更强
  • ubuntu18.04安装ROS Melodic的详细过程以及填坑经历

    一 版本说明 ROS官方将在2021年不再维护Kinetic xff0c 后续使用Ubuntu18 04 43 Melodic组合 xff0c Melodic支持时间到2023年5月 二 安装前Ubuntu18 04设置 打开Ubuntu1
  • win10和ubuntu20双系统设置默认启动系统为win10

    在win10下安装了Ubuntu20 04系统 xff0c 默认情况下 xff0c 启动的是Ubuntu系统 要将默认启动系统设置成win10 xff0c 方法如下 xff1a 1 进入ubuntu系统 xff0c 按住Ctrl 43 Al
  • Keil添加芯片支持包(Pack)

    1 前言 一直用STM32的芯片 xff0c 现在想看看工程是否可以在其他厂家的芯片上跑 xff0c 可是keil的Device中只有ST厂家的 因此 xff0c 尝试在keil中添加其他厂家的芯片支持包 2 keil软件内安装 点击工具栏
  • Qt 设置窗体大小和背景颜色

    1 一种方法是设置它的最大窗口值和最小窗口值 xff0c 并且使最大值和最小值相等 简单的示例 xff1a setMinimumSize 370 150 setMaximumSize 370 150 此时窗口大小便被固定为 xff08 37
  • Shell 脚本详解

    简介 shell xff1a 蛋 壳 shell脚本是在操作系统外 xff0c 可以直接调用系统内核命令的一个脚本语言 shell脚本可以分为两大类组成 xff1a 1 命令行 xff08 系统命令行 xff09 2 脚本语法 xff08
  • Windows——电脑不能连接手机热点(WLAN显示已经禁用)的解决办法

    笔记本电脑提示 xff1a 已关闭无线功能 基于这篇博客之上 xff0c 在第二步中 xff0c 关闭WLAN AutoConfig 服务 xff0c 之后重新打开WLAN AutoConfig 服务 xff0c 即可
  • Ubuntu——系统语言由英文切换到中文的方法

    一 方法一 ubuntu设置系统语言为中文 二 方法二 若方法一中不能拖动中文输入法到第一行 xff0c 则可以直接采取卸载英文输入法 xff0c 这样就中文输入法到第一行了 xff0c 切换成中文了 英文输入法可以根据需要考虑是否安装 一
  • RealSense D435——基本介绍

    一 结构介绍 采用的是结构光Tof成像方案 正面的四个摄像头从左至右 xff0c 依次是左红外相机 红外点阵投影仪 右红外相机 RGB相机 xff08 前三个负责形成深度图 xff0c 最后一个就形成RGB图 xff09 二 小贴士 RGB
  • RealSense D435——相机内参获取

    RealSense D435 相机内参获取 一 参考博客二 小贴士2 1 遇到的问题及解决方案问题一描述问题一解决方法问题二描述问题二解决方法 一 参考博客 RealSense D435内参获取环境配置 xff1a Realsense D4
  • Vscode——报错解决:Unable to start debugging.Unexpected GDB output from command. 或 程序点击运行一直无结果

    一 报错截图 1 Unable to start debugging Unexpected GDB output from command 2 程序点击运行一直无结果 二 原因 路径中含有中文 三 解决办法 将文件放入不包含中文的路径下
  • Github——合并分支

    一 当两个分支不一样时 xff0c 会出现下面的标志 xff08 前提是设定了分支保护 xff09 xff0c 点击Compare amp pull request 二 选择双方分支 三 处理请求 四 确认请求
  • 基于四旋翼飞行器的陀螺仪、加速度计、磁力计传感器说明

    一 什么是磁力计 加速度计和陀螺仪以及他们之间的区别 1 什么是陀螺仪 加速度计和磁力计 xff1f xff08 1 xff09 陀螺仪 xff08 Gyroscope GYRO Sensor xff09 也叫地感器 xff0c 三轴陀螺仪

随机推荐