现有某大闸蟹电商负面评论5000条,txt文本,一行一条,举例如下,任务是要对其进行文本分析。读入所有文档并分词,统计词频,找到高频词,确定特征集,为每一条评论生成向量表示,计算一下不同评论之间的距离(自定义,如欧氏或余弦),能不能找到所有评论的“重心”或者所有评论中的代表性评论并输出原文?除了词云外,针对多文档数据还有别的可视化方式没有?

打开时就有一种臭味,不新鲜。今天蒸时也闻到的是怪味,吃蟹爪时没有鲜味,打开蟹壳里面全是蟹粪样的东西,蟹黄一点点并且不好吃。这也没什么,最担心的是吃完这蟹怕会生病,腹泻。
东西就别说能吃一打开那味你问一下都想吐。没有良心的卖家大家一定要慎重。
反应,一直再未收到过卖家的电话。第一次给家里老人买这个就出现情况!此次购买体验较失忘!
比较不满意蟹很脏,壳厚不白,比想的个头小,不如买便宜的了唯一的优点是还活着
非常不值得,是我见过最差的大闸蟹。脏,膏少无黄油,公蟹绝对是洗澡蟹。大家都要注意这家蟹的问题。
只有两个公的应有4-5两,其他都比较小,应没标称的5两或3.5两。最重要的是,母的都比较脏,还有苦味!
和描述差别太大,还有个是坏的,以后不会再买了

一、代码任务:

  1. 统计词频,找到高频词, 绘制词云图。
  2. 确定特征集,用频数法、权重法、独热法为每条评论生成向量表示, 计算不同评论之间的距离,输出文本中心 。
  3. 其他可视化方法 K 均值聚类分析

代码实现

  1. 统计词频,找到高频词,绘制词云图。
import re # 正则表达式
import collections # 词频统计库
import numpy as np # numpy数据处理库
import jieba  # 结巴分词
import wordcloud # 词云展示库
from PIL import Image # 图像处理库
import matplotlib.pyplot as plt # 图像展示库
from sklearn.decomposition import PCA # 降维
from sklearn.cluster import KMeans # 聚类
# 获取stopword
def get_stopwords(filepath):with open(filepath, 'r', encoding='utf-8') as stopfile:stopwords = [line.strip() for line in stopfile.readlines()]return set(stopwords)
# 结巴分词
def obj_word(words_filepath, stopwords):obj_words = []with open(words_filepath, 'r', encoding='utf-8') as f:for line in f.readlines():for word in jieba.cut(line.strip().replace(' ','')):if word not in stopwords:obj_words.append(word)return obj_words
# 词频统计,找到高频词
def word_freqcy(obj_word):word_freq = collections.Counter(obj_word) # 对分词作词频统计return word_freq# 打印高频词
def topn_word_freq(word_freq, topn=50):word_freq_topn = word_freq.most_common(topn) # 获取前100最高频的词print("高频词前50:")print(word_freq_topn) # 输出检查# 词云
def draw_cloud(word_freq):mask = np.array(Image.open('wordcloud.png')) # 定义词频背景wc = wordcloud.WordCloud(font_path='C:/Windows/Fonts/simhei.ttf', # 设置字体格式mask=mask,          # 背景图max_words=150,      # 最多显示词数max_font_size=100,   # 字体最大值background_color='white')wc.generate_from_frequencies(word_freq) # 从字典生成词云plt.imshow(wc) # 显示词云plt.axis('off') # 关闭坐标轴plt.show() # 显示图像

高频词结果:

词云图结果:

2. 确定特征集,用频数法、权重法、独热法为每条评论生成向量表示,计算不同评论之间的距离,输出文本中心。当出现频数大于10时,定义该词为特征词,为每条评论建立特征词向量,有三种向量表示方法:
3. 权重法——记录每个特征词的词频,用频数除以该句子中所有特征值的词频总和)
4. 独热编码——记录每个特征词的0-1状态
5. 频数——记录每个特征词的词频(频数)

# 确定特征值
def feature(word_freq):features = []for k in word_freq:if word_freq[k] <= 100000 and word_freq[k] >= 10:features.append(k)print("特征值: ")print(features)return features

特征值结果:

三种向量生成方法:

