当前位置:   article > 正文

jieba结巴分词--关键词抽取_如何利用python进行语段分析与分词(顺便制作成好看的词云~)...

jieba生成关键词

5dbc6c5b9f66d6bc3a089fd9b1d26529.png

很多时候,我们想提取一段文字(或一篇文章)中的高频词汇;或是对文章进行分词处理,进行惯用词统计及词云制作。(打个比方:你写了一篇文章,写完之后你觉得好像用词有些单调,你想佐证一下自己的想法,所以就需要对自己写的这篇文章进行词汇梳理及使用频率统计)。这时候,最常用的做法就是利用今天要讲的——jieba库


(1)原理

jieba 是目前最好用的 Python 中文分词库,它的原理是:

  • 利用已用中文词库(使用者可以根据自身需要可以在原词库基础上再进行添加新词),确定汉字之间的关联概率
  • 汉字间概率大的组成词组,形成分词结果

jieba库的三种分词模式:

精确模式、全模式、搜索引擎模式

  1. 精确模式:把文本精确的切分开,不存在冗余单词
  2. 全模式:把文本中所有可能的词语都扫描出来,可能存在冗余单词
  3. 搜索引擎模式:在精确模式基础上,对长词再次切分

除此之外,jieba库还具有以下两个特性:

  • 支持繁体分词
  • 支持自定义词典

jieba库常用函数:

5f7a7ed73d4e6db1b26d2633ec4c558c.png

同学们可以根据自己的需求,调用不同的方法。

下面,我们通过一个小例子来体验一下精确模式和全模式之间的差异:

首先先展示一下我们案例用的一个小文案:

b541c906fc6a9fce2c4605084a24efdf.png

首先是精确模式

代码总共分为三步:

(1)导入jieba库;并导入文件;

(2)使用jieba库中的cut函数进行分词,剔除了其中为单字的词及换行符,保留剩余结果;

(3)输出分词结果。

  1. import jieba
  2. file_name =r'C:UsersAdministratorDesktopjieba例子.txt'
  3. with open(file_name,'r') as f:
  4. content = f.read()
  5. #这里我定义了一个函数cut_word():
  6. def cut_word():
  7. segment=[]
  8. # 保存分词结果
  9. segs=jieba.cut(content)
  10. # 对整体进行分词
  11. for seg in segs:
  12. if len(seg) > 1 and seg != 'rn':
  13. # 如果说分词得到的结果不是单字,且不是换行符,则加入到数组中
  14. segment.append(seg)
  15. return segment
  16. print(cut_word())

运行结果:

b58ffc5129f35ee5214e132e4f714dcb.png

可以看到,“是”、“的”之类的单字被我们筛除掉了,不过其他词段均完整了进行了分割,效果还是可以的。

下面我们尝试使用全模式

全模式与精确模式的区别,在于使用了 cut_all = True 这一个参数。(其他代码内容不变)

  1. import jieba
  2. file_name =r'C:UsersAdministratorDesktopjieba例子.txt'
  3. with open(file_name,'r') as f:
  4. content = f.read()
  5. #这里我定义了一个函数cut_word():
  6. def cut_word():
  7. segment=[]
  8. # 保存分词结果
  9. segs=jieba.cut(content,cut_all = True)
  10. # 对整体进行分词
  11. for seg in segs:
  12. if len(seg) > 1 and seg != 'rn':
  13. # 如果说分词得到的结果不是单字,且不是换行符,则加入到数组中
  14. segment.append(seg)
  15. return segment
  16. print(cut_word())

f6509fa7e9da1969fcd4a20436d385a6.png

可以看到,更多的词汇被分割出来了。

通过以上这个小例子,我们可以明显感受到精确模式和全模式的差异,大家可以根据实际情况灵活选择。


可能有些小伙伴会问了,当待分词的文案中,出现了jieba词库里没有的词该怎么办?

下面我们再来看一个小例子:

首先还是看看我们的文本:

4d475a0584d4188eb1fe9d71397a6da3.png

使用jieba库进行分词:(做法与前面一致)

  1. import jieba
  2. file_name =r'C:UsersAdministratorDesktopjieba例子.txt'
  3. with open(file_name,'r') as f:
  4. content = f.read()
  5. #这里我定义了一个函数cut_word():
  6. def cut_word():
  7. segment=[]
  8. # 保存分词结果
  9. segs=jieba.cut(content)
  10. # 对整体进行分词
  11. for seg in segs:
  12. if len(seg) > 1 and seg != 'rn':
  13. # 如果说分词得到的结果不是单字,且不是换行符,则加入到数组中
  14. segment.append(seg)
  15. return segment
  16. print(cut_word())

