词云图制作
题
pip源
由于默认源下载速度几把慢(10KB/s),通过更换国内源的方式能显著提升速度(100~200KB/s)
给出几个国内镜像:
让pip源使用国内镜像:
清华:https://pypi.tuna.tsinghua.edu.cn/simple
阿里云:http://mirrors.aliyun.com/pypi/simple/
中国科技大学 https://pypi.mirrors.ustc.edu.cn/simple/
华中理工大学:http://pypi.hustunique.com/
山东理工大学:http://pypi.sdutlinux.org/
豆瓣:http://pypi.douban.com/simple/
临时使用某个源下载的使用语句如下:
通过清华源下载jieba
包
pip3 install -i https://pypi.tuna.tsinghua.edu.cn/simple jieba
通用格式:
将packageNAME
换成包名即可
``pip3 install -i https://pypi.tuna.tsinghua.edu.cn/simple packageNAME`
这是临时性的,即本次下载使用这个源,永久性的更换源如下:
如果要永久性的,可以按以下操作。
Linux下,修改 ~/.pip/pip.conf (没有就创建一个,文件夹要加“.”,表示是隐藏文件夹)。
Windows下,直接在user目录中创建一个pip目录,如:C:\Users\xx\pip,xx一般表示用户名,新建文件pip.ini。
它们的文件内容如下(使用的是清华镜像,其他可以自行修改):
1
2
3
4 [global]
index-url = https://pypi.tuna.tsinghua.edu.cn/simple
[install]
trusted-host=mirrors.aliyun.com
namedtuple:
首次学习
from collections import namedtuple
引入一个强化包,继承自元组,是元组的强化版。
首先把他实例化,如下:
fun_use = namedtuple(“admin”,[“name”,”authority”,”timeout”])
之后可以调用fun_use
来访问这个已经制定的admin
元组
现在给第一个管理A赋值
1 | from collections import namedtuple |
可以通过示例名.自定义属性名
来访问具体的值
1 | print("管理员名称{},权限等级为{},超时时间为{}".format(A.name,A.authority,A.timeout)) |
本身元组是不允许修改的,但是这个强化版的元组允许访问修改里面的值,方法如下:
1 | A._replcae(authority=32) |
可以发现元组的值发生了变化。
增强型元组还支持转换成字典,即属性名:值
,用_asdict()
如下:
1 | print(A._asdict()) |
第二次学习
显然只会一些句法是不够的,现在提出几个问题:
- 如何将普通的元组和字典转换成
Namedtuple
- 如何对
Namedtuple
排序? - 与其他数据类型的区别
- 如何创建
引言:
namedtuple能够用来创建类似于元祖的数据类型,除了能够用索引来访问数据,能够迭代,更能够方便的通过属性名来访问数据。在python中,传统的tuple类似于数组,只能通过下标来访问各个元素,我们还需要注释每个下标代表什么数据。通过使用namedtuple,每个元素有了自己的名字。
jieba
安装
Github——jieba (包括中文教程)
根据官方文档的介绍,安装方法如下:
- 全自动安装:
easy_install jieba
或者pip install jieba
/pip3 install jieba
- 半自动安装:先下载 http://pypi.python.org/pypi/jieba/ ,解压后运行
python setup.py install
- 手动安装:将 jieba 目录放置于当前目录或者 site-packages 目录
- 通过
import jieba
来引用- 如果需要使用paddle模式下的分词和词性标注功能,请先安装paddlepaddle-tiny,
pip install paddlepaddle-tiny==1.6.1
。
有时候全自动安装往往失败,本文使用了半自动安装方式
安装遇到问题
已经安装jieba后,遇到了问题
使用CMD命令,再运行一次pip3 install jieba
会提示已经存在,并且返回一个地址,似乎是本地解释器环境lib
中没有jieba
包的问题
反正我直接在Pycharm
里面直接选择安装这个包
等待完成安装即可
分词
jieba.lcut(str)
精度分词模式,对str
内容进行分词
jieba.lcut(str,cut_all=True)
全分词模式,对str
进行全分词
jieba.lcut_for_search(str)
搜索引擎分词模式,是以上两种模式的结合
jieba.cut(str)
对一个字符串进行分词
推荐使用lcut()
,他直接返回list
精度模式会对长句进行精确分词,没有冗余,意味着结果可以再拼接成原句
全分词模式会对有语义的内容从不同角度全部分词,有冗余
示例:
“好好学习,天天向上”
精度模式是 “好好学习”,“天天向上”
全分词模式是“好好”,“好好学习”,“好学”,“学习”,“天天”,“向上”,“天天向上”
搜索引擎模式在精度分词的基础上对长的字符串再分词,方便搜索引擎抓取关键词。
全分词模式速度比较快,精度模式分词分得比较好,但是慢
英文分词需要先把所有英文单词转换成小写模式lowwer()
,将特殊字符替换成空格,代码如下
1 | for ch in '!"#$%&()*+,-./:;<=>?@[\\]^_‘{|}~': |
分词结果的返回值是列表内字符串形式
分词完成后返回的是列表,使用“ ”.join()
将列表内容输入出来
【需要注意】
分词会按照词频来分,词频越高的词越容易被切出来,因此【台中】经常被切成【台】【中】而不是保留【台中】的原因是因为词频P(台中)<P(台)<P(中),因此调整词频才能较好的解决这个问题。
贴出官方的分词速度
- 1.5 MB / Second in Full Mode
- 400 KB / Second in Default Mode
- 测试环境: Intel(R) Core(TM) i7-2600 CPU @ 3.4GHz;《围城》.txt
统计词数\行数
因为分词不完全正确,我们需要去掉一些不需要的词语,一般去掉单个词语,即len()==1
的词语
因为我们一开始不知道文件有少行,因此我们需要读出行数,可以直接使用readline()
然后len()
一下就行,但是如果文件很大的话,似乎会出现某种问题,因此使用enumerate()
统计,代码如下:
1 | for count,line in enumerate("file_name"): |
多词合并
有时统计人名时会出现多个昵称都指向一个人,因此需要进行合并
示例代码如下:
1 | for word in words: #words是已经切分好的 |
关键词提取
import jieba.analyse
来引入关键词分析功能
使用方法如下:
jieba.analyse.extract_tags(str,topK=20)
不过我不是很理解这个extract_tags
是什么意思
对str
进行关键词提取,返回20个TF/IDF
权重最大的关键词
这个方法的全文为:
jieba.analyse.extract_tags(sentence, topK=20, withWeight=False, allowPOS=())
- sentence 为待提取的文本
- topK 为返回几个 TF/IDF 权重最大的关键词,默认值为 20
- withWeight 为是否一并返回关键词权重值,默认值为 False
- allowPOS 仅包括指定词性的词,默认值为空,即不筛选
自定义字典
jieba本身的分词词典可能不满足现代化的互联网需求,需要建立自己的字典或者及时更新新的字典,也可以在现有字典的基础上添加词语
jieba.load_userdict(file_name)
载入自定义词典,可以是.txt .csv
自定义词典的格式:
一个词占一行,每一行是三个部分,用空格隔开
【词名】【词频_可省略】【词性_可省略】
也可以动态更新内置词典
- 使用
add_word(word, freq=None, tag=None)
和del_word(word)
可在程序中动态修改词典。- 使用
suggest_freq(segment, tune=True)
可调节单个词语的词频,使其能(或不能)被分出来。- 注意:自动计算的词频在使用 HMM 新词发现功能时可能无效。
官方给出的示例,我不是很看得懂实际上
1
2
3
4
5
6
7
8
9
10
11
12 >>> print('/'.join(jieba.cut('如果放到post中将出错。', HMM=False)))
如果/放到/post/中将/出错/。
>>> jieba.suggest_freq(('中', '将'), True)
494
>>> print('/'.join(jieba.cut('如果放到post中将出错。', HMM=False)))
如果/放到/post/中/将/出错/。
>>> print('/'.join(jieba.cut('「台中」正确应该不会被切开', HMM=False)))
「/台/中/」/正确/应该/不会/被/切开
>>> jieba.suggest_freq('台中', True)
69
>>> print('/'.join(jieba.cut('「台中」正确应该不会被切开', HMM=False)))
「/台中/」/正确/应该/不会/被/切开
提示
在使用文本路径时,请使用\
,使用/
会被认为是除法,需要加转义,也就是只能使用//
安装WordCloud
一般情况下,直接使用CMD
安装:pip install wordcloud
,但往往不成功
通过官网离线下载的方式下载、安装
选择适合自己本地环境的版本即可,cp
是你的python版本,我的是3.10.x
,amd64
的
不知道如何查看自己电脑是几位的请移步Paddle安装
部分
安装飞浆PaddlePaddel
内容引自CSND
以及花了四五个小时反复重新安装10.2的悲惨遭遇总结而出
兼容性确认:
必须拥有英伟达GPU,并且检查版本兼容性:
【1】环境确认:(截取部分)
Unbuntu/Linux/Windows 7/10
有且仅有一张GPU
Python版本 3.6+ ~ 3.10+
CMD输入python --version
检查版本号
- pip版本 20.2.2+
CMD输入python -m -pip --version
检查pip版本号
输入python -m pip install --upgrade pip
更新pip
【2】系统兼容性确认
在CMD中输入python -c "import platform;print(platform.architecture()[0]);print(platform.machine())"
要求返回值必须是64bit
和AMD64或x86_64或x64
版本检查
打开电脑的英伟达控制面板,右键桌面可以看到【英伟达控制面板】
在【管理3D设置】——左下方【系统信息】——【驱动版本】

