试验任务概述:如下为所给CSDN博客信息表,分别汇总了'ai', 'algo', 'big-data', 'blockchain', 'hardware', 'math', 'miniprog'等7个标签的博客。对CSDN不同领域标签类别的博客内容进行词频统计,绘制词频统计图,并根据词频统计的结果绘制词云图。
数据表链接:https://download.csdn.net/download/m0_52051577/88669409?spm=1001.2014.3001.5503?
import pandas as pd
data=pd.read_csv(open('D://实训课//实训课数据csdn.csv'),sep=',') //导入数据
data //数据预览
如图,数据信息包括class、url、title、content四个类标签,分别表示博客所属领域类别、对应链接、博文题目和博客内容。下面第一步对这些博文按类别进行分类。
session=data.loc[:,'class'].values
set(session)//对数据表的class类别列切分
def classma(i):
class1=data.loc[data['class']==class_list[i],:]
print(class1)
return class1
//定义切分函数,按类别列作为索引返回每一类别对应的数据信息
class_list=['ai', 'algo', 'big-data', 'blockchain', 'hardware', 'math', 'miniprog']
# for i in range(len(class_list)):
# classma(i)
ai=classma(0)
分类结果如下图所示:?
?导入停用词表,对所分类数据进行停用词处理。
file_path='D:/..csv'
def getStopword(file_path):
stop_list=[line[:-1] for line in open(file_path+'/哈工大停用词表 .txt','r',encoding='UTF-8')]
return stop_list
getStopword(file_path)
import jieba
def preProcess(all_data,stop_list):
xdata=all_data['content']
result_data=list(xdata)
result=[]
for doc in result_data:
doc=doc.strip()
cut_list=jieba.lcut(doc)
doc_result=[word for word in cut_list if word not in stop_list]
result.append(doc_result)
return result
# getStopword(file_path)
result1=preProcess(ai,getStopword(file_path))
print(result1)
?导入jieba库,对去除停用词后的数据进行分词处理,并返回分词后的结果。
?
后续是对分词后的词频进行统计,并计算每个分词的tf-idf值,这里引入一个tf-idf值的概念:
TF(词频)指的是一个词语在文档中出现的频率,它认为在一个文档中频繁出现的词语往往与文档的主题相关性更高。
from gensim.models.tfidfmodel import TfidfModel
from gensim import corpora
def calculate(resultx):
dictionary=corpora.Dictionary(resultx)
corpus=[dictionary.doc2bow(text) for text in resultx]
tf_idf_model = TfidfModel(corpus, normalize=False)
word_tf_tdf = list(tf_idf_model[corpus])
print('词典:', dictionary.token2id)
print('词频:', corpus)
print('词的tf-idf值:', word_tf_tdf)
return dictionary.token2id,corpus,word_tf_tdf
idic,corpus,word_tf_tdf=calculate(result1)
?
如上图,找出每个分词和与之相关联的词对应的下标。
max_pic=[]
max_fre=[]
def search(resultx,a):
maxmum=[]
idic,corpus,word_tf_tdf=calculate(resultx)
for row in word_tf_tdf[a]:
maxmum.append(row[1])
for col in word_tf_tdf[a]:
if col[1]==max(maxmum):
print(max(maxmum))
max_fre.append(max(maxmum))
max_sig=col[0]
max_pic.append(max_sig)
return max_pic,max_fre
for i in range(len(word_tf_tdf)):
search(result1,i)
print(max_pic)
print(max_fre)
对所有相关联的数对进行检索,采用特征提取方法对数据排序。并采用最大关联分析,找出每一个标签中与属性相关最大的词。?返回的是对应词的下标和对应的tf-idf值。
dictionary_s=idic
key_words=[]
for key,value in dictionary_s.items():
if value in max_pic:
key_words.append(key)
key_words.pop(-1)
print(key_words)
?构造关键词列表,根据之前返回的关联度最大词汇对应的下标,回到原数据表中定位,找出对应的词汇。
# 构造词频字典
dict_zip=dict(zip(key_words,max_fre))
print(dict_zip)
最后,根据词汇、词频列表绘制词云图。
# 绘制词云
from wordcloud import WordCloud
import matplotlib.pyplot as plt
def draw(y):
my_cloud = WordCloud(
background_color='white', # 设置背景颜色 默认是black
width=900, height=600,
max_words=100, # 词云显示的最大词语数量
font_path='simhei.ttf', # 设置字体 显示中文
max_font_size=99, # 设置字体最大值
min_font_size=16, # 设置子图最小值
random_state=50 # 设置随机生成状态,即多少种配色方案
).generate_from_frequencies(y)
# 显示生成的词云图片
plt.imshow(my_cloud, interpolation='bilinear')
# 显示设置词云图中无坐标轴
plt.axis('off')
plt.show()
draw(dict_zip)
?
注:以上为AI标签列对应的词云图,其他标签列词云图绘制的实现方式同此方法。就不再赘述。?