赞
踩
利用爬虫爬取网上新闻,评论,并从中分析最近社会热点,是数据科学,人工智能中的热点之一,其中在分析文本中使用词云图,看起来简洁明了,因为如下图出现频率最高的词会显示在屏幕最中央,同时更有意思的我们可以利用不同的图片使得词云图呈现出不同的形状,那么具体是如何完成的呢,我们从下面开始逐渐分析
这里我采用的是最近中文新闻网站上所抓取的数类新闻数据,并且已经提前分好类了(这个文本同时可以用来做文本分类,我最近也正好在做这个,如果对于这种大数据中文文本处理有经验的大佬,欢迎赐教):
对于这样的数据集(拥有多个sheet的EXCEL),我们可以考虑使用pandas配合XLRD库来进行读取从而把所有的子表读取到数据中,代码编写如下:
import xlrd import pandas as pd from pandas import DataFrame excel_name = '文本.xlsx' wb = xlrd.open_workbook(excel_name) # 获取workbook中所有的表格 sheets = wb.sheet_names() # 循环遍历所有sheet df_28 = DataFrame() for i in range(len(sheets)): df = pd.read_excel(excel_name, sheet_name=i) df_28 = df_28.append(df) data = df_28 #这样我们就将所有数据读取到dataFrame对象的data
在介绍如何处理之前,我这里先简单介绍一下我们这次处理数据的目的,我们的词云图是通过统计所有文本中出现的单词频率,但是我们的数据却是这样:
content = data['content']
print(content.iloc[1])
输出:
北京3月31日电 (记者 王恩博)记者3月31日从中国银保监会获悉,官方将坚决惩治重大金融风险背后的腐败问题。破坏监管秩序、市场秩序,造成国有金融资产重大损失甚至诱发风险事件的,一律严惩不贷。银保监会表示,近年来,银保监会党委坚决贯彻落实中共中央全面从严治党重大决策部署,坚持从惩治腐败和防范化解金融风险大局出发,深化金融领域反腐力度,积极支持、全力配合驻会纪检监察组,严查重大金融风险、监管失职失守背后的腐败问题并向金融基础设施等领域延伸。谈及下一步工作,银保监会表示,将坚决惩治重大金融风险背后的腐败问题。坚持无禁区、全覆盖、零容忍,坚持重遏制、强高压、长震慑,重点关注高风险机构和地区,持续深入查处重大风险事件、金融案件背后的利益输送、监管失守问题,特别是破坏监管秩序、市场秩序,造成国有金融资产重大损失甚至诱发风险事件的,一律严惩不贷。同时,落实中共十九届五中全会和中央经济工作会议对新时代经济金融工作作出一系列重大决策部署,重点做好反垄断和防止资本无序扩张、提高金融服务实体经济发展效能、妥善处置银行业保险业重大风险、规范发展城商行和农村中小金融机构、完善现代金融监管体系、强化金融消费者权益保护等工作。银保监会还提及,坚决严查违反中央八项规定精神案件,坚定释放越往后盯得越紧、执纪越严的信号。对拉拢腐蚀监管干部的金融机构和人员,严格执行“双通报”;落实行贿受贿一起查处,涉及金融机构及其人员违法违规违纪问题,及时通报监管部门,督促作出严肃处理。(完)
然后我们就发现中文和英文的天大区别,英文的每一句话是有一堆单词加空格组成的,例如
英文:I love you.这句话里其中每个单词之间是有间隔的,我们如果要对这句话进行处理的话,我们可以直接利用空格将句子简单的切成三个单词 ‘I’,‘love’,‘you’,而而我们的中文却与之相反,
中文:我喜欢你。这句话我们还能使用空格划分句子吗?显然是不能的,那么如何处理呢,这里我们可以用他人以及训练好的模型,jieba库的cut方法从而来处理中文文本,代码如下:
import re import jieba.posseg as pseg def word_slice(lines): corpus = [] corpus.append(lines.strip()) stripcorpus = corpus.copy() for i in range(len(corpus)): stripcorpus[i] = re.sub("@([\s\S]*?):", "", corpus[i]) # 去除@ ...: stripcorpus[i] = re.sub("\[([\S\s]*?)\]", "", stripcorpus[i]) # [...]: stripcorpus[i] = re.sub("@([\s\S]*?)", "", stripcorpus[i]) # 去除@... stripcorpus[i] = re.sub( "[\s+\.\!\/_,$%^*(+\"\']+|[+——!,。?、~@#¥%……&*()]+", "", stripcorpus[i]) # 去除标点及特殊符号 stripcorpus[i] = re.sub("[^\u4e00-\u9fa5]", "", stripcorpus[i]) # 去除所有非汉字内容(英文数字) stripcorpus[i] = re.sub("原标题", "", stripcorpus[i]) stripcorpus[i] = re.sub("回复", "", stripcorpus[i]) stripcorpus[i] = re.sub("(完)", "", stripcorpus[i]) # 相当于replace #这里先使用re库清洗数据,将不影响原文意思和特殊字符全部去除 onlycorpus = [] for string in stripcorpus: if(string == ''): continue else: if(len(string) < 5): continue else: onlycorpus.append(string) cutcorpusiter = onlycorpus.copy() cutcorpus = onlycorpus.copy() wordtocixing = [] # 储存分词后的词语 for i in range(len(onlycorpus)): cutcorpusiter[i] = pseg.cut(onlycorpus[i]) print(cutcorpusiter[i]) cutcorpus[i] = "" for every in cutcorpusiter[i]: cutcorpus[i] = (cutcorpus[i] + " " + str(every.word)).strip() wordtocixing.append(every.word) return wordtocixing fp = open('text2.txt', "w+", encoding='utf-8') lenx=[] for string in content: if not isinstance(string,str): continue lines=word_slice(string) lenx.append(len(lines)) for line in lines: fp.write(line) fp.write(' ') fp.write('\n') fp.close() #这里我的方法是将切割后的文本全部存储到一个text2.txt,方便以后使用,每一句的所有单词在同一行吗,同时以换行符来区分每个句子
这里最终形成的text2.txt样式如下:
python拥有一个wordcloud库,可以形成词云图,所以我们编写代码如下
import numpy as np from PIL import Image from wordcloud import WordCloud, ImageColorGenerator from matplotlib import pyplot as plt from collections import Counter def split_four_text(words): words_list=list(words) words=[ lst.split(' ') for lst in words_list] result=[] for wordslst in words: for word in wordslst: result.append(word) # 用Counter方法计算单词频率数 count = Counter(result) most_count = count.most_common() words_list = [] for i in most_count: if len(i[0]) >= 4:#一个中文占据两个字节,然后我们只要大于四个字节的单词 words_list.append(i[0]) return words_list def draw_wordcloud(text, image_mask,): # draw_wordcloud函数以用户定义的模板轮廓图来显示中文词云。 sanguo_mask = np.array(Image.open(image_mask)) wordcloud = WordCloud(background_color = 'white', mask = sanguo_mask, max_words = 1000,font_path='C:\\Windows\\STCAIYUN.TTF') # 如果不设置中文字体,可能会出现乱码) wordcloud.generate(text) image_colors = ImageColorGenerator(sanguo_mask) wordcloud.to_file("wordcloud_jiaran.jpg")#存储图片 plt.figure(figsize = (14, 8)) # 创建左侧中文词云图 plt.subplot(1,2,1) plt.imshow(wordcloud.recolor(color_func = image_colors), interpolation = 'bilinear') plt.axis('off') # 创建右侧原图 plt.subplot(1,2,2) plt.imshow(sanguo_mask, interpolation = 'bilinear') plt.axis('off') plt.show() text_content = open('text2.txt',encoding='UTF-8') str1 = split_four_text(words=text_content) # 由于split_four_text函数返回的是一个list类型,词云只接收字符串或者二进制形式输入, # 所以用str()函数转换为字符串。 draw_wordcloud(text = str(str1), image_mask = 'jiaran.jpg')#image_mask决定我们要输入的词云形状
关于词云的字体如果我们默认不使用的话,由于是中文买就会出现乱码集中文被一堆矩形框所代替,所以我们需要进入C:\Windows\Fonts文件夹下寻找中文字体:
然后在属性中查看该字体的名字,从而使用,比如我选择的是’C:\Windows\STCAIYUN.TTF’,那么通过这样的方法我产生了五张不同形状的词云图
这五个可爱的女孩子是虚拟偶像欧,感谢她们给博主最近无聊乏味的生活中增添了不知多少趣味,如果不麻烦的话麻烦B站关注,多谢
嘉然今天吃什么的个人空间 - 哔哩哔哩 ( ゜- ゜)つロ 乾杯~ Bilibili
贝拉kira的个人空间 - 哔哩哔哩 ( ゜- ゜)つロ 乾杯~ Bilibili
向晚大魔王的个人空间 - 哔哩哔哩 ( ゜- ゜)つロ 乾杯~ Bilibili
乃琳Queen的个人空间 - 哔哩哔哩 ( ゜- ゜)つロ 乾杯~ Bilibili
珈乐Carol的个人空间 - 哔哩哔哩 ( ゜- ゜)つロ 乾杯~ Bilibili
同时如果对博主这篇博客有任何错误或者建议欢迎评论区交流。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。