词查找
jieba.tokenize
可以查找出字符串内分词在字符串的起始位置,返回一个容器(我不知道具体是什么),通过下标访问,0:分词,1:分词在文本出现的初始位置-1,2:分词在文本中出现的最终位置(含)
或者在CMD
里面输入nvidia-smi
返回驱动版本号、
从图中可以指导,我们的驱动器版本号是512.59
每次英伟达的驱动更新都可能改变这个版本号,目前我还没遇到这种情况。姑且认为他不会变。
对照英伟达官网中的表,这里给出一部分截图
根据图表中的对应,512版本应当使用至少11.x
版本的CUDA ToolKit
(在官网处只提供11.x
版本和10.x
版本的Kit
)
注意:根据我的经验,尽可能使用较新的版本,理论上应该是向下兼容的,但是10.2版本无论如何都无法正常运行,选择I Agree……
然后选择11.x
进行下载。
下载完成后双击安装读条即可。
安装时请使用自定义安装,然后修改到合适的路径,三个路径最好都是用同一个文件夹,或者使用默认路径也行,但是必须在自定义安装中记录下其路径,这对以后有帮助。假设路径是./dv11.2
。
其后选择相应的cuDNN
包下载,此处选择的是为CUDA 11.x
准备的cuDNN
解压之后将三个文件复制粘贴到从自定义安装中读出的路径中。
安装Paddle
直接在CMD
运行以下代码,此处使用的是安装适配CUDA 11.2
的版本,其他版本请前往官网下载
python -m pip install paddlepaddle-gpu==2.3.0.post112 -f https://www.paddlepaddle.org.cn/whl/windows/mkl/avx/stable.html
即可快速安装Paddle
安装完成提示Successfully
后即可
引入测试
在Python文件中进行测试,
1 | import paddle |
结果如下:
出现如下结果时说明Paddle成功启用
排障:
【1】DeprecationWarning
使用代码过旧,这个无需理会,不影响程序运行
【2】版本兼容性问题,请查阅Paddle排障板块
Paddle
需要注意的是,只接受unicode
编码的文本,因此在字符串前面添加u
可以转换成unicode
例如u”str”
logging
一个内置的Python日志模块
WordCloud
从文本中读取文件,需要把提取的列表转换成文本,如下
1 | ls_re = ['a','b','c'] # 这些是已经提取好的中文,但是末尾的换行符被去掉了 |
writelines()
能写入可迭代对象,一般是列表的内容到文本中
【排障】其他杂七杂八的问题
中文性判断:
判断这个单个字符串是否为中文(不包括混合情况)
1 | ls = ['你好','a','其他','我们中出了一个叛徒'] |
PaddlePaddle排障
版本兼容性问题
使用pip install paddlepaddle
指令或运行官网的安装指令完成,并显示successfully
后,在python中引用依然报错,报错内容如下
1
2
3
4
5
6
7 TypeError: Descriptors cannot not be created directly.
If this call came from a _pb2.py file, your generated code is out of date and must be regenerated with protoc >= 3.19.0.
If you cannot immediately regenerate your protos, some other possible workarounds are:
1. Downgrade the protobuf package to 3.20.x or lower.
2. Set PROTOCOL_BUFFERS_PYTHON_IMPLEMENTATION=python (but this will use pure-Python parsing and will be much slower).
More information: https://developers.google.com/protocol-buffers/docs/news/2022-05-06#python-updates
重点词是Downgrade the protobuf package to 3.20.x or lower.
提示我们应该降级安装,因此运行如下代码进行Protobuf
降级
1 | pip install 'protobuf~=3.19.0' |
成功解决该报错
Picgo排障
写Blog时发现图片辅助Picgo出现问题,报错如下:
重装Picgo失败后决定重装Java
Java重新安装
在Java官网中下载JDK,然后安装在默认位置(以C:\Program Files\Java\jdk-18.0.1.1
为例)
在环境变量
中
写入变量名为JAVA_HOME
值为C:\Program Files\Java\jdk-18.0.1.1
写入变量名为CLASSPATH
值为C:\Program Files\Java\jdk-18.0.1.1
在PATH
变量中写入记录C:\Program Files\Java\jdk-18.0.1.1
在CMD
中输入java
返回提示信息视为安装成功
显然,上述办法也失败了
随便删点什么
于是顺着报错路径去删掉了整个AppData
下的picgo
文件夹再重装,解决。
Github排障
SSH问题
修好Picgo后得去重新获取token,不小心删掉了Github的SSH,在./user/name/.ssh
的用户文件夹下可以发现之前创建的id_rsa.pub
公钥,重新在Github中添加公钥即可
获取token
在账户设置setting
页面最底下的开发者设置Developer Setting
可以找到私人验证Personal access token
,新建一个,权限勾选repo
即可