中文分词
相比之下,英文单词之间由于有空格,因此不需要分词,中文则不同,这就需要使用第三方库来进行分割,因此我们需要引用jieba分词库。
jieba(结巴)分词是目前最流行的中文分词库
安装jieba分词(在Terminal中输入)
- pip install jieba
C:\Users\Administrator\Desktop\pycharm-雪碧>pip install jieba
导入jieba分词库
import jieba
插曲:导入模块的两种方式:
- import 模块名
import turtle
import jieba
import random
- from 模块 import 对象/函数(有需则导入,无需则不导入)
from random import randint #从random库中导入randint模块
可同时导入多个
from random import randint,random
两个导入方式各有优缺点:
- 用from...import方式:具体导入某个模块,可精确定位以及节省时间,而且引用时方便易懂
- 用import方式:该库的全模块全部导入,有些模块多的导入时间会长,相对会浪费时间
from random import randint
randint()
# 等价于
import random
random.randint()
jieba分词的特点,支持三种模式
seg = '吃葡萄不吐葡萄皮儿,不吃葡萄倒吐葡萄皮儿。'
- 精确模式:新列表名 = jieba.lcut(需要进行分词的句子)
- 将字符串分割成等量的中文,最常用
seg_list = jieba.lcut(seg)
print(seg_list)
['吃', '葡萄', '不吐', '葡萄', '皮儿', ',', '不吃', '葡萄', '倒', '吐', '葡萄', '皮儿', '。']
- 全模式:新列表名 = jieba.lcut(需要进行分词的句子, cut_all=True)
- cut_all参数用来控制是否采用全模式,将字符串中所有的分词结果都列举出来
特点:全方位 缺点:冗余性大
seg_list1 = jieba.lcut(seg, cut_all=True)
print(seg_list1)
['吃', '葡萄', '不', '吐', '葡萄', '皮儿', '', '', '不吃', '葡萄', '倒', '吐', '葡萄', '皮儿', '', '']
- 搜索引擎模式:新列表名 = jieba.lcut_for_search(需要进行分词的句子)
- 首先执行精确模式
- 然后对其中的长词进一步切分得到的结果,该模式更倾向于寻找短词语,且具有一定的冗余度,但比全模式要少
seg_list2 = jieba.lcut_for_search(seg)
print(seg_list2)
['吃', '葡萄', '不吐', '葡萄', '皮儿', ',', '不吃', '葡萄', '倒', '吐', '葡萄', '皮儿', '。']
如何选择模式:
- 如果希望对文本词分词准确,不产生冗余 ===> 精确模式
- 如果希望对文本词分词更为准确,不漏下任何分词的可能 ===> 全模式
- 如果没想好怎么用 ===> 搜索引擎模式
词云的生成——使用wordcloud库生成词云
安装wordcloud:
- pip install wordcloud
使用pip本地安装wordcloud文件解决C++环境缺失问题
使用方式:在工作目录下复制wordcloud.whl文件(该文件可以在https://www.lfd.uci.edu/~gohlke/pythonlibs/上下载),然后再下载matplotlib模块
打开终端,输入pip install 文件名
注:只要在工作空间上,输入首字母再tab键就可以显示目标文件名
C:\Users\Administrator\Desktop\pycharm-雪碧>pip install wordcloud-1.5.0-cp37-cp37m-win32.whl
C:\Users\Administrator\Desktop\pycharm-雪碧>pip install matplotlib
首先,导入jieba库和wordcloud模块
import jieba
from wordcloud import WordCloud #WC类
定义字符串文本
text = """
蒲公英的约定 - 周杰伦
词:方文山
曲:周杰伦
小学篱笆旁的蒲公英
是记忆里有味道的风景
午睡操场传来蝉的声音
多少年后也还是很好听
将愿望折纸飞机寄成信
因为我们等不到那流星
认真投决定命运的硬币
却不知道到底能去哪里
一起长大的约定
那样清晰 拉过勾的我相信
说好要一起旅行
是你如今 唯一坚持的任性
在走廊上罚站打手心
我们却注意窗边的蜻蜓
我去到哪里你都跟很紧
很多的梦在等待着进行
一起长大的约定
那样清晰 拉过勾的我相信
说好要一起旅行
是你如今 唯一坚持的任性
一起长大的约定
那样真心
与你聊不完的曾经
而我已经分不清
你是友情还是错过的爱情
"""
中文分词处理(一般使用精确模式)
txt_list = jieba.lcut(text)
print(txt_list)
将列表转化成字符串,用空格隔开
txt_string = ' '.join(txt_list)
print(txt_string)
调用WordCloud类,生成词云对象
wc = WordCloud(
background_color='white',
font_path='msyh.ttc', #微软雅黑字体
width=800,
height=600
).generate(txt_string)
wc.to_file('蒲公英的约定.png')
完整代码如下:
# 导入库
import jieba
from wordcloud import WordCloud #WC类
# 定义文本
text = """
蒲公英的约定 - 周杰伦
词:方文山
曲:周杰伦
小学篱笆旁的蒲公英
是记忆里有味道的风景
午睡操场传来蝉的声音
多少年后也还是很好听
将愿望折纸飞机寄成信
因为我们等不到那流星
认真投决定命运的硬币
却不知道到底能去哪里
一起长大的约定
那样清晰 拉过勾的我相信
说好要一起旅行
是你如今 唯一坚持的任性
在走廊上罚站打手心
我们却注意窗边的蜻蜓
我去到哪里你都跟很紧
很多的梦在等待着进行
一起长大的约定
那样清晰 拉过勾的我相信
说好要一起旅行
是你如今 唯一坚持的任性
一起长大的约定
那样真心
与你聊不完的曾经
而我已经分不清
你是友情还是错过的爱情
"""
# 分词处理
txt_list = jieba.lcut(text)
print(txt_list)
txt_string = ' '.join(txt_list)
print(txt_string)
# 生成词云
wc = WordCloud(
background_color='white',
font_path='msyh.ttc', #微软雅黑字体
width=800,
height=600
).generate(txt_string)
wc.to_file('蒲公英的约定.png')
终端输出如下:
Building prefix dict from the default dictionary ...
Loading model from cache C:\Users\ADMINI~1\AppData\Local\Temp\jieba.cache
Loading model cost 0.660 seconds.
Prefix dict has been built succesfully.
['\n', '\n', ' ', ' ', ' ', ' ', '蒲公英', '的', '约定', ' ', '-', ' ', '周杰伦', '\n', ' ', ' ', ' ', ' ', '词', ':', '方文山', '\n', ' ', ' ', ' ', ' ', '曲', ':', '周杰伦', '\n', ' ', ' ', ' ', ' ', '小学', '篱笆', '旁', '的', '蒲公英', '\n', ' ', ' ', ' ', ' ', '是', '记忆里', '有', '味道', '的', '风景', '\n', ' ', ' ', ' ', ' ', '午睡', '操场', '传来', '蝉', '的', '声音', '\n', ' ', ' ', ' ', ' ', '多少', '年', '后', '也', '还是', '很', '好听', '\n', ' ', ' ', ' ', ' ', '将', '愿望', '折纸', '飞机', '寄成', '信', '\n', ' ', ' ', ' ', ' ', '因为', '我们', '等', '不到', '那', '流星', '\n', ' ', ' ', ' ', ' ', '认真', '投', '决定', '命运', '的', '硬币', '\n', ' ', ' ', ' ', ' ', '却', '不', '知道', '到底', '能', '去', '哪里', '\n', ' ', ' ', ' ', ' ', '一起', '长大', '的', '约定', '\n', ' ', ' ', ' ', ' ', '那样', '清晰', ' ', '拉过', '勾', '的', '我', '相信', '\n', ' ', ' ', ' ', ' ', '说好', '要', '一起', '旅行', '\n', ' ', ' ', ' ', ' ', '是', '你', '如今', ' ', '唯一', '坚持', '的', '任性', '\n', ' ', ' ', ' ', ' ', '在', '走廊', '上', '罚站', '打', '手心', '\n', ' ', ' ', ' ', ' ', '我们', '却', '注意', '窗边', '的', '蜻蜓', '\n', ' ', ' ', ' ', ' ', '我', '去', '到', '哪里', '你', '都', '跟', '很', '紧', '\n', ' ', ' ', ' ', ' ', '很多', '的', '梦', '在', '等待', '着', '进行', '\n', ' ', ' ', ' ', ' ', '一起', '长大', '的', '约定', '\n', ' ', ' ', ' ', ' ', '那样', '清晰', ' ', '拉过', '勾', '的', '我', '相信', '\n', ' ', ' ', ' ', ' ', '说好', '要', '一起', '旅行', '\n', ' ', ' ', ' ', ' ', '是', '你', '如今', ' ', '唯一', '坚持', '的', '任性', '\n', ' ', ' ', ' ', ' ', '一起', '长大', '的', '约定', '\n', ' ', ' ', ' ', ' ', '那样', '真心', '\n', ' ', ' ', ' ', ' ', '与', '你', '聊', '不', '完', '的', '曾经', '\n', ' ', ' ', ' ', ' ', '而', '我', '已经', '分不清', '\n', ' ', ' ', ' ', ' ', '你', '是', '友情', '还是', '错过', '的', '爱情', '\n', '\n']
蒲公英 的 约定 - 周杰伦
词 : 方文山
曲 : 周杰伦
小学 篱笆 旁 的 蒲公英
是 记忆里 有 味道 的 风景
午睡 操场 传来 蝉 的 声音
多少 年 后 也 还是 很 好听
将 愿望 折纸 飞机 寄成 信
因为 我们 等 不到 那 流星
认真 投 决定 命运 的 硬币
却 不 知道 到底 能 去 哪里
一起 长大 的 约定
那样 清晰 拉过 勾 的 我 相信
说好 要 一起 旅行
是 你 如今 唯一 坚持 的 任性
在 走廊 上 罚站 打 手心
我们 却 注意 窗边 的 蜻蜓
我 去 到 哪里 你 都 跟 很 紧
很多 的 梦 在 等待 着 进行
一起 长大 的 约定
那样 清晰 拉过 勾 的 我 相信
说好 要 一起 旅行
是 你 如今 唯一 坚持 的 任性
一起 长大 的 约定
那样 真心
与 你 聊 不 完 的 曾经
而 我 已经 分不清
你 是 友情 还是 错过 的 爱情
Process finished with exit code 0
效果如下:
python中的文件操作
读取文件:open()函数可以读取指定路径的文件
在open()函数中:
file是文件的路径
mode='r'是以只读方式打开
encoding=' '
创建一个text.txt文件:
有两种读取方式(结果是一样的):
- 读取方式一:
比较麻烦,每次读取完都需要关闭文件
f = open(file='text.txt',mode='r',encoding='UTF-8')
txt = f.read()
f.close()
print(txt)
- 读取方式二:
使用with上下文管理器进行文件读取
此方法无需每次读取完后关闭文件
with open('text.txt', 'r', encoding='UTF-8') as f:
print(f.read())
输出的结果一样:
【练习】读取三国演义小说,并且绘制该小说的整篇词云
分别引入jieba库、wordcloud库、imageio库
import jieba
from wordcloud import WordCloud
import imageio
读入文件threekingdom.txt,并分词
with open('threekingdom.txt', 'r', encoding='UTF-8') as f:
data = f.read()
# print(data)
print(len(data))
# 分词
word_list = jieba.lcut(data)
print(len(word_list))
words = ' '.join(word_list)
# 绘制词云
wc = WordCloud(
background_color='white',
font_path='msyh.ttc', #不指定输出字体就会乱码
width=800,
height=600,
).generate(words).to_file('三国演义词云.png')
终端显示如下:
557133 #分此前data的长度(整篇小说的字数)
Building prefix dict from the default dictionary ...
Loading model from cache C:\Users\ADMINI~1\AppData\Local\Temp\jieba.cache
Loading model cost 0.680 seconds.
Prefix dict has been built succesfully.
355143 #分词后data的长度(整篇小说经过分词后的字段数)
效果如下:
【练习】在练习的基础上,按指定图片形状来绘制该小说的整篇词云
新增模块:imageio
没的话先下载
- pip install imageio
C:\Users\Administrator\Desktop\pycharm-雪碧>pip install matplotlib
(新增)通过imageio模块读取指定形状的图片
mask = imageio.imread('china.jpg')
(新增)然后在WordCloud()中加入
mask = mask
完整代码如下:
# 分别引入jieba库、wordcloud库、imageio库
import jieba
from wordcloud import WordCloud
import imageio
#引入面具
mask = imageio.imread('china.jpg')
# 读入文件
with open('threekingdom.txt', 'r', encoding='UTF-8') as f:
data = f.read()
# 分词
word_list = jieba.lcut(data)
words = ' '.join(word_list)
# 绘制词云
wc = WordCloud(
background_color='white',
font_path='msyh.ttc', #不指定输出字体就会乱码
width=800,
height=600,
mask=mask #对面具重新赋值
).generate(words).to_file('地图版三国演义词云.png')
效果如下:
当然,WordCloud类还有很多属性,例如:
max_words=40, #词云中出现的词的最大个数
max_font_size=80, #最大字体的大小(单位为px)
min_font_size=20, #最小字体的大小(单位为px)