运行结果:

f5dc69858e0e523d4f4f7aaee114504f.png

可以看到,在运行结果中,发明人“肖欣然”的名字并没有被识别,而是被识别成了“欣然”这个词,显然,这种分词结果是我们不想要的。

那为什么会出现这个情况呢?

在我们的jieba库中,存在着几十万个原生词,当然了,当我们涉及到更高级的专业术语、或者人名时,显然jieba库里是不存在的。这时,我们对文段进行分词时便会出现上述这种情况。

为了避免这种情况,我们可以通过向jieba词库里添加新词,或新添自定义词库的方式,从而满足我们的使用需求。

添加新词的方法:

(1)使用jieba.add_word() 添加关键词

通过使用jieba.add_word(),我们可以手动添加一个关键词进入词库,下面我们来回到上面那个例子:

在原例子中,“肖欣然”一

词并没有在词库中,因此没有被识别,因此,我们先利用jieba.add_word(),向词库里填充“肖欣然”一词。

jieba.add_word('肖欣然')

接着再次使用jieba库进行分词:

ce8904f3b52bd8f66abd87eecd9b33e4.png

可以看到,这一次“肖欣然”这个名字便可以被成功分出来了。

然后,通过一次次使用jieba.add_word() 添加关键词的方法,未免有点死板,如果我们想批量添加新词时该怎么办呢?这时候就要利用到另一种添加方法——jieba.load_userdict()。

(2)使用jieba.load_userdict() 批量设置关键词

首先我们来看一下load_userdict() 方法的文档:

1bd4b83c752700b1b24cbaf099d45faf.png

可以看到,当我们使用load_userdict()添加新词时,总共涉及到三个参数:

关键词 词频 词性

也就是说,当我们添加一个词时,需按照 “关键词 词频 词性 ”的顺序进行添加,(如上图红色框内所示,每行一词)

PS:然而,从文档中我们也可以看到,词性是可以省略的;同时,起始词频也是可以省略的。

下面我们还是进行实例操作:

首先看下文本:

8e2dc341f60603abd79af4f790421bd2.png

(1)看看未添加关键词前的分词效果:

  1. import jieba
  2. file_name =r'C:UsersAdministratorDesktopjieba例子.txt'
  3. with open(file_name,'r') as f:
  4. content = f.read()
  5. #这里我定义了一个函数cut_word():
  6. def cut_word():
  7. segment=[]
  8. # 保存分词结果
  9. segs=jieba.cut(content)
  10. # 对整体进行分词
  11. for seg in segs:
  12. if len(seg) > 1 and seg != 'rn':
  13. # 如果说分词得到的结果不是单字,且不是换行符,则加入到数组中
  14. segment.append(seg)
  15. return segment
  16. print(cut_word())

输出结果:

['这是', '一段', '游戏', '解说', '凭借', 'ADC', '螺旋式', '走位', '以及', '辅助', '完美', '开团', '他们', '成功', '打出', '一波', '零换']

下面,我们使用jieba.load_userdict() 批量设置关键词:

步骤一:创建文件,将自己想要添加的词输入进去:

18f4f2fd6626ce6ca9d26ab84d106bea.png

步骤二:导入文件并命名,并使用jieba.load_userdict()方法。

  1. word_file = "C:UsersAdministratorDesktop关键词.txt"
  2. jieba.load_userdict(word_file)

重新查看分词结果:

  1. import jieba
  2. file_name =r'C:UsersAdministratorDesktopjieba例子.txt'
  3. with open(file_name,'r') as f:
  4. content = f.read()
  5. #这里我定义了一个函数cut_word():
  6. def cut_word():
  7. segment=[]
  8. # 保存分词结果
  9. segs=jieba.cut(content)
  10. # 对整体进行分词
  11. for seg in segs:
  12. if len(seg) > 1 and seg != 'rn':
  13. # 如果说分词得到的结果不是单字,且不是换行符,则加入到数组中
  14. segment.append(seg)
  15. return segment
  16. print(cut_word())

130a542a3695124e65feec342c17b210.png

055984375a126493a4927cf52eb0ed8d.png

可以看到,我们想要的词都被保留下来了。

利用pandas,我们还可以轻松地统计出每个词汇的被使用次数。(在统计文章时会很好用)

(忘记相关知识点的同学,可以看我前面发过的文章~)

  1. import pandas
  2. words = cut_word()
  3. df = pandas.DataFrame({'关键词':words})
  4. words_count = df.groupby(by=['关键词'])['关键词'].agg({"出现次数":numpy.size})
  5. words_count = words_count.reset_index().sort_values(by="出现次数",ascending=False)
  6. print(words_count)