# 用频数法为每条评论建立向量
def get_vector_freq(lineword_freq, feature):vector = []for f in feature:if f in lineword_freq:vector.append(lineword_freq[f])else:vector.append(0)return vector# 用独热法为每条评论生成向量
def get_vector_onehot(lineword_freq, feature):vector = []for f in feature:if f in lineword_freq:vector.append(1)else:vector.append(0)return vector# 用权重法
def get_vector_weight(lineword_freq, feature):vector = []length = np.sum(list(lineword_freq.values()))for f in feature:if f in lineword_freq:vector.append(lineword_freq[f]/length)else:vector.append(0)return vector
# 生成矩阵
def get_vs_list(word_filepath, features, stopwords):vs_list = []content = {}with open(word_filepath, 'r', encoding='utf-8') as file:line = file.readline()i = 0while line:content[i] = lineobj_linewords = []for w in jieba.cut(line.strip()):if w not in stopwords:obj_linewords.append(w)lineword_freq = word_freqcy(obj_linewords)v = get_vector_onehot(lineword_freq, features)vs_list.append(v)line = file.readline()i += 1 return vs_list, content   # 计算矩阵的各向量之间的距离
def dist_matrix(vs_list, content):length = len(vs_list)distance = []vector1 = np.array(vs_list)for i in range(length):vector2 = vs_list[i]dis = np.sqrt(np.sum(np.square(vector1 - vector2)))distance.append(dis)#print("第%d个评论与重心的距离为:%f" %((i+1), distance[i]) )pos = distance.index(min(distance))print("第%d个评论为评论重心" %(pos+1))print("评论内容为:" + content[pos])
def main():stopword = get_stopwords('stopwords_list.txt')object_word = obj_word('online_reviews_texts.txt', stopword)word_freq = word_freqcy(object_word)topn_word_freq(word_freq)draw_cloud(word_freq)features = feature(word_freq)vs_list, content = get_vs_list('online_reviews_texts.txt', features, stopword)dist_matrix(vs_list, content)

运行结果: 用独热法生成的评论重心:

用权重法生成的评论重心:

用 频数 法 生成的评论重心:

3. K均值聚类分析

(1) 分别将 weight /one hot freq 三种方式得到的向量集 进行 PCA 降维结果如下。由图像可知 在one hot 编码下,向量集各样本点分散程度最好,故选用 one hot 向量机完成后续 KMeans 文本聚类及分布图的绘制。

    # PCA降维pca = PCA(n_components=2)reduced_vs = pca.fit_transform(vs_list)# 绘图plt.scatter(reduced_vs[:,0], reduced_vs[:,1], c='y', marker='.')plt.show()



(2) 在进行 K Means 聚类分析前,通常会通过 PCA 主成分分析将数据降维,选择 PCA 降维后保留原始数据 80% 的信息 。

  • 以降维后的数据作为数据集,进行 K Means 聚类分析 ,画出畸变程度曲线 。如图所示,横轴表示 聚类个数, 纵轴表示聚类误差,其计算方法是将同一类的 点之间的距离求和,数值越小说明聚 类效果越好 。
  • 根据肘部法则由图可知在分类个数为 7 类左右时,聚类效果比较明显,因此按照n=7 进行后续分析。
    # PCA降维,保留0.8的信息pca = PCA(n_components=0.8)vs = pca.fit_transform(vs_list)# 根据肘部法则,确定簇数iter = 30clf_inertia = [0.]*iterfor i in range(1, iter+1, 1):clf = KMeans(n_clusters=i, max_iter=300)s = clf.fit(vs)clf_inertia[i-1] = clf.inertia_# 畸变程度曲线plt.figure()plt.plot(np.linspace(1, iter, iter), clf_inertia, c='b')plt.xlabel('center_num')plt.ylabel('inertia')plt.show()


(3) K Means 聚类

   # 聚类中心数量为7k = 7clf = KMeans(n_clusters=k)clf.fit(vs)# 得到每类聚类的评论和向量,画聚类结果图review = []with open('online_reviews_texts.txt', 'r', encoding='utf-8') as f:lines = f.readlines()review = np.array(lines)vs_list = np.array(vs_list)review_dict = {}  # 每类的评论vector_dict = {}  # 每类的评论对应的向量color = ['r','y','b','g','c','m','k']for i in range(k):members = clf.labels_ == ireview_dict[i] = review[members]vector_dict[i] = vs_list[members]xs = reduced_vs[members, 0]ys = reduced_vs[members, 1]plt.scatter(xs, ys, c=color[i], marker='.')plt.show()near_center_point(review_dict, vector_dict, num=7)# 得到每类聚类中距离重心最近的Num条评论
def near_center_point(review_dict, vector_dict, num=7):length = len(review_dict)   for i in range(0, length):distance = []content = review_dict[i]vector = vector_dict[i]leng = len(review_dict[i])for h in range(leng):vector2 = vector[h]dis = np.sqrt(np.sum(np.square(vector - vector2)))distance.append(dis)pos = np.argsort(distance)[0:num]print(pos)print('\n第',(i+1),'类评论,与重心距离最近的',num,'条评论为:')print(content[pos])if __name__=='__main__':main()


(4)输出



