1. 关键词提取技术

在本章,你将了解目前较为实用的关键词提取技术。关键词是代表文章重要内容的一组词。对文本聚类、分类、自动摘要等起重要的作用。此外,它还能使人们便捷地浏
览和获取信息。现实中大量文本不包含关键词,自动提取关键词技术也因此具有重要意义和价值。

一篇文档的关键词等同于最能表达文档主旨的N个词语,即对于文档来说最重要的词,因此,可以将文本关键词抽取问题转化为词语重要性排序问题,选取排名前TopN个词语作为文本关键词。目前,主流的文本关键词抽取方法主要有以下两大类:

(1)基于统计的关键词提取方法
该方法根据统计信息,如词频,来计算得到文档中词语的权重,按权重值排序提取关键词。TF-IDF和TextRank均属于此类方法,其中TF-IDF方法通过计算单文本词频(Term Frequency, TF)和逆文本频率指数(Inverse Document Frequency, IDF)得到词语权重;TextRank方法基于PageRank的思想,通过词语共现窗口构建共现网络,计算词语得分。此类方法简单易行,适用性较强,然而未考虑词序问题。
(2)基于机器学习的关键词提取方法
该方法包括了SVM、朴素贝叶斯等有监督学习方法,以及K-means、层次聚类等无监督学习方法。在此类方法中,模型的好坏取决于特征提取,而深度学习正是特征提取的一种有效方式。由Google推出的Word2Vec词向量模型,是自然语言领域中具有代表性的学习工具。它在训练语言模型的过程中将词典映射到一个更抽象的向量空间中,每一个词语通过高维向量表示,该向量空间中两点之间的距离就对应两个词语的相似程度。

相对于有监督的方法而言,无监督的方法对数据的要求就低多了。既不需要一张人工生成、维护的词表,也不需要人工标准语料辅助进行训练。因此,这类算法在关键词提取领域的应用更受到大家的青睐。本任务主要为大家介绍的就是一些目前较常用的无监督关键词提取算法,分别是TF-IDF算法和TextRank算法。

2. TF-IDF算法

2.1 TF-IDF算法思想

词频(Term Frequency,TF)指某一给定词语在当前文件中出现的频率。由于同一个词语在长文件中可能比短文件有更高的词频,因此根据文件的长度,需要对给定词语进行归一化,即用给定词语的次数除以当前文件的总词数。

逆向文件频率(Inverse Document Frequency,IDF)是一个词语普遍重要性的度量。即如果一个词语只在很少的文件中出现,表示更能代表文件的主旨,它的权重也就越大;如果一个词在大量文件中都出现,表示不清楚代表什么内容,它的权重就应该小。分母加1是为了避免分母为0。

TF-IDF的主要思想是,如果某个词语在一篇文章中出现的频率高,并且在其他文章中较少出现,则认为该词语能较好的代表当前文章的含义。即一个词语的重要性与它在文档中出现的次数成正比,与它在语料库中文档出现的频率成反比。

计算公式如下:

在这里插入图片描述

2.1 TF-IDF文本关键词抽取方法流程

TF-IDF是对文本所有候选关键词进行加权处理,根据权值对关键词进行排序。假设Dn为测试语料的大小,该算法的关键词抽取步骤如下所示:

(1) 对于给定的文本D进行分词、词性标注和去除停用词等数据预处理操作。本分采用结巴分词,保留’n’,‘nz’,‘v’,‘vd’,‘vn’,‘l’,‘a’,'d’这几个词性的词语,最终得到n个候选关键词,即D=[t1,t2,…,tn] ;

(2) 计算词语ti 在文本D中的词频;

(3) 计算词语ti 在整个语料的IDF=log (Dn /(Dt +1)),Dt 为语料库中词语ti 出现的文档个数;

(4) 计算得到词语ti 的TF-IDF=TF*IDF,并重复(2)—(4)得到所有候选关键词的TF-IDF数值;

(5) 对候选关键词计算结果进行倒序排列,得到排名前TopN个词汇作为文本关键词。

3. TextRank算法

3.1PageRank算法思想

TextRank算法是基于PageRank算法的,因此,在介绍TextRank前不得不了解一下PageRank算法。

PageRank算法是Google的创始人拉里·佩奇和谢尔盖·布林于1998年在斯坦福大学读研究生期间发明的,是用于根据网页间相互的超链接来计算网页重要性的技术。该算法借鉴了学术界评判学术论文重要性的方法,即查看论文的被引用次数。基于以上想法,PageRank算法的核心思想是,认为网页重要性由两部分组成:

