怎么用VS2012建设网站,网站建设怎么汇报,wordpress 获取文章的分类id,建设网站工作汇报大家好#xff0c;我是八块腹肌的小胖#xff0c;
下面将围绕微博“中国文化”以数据分析、数据处理、建模及可视化等操作
目录
1、数据获取
2、数据处理
3、词频统计及词云展示
4、文本聚类分析
5、文本情感倾向性分析
6、情感倾向演化分析
7、总结 1、数据获取
本…大家好我是八块腹肌的小胖
下面将围绕微博“中国文化”以数据分析、数据处理、建模及可视化等操作
目录
1、数据获取
2、数据处理
3、词频统计及词云展示
4、文本聚类分析
5、文本情感倾向性分析
6、情感倾向演化分析
7、总结 1、数据获取
本任务以新浪微博为目标网站爬取“中国文化”为主题的微博数据进行数据预处理、数据可视化等操作。
目标网站如图1所示 图1 微博网站及分析
通过分析微博网站使用爬虫获取代码爬虫核心伪代码如下 这段代码咱们开始处理微博数据了。这次的目标是搞清楚微博里的各种信息包括内容、创建时间、作者、还有转发、评论、点赞这些数字。 首先呢咱们用jsonpath这个工具从一大堆微博数据里挑出来微博的文本内容这就是咱们要分析的主角。但这些文本里可能夹杂了一些HTML标签看着碍眼所以用了正则表达式把这些标签统统清除掉让文本干净整洁。 然后咱们也顺便把微博的发布时间、发布者、微博ID这些信息给捞出来这都是分析的重要信息。特别的是如果发现了有微博是长文咱们就得用特殊的方式去获取全文确保分析的内容不遗漏。 紧接着转发数、评论数、点赞数这些“数字见证”也统统不放过这些可是衡量微博火不火的重要标尺。 最后把这些信息整理好打包进一个DataFrame里这样数据就既清晰又方便后续的分析了。打印出一些列表的长度就是为了检查一下咱们收集的信息完整不完整防止哪里出了差错。 整个过程就像是咱们对微博数据进行了一次大扫除把需要的信息都收集齐全准备好了接下来的分析步骤。这样一来不管咱们想研究微博的哪方面信息手头上都有足够的材料了。
1. # 微博内容
2. text_list jsonpath(cards, $..mblog.text)
3. # 微博内容-正则表达式数据清洗
4. dr re.compile(r[^], re.S)
5. text2_list []
6. print(text_list is:)
7. # print(text_list)
8. if not text_list: # 如果未获取到微博内容进入下一轮循环
9. continue
10. if type(text_list) list and len(text_list) 0:
11. for text in text_list:
12. text2 dr.sub(, text) # 正则表达式提取微博内容
13. # print(text2)
14. text2_list.append(text2)
15. # 微博创建时间
16. time_list jsonpath(cards, $..mblog.created_at)
17. time_list [trans_time(v_stri) for i in time_list]
18. # 微博作者
19. author_list jsonpath(cards, $..mblog.user.screen_name)
20. # 微博id
21. id_list jsonpath(cards, $..mblog.id)
22. # 判断是否存在全文
23. isLongText_list jsonpath(cards, $..mblog.isLongText)
24. idx 0
25. for i in isLongText_list:
26. if i True:
27. long_text getLongText(v_idid_list[idx])
28. text2_list[idx] long_text
29. idx 1
30. # 转发数
31. reposts_count_list jsonpath(cards, $..mblog.reposts_count)
32. # 评论数
33. comments_count_list jsonpath(cards, $..mblog.comments_count)
34. # 点赞数
35. attitudes_count_list jsonpath(cards, $..mblog.attitudes_count)
36. # 把列表数据保存成DataFrame数据
37. print(id_list:, len(id_list))
38. print(len(time_list))
39. print(region_name_list:, len(region_name_list))
40. print(len(status_city_list))
41. print(len(status_province_list))
42. print(len(status_country_list))获取的爬虫数据如图2所示 图2微博数据 2、数据处理 咱们这一步呢是要把数据梳理得整整齐齐的好比给数据做个美容。首先咱们决定了要关注哪几个方面的信息发布者的名字、发布时间、文本内容、转发数、评论数、点赞数和位置信息。这些都是分析微博活动时不可或缺的。
接下来咱们对日期格式做了标准化处理确保所有的日期都是按照年-月-日 时:分:秒这样的格式来的这样看起来既整洁又方便后续的分析。
然后文本内容里有些杂七杂八的东西需要清理掉比如那些乱七八糟的标签啊、特殊字符啊甚至是一些广告内容都得用字符串替换的方法把它们给去掉让文本内容清清爽爽。
咱们还考虑到了数据里可能会有一些空白的地方这些地方咱们就统一填上N/A意思就是这里啥也没有但是也不能空着得有个标记。
做完这一切咱们就可以看看咱们的数据变成啥样了。打印出来一看所有的信息都按部就班整整齐齐的这下子无论是要做分析还是画图手里的数据都是清清楚楚明明白白的了。这就像是给数据穿上了新衣服既美观又实用。
1. # 数据清洗和预处理
2. # 列screen_name, created_at, text, reposts_count, comments_count, attitudes_count, location
3. selected_columns [screen_name, created_at, text, reposts_count, comments_count, attitudes_count, location]
4. data data[selected_columns]
5.
6. # 处理日期格式
7. data[created_at] pd.to_datetime(data[created_at], format%Y-%m-%d %H:%M:%S)
8.
9. # 去除文本中的特殊字符或标签
10. data[text] data[text].str.replace(r#, )
11. data[text] data[text].str.replace(r【, )
12. data[text] data[text].str.replace(r】, )
13. data[text] data[text].str.replace(r不得鸟的微博视频, )
14.
15. # 填充缺失值如果有
16. data data.fillna(N/A)
17.
18. # 查看预处理后的数据
19. print(data)“数据处理”代码输出如图3所示
图3数据处理 3、词频统计及词云展示 咱们这一步就是要搞清楚咱们数据里面都聊了啥用的哪些词特别多。
首先得用jieba来分词就是把句子切成词儿。把咱们数据里的文本内容拿出来一条条地切切完了汇总到一起。
然后你知道有些词儿咱其实不太需要比如“的”、“是”这种这就需要用到停用词表了。
停用词表里的词儿咱们在分词结果里看到了就直接忽略它。这个停用词表是个文件咱们打开它把里面的词读出来存起来准备用。
接下来咱们要把切出来的词里面不在停用词表里的筛出来这样剩下的就都是咱们要的了。
这些词儿咱们来数数谁出现得多谁出现得少就是词频统计。
统计完了咱们就挑出来出现次数最多的前十个词看看都是些啥打印出来给自己看看。
最后用这些词儿画个词云图。词云图就是把这些词以不同的大小显示出来谁大谁就是出现次数多的。
这样一看就一目了然了知道咱们数据里面热点话题都有啥。
画完了直接显示出来这图挺好看的也挺有用的一眼能看出来重点词汇。
1. # 词频统计及词云显示
2. # 分词
3. import pandas as pd
4. import jieba
5. from collections import Counter
6. from wordcloud import WordCloud
7. import matplotlib.pyplot as plt
8. # 分词
9. seg_list []
10. for text in data[text]:
11. seg_list.extend(jieba.cut(text))
12.
13. # 加载停用词表
14. stopwords set()
15. with open(stop_words.txt, r, encodingutf-8) as f:
16. for line in f:
17. stopwords.add(line.strip())
18.
19. # 过滤停用词
20. seg_list_filtered [word for word in seg_list if word not in stopwords]
21.
22. # 统计词频
23. word_counts Counter(seg_list_filtered)
24.
25. # 获取词频最高的前N个词
26. top_n 10
27. top_words word_counts.most_common(top_n)
28.
29. # 打印词频最高的词
30. for word, count in top_words:
31. print(f{word}: {count})
32.
33. # 生成词云
34. wordcloud WordCloud(font_pathSimHei.ttf, background_colorwhite).generate( .join(seg_list_filtered))
35.
36. # 显示词云
37. plt.imshow(wordcloud, interpolationbilinear)
38. plt.axis(off)
39. plt.show()4、文本聚类分析 下面聚类的代码咱们是要搞点更高级的不光是看看热词还要把这些文本内容分个类看看都有哪些不同的主题或者类型在里面。
首先还是老规矩先把数据读进来用Pandas从一个叫data.csv的文件里读数据。然后还是得清理一下文本把一些乱七八糟的特殊字符或者不需要的标签给去掉。
接着分词。这次咱们分完词后每个词之间加个空格因为接下来要用TF-IDF词频-逆文档频率来向量化文本这个操作是把文本转换成数学上的向量为的是让计算机能理解和处理。
咱们用TF-IDF把文本向量化之后文本就变成了一堆数字表示的向量接下来就可以用KMeans这个算法来聚类了。意思就是咱们想把这些文本按内容或风格自动分成几堆这里咱们定了3堆。
聚类完了为了让咱们肉眼能看出来效果用到了SVD奇异值分解进行降维就是把那些高维的数据压缩到2维空间里这样就能在图上画出来了。
然后咱们就可以画图看看了用不同颜色表示不同的类把这些点画到图上通过颜色就能看出来哪些文本是被分到一组的。
这还不够咱们还得知道每组里面都是些啥内容所以要找出每个聚类也就是每堆的关键词。这里就是计算每个聚类里面哪些词最能代表这个聚类然后挑出来权重最高的前10个词。
最后把这些关键词打印出来每个聚类的关键词都列一列这样一看就知道每个聚类大概是啥主题的了。还把每个聚类里面的文本也打印出来这样咱们就能具体看看分得对不对有没有啥意外的发现。
画完图标上轴名给图个标题这图就完整了展示的是咱们的聚类结果。看完这个就能对咱们数据里的文本有个更深入的了解了。
1. import pandas as pd
2. import jieba
3. from sklearn.feature_extraction.text import TfidfVectorizer
4. from sklearn.cluster import KMeans
5. from sklearn.decomposition import TruncatedSVD
6. import matplotlib.pyplot as plt
7. from scipy.sparse import csr_matrix
8.
9. # 读取数据文件
10. data pd.read_csv(data.csv)
11.
12. # 去除文本中的特殊字符或标签
13. data[text] data[text].str.replace(r#, )
14. data[text] data[text].str.replace(r【, )
15. data[text] data[text].str.replace(r】, )
16. data[text] data[text].str.replace(r不得鸟的微博视频, )
17.
18. # 分词
19. seg_list []
20. for text in data[text]:
21. seg_list.append( .join(jieba.cut(str(text))))
22.
23. # 使用TF-IDF向量化文本
24. vectorizer TfidfVectorizer()
25. X vectorizer.fit_transform(seg_list)
26.
27. # 转换为稀疏矩阵
28. X_sparse csr_matrix(X)
29.
30. # 使用KMeans聚类
31. k 3 # 聚类数量
32. kmeans KMeans(n_clustersk, random_state42)
33. kmeans.fit(X_sparse)
34.
35. # 使用SVD进行降维
36. svd TruncatedSVD(n_components2)
37. X_svd svd.fit_transform(X_sparse)
38.
39. # 绘制聚类结果
40. colors [red, blue, green]
41. labels kmeans.labels_
42. for i in range(len(X_svd)):
43. plt.scatter(X_svd[i, 0], X_svd[i, 1], colorcolors[labels[i]])
44.
45. # 获取聚类关键词
46. terms vectorizer.get_feature_names()
47.
48. # 显示类别关键词
49. for cluster_id in range(k):
50. cluster_terms []
51. cluster_indices labels cluster_id
52. cluster_text data.loc[cluster_indices, text]
53. cluster_vector X[cluster_indices]
54.
55. # 计算每个类别的关键词权重总和
56. cluster_weights cluster_vector.sum(axis0).A1
57. sorted_indices cluster_weights.argsort()[::-1]
58.
59. # 获取权重排名前10的关键词
60. for term_index in sorted_indices[:10]:
61. cluster_terms.append(terms[term_index])
62.
63. print(fCluster {cluster_id 1} Keywords: { .join(cluster_terms)})
64. print(fCluster {cluster_id 1} Texts:)
65. print(cluster_text)
66. print()
67.
68. plt.xlabel(Component 1)
69. plt.ylabel(Component 2)
70. plt.title(KMeans Clustering)
71. plt.show()文本聚类最终展示的聚类前10个关键词如下所示完整结果及聚类输出如图5所示
Cluster 1 Keywords: 京剧 国粹 表演 中国 戏曲 艺术 文明 视频 变脸 传统
Cluster 2 Keywords: 中国 文化 历史 美食 传统 传统节日 视频 微博 我们 六级
Cluster 3 Keywords: 街头 联动 外国 上海 时代广场 疯狂 上分 文化 我们 中国 图5 聚类结果
5、文本情感倾向性分析
咱们这回的任务是要看看咱们数据里面的文本大家是个啥心情是不是开心还是有点小郁闷。用的是情感分析这玩意儿可以算出一句话是正面的、负面的还是说不上好坏中性的。
先来对每条文本用SnowNLP这个工具跑一遍这个东西能给咱们一个情感倾向性得分分数高的话说明这话挺乐观的分数低就可能有点悲观。
得到所有文本的情感得分后咱们分三类负面、中性、正面。规则是这样的得分低于0.3的咱们认为是负面的0.3到0.7之间的算中性高于0.7的就是正面了。然后数一数每类有多少条。
下一步咱们要把这个结果做成一个饼图一眼就能看出来哪种情绪的文本多。为了好看点还得挑挑颜色用的是snsSeaborn库的色板选了个pastel粉彩风格的前三种颜色。
画饼图时标上每种情绪的标签加上每部分占的比例然后从90度开始画这样看起来舒服。
因为咱们要显示中文所以还得设置下字体确保中文不会乱码。设置完后把所有文本的字体都调整成咱们设置的那个。
给图加个标题叫“情感分析结果”别忘了也要设置成中文显示。最后为了饼图看起来是个正圆调一调轴的比例。
做完这些跑一下饼图就出来啦。这样一看咱们就清楚了在咱们的数据里人们大多是啥心情乐观的、悲观的还是说不上来的心里有数了。
1. # 对每条文本进行情感分析并计算情感倾向性得分
2. sentiments []
3. for text in data[text]:
4. s SnowNLP(str(text))
5. sentiment_score s.sentiments
6. sentiments.append(sentiment_score)
7.
8. # 情感类别定义
9. labels [负面, 中性, 正面]
10.
11. # 统计情感类别的数量
12. sentiment_counts [0, 0, 0]
13. for sentiment in sentiments:
14. if sentiment 0.3:
15. sentiment_counts[0] 1
16. elif sentiment 0.3 and sentiment 0.7:
17. sentiment_counts[1] 1
18. else:
19. sentiment_counts[2] 1
20.
21. # 创建情感分析饼图
22. plt.figure(figsize(6, 6))
23.
24. # 设置颜色
25. colors sns.color_palette(pastel)[0:3]
26.
27. # 绘制饼图
28. plt.pie(sentiment_counts, labelslabels, colorscolors, autopct%1.1f%%, startangle90)
29.
30. # 设置中文显示
31. font FontProperties(fnameSimHei.ttf, size12)
32. for text in plt.gca().texts:
33. text.set_fontproperties(font)
34.
35. # 添加标题
36. plt.title(情感分析结果, fontpropertiesfont)
37.
38. # 调整饼图为正圆
39. plt.axis(equal)
40.
41. # 显示饼图
42. plt.show()代码运行后的到的情感分析饼状图如图6所示 图6 情感分析 6、情感倾向演化分析
咱们这回的动作是要看看随着时间变化人们的情绪变化怎么样。就像看天气预报一样不过咱们预报的是情绪。
首先把刚才算出来的每条文本的情感得分直接加到数据里去这样每条数据都有个情感分数了。
接下来咱们要按日期来一次大聚合把同一天的情感得分平均一下看看这一天的整体情绪怎么样。这样咱们就能得到每一天的平均情感得分了。
然后咱们开始画图这次画的是折线图一看就知道每天情绪怎么变的。图的大小定为12x6这样显示的信息多一些看起来也舒服。
为了让图好看咱们选了个色板husl颜色鲜艳一点把折线图画出来用的是色板的第一个颜色。
标题、标签都设置好用中文显示并且字号也调了一下让它更清晰易读。日期标签旋转了45度这样不管日期多密集每个标签都能看得清。
加了个图例也是用中文显示。然后为了让图看起来更有条理加了横向的网格线线条是虚线透明度调低一些不那么扎眼。
最后调整了一下图形的边距让整个图看起来更紧凑信息显示得更完整。
一切设置好后展示图形这下咱们就能看到随着时间的推移整体的情绪是怎么变化的了。这可比单纯看数字有意思多了一目了然一折线图看天下情绪
1. # 添加情感得分列
2. data[sentiment_score] sentiments
3.
4. # 按日期分组并计算每天的情感得分的平均值
5. sentiment_by_date data.groupby(data[created_at].dt.date)[sentiment_score].mean()
6.
7. # 创建图形
8. plt.figure(figsize(12, 6))
9.
10. # 设置颜色
11. colors sns.color_palette(husl)
12.
13. # 绘制情感得分随时间变化的折线图并设置颜色
14. sentiment_by_date.plot(kindline, linewidth2, colorcolors[0])
15.
16. # 设置标题、标签和图例
17. plt.title(情感分数随时间变化, fontpropertiesmyfont, fontsize16)
18. plt.xlabel(日期, fontpropertiesmyfont, fontsize12)
19. plt.ylabel(情感分数, fontpropertiesmyfont, fontsize12)
20. plt.xticks(rotation45)
21. plt.legend(propmyfont)
22.
23. # 设置网格线
24. plt.grid(axisy, linestyle--, alpha0.5)
25.
26. # 调整图像边距
27. plt.tight_layout()
28.
29. # 显示图形
30. plt.show()情感演化如图7所示 图7 情感演化
由图7可知2023年1月网民情绪波动较大分析与中国传统节日“春节”有关且整体情绪处于中性和积极分值中2023年4月至2023年6月期间网民整齐情绪波动较大分析其可能与4月的清明节、5月劳动节及6月的端午节有关。 7、总结
本次任务以“中国文化”为主题首先通过爬虫对微博数据进行爬取并对获取的数据进行预处理等操作。通过对微博数据进行词频统计可以发现在关于中国文化的讨论中最常出现的词是中国出现了4112次紧随其后的是文化出现了2986次。此外历史、传统和美食也是热门关键词分别出现了1036次、1021次和645次。这反映了人们对中国文化的关注和兴趣。
使用kmeans算法进行文本聚类将微博文本分为了三类。第一类聚焦于中国传统艺术如京剧、国粹和戏曲体现了中国丰富的艺术表演传统。第二类聚集了与中国文化、历史和传统节日有关的关键词同时也涉及到微博和视频的讨论。第三类则关注街头文化、外国影响和中国城市的繁华景象。
情感分析的结果显示人们对中国文化的态度整体上积极积极情感得分为91.2%消极情感得分为4.1%中性情感得分为4.7%。这说明大多数人在微博上表达对中国文化的喜爱和肯定。
在情感演化的分析中选取了时间范围从2022年6月到2023年6月。2023年1月人们的情绪波动较大可能与中国传统节日春节有关整体情绪处于中性和积极分值中。而在2023年4月至6月期间情绪波动再次增大推测可能与清明节、劳动节和端午节等传统节日有关。
基于微博爬取的中国文化分析表明人们对中国文化表达了浓厚的兴趣和积极的态度。通过文本聚类和情感分析我们深入了解了人们对中国文化的关注焦点和情感变化。这些结果有助于我们更好地理解和推动中国文化的传播与发展。