赞
踩
很多时候,我们想提取一段文字(或一篇文章)中的高频词汇;或是对文章进行分词处理,进行惯用词统计及词云制作。(打个比方:你写了一篇文章,写完之后你觉得好像用词有些单调,你想佐证一下自己的想法,所以就需要对自己写的这篇文章进行词汇梳理及使用频率统计)。这时候,最常用的做法就是利用今天要讲的——jieba库。
(1)原理
jieba 是目前最好用的 Python 中文分词库,它的原理是:
jieba库的三种分词模式:
精确模式、全模式、搜索引擎模式
除此之外,jieba库还具有以下两个特性:
jieba库常用函数:
同学们可以根据自己的需求,调用不同的方法。
下面,我们通过一个小例子来体验一下精确模式和全模式之间的差异:
首先先展示一下我们案例用的一个小文案:
首先是精确模式:
代码总共分为三步:
(1)导入jieba库;并导入文件;
(2)使用jieba库中的cut函数进行分词,剔除了其中为单字的词及换行符,保留剩余结果;
(3)输出分词结果。
- import jieba
- file_name =r'C:UsersAdministratorDesktopjieba例子.txt'
- with open(file_name,'r') as f:
- content = f.read()
-
- #这里我定义了一个函数cut_word():
- def cut_word():
- segment=[]
- # 保存分词结果
- segs=jieba.cut(content)
- # 对整体进行分词
- for seg in segs:
- if len(seg) > 1 and seg != 'rn':
- # 如果说分词得到的结果不是单字,且不是换行符,则加入到数组中
- segment.append(seg)
- return segment
-
- print(cut_word())
运行结果:
可以看到,“是”、“的”之类的单字被我们筛除掉了,不过其他词段均完整了进行了分割,效果还是可以的。
下面我们尝试使用全模式:
全模式与精确模式的区别,在于使用了 cut_all = True 这一个参数。(其他代码内容不变)
- import jieba
- file_name =r'C:UsersAdministratorDesktopjieba例子.txt'
- with open(file_name,'r') as f:
- content = f.read()
-
- #这里我定义了一个函数cut_word():
- def cut_word():
- segment=[]
- # 保存分词结果
- segs=jieba.cut(content,cut_all = True)
- # 对整体进行分词
- for seg in segs:
- if len(seg) > 1 and seg != 'rn':
- # 如果说分词得到的结果不是单字,且不是换行符,则加入到数组中
- segment.append(seg)
- return segment
- print(cut_word())
可以看到,更多的词汇被分割出来了。
通过以上这个小例子,我们可以明显感受到精确模式和全模式的差异,大家可以根据实际情况灵活选择。
可能有些小伙伴会问了,当待分词的文案中,出现了jieba词库里没有的词该怎么办?
下面我们再来看一个小例子:
首先还是看看我们的文本:
使用jieba库进行分词:(做法与前面一致)
- import jieba
- file_name =r'C:UsersAdministratorDesktopjieba例子.txt'
- with open(file_name,'r') as f:
- content = f.read()
-
- #这里我定义了一个函数cut_word():
- def cut_word():
- segment=[]
- # 保存分词结果
- segs=jieba.cut(content)
- # 对整体进行分词
- for seg in segs:
- if len(seg) > 1 and seg != 'rn':
- # 如果说分词得到的结果不是单字,且不是换行符,则加入到数组中
- segment.append(seg)
- return segment
- print(cut_word())
运行结果:
可以看到,在运行结果中,发明人“肖欣然”的名字并没有被识别,而是被识别成了“欣然”这个词,显然,这种分词结果是我们不想要的。
那为什么会出现这个情况呢?
在我们的jieba库中,存在着几十万个原生词,当然了,当我们涉及到更高级的专业术语、或者人名时,显然jieba库里是不存在的。这时,我们对文段进行分词时便会出现上述这种情况。
为了避免这种情况,我们可以通过向jieba词库里添加新词,或新添自定义词库的方式,从而满足我们的使用需求。
添加新词的方法:
(1)使用jieba.add_word() 添加关键词
通过使用jieba.add_word(),我们可以手动添加一个关键词进入词库,下面我们来回到上面那个例子:
在原例子中,“肖欣然”一
词并没有在词库中,因此没有被识别,因此,我们先利用jieba.add_word(),向词库里填充“肖欣然”一词。
jieba.add_word('肖欣然')
接着再次使用jieba库进行分词:
可以看到,这一次“肖欣然”这个名字便可以被成功分出来了。
然后,通过一次次使用jieba.add_word() 添加关键词的方法,未免有点死板,如果我们想批量添加新词时该怎么办呢?这时候就要利用到另一种添加方法——jieba.load_userdict()。
(2)使用jieba.load_userdict() 批量设置关键词
首先我们来看一下load_userdict() 方法的文档:
可以看到,当我们使用load_userdict()添加新词时,总共涉及到三个参数:
关键词 词频 词性
也就是说,当我们添加一个词时,需按照 “关键词 词频 词性 ”的顺序进行添加,(如上图红色框内所示,每行一词)
PS:然而,从文档中我们也可以看到,词性是可以省略的;同时,起始词频也是可以省略的。
下面我们还是进行实例操作:
首先看下文本:
(1)看看未添加关键词前的分词效果:
- import jieba
- file_name =r'C:UsersAdministratorDesktopjieba例子.txt'
- with open(file_name,'r') as f:
- content = f.read()
-
- #这里我定义了一个函数cut_word():
- def cut_word():
- segment=[]
- # 保存分词结果
- segs=jieba.cut(content)
- # 对整体进行分词
- for seg in segs:
- if len(seg) > 1 and seg != 'rn':
- # 如果说分词得到的结果不是单字,且不是换行符,则加入到数组中
- segment.append(seg)
- return segment
- print(cut_word())
输出结果:
['这是', '一段', '游戏', '解说', '凭借', 'ADC', '螺旋式', '走位', '以及', '辅助', '完美', '开团', '他们', '成功', '打出', '一波', '零换']
下面,我们使用jieba.load_userdict() 批量设置关键词:
步骤一:创建文件,将自己想要添加的词输入进去:
步骤二:导入文件并命名,并使用jieba.load_userdict()方法。
- word_file = "C:UsersAdministratorDesktop关键词.txt"
- jieba.load_userdict(word_file)
重新查看分词结果:
- import jieba
- file_name =r'C:UsersAdministratorDesktopjieba例子.txt'
- with open(file_name,'r') as f:
- content = f.read()
-
- #这里我定义了一个函数cut_word():
- def cut_word():
- segment=[]
- # 保存分词结果
- segs=jieba.cut(content)
- # 对整体进行分词
- for seg in segs:
- if len(seg) > 1 and seg != 'rn':
- # 如果说分词得到的结果不是单字,且不是换行符,则加入到数组中
- segment.append(seg)
- return segment
- print(cut_word())
可以看到,我们想要的词都被保留下来了。
利用pandas,我们还可以轻松地统计出每个词汇的被使用次数。(在统计文章时会很好用)
(忘记相关知识点的同学,可以看我前面发过的文章~)
- import pandas
- words = cut_word()
- df = pandas.DataFrame({'关键词':words})
- words_count = df.groupby(by=['关键词'])['关键词'].agg({"出现次数":numpy.size})
- words_count = words_count.reset_index().sort_values(by="出现次数",ascending=False)
- print(words_count)
小例子2:
我们使用上述方法,对《钢铁是怎么炼成的》节选片段进行分析。
我们主要利用这个方法,查看这段文案中使用频率最高的前10个词,代码如下:
- import jieba
- import pandas
- file_name =r'C:UsersAdministratorDesktop钢铁是怎样炼成的.txt'
- with open(file_name,'r') as f:
- content = f.read()
-
- #这里我定义了一个函数cut_word():
- def cut_word():
- segment=[]
- # 保存分词结果
- segs=jieba.cut(content)
- # 对整体进行分词
- for seg in segs:
- if len(seg) > 1 and seg != 'rn':
- # 如果说分词得到的结果不是单字,且不是换行符,则加入到数组中
- segment.append(seg)
- return segment
- words = cut_word()
- df = pandas.DataFrame({'关键词':words})
- words_count = df.groupby(by=['关键词'])['关键词'].agg({"出现次数":numpy.size})
- words_count = words_count.reset_index().sort_values(by="出现次数",ascending=False)
-
- #查看使用频率最高的前10个词:
- print(words_count.head(10))
输出结果:
可以看到输出结果符合我们的要求。
我们主要用到以下三个库:
wordcloud、matplotlib、scipy
其中,matplotlib、scipy这两个库在前面的文章我们也介绍得比较多了,因此这里的话我们主要讲一下wordcloud这个库。
侦探L:python绘图库——Matplotlib及Seaborn使用(入门篇1)zhuanlan.zhihu.com主要功能:
WordCloud 是一款python环境下的词云图工具包,而词云图可以帮助我们过滤掉文本内低频低质的文本信息,对文本中出现频率较高的“关键词”予以视觉化的展现;
主要参数:
下面我们进行实例操作(还是使用上面的代码,接下去)
(1)将我们要用的库导入:
- import numpy as np
- from scipy.misc import imread
- from matplotlib import pyplot as plt
- from wordcloud import WordCloud, ImageColorGenerator
(2)选好我们要用的图片:(我用的是下面这一张-)
这里图片的格式是jpg或png都可以。不过,由于png格式背景一般是透明的,因此当我们的图片格式是png的话,词云的背景色需要设置为None,然后mode应该设为RGBA。
(3)导入示例图片并读取,获取词云对象,同时设置词云背景颜色及字体格式 :
- #导入示例图片并读取,获取词云对象,同时设置词云背景颜色及字体格式
-
- bimg = imread('C:UsersAdministratorDesktop示例图片.jpg')
- wordcloud = WordCloud(background_color='white', mask=bimg, font_path='simhei.ttf')
(4)将词语和频率转为字典,并映射到词云对象上:
- # 将词语和频率转为字典,并映射到词云对象上
-
- words = words_count.set_index("关键词").to_dict()
- wordcloud = wordcloud.fit_words(words["出现次数"])
(5)生成词云图片并进行输出:
- #生成词云图片并进行输出
- bimgColors = ImageColorGenerator(bimg)
- plt.axis("off")
- plt.imshow(wordcloud.recolor(color_func=bimgColors))
- plt.show()
最后,查看我们的运行结果:
可以看到,我们制作的词云还是挺美观的~
这里如果同学们还可以根据自己的需要,通过调节wordcloud里的各个参数,达到自己想要的效果!(字体、颜色、词云数量都可以调节哦~)
以上便是<如何利用python进行语段分析及分词(还可以制作好看的词云!!)>的内容,感谢大家的细心阅读,同时欢迎感兴趣的小伙伴一起讨论、学习,想要了解更多内容的可以看我的其他文章,同时可以持续关注我的动态~
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。