① 如果一个网页被大量其他网页链接到说明这个网页比较重要,即被链接网页的数量;

② 如果一个网页被排名很高的网页链接说明这个网页比较重要,即被链接网页的权重。

一般情况下,一个网页的PageRank值(PR)计算公式如下所示:

在这里插入图片描述

PageRank计算公式

其中,PR(Pi)是第i个网页的重要性排名即PR值;ɑ是阻尼系数,一般设置为0.85;N是网页总数;Mpi 是所有对第i个网页有出链的网页集合;L(Pj)是第j 个网页的出链数目。

初始时,假设所有网页的排名都是1/N,根据上述公式计算出每个网页的PR值,在不断迭代趋于平稳的时候,停止迭代运算,得到最终结果。一般来讲,只要10次左右的迭代基本上就收敛了。

3.2 TextRank文本关键词抽取方法流程

TextRank算法是Mihalcea和Tarau于2004年在研究自动摘要提取过程中所提出来的,在PageRank算法的思路上做了改进。该算法把文本拆分成词汇作为网络节点,组成词汇网络图模型,将词语间的相似关系看成是一种推荐或投票关系,使其可以计算每一个词语的重要性。

基于TextRank的文本关键词抽取是利用局部词汇关系,即共现窗口,对候选关键词进行排序,该方法的步骤如下:

(1) 对于给定的文本D进行分词、词性标注和去除停用词等数据预处理操作。本分采用结巴分词,保留’n’,‘nz’,‘v’,‘vd’,‘vn’,‘l’,‘a’,'d’这几个词性的词语,最终得到n个候选关键词,即D=[t1,t2,…,tn] ;

(2) 构建候选关键词图G=(V,E),其中V为节点集,由候选关键词组成,并采用共现关系构造任两点之间的边,两个节点之间仅当它们对应的词汇在长度为K的窗口中共现则存在边,K表示窗口大小即最多共现K个词汇;

(3) 根据公式迭代计算各节点的权重,直至收敛;

(4) 对节点权重进行倒序排列,得到排名前TopN个词汇作为文本关键词。

说明:Jieba库中包含jieba.analyse.textrank函数可直接实现TextRank算法,本文采用该函数进行实验。

4. 关键词抽取步骤

训练一个关键词提取算法需要以下几个步骤:

1)加载已有的文档数据集。
2)加载停用词表。
3)对数据集中的文档进行分词。
4)根据停用词表,过滤干扰词。
5)根据数据集训练算法。

而根据训练好的关键词提取算法对新文档进行关键词提取要经过以下环节:

1)对新文档进行分词。
2)根据停用词表,过滤干扰词。
3)根据训练好的算法提取关键词。

任务实施:

文本关键词抽取,是对文本信息进行高度凝练的一种有效手段,通过3-5个词语准确概括文本的主题,帮助读者快速理解文本信息。目前,用于文本关键词提取的主要方法有四种:基于TF-IDF的关键词抽取、基于TextRank的关键词抽取、基于Word2Vec词聚类的关键词抽取,以及多种算法相融合的关键词抽取。
本任务Python代码的实现使用到了多个著名的第三方模块,主要模块如下所示:

(1)Jieba
目前使用最为广泛的中文分词组件。下载地址:https://pypi.python.org/pypi/jieba/
(2)Gensim
用于主题模型、文档索引和大型语料相似度索引的python库,主要用于自然语言处理(NLP)和信息检索(IR)。下载地址:https://pypi.python.org/pypi/gensim
本实例中的维基中文语料处理和中文词向量模型构建需要用到该模块。
(3)Pandas
用于高效处理大型数据集、执行数据分析任务的python库,是基于Numpy的工具包。下载地址:https://pypi.python.org/pypi/pandas/0.20.1
(4)Numpy
用于存储和处理大型矩阵的工具包。下载地址:https://pypi.python.org/pypi/numpy
(5)Scikit-learn
用于机器学习的python工具包,python模块引用名字为sklearn,安装前还需要Numpy和Scipy两个Python库。官网地址:http://scikit-learn.org/stable/ 本实例中主要用到了该模块中的feature_extraction、KMeans(k-means聚类算法)和PCA(pac降维算法)。
(6)Matplotlib
Matplotlib是一个python的图形框架,用于绘制二维图形。下载地址:https://pypi.python.org/pypi/matplotlib

1.基于TF-IDF的关键词抽取

