地摊经济数据集分析 -- 分词+聚类+词云

该博客详细介绍了对地摊经济相关弹幕数据的分析过程,包括数据预处理、文本分词、K-means聚类和词云生成。通过对弹幕内容的清洗、分词,利用TF-IDF转换并进行K-means聚类,最终绘制词云图以揭示公众对地摊经济的主要观点和讨论热点。
摘要由CSDN通过智能技术生成

地摊经济数据集分析 – 分词+聚类+词云

背景描述

地摊经济,是指通过摆地摊获得收入来源而形成的一种经济形式。地摊经济是城市的一种边缘经济,一直是影响市容环境的关键因素,但地摊经济有其独特优势,在金融危机背景下能一定程度上缓解就业压力。

2020年5月27日,中央文明办明确,在2020年全国文明城市测评指标中不将马路市场、流动商贩列为文明城市测评考核内容 。6月1日上午,国务院总理李克强在山东烟台考察时表示,地摊经济、小店经济是就业岗位的重要来源,是人间的烟火,和“高大上”一样,是中国的生机。

数据说明

数据列说明

列名说明
url网址
danmu_infos弹幕信息
danmu_text弹幕文本内容

主要内容

1、 对无用的数据进行整理

2、 用正确的方式完成数据清洗

3、 对弹幕文本内容进行合理分词

4、 根据分词结果建立词向量完成聚类,根据聚类结果形成词云,对于人们的评论观点进行分析

配置及代码核心实现

数据预处理

数据预处理:将未加工数据转换成适合分析的形式,包括多数据源的数据融合、数据清洗、维规约等等。为什么要进行预处理:原始数据普遍存在问题,必须加以处理才能用于分析,一方面要提高数据质量,另一方面为了更好的使数据适应特定的数据挖掘技术及工具。

(1)导入库、读取数据

import pandas as pd
import numpy as np
from sklearn import ensemble

df = pd.read_csv('成都地摊的经济与文化-B站弹幕.csv')
df.head()   #查看部分数据

(2)数据空值,重复值处理

# 查看重复值
df.duplicated()
#统计重复着个数
df.duplicated().sum()
#空值处理,把空值用空格符代替
df.fillna(' ')

(3)把submit_time分割获取更多的数据,方便进行后面的任务

import time
# 定义转换时间
def transform_timestamp(time_second):
    timeArray = time.gmtime(time_second) 
    otherStyleTime = time.strftime('%Y-%m-%d %H:%M:%S', timeArray) 
    return otherStyleTime

# 提取时间,把submit_time用split进行分割,获取x[4],然后进行时间转换,然后重新创建submit_time标签
df['submit_time'] = df['danmu_infos'].str.split(',').apply(lambda x:x[4])
df['submit_time'] = df['submit_time'].astype('int').apply(lambda x: transform_timestamp(x))

# 提取日期,把submit_time用split进行分割,获取x[0],然后进行时间转换,然后重新创建submit_date和submit_hour标签
df['submit_date'] = df['submit_time'].str.split(' ').apply(lambda x:x[0])
df['submit_hour'] = df['submit_time'].str.split(' ').apply(lambda x:x[1]).str.split(':').apply(lambda x:x[0])

