目录
背景
据社交媒体研究机构Shareablee统计的数据显示,近期社交媒体已经超过网络搜索,成为人们消遣和了解疫情的首要渠道。
作为数据分析小白,为了初探疫情下的媒体们在社交平台上的报道重心,我从Shareablee.com下载了从2020年1月至3月Facebook上媒体行业的po文记录,并做了一次简单的词云分析。想通过这样一个实际场景,带大家领略一下词云的有趣之处。
词云的定义
关键词云是对海量文字内容中出现频率较高的“关键词”的视觉突出。对新闻媒体行业而言,关键词字体越大,其被使用的频率越高,越能凸显当前的热点趋势。(示例图如下,摘自icode9.com)
从示例图中,我们不难看出被频繁使用的关键字能迅速内向读者传达人们所讨论的热点话题。
在接下来的实例中,我所用到的数据并非TXT文件,而是Excel文档中的其中一列,所以相较于常规的分词方法有所不同的是,我们需要遍历整个列来进行分词。我会在词云构建的流程中,对该部分进行详细的讲解。
词云的创建
词云构建流程图:
- 获取待分析文件
1.1 导入所需的包
import pandas as pd
import numpy as np
import warnings
from PIL import Image
import matplotlib.pyplot as plt
from wordcloud import WordCloud, ImageColorGenerator #创建词云用到的包
warnings.filterwarnings('ignore')
1.2 读取已下载好的文件
从shareablee.com下载的Excel文档共有10份,为了一次性读取并合并所有文件内容,我用了一个简单的for循环。
dataset_fb=pd.DataFrame()
for i in range(1,10):
data=pd.read_excel('FBpublishing'+str(i)+'.xlsx')
dataset_fb=dataset_fb.append(data)
1.3 查看已读取好的数据
我们所需要用到的数据仅仅为‘Content of Post’ 这一列。
dataset_fb[['Link to Post','Content of Post']].head(2)
1.4 将‘Content of Post' 这一列转换为list格式,便于后续的分词处理
fb_content=dataset_fb['Content of Post'].to_list()
2. 对文本进行分词2.1 删除缺失值
从上述的运行结果中我们可以看到,有些博文是没有文字内容的(显示为nan),我们需要将这些博文记录删除。
dat = [word for word in fb_content if str(word) != 'nan']
2.2 进行分词处理与关键词计数
在遍历每条博文记录前,我们可以自行设定一个列表(此次例子中的list为remove_content),将一些无用的词汇从博文中去除。
dic = {} #建立一个空的字典来存储关键词![在这里插入图片描述](https://www.icode9.com/i/ll/?i=20200406062407169.png)
remove_content=['in','so','they','our','for','can','with','from','his','was','new','her','but','one','what','out','their','who','will','have','your','we','as','the','to','a','the','and','of','is','this','on','that','this','these','are','at','i','it','be','has','be','an','all','by','just','about','not','my','she','he','if','do','or','you']
# fb_content
for i in range(0,len(dat)):
speech = dat[i].lower().split() #将所有的词汇变成小写,避免大小写出现的漏词情况
for word in speech:
if word not in remove_content:
if word not in dic:
dic[word] = 1 #如果所出现的词汇不在字典里,频数记为1
else:
dic[word] = dic[word] + 1 #否则,改词的频数在原本的基础上+1
Key_word=pd.DataFrame(zip(dic.values(),dic.keys())) #将字典的key与其所对应的值转换为两列
Key_word.columns=['Count','Words'] #为这两列取列名
2.3 查看关键词频数
Key_word.sort_values('Count',ascending=False)
- 创建词云
创建词云最有趣的地方是你可以选择不同的背景图,将你的关键词填充进去,让图片变得更加生动有趣。效果示例图如下:
而我所用到背景图如下:
接下来只需要下载好你所需要的背景图片,将图片中所需要出现的不同关键词的个数设定好,就能得到属于你自己的词云了。3.1 创建词云
#image = Image.open('girl.png') # 作为背景轮廓图
image = Image.open('thumb.png') # 作为背景轮廓图
graph = np.array(image)
name = list(Key_word.Words) # 词
value = list(Key_word.Count) # 词的频率
dic = dict(zip(name, value))
wc = WordCloud(background_color="white", max_words=100, mask=graph, max_font_size=600, random_state=42)
wc.generate_from_frequencies(dic)
image_color = ImageColorGenerator(graph)
plt.imshow(wc)
plt.axis("off") # 不显示坐标轴
plt.show()
wc.to_file('词云.png') #将词云存储为png格式
3.2 词云效果图查看