基于TF-IDF方法实现文本关键词抽取的代码执行步骤如下:

(1)读取样本源文件sample_data.csv;

(2)获取每行记录的标题和摘要字段,并拼接这两个字段;

(3)加载自定义停用词表stopWord.txt,并对拼接的文本进行数据预处理操作,包括分词、筛选出符合词性的词语、去停用词,用空格分隔拼接成文本;

(4)遍历文本记录,将预处理完成的文本放入文档集corpus中;

(5)使用CountVectorizer()函数得到词频矩阵,a[j][i]表示第j个词在第i篇文档中的词频;

(6)使用TfidfTransformer()函数计算每个词的tf-idf权值;

(7)得到词袋模型中的关键词以及对应的tf-idf矩阵;

(8)遍历tf-idf矩阵,打印每篇文档的词汇以及对应的权重;

(9)对每篇文档,按照词语权重值降序排列,选取排名前topN个词最为文本关键词,并写入数据框中;

(10)输出数据框。

1.1 安装相关依赖包
!pip install numpy==1.21.6
!pip install scikit-learn==1.0.2
!pip install jieba==0.42.1
!pip install pandas==1.3.5
!pip install matplotlib==3.5.2
!pip install wordcloud==1.8.1
import sys,codecs
import pandas as pd
import numpy as np
import jieba.posseg
import jieba.analyse
from sklearn import feature_extraction
from sklearn.feature_extraction.text import TfidfTransformer
from sklearn.feature_extraction.text import CountVectorizer
1.2 读取样本源文件并查看数据

本任务将汽车行业的10篇专利作为样本数据集,见文件“data/sample_data.csv”。文件中依顺序包含编号(id)、标题(title)和摘要(abstract)三个字段,其中标题和摘要都要参与到关键词的抽取。

运行以下代码读取数据集并展示

读取数据集

dataFile = './data/sportss.csv'
data = pd.read_csv(dataFile)
data
运行以下代码查看数据集中第一行摘要字段
data['abstract'][0] #查看第一个摘要
1.3 增加停用词

由于本实例的样本是体育新闻文本,词汇专业性较高,需要人工新增停用词,可直接在停用词表中添加,一行为一个停用词。
动手练习1

打开文件“data/stopWord.txt”,在文件前面新增“新浪”、“北京”、“时间”、“微博”这四个停用词。
运行以下代码,若出现以下内容。则说明操作正确。

   ['新浪\n', '北京\n', '时间\n', '微博\n']
with open("./data/stopWord.txt",encoding="utf-8") as f:
print(f.readlines()[:4])
TF-IDF权重:
       1、CountVectorizer 构建词频矩阵
       2、TfidfTransformer 构建tfidf权值计算
       3、文本的关键字
       4、对应的tfidf矩阵

动手练习2

  1. 在<1>处定义选取的词性,我们需要名词、其他专名、普通动词、动副词、名动词、习用语、形容词、副词
  2. 在<2>处添加“微博”到jieba字典中。
    外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

#在这里手敲上面代码并填补缺失代码

def dataPrepos(text,stopkey):
l = []
pos = ["n", "ns", "v", "d", "vn", "l", "a", "ad"]
jieba.add_word("微博")
seg = jieba.posseg.cut(text)
for i in seg:
if i.word not in stopkey and i.flag in pos:
l.append(i.word)
return l

执行以下代码,若出现以下结果,则说明填写正确。

['湖人', '首发', '带伤', '战', '战', '体育讯', '时间', '湖人', '主场', '迎战', '比赛', '双方', '战成', '平', '本场', '比赛', '球队', '重要', '双方', '公布', '首发', '阵容', '黄蜂队', '扎', '官方', '湖人', '新闻动态', '专题', '湖人', '图文', '直播室', '体育']
text = """黄蜂vs湖人首发:科比带伤战保罗 加索尔救赎之战 新浪体育讯北京时间4月27日,
NBA季后赛首轮洛杉矶湖人主场迎战新奥尔良黄蜂,此前的比赛中,双方战成2-2平,
因此本场比赛对于两支球队来说都非常重要,赛前双方也公布了首发阵容:
湖人队:费舍尔、科比、阿泰斯特、加索尔、拜纳姆黄蜂队:保罗、贝里内利、阿里扎、兰德里、奥卡福
[新浪NBA官方微博][新浪NBA湖人新闻动态微博][新浪NBA专题][黄蜂vs湖人图文直播室](新浪体育)"""
stopkey = [w.strip() for w in codecs.open('./data/stopWord.txt', 'r', 'utf8').readlines()]
text = dataPrepos(text, stopkey)
print(text)
1.4 整理语料格式