# 提取发送时间点,把submit_time用split进行分割,获取x[0],然后进行时间转换,然后重新创建send_point_2,send_point标签
df['send_point'] = df['danmu_infos'].str.split(',').apply(lambda x:x[0])
df['send_point_2'] = df['send_point'].astype('float').astype('int')
df['send_point_2'] = df['send_point_2'].apply(lambda x: str(x//60)+':'+str(x%60))
df.head(5) 

(4)删除’url’,'danmu_infos’2个无用的标签

df = df.drop(['url','danmu_infos'], axis=1)
df.head(5)  
文本分词

分词(tokenization):将每个文档划分为出现在其中的单词[(token)],比如按空格和标点划分。

(1)处理评论内容,提取有用的弹幕评论信息,并进行分词

#定义删除除字母,数字,汉字以外的所有符号的函数

def remove_punctuation(line):
    line = str(line)
    if line.strip() == '':
        return ''
    rule = re.compile(u"[^a-zA-Z0-9\u4E00-\u9FA5]")
    line = rule.sub('', line)
    return line

#停用词
def stopwordslist(filepath):
    stopwords = [line.strip() for line in open(filepath, 'r', encoding='utf8').readlines()]
    return stopwords

# 加载停用词
stopwords = stopwordslist("baidu_stopwords.txt")

#去除标点符号
df['danmu_text']=df['danmu_text'].apply(remove_punctuation)
#去除停用词
df['danmu_text']=df['danmu_text'].apply(lambda x:" ".join([w for w in list(jieba.cut(x)) if w not in stopwords]))
#删除数字,把全是数字的变成空格符
for i in range(len(df)):
    if str(df['danmu_text'][i]).isdigit()==True:
        df['danmu_text'][i]=" "
df
聚类+词云

K-means 聚类分析算法又称群分析,它是研究(样品或指标)分类问题的一种多元统计方法,所谓类就是指相似元素的集合。

聚类(Clustering):是按照某个特定标准(如距离)把一个数据集分割成不同的类或簇,使得同一个簇内的数据对象的相似性尽可能大,同时不在同一个簇中的数据对象的差异性也尽可能地大。也即聚类后同一类的数据尽可能聚集到一起,不同类数据尽量分离。相似的数据划分到一起,具体划分的时候并不关心这一类的标签,目标就是把相似的数据聚合到一起,聚类是一种无监督学习(Unsupervised Learning)方法。

(1)把分词好的弹幕评论内容进行词向量的转化

from sklearn.feature_extraction.text import CountVectorizer#词袋
from sklearn.feature_extraction.text import TfidfTransformer#tfidf
#词向量转换
count_vect = CountVectorizer()
X = count_vect.fit_transform(df['danmu_text'])

#tf-idf
tfidf_transformer = TfidfTransformer()
X_tfidf = tfidf_transformer.fit_transform(X)
print(X_tfidf)

(2)用SSE画出K值的图,用来选择最优的K值

from sklearn.cluster import KMeans
import matplotlib.pyplot as plt

# '利用SSE选择k'
SSE = []  # 存放每次结果的误差平方和
for k in range(1, 9):
    estimator = KMeans(n_clusters=k)  # 构造聚类器
    estimator.fit(X_tfidf)
    SSE.append(estimator.inertia_)
X = range(1, 9)
plt.xlabel('k')
plt.ylabel('SSE')
plt.plot(X, SSE, 'o-')
plt.show()

在这里插入图片描述

(3)创建kmeans模型,传入词向量进行训练

# K均值聚类
model_kmeans = KMeans(n_clusters=8,random_state=1)  # 创建聚类模型对象
model_kmeans.fit(X_tfidf)  # 训练模型

# 聚类结果
cluster_labels = model_kmeans.labels_  # 聚类标签结果
print(cluster_labels)

(4)把聚类生成的结果与danmu_text对应

#结果拼接
labels=pd.DataFrame(cluster_labels,columns=['标签'])

shuju=pd.concat([df['danmu_text'],labels],axis=1)
print(shuju)

(5)查看部分类别的词汇

cat_desc = dict()
biaoqian_values=[0,1,2,3,4,5,6]#聚类标签
for i in biaoqian_values:
    text = shuju.loc[shuju['标签'] == i, 'danmu_text']
    text = (' '.join(map(str, text))).split(' ')
    cat_desc[i] = text
print(cat_desc[2])#打印2类词汇

(6)把聚类产生的结果,然后统计词频,可以画出词云图,方便进行分析

#词云图
#查看词云
from collections import Counter
from wordcloud import WordCloud
def generate_wordcloud(tup):
    wordcloud = WordCloud(background_color='white',
                          font_path='simhei.ttf',
                          max_words=50, max_font_size=40,
                          random_state=42
                          ).generate(str(tup))
    return wordcloud
fig, axes = plt.subplots(4, 2, figsize=(30, 38))

k = 0
for i in range(4):
    for j in range(2):
        most10 = Counter(cat_desc[k]).most_common(10)#10个高频词
        ax = axes[i, j]
        ax.imshow(generate_wordcloud(most10), interpolation="bilinear")
        ax.axis('off')   #坐标视为不可见,但坐标系的title视为可见.
        ax.set_title("{} Top 10".format(k), fontsize=30)

        if k<6:
           k += 1

plt.show()

在这里插入图片描述

  • 2
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ChlinRei

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值