高频词 词云图 文本重心 聚类相关推荐

  1. Pytorch 文本数据分析方法(标签数量分布、句子长度分布、词频统计、关键词词云)、文本特征处理(n-gram特征、文本长度规范)、文本数据增强(回译数据增强法)

    日萌社 人工智能AI:Keras PyTorch MXNet TensorFlow PaddlePaddle 深度学习实战(不定时更新) 文本数据分析 学习目标: 了解文本数据分析的作用. 掌握常用的 ...

  2. 评论安装_再也不用手动复制粘贴收集Taptap游戏评论了,还可以制作好看的热词词云图~...

    日常工作中会需要对玩家的一些评价进行整理分析,曾经人肉扫.手工采蛮痛苦的,所以,今天TA来了~ 05 目录: 1.引入需要的库 2.评论内容采集 3.热词词云制作 4.程序跑起来 预览 同学们,猜猜以 ...

  3. 【自然语言处理】词袋模型在文本分类中的用法

    词袋模型在文本分类中的用法 1.加载数据 20 Newsgroups:数据被组织成 20 个不同的新闻组,每个新闻组对应一个不同的主题.一些新闻组彼此非常密切相关(例如 comp.sys.ibm.pc ...

  4. 基于预训练词向量的文本相似度计算-word2vec, paddle

    文章目录 0. 前言 1. 余弦相似度算子 2. 示例代码并验证 3. 基于词向量的文本相似度 3.1 读取word2vec文件 3.2 定义模型 3.3 运行模型 3.4 根据分数降序排列 3.5 ...

  5. 实体链接(Entity Linking)、依存句法分析、成分句法树、词袋模型、文本向量空间模型(TF-IDF)、

    实体链接(Entity Linking).依存句法分析.成分句法树.词袋模型.文本向量空间模型(TF-IDF) 目录

  6. ik分词和jieba分词哪个好_Python 中文 文本分析 实战:jieba分词+自定义词典补充+停用词词库补充+词频统计...

    最近项目需要,实现文本的词频分析,折腾了几天才完成任务,有点成就感,最后整理总结一下这部分的内容,希望更多同僚受益. 一.使用前准备 环境:Python3.6 安装结巴:pip install ji ...

  7. 深度学习实战-词嵌入计算文本相似性

    使用词嵌入计算文本相似性 文章目录 使用词嵌入计算文本相似性 简介 词嵌入 预训练词嵌入查看文本相似性 Word2vec的数学特性 可视化词嵌入 词嵌入中发现实体类 类内部语义距离 可视化国家数据 补 ...

  8. BERT实战(1):使用DistilBERT作为词嵌入进行文本情感分类,与其它词向量(FastText,Word2vec,Glove)进行对比

    这次根据一篇教程Jay Alammar: A Visual Guide to Using BERT for the First Time学习下如何在Pytorch框架下使用BERT. 主要参考了中文翻 ...

  9. 飞桨2.0高层api教程——使用预训练词向量进行文本分类

    使用预训练的词向量完成文本分类任务 作者: fiyen 日期: 2021.03 摘要: 本示例教程将会演示如何使用飞桨内置的Imdb数据集,并使用预训练词向量进行文本分类. 摘要 在这个示例中,我们将 ...

最新文章

  1. python【力扣LeetCode算法题库】409-最长回文串(数学 计数器)
  2. 深度学习笔记第二门课 改善深层神经网络 第二周:优化算法
  3. List集合_介绍常用方法
  4. LeetCode 1236. 网络爬虫(BFS/DFS)
  5. HDU 4422 The Little Girl who Picks Mushrooms(简单题)
  6. win7日历加入农历_还是农历更亲切,春节制作一个带农历的日历,欢欢喜喜过新年...
  7. PHP经典面试题汇总(续)
  8. HDU2021 发工资咯:)【入门】
  9. nginx cache配置
  10. kvaser 驱动修复(linux)
  11. 模块参考资料-硬件资料-Air720UG/UH-功耗指标
  12. WinRAR是什么?------压缩工具
  13. Kali Linux安装2019.2.28
  14. python程序采用unicode编码、英文字符_python--基础字符编码
  15. 大数据时代下 数据安全运营面临严峻待解决问题有哪些
  16. LDR6290-QFN28 做Type-C台式显示器 一线通大功率PD3.0 快充与在线升级的运用
  17. NXP JN5169 使用看门狗定时器
  18. 如何在 微软Microsoft 官网 下载 office365
  19. ESP8266-SDK的3路PWM输出
  20. SQL Server 2012 下载和安装详细教程(转载)

热门文章

  1. Vue 3系列之03——Vue 3使用TypeScript
  2. 去雾模块dehaze.py(可直接调用)
  3. 一步一步教你安装MeeGO和Windows 7双系统(上网本或笔记本)
  4. 第二章 四部和声的基本要求
  5. 无线路由器的dhcp服务器如何设置,磊科无线路由器上DHCP服务器怎么设置
  6. 混合罚函数法matlab报错,罚函数法MATLAB程序
  7. 数学建模之:匈牙利算法python代码
  8. Ubuntu16.04笔记本 安装R RStudio
  9. 博士毕业答辩会上的感言——余子濠
  10. 15000个常用的英语单词