动手练习3

  1. 在<1>处获取每行记录的id、标题和摘要字段;
  2. 在<2>处拼接标题和摘要两个字段,并用“。”连接。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

def getCorpus(data,stopkey):
idList = data.id
titleList =data.title
abstractList = data.abstract
corpus = []
for index in range(len(idList)):
text = ".".join([titleList[index], abstractList[index]])
text = dataPrepos(text,stopkey)
text = " ".join(text)
corpus.append(text)
return idList,titleList,abstractList,corpus

执行以下代码,若出现以下结果,则说明填写正确。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

stopkey = [w.strip() for w in codecs.open('./data/stopWord.txt', 'r', 'utf8').readlines()]
idList, titleList, abstractList, corpus = getCorpus(data,stopkey)
print(corpus)
1.5 实现TF-IDF关键词抽取

Python第三方工具包Scikit-learn提供了TFIDF算法的相关函数,本任务主要用到了sklearn.feature_extraction.text下的TfidfTransformer和CountVectorizer函数。其中,CountVectorizer函数用来构建语料库的中的词频矩阵,TfidfTransformer函数用来计算词语的tfidf权值。

注:TfidfTransformer()函数有一个参数smooth_idf,默认值是True,若设置为False,则IDF的计算公式为idf=log(Dn /Dt ) + 1。
CountVectorizer是属于常见的特征数值计算类,是一个文本特征提取方法。对于每一个训练文本,它只考虑每种词汇在该训练文本中出现的频率。CountVectorizer会将文本中的词语转换为词频矩阵,它通过fit_transform函数计算各个词语出现的次数。

CountVectorizer(input='content', encoding='utf-8',  decode_error='strict', strip_accents=None, lowercase=True, preprocessor=None, tokenizer=None, stop_words=None, token_pattern='(?u)\b\w\w+\b', ngram_range=(1, 1), analyzer='word', max_df=1.0, min_df=1, max_features=None, vocabulary=None, binary=False, dtype=)

参数说明:

  • ngram_range:词组切分的长度范围;
  • max_df:可以设置为范围在[0.0 1.0]的float,也可以设置为没有范围限制的int,默认为1.0。这个参数的作用是作为一个阈值,当构造语料库的关键词集的时候,如果某个词的document frequence大于max_df, 这个词不会被当作关键词。如果这个参数是float, 则表示词出现的次数与语料库文档数的百分比,如果是int,则表示词出现的次数。如果参数中已经给定了vocabulary,则这个参数无效;
  • min_df:类似于max_ df, 不同之处在于如果某个词的document frequence小于min df, 则这个词不会被当作关键词;
  • max_features:默认为None,可设为int, 对所有关键词的term frequency进行降序排序,只取前max_ _features个作为关键词集。

动手练习4

  1. 在<1>处使用CountVectorizer()函数得到词频矩阵,并添加参数decode_error="replace"以保存训练特征;
  2. 在<2>处使用TfidfTransformer()函数计算每个词的tf-idf权值;
  3. 在<3>处使用get_feature_names()函数获取词袋模型中的关键词。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

#在这里手敲上面代码并填补缺失代码
#tf-idf获取文本top10关键词
idList,titlelist,abstractList, corpus = getCorpus(data, stopkey)
# 1、构建词频矩阵,游文本中的词语转换成词频矩阵
vectorizer = CountVectorizer(decode_error="replace")
X = vectorizer.fit_transform(corpus) # 河频矩阵,a[i][j]表示i在个文本中的词频
# 2、统计每个词的tf-idf值
transformer = TfidfTransformer()
tfidf = transformer.fit_transform(X)
# 3、获取词袋模型中的关链词
word = vectorizer.get_feature_names()
# 4、获tf-idf矩阵,a[i]l]表示i词在篇文本中的f-idf灰重
weight = tfidf.toarray()
# 打印并保存结果
def getKeywords_tfidf(idList, titleList, abstractList, weight):
ids, titles, keys = [], [], []
for i in range(len(weight)):
print (u"-------这里输出第", i+1 , u"篇文本的前 10 词语tf-idf------")
ids.append(idList[i])
titles.append(titleList[i])
df_word,df_weight = [],[] # 当前文章的所有词汇列表、词汇对应权重列表
for j in range(len(word)):
df_word.append(word[j])
df_weight.append(weight[i][j])
df_word = pd.DataFrame(df_word,columns=['word'])
df_weight = pd.DataFrame(df_weight,columns=['weight'])
word_weight = pd.concat([df_word, df_weight], axis=1) # 拼接词汇列表和权重列表
word_weight = word_weight.sort_values(by="weight",ascending = False) # 按照权重值降序排列
keyword = np.array(word_weight['word']) # 选择词汇列并转成数组格式
word_split = [keyword[x] for x in range(0,10)] # 抽取前10个词汇作为关键词
print(word_weight[:10])
word_split = " ".join(word_split)
keys.append(word_split)
result = pd.DataFrame({"id": ids, "title": titles, "key": keys},columns=['id','title','key'])
return result