eea3f522e9eae574369ec3883737dfd0.png

小例子2:

我们使用上述方法,对《钢铁是怎么炼成的》节选片段进行分析。

45fff3e85cb2199b38071e24faf58fc1.png

我们主要利用这个方法,查看这段文案中使用频率最高的前10个词,代码如下:

  1. import jieba
  2. import pandas
  3. file_name =r'C:UsersAdministratorDesktop钢铁是怎样炼成的.txt'
  4. with open(file_name,'r') as f:
  5. content = f.read()
  6. #这里我定义了一个函数cut_word():
  7. def cut_word():
  8. segment=[]
  9. # 保存分词结果
  10. segs=jieba.cut(content)
  11. # 对整体进行分词
  12. for seg in segs:
  13. if len(seg) > 1 and seg != 'rn':
  14. # 如果说分词得到的结果不是单字,且不是换行符,则加入到数组中
  15. segment.append(seg)
  16. return segment
  17. words = cut_word()
  18. df = pandas.DataFrame({'关键词':words})
  19. words_count = df.groupby(by=['关键词'])['关键词'].agg({"出现次数":numpy.size})
  20. words_count = words_count.reset_index().sort_values(by="出现次数",ascending=False)
  21. #查看使用频率最高的前10个词:
  22. print(words_count.head(10))

输出结果:

e573525bb16077f801020ff7bc0dcfad.png

可以看到输出结果符合我们的要求。


最后,我们甚至可以利用这个方法来制作好看的词云!

我们主要用到以下三个库:

wordcloud、matplotlib、scipy

其中,matplotlib、scipy这两个库在前面的文章我们也介绍得比较多了,因此这里的话我们主要讲一下wordcloud这个库。

侦探L:python绘图库——Matplotlib及Seaborn使用(入门篇1)​zhuanlan.zhihu.com
30813171cc24c8f9d6c5352c35dabdd2.png

wordcloud库:

主要功能:

WordCloud 是一款python环境下的词云图工具包,而词云图可以帮助我们过滤掉文本内低频低质的文本信息,对文本中出现频率较高的“关键词”予以视觉化的展现;

主要参数:

7bedd4af4b8f70b07ceafab63353ff8f.png

46aef8172dedc381f7db7bec0d6798c0.png

394e66248fec202e6f2e34cf13669295.png

下面我们进行实例操作(还是使用上面的代码,接下去)

(1)将我们要用的库导入:

  1. import numpy as np
  2. from scipy.misc import imread
  3. from matplotlib import pyplot as plt
  4. from wordcloud import WordCloud, ImageColorGenerator

(2)选好我们要用的图片:(我用的是下面这一张-)

6593df6ba6804d99153413d8925d8db6.png

这里图片的格式是jpg或png都可以。不过,由于png格式背景一般是透明的,因此当我们的图片格式是png的话,词云的背景色需要设置为None,然后mode应该设为RGBA。

(3)导入示例图片并读取,获取词云对象,同时设置词云背景颜色及字体格式 :

  1. #导入示例图片并读取,获取词云对象,同时设置词云背景颜色及字体格式
  2. bimg = imread('C:UsersAdministratorDesktop示例图片.jpg')
  3. wordcloud = WordCloud(background_color='white', mask=bimg, font_path='simhei.ttf')

(4)将词语和频率转为字典,并映射到词云对象上:

  1. # 将词语和频率转为字典,并映射到词云对象上
  2. words = words_count.set_index("关键词").to_dict()
  3. wordcloud = wordcloud.fit_words(words["出现次数"])

(5)生成词云图片并进行输出:

  1. #生成词云图片并进行输出
  2. bimgColors = ImageColorGenerator(bimg)
  3. plt.axis("off")
  4. plt.imshow(wordcloud.recolor(color_func=bimgColors))
  5. plt.show()

最后,查看我们的运行结果:

206c26fa9c15c96b1164ed3b857b58ac.png

可以看到,我们制作的词云还是挺美观的~

这里如果同学们还可以根据自己的需要,通过调节wordcloud里的各个参数,达到自己想要的效果!(字体、颜色、词云数量都可以调节哦~)


以上便是<如何利用python进行语段分析及分词(还可以制作好看的词云!!)>的内容,感谢大家的细心阅读,同时欢迎感兴趣的小伙伴一起讨论、学习,想要了解更多内容的可以看我的其他文章,同时可以持续关注我的动态~

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小小林熬夜学编程/article/detail/243459?site
推荐阅读
相关标签
  

闽ICP备14008679号