目录

 

1、实例理解

2、添加自定义词典

3、关键词抽取

4、分词-词云展示


Python中分分词工具很多,包括盘古分词、Yaha分词、Jieba分词、清华THULAC等。它们的基本用法都大同小异,使用的比较广泛的是结巴分词。

 

Jieba分词结合了基于规则基于统计这两类方法:

  • 基于前缀词典实现词图扫描,生成句子中汉字所有可能成词情况所构成的有向无环图(DAG),采用动态规划查找最大概率路径,找出基于词频的最大切分组合;
  • 对于未登录词,采用了基于汉字成词能力的 HMM模型,采用Viterbi算法进行计算;
  • 基于Viterbi算法的词性标注;
  • 分别基于tfidf和textrank模型抽取关键词;

 

Jieba提供了三种分词模式:

  • 精确模式:试图将句子最精确地切开,适合文本分析。
  • 全模式:把句子中所有可以成词的词语都扫描出来,速度非常快,但是不能解决歧义。
  • 搜索引擎模式:在精确模式的基础上,对长词再次切分,提高召回率,适合用于搜索引擎分词。

1、实例理解

先导入结巴包

import jieba

包的安装可以直接pip install jieba

 

c="我来到北京清华大学"

seg_list = jieba.cut(c, cut_all=True)
print("全模式: " + "/ ".join(seg_list))  # 全模式

seg_list = jieba.cut(c, cut_all=False)
print("精确模式: " + "/ ".join(seg_list))  # 精确模式

seg_list = jieba.cut(c)  # 默认是精确模式
print("默认模式: " + "/ ".join(seg_list))

seg_list = jieba.cut_for_search(c)  # 搜索引擎模式模式
print("搜索引擎模式: " + "/ ".join(seg_list))

结果: 

全模式: 我/ 来到/ 北京/ 清华/ 清华大学/ 华大/ 大学
精确模式: 我/ 来到/ 北京/ 清华大学
默认模式: 我/ 来到/ 北京/ 清华大学
搜索引擎模式: 我/ 来到/ 北京/ 清华/ 华大/ 大学/ 清华大学

可以看到,全模式和搜索引擎模式下,Jieba将会把分词的所有可能都打印出来。一般直接使用精确模式即可,但是在某些模糊匹配场景下,使用全模式或搜索引擎模式更适合。

 

2、添加自定义词典

有些特定的名词,结巴可能没有记录不能区分,需要我们自己添加自定义词典来进行分词

先看一个例子

text = "故宫的著名景点包括乾清宫、太和殿和黄琉璃瓦等"

# 全模式
seg_list = jieba.cut(text, cut_all=True)
print(u"[全模式]: ", "/ ".join(seg_list))

# 精确模式
seg_list = jieba.cut(text, cut_all=False)
print(u"[精确模式]: ", "/ ".join(seg_list))
[全模式]:  故宫/ 的/ 著名/ 著名景点/ 景点/ 包括/ 乾/ 清宫/ / / 太和/ 太和殿/ 和/ 黄/ 琉璃/ 琉璃瓦/ 等
[精确模式]:  故宫/ 的/ 著名景点/ 包括/ 乾/ 清宫/ 、/ 太和殿/ 和/ 黄/ 琉璃瓦/ 等

可以看到乾清宫和黄琉璃瓦没能正确分词

在当前文件夹下建立一个txt文件,命名为mydict

文件内容如下(文件格式一定要保存为UTF-8)

乾清宫 1 n
黄琉璃瓦 1 n
jieba.load_userdict("./mydict.txt") #需UTF-8,可以在另存为里面设置

#也可以用jieba.add_word("乾清宫")

text = "故宫的著名景点包括乾清宫、太和殿和黄琉璃瓦等"

# 全模式
seg_list = jieba.cut(text, cut_all=True)
print(u"[全模式]: ", "/ ".join(seg_list))

# 精确模式
seg_list = jieba.cut(text, cut_all=False)
print(u"[精确模式]: ", "/ ".join(seg_list))
[全模式]:  故宫/ 的/ 著名/ 著名景点/ 景点/ 包括/ 乾清宫/ 清宫/ / / 太和/ 太和殿/ 和/ 黄琉璃瓦/ 琉璃/ 琉璃瓦/ 等
[精确模式]:  故宫/ 的/ 著名景点/ 包括/ 乾清宫/ 、/ 太和殿/ 和/ 黄琉璃瓦/ 等

这样就可以正确的进行区分了

 

3、关键词抽取

import jieba.analyse

seg_list = jieba.cut(text, cut_all=False)
print (u"分词结果:"+"/".join(seg_list))
print ()

#获取关键词
tags = jieba.analyse.extract_tags(text, topK=5)
print (u"关键词:"+" ".join(tags))
分词结果:故宫/的/著名景点/包括/乾清宫/、/太和殿/和/黄琉璃瓦/等

关键词:著名景点 乾清宫 黄琉璃瓦 太和殿 故宫

可以查看前K个关键词

当然也可以查看关键词的权重

tags = jieba.analyse.extract_tags(text, topK=5, withWeight=True)
for word, weight in tags:
    print(word, weight)
著名景点 2.3167796086666668
乾清宫 1.9924612504833332
黄琉璃瓦 1.9924612504833332
太和殿 1.6938346722833335
故宫 1.5411195503033335

查看词性标注

import jieba.posseg as pseg

text = "故宫的著名景点包括乾清宫、太和殿和黄琉璃瓦等"
words = pseg.cut(text)
for word, flag in words:
    print("%s %s" % (word, flag))
故宫 n
的 uj
著名景点 n
包括 v
乾清宫 n
、 x
太和殿 nr
和 c
黄琉璃瓦 n
等 u

 

4、分词-词云展示

我们利用结巴分词来分析19大报告,并用词云来展示一下

import jieba
from wordcloud import WordCloud
from scipy.misc import imread
from collections import Counter
import matplotlib.pyplot as plt
%matplotlib inline

data={}

text_file = open('./data/19Congress.txt','r',encoding='utf-8')#导入文本
text = text_file.read()
with open('./data/stopwords.txt',encoding='utf-8') as file:
    stopwords = {line.strip() for line in file}

seg_list = jieba.cut(text, cut_all=False)
for word in seg_list:
    if len(word)>=2:
        if not data.__contains__(word):
            data[word]=0
        data[word]+=1
#print(data)  计数    
 
#参数设置
my_wordcloud = WordCloud(  
    background_color='white',  #设置背景颜色
    max_words=400,  #设置最大实现的字数
    font_path=r'./data/SimHei.ttf',  #设置字体格式,如不设置显示不了中文
    mask=imread('./data/mapofChina.jpg'), #指定在什么图片上画
    width=1000,
    height=1000,
    stopwords = stopwords
).generate_from_frequencies(data)

#展示
plt.figure(figsize=(18,16))
plt.imshow(my_wordcloud)
plt.axis('off')
plt.show()  # 展示词云
#保存
my_wordcloud.to_file('result.jpg')
text_file.close()