执行以下代码,若出现以下结果,则说明填写正确。

在这里插入图片描述

tf-idf关键词抽取

result = getKeywords_tfidf(idList, titleList, abstractList, weight)
result.to_csv("result/keys_TFIDF.csv",index=False, encoding= "utf-8-sig")
1.6 词典保存与预测

保存经过fit的vectorizer 与 经过fit的transformer,保存在models文件夹下。

import pickle
feature_path = 'models/feature.pkl'
with open(feature_path, 'wb') as fw:
pickle.dump(vectorizer.vocabulary_, fw)

动手练习5

  1. 参照上方代码,在<1>处保存经过fit的transformer;
  2. 在<2>处使用pickle.load加载transformer;
  3. 在<3>处使用transform函数测试数据。

在这里插入图片描述

#在这里手敲上面代码并填补缺失代码
# 保存transformer
tfidftransformer_path = 'models/tfidftransformer.pkl'
with open(tfidftransformer_path, 'wb') as f:
pickle.dump(transformer, f)
# 加载特征
feature_path = 'models/feature.pkl'
loaded_vec = CountVectorizer(decode_error="replace", vocabulary=pickle.load(open(feature_path, "rb")))
# 加TfidfTransformer
tfidftransformer_path = 'models/tfidftransformer.pkl'
tfidftransformer = pickle.load(open(tfidftransformer_path, 'rb'))
#测过用transform,表示测这数据,为List
test_data = ["这是一个测试文本"]
X_test = loaded_vec.transform(test_data)
test_tfidf = tfidftransformer.transform(X_test)
# 获tf-idf矩阵,a[i][]表示j词在篇文本中的tf-idf灰重
weight = test_tfidf.toarray()

运行以下代码,若输出为下面内容,则说明填写正确。

在这里插入图片描述

tf-idf关键词预测

testresult = getKeywords_tfidf(idList, titleList, abstractList, weight)
testresult.to_csv("result/testkeys_TFIDF.csv",index=False, encoding= "utf-8-sig")

2. 基于TextRank的关键词抽取

基于TextRank方法实现文本关键词抽取的代码执行步骤如下:

(1)读取样本源文件sample_data.csv;

(2)获取每行记录的标题和摘要字段,并拼接这两个字段;

(3)加载自定义停用词表stopWord.txt;

(4)遍历文本记录,采用jieba.analyse.textrank函数筛选出指定词性,以及topN个文本关键词,并将结果存入数据框中;

(5)输出结果。

2.1 使用jieba的textrank算法

采用jieba.analyse.textrank函数筛选出指定词性,以及topN个文本关键词,函数如下:

jieba.analyse.textrank(sentence, topK=20, withWeight=False, allowPOS=('ns', 'n', 'vn', 'v'))

参数解释如下:

string:待处理语句
topK:关键字的个数,默认20
withWeight:是否返回权重值,默认false
allowPOS:是否仅返回指定类型,默认为空

以下代码是筛选出指定词性,包括地名、名词、名动词和动词,以及5个文本关键词和相应权重的效果。

text = """
黄蜂vs湖人首发:科比带伤战保罗 加索尔救赎之战 新浪体育讯北京时间4月27日,
NBA季后赛首轮洛杉矶湖人主场迎战新奥尔良黄蜂,此前的比赛中,双方战成2-2平,
因此本场比赛对于两支球队来说都非常重要,赛前双方也公布了首发阵容:
湖人队:费舍尔、科比、阿泰斯特、加索尔、拜纳姆黄蜂队:保罗、贝里内利、阿里扎、兰德里、奥卡福
[新浪NBA官方微博][新浪NBA湖人新闻动态微博][新浪NBA专题][黄蜂vs湖人图文直播室](新浪体育)
"""
jieba.analyse.textrank(text, topK=10, withWeight= True, allowPOS=('ns', 'n', 'vn', 'v'))
2.2 实现textrank关键词抽取

