当前位置:   article > 正文

如何使用python处理中文文本--近几个月的新闻数据分析社会热点并创造词云图_社会热点文本分析词云图

社会热点文本分析词云图

使用python处理中文文本并创造词云图

1.前言

利用爬虫爬取网上新闻,评论,并从中分析最近社会热点,是数据科学,人工智能中的热点之一,其中在分析文本中使用词云图,看起来简洁明了,因为如下图出现频率最高的词会显示在屏幕最中央,同时更有意思的我们可以利用不同的图片使得词云图呈现出不同的形状,那么具体是如何完成的呢,我们从下面开始逐渐分析

在这里插入图片描述

2.数据集介绍

​ 这里我采用的是最近中文新闻网站上所抓取的数类新闻数据,并且已经提前分好类了(这个文本同时可以用来做文本分类,我最近也正好在做这个,如果对于这种大数据中文文本处理有经验的大佬,欢迎赐教):
在这里插入图片描述

3.预处理数据集

对于这样的数据集(拥有多个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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

在介绍如何处理之前,我这里先简单介绍一下我们这次处理数据的目的,我们的词云图是通过统计所有文本中出现的单词频率,但是我们的数据却是这样:

content = data['content']
print(content.iloc[1])
输出:
北京331日电 (记者 王恩博)记者331日从中国银保监会获悉,官方将坚决惩治重大金融风险背后的腐败问题。破坏监管秩序、市场秩序,造成国有金融资产重大损失甚至诱发风险事件的,一律严惩不贷。银保监会表示,近年来,银保监会党委坚决贯彻落实中共中央全面从严治党重大决策部署,坚持从惩治腐败和防范化解金融风险大局出发,深化金融领域反腐力度,积极支持、全力配合驻会纪检监察组,严查重大金融风险、监管失职失守背后的腐败问题并向金融基础设施等领域延伸。谈及下一步工作,银保监会表示,将坚决惩治重大金融风险背后的腐败问题。坚持无禁区、全覆盖、零容忍,坚持重遏制、强高压、长震慑,重点关注高风险机构和地区,持续深入查处重大风险事件、金融案件背后的利益输送、监管失守问题,特别是破坏监管秩序、市场秩序,造成国有金融资产重大损失甚至诱发风险事件的,一律严惩不贷。同时,落实中共十九届五中全会和中央经济工作会议对新时代经济金融工作作出一系列重大决策部署,重点做好反垄断和防止资本无序扩张、提高金融服务实体经济发展效能、妥善处置银行业保险业重大风险、规范发展城商行和农村中小金融机构、完善现代金融监管体系、强化金融消费者权益保护等工作。银保监会还提及,坚决严查违反中央八项规定精神案件,坚定释放越往后盯得越紧、执纪越严的信号。对拉拢腐蚀监管干部的金融机构和人员,严格执行“双通报”;落实行贿受贿一起查处,涉及金融机构及其人员违法违规违纪问题,及时通报监管部门,督促作出严肃处理。()
  • 1
  • 2
  • 3
  • 4

然后我们就发现中文和英文的天大区别,英文的每一句话是有一堆单词加空格组成的,例如

英文: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,方便以后使用,每一句的所有单词在同一行吗,同时以换行符来区分每个句子
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51

这里最终形成的text2.txt样式如下:

在这里插入图片描述

4.使用wordcloud库制造词云图

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决定我们要输入的词云形状
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53

关于词云的字体如果我们默认不使用的话,由于是中文买就会出现乱码集中文被一堆矩形框所代替,所以我们需要进入C:\Windows\Fonts文件夹下寻找中文字体:

在这里插入图片描述

然后在属性中查看该字体的名字,从而使用,比如我选择的是’C:\Windows\STCAIYUN.TTF’,那么通过这样的方法我产生了五张不同形状的词云图

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

结语

这五个可爱的女孩子是虚拟偶像欧,感谢她们给博主最近无聊乏味的生活中增添了不知多少趣味,如果不麻烦的话麻烦B站关注,多谢

嘉然今天吃什么的个人空间 - 哔哩哔哩 ( ゜- ゜)つロ 乾杯~ Bilibili

贝拉kira的个人空间 - 哔哩哔哩 ( ゜- ゜)つロ 乾杯~ Bilibili

向晚大魔王的个人空间 - 哔哩哔哩 ( ゜- ゜)つロ 乾杯~ Bilibili

乃琳Queen的个人空间 - 哔哩哔哩 ( ゜- ゜)つロ 乾杯~ Bilibili

珈乐Carol的个人空间 - 哔哩哔哩 ( ゜- ゜)つロ 乾杯~ Bilibili
同时如果对博主这篇博客有任何错误或者建议欢迎评论区交流。

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

闽ICP备14008679号