动手练习6

  1. 在<1>处加载自定义停用词表./data/stopWord.txt
  2. 在<2>处采用jieba.analyse.textrank函数筛选出指定词性(‘n’,‘nz’,‘v’,‘vd’,‘vn’,‘l’,‘a’,‘d’),以及topN个文本关键词,不返回权重值。
    在这里插入图片描述
import sys
import pandas as pd
import jieba.analyse
# 处理标题和摘要,提取关键词
def getKeywords_textrank(data, topk):
idList, titleList, abstractList = data['id'], data['title'], data['abstract']
ids, titles, keys = [], [], []
for index in range(len(idList)):
text = '%s。%s' % (titleList[index], abstractList[index])
# 加载自定义停用词表
jieba.analyse.set_stop_words('./data/stopWord.txt')
print(titleList[index], " 10 Keywords - TextRank :")
keywords = jieba.analyse.textrank(text, topK=topk, allowPOS=('n', 'nz', 'v', 'vd', 'vn', 'l', 'a', 'd'), withWeight=False)
word_split = " ".join(keywords)
print(word_split)
keys.append(word_split)
ids.append(idList[index])
titles.append(titleList[index])
result = pd.DataFrame({"id": ids, "title": titles, "key": keys}, columns=['id', 'title', 'key'])
return result

运行以下代码,若出现下图结果,则说明填写正确。

在这里插入图片描述

result = getKeywords_textrank(data,10)
result.to_csv("result/keys_TR.csv",index=False, encoding= "utf-8-sig")

结果文件可以在result文件夹下查看。

2.3 绘制关键词的词云图

词云特点:出现频率越多的单词,字体越大,所以我们在分析文本中的关键词的时候有重要作用。

wordcloud库:用来生成词云文本,根据词频绘制词云图像

import matplotlib.pyplot as plt
%matplotlib inline
import matplotlib
import pandas as pd
from wordcloud import WordCloud # 词云包

读取数据,将其整理成wordcloud需要的格式。

filepath = "./result/keys_TR.csv"
text = pd.read_csv(filepath)
wc_text = ""
for l in text["key"]:
wc_text += str(l+" ")
wc_text

wordcloud.WordCloud()用于生成和绘制的Word云对象,参数说明如下:

  • font_path:str,要使用的字体(OTF或TTF)的字体路径;
  • width :int(默认=400),画布的宽度;
  • height :int(默认=200),画布的高度;
  • max_words :数字(默认=200),单词的最大数量;
  • stopwords :一组字符串或没有将被删除的单词。如果没有,将使用内置的STOPWORDS列表;
  • background_color :颜色值(默认=“黑色”),背景色为字云图像;
  • max_font_size : int或None(默认=None),为最大的字的最大字体大小。如果没有,则使用图像的高度。
matplotlib.rcParams['figure.figsize'] = (10.0,6.0)
# wc = WordCloud(font_path=font_path).generate(text)
wc = wordcloud.WordCloud(font_path='./data/simhei.ttf',background_color='white',max_font_size=80).generate(wc_text) # 加载词云文本
plt.imshow(wc, interpolation='bilinear')# 用plt显示图片
plt.axis("off")  # 不显示坐标轴
plt.show() # 显示图片

动手练习7

用’keys_TFIDF.csv’数据来绘制一个心形词云图。

  1. 在<1>处加载keys_TFIDF.csv数据集;
  2. 在<2>处读取蒙版图像,用Image.open函数打开蒙版图像,并用np.array函数将其转换为矩阵;
  3. 在<3>处添加蒙版参数。
    在这里插入图片描述
#在这里手敲上面代码并填补缺失代码
import numpy as np
from PIL import Image
# 读取显示的词文件
filepath = './result/keys_TFIDF.csv'
text = pd.read_csv(filepath)
WC_text = ""
for l in text["key"]:
wc_text += str(l+" ")# 读取蒙版图像
heart_mask = np.array(Image.open("./data/heart.png"))
#创建词云对象
wc = WordCloud(font_path="./data/simhei.ttf",background_color='white',max_font_size=80,mask=heart_mask)
#生成词云
wc.generate(wc_text)
# 展示图缘
plt.imshow(wc,interpolation='bilinear')# 用lt显不图片
plt.axis("off") # 不显示华标热
plt.show() # 显示图片

若出现以下结果,则说明填写正确。

在这里插入图片描述