基于文本挖掘的情人节微信聊天记录情感分析

       铁子们,明天就是情人节啦,不知道各位是否已经开学和对象见面了呀哈哈,可惜我还是个没有对象的可怜鬼,但没有不要紧,咱可以假装拥有哈哈,所以今天准备实践一下基于文本挖掘的微信聊天记录分析,为以后做准备嘛不是。。。这里就用和大学本科好基友的聊天记录作为语料库啦。整个分析流程分为以下几个部分:

目录

1.微信聊天记录获取

2.数据清洗

2.1 分词、去停、去重

2.2 外部词典调用

3.数据分析

3.1 词频分析与词云展示

3.2 LDA主题概率模型及pyLDAvis可视化

3.2 其他深度学习应用

1.微信聊天记录获取

      在进行分析之前,我们必须获取我们想要的数据作为语料库,获取的方式分为安卓用户和IOS用户,其中安卓用户除了小米外其他都必须进行root后才能解译成txt文件,而IOS用户则相对比较简单一些,可以直接用iturns或者爱思助手直接导出,具体的步骤CSDN上也有很多详细的讲解,这里就不多赘述了,我这里用的是爱思助手备份后再导出,连接数据线后具体步骤如下:

《基于文本挖掘的情人节微信聊天记录情感分析》

 《基于文本挖掘的情人节微信聊天记录情感分析》

 《基于文本挖掘的情人节微信聊天记录情感分析》

按照上面的步骤就可以导出为txt的聊天记录文件啦。 

2.数据清洗

       数据清洗一般分为两次处理。

2.1 分词、去停、去重

第一次为基本处理,主要为分词、去除停用词、去重。下面直接上代码:

#首先导入我们会用到的库
import codecs
import re
import jieba
import numpy as np
import pandas as pd
import wordcloud
import matplotlib.pyplot as plt

#其次读取我们获取的聊天记录txt文件,由于聊天记录中有很多重复的表情和数字,所以我们直接用正则表达式进行第一次清洗
corpus = []
file = codecs.open("聊天记录.txt","r","utf-8")
for line in file.readlines():
    corpus.append(line.strip())
    stripcorpus = corpus.copy()
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])  #  去除所有非汉字内容(英文数字)

#之后,开始进行分词
stoplist=open('哈工大停用词表.txt','r',encoding='utf-8').read()#有时候停用词去不掉是因为list的格式,修改为txt即可
result = []
for comments in stripcorpus:
    jieba.load_userdict("自定义词典.txt")#此定义词典
    c_words = jieba.cut(comments)
    result.append([word for word in c_words if word not in stoplist and len(word)>1])

这是初次清洗后的结果:

《基于文本挖掘的情人节微信聊天记录情感分析》

2.2 外部词典调用

       可以看到,分词的结果基本上还是比较好的,这可能和聊天记录比较偏生活有关,jieba库比较容易识别,但如果有些词被强行分开了,比如说第一行的“成都附近”被分成了“成都”和“附近”,那么我们就需要设置自定义词典。具体的做法为在当前文件夹下创一个txt文件,在文件里面输入你不想让其被分开的专有词汇,格式为“词+出现频率+词性”。一个词一行,效果如下:

《基于文本挖掘的情人节微信聊天记录情感分析》

 代码上实现也很简单,在分词前直接调用外部词典即可:

jieba.load_userdict("自定义词典.txt")

3.数据分析

3.1 词频分析与词云分析

        顾名思义就是根据两个人聊天中最经常提到的一些词,为了增强视觉效果,词云被广泛地用于词频分析后的可视化,这里需要注意的是,词云可以对绝对意义上的词频进行分析,当然也可以对TF-IDF特征提取后的结果进行分析,TF-IDF也很简单,jieba库和gensim库里面都有写好的模块,直接调用即可,这里就展示绝对意义上的词频。直接放效果图。

《基于文本挖掘的情人节微信聊天记录情感分析》

        但这样方方正正的词云图显得有些千篇一律,所以这里我们还可以对词云的颜色、形状等多方面进行修改。比如用两个人之间的合照作为底图,这里我选的是和两个朋友一起的底图:

《基于文本挖掘的情人节微信聊天记录情感分析》

        这里需要注意的是:词云只显示在深色部分,所以为了更好的展示我们背景图的轮廓,需要进行抠图处理,我选择的是醒图

        词云代码也很简单,直接放:

ciyun = ''.join((open('清洗后文本.txt', 'r',encoding='UTF-8')).readlines())
pic = imread('底图.jpg')
w = wordcloud.WordCloud(width=640,height=480,background_color = 'black',font_path='C:\WINDOWS\FONTS\MSYH.TTC',max_words=200,mask=pic,contour_color='black')#font_path这个参数必须要有,沿着路径在电脑自带的字体中随便选一个,否则wordcloud默认的是英文,而且字体的路径最好手动输入,否则会报错,mask就是我们选择的底图
w.generate(ciyun)#这里的文本必须是分词后的结果,必须要有空格或者标点隔开
plt.subplots(figsize=(10,8),dpi=1200)#调节词云图的分辨率,使图片更清晰
plt.imshow(w)
plt.axis("off")# 不要坐标轴
plt.show()

     然后我们来看看效果图:

《基于文本挖掘的情人节微信聊天记录情感分析》

3.2 LDA主题概率模型

      词云只是为了给我们展示某些关键词,但具体我们的聊天是什么主题无法探索到。所以这里再加一条LDA主题分析,并且能够结合R语言进行可视化,还能保存为网页发给对方。

      由于LDA实质上是一种基于概率模型的无监督聚类算法,所以其分类是没有标签可以训练的,我们需要事先为其设定topics的数量。类似k-means的k均值确定哈,一般的评价指标是困惑度和一致性。但学术界对这些指标的评价都褒贬不一,甚至连gensim库的作者都进行了自我否定。因此,按照实际的聚类效果来确定也是一种很好的选择。这里我是随机选了8个主题进行了一下简单的演示,代码比较长我就不写在这上面啦,有需要的可以评论留下邮箱~。直接放效果图。我是直接保存为了html,可以直接打开并且可以触碰不同的主题进行动态显示。

《基于文本挖掘的情人节微信聊天记录情感分析》

《基于文本挖掘的情人节微信聊天记录情感分析》

 3.3 基于机器学习的情感分析

        以上的分析都是定性分析,而如果要关注你说的这句话是积极的还是消极的,则需要定量分析,情感分析实质上是文本的分类,所以我们需要对其进行标记才能进一步的训练,这里我选择的是基于朴素贝叶斯的SNOWNLP进行演示,这个库很简单,也很初始,用于做论文是肯定不行的,但作为平时玩玩儿还是可以滴~首先,它的分词相比于jieba分词效果欠佳,我们可以对SnowNLP的源码进行修改,并且可以用自己训练的模型,具体可以参考下面两篇博客。

https://blog.csdn.net/weixin_42007766/article/details/89824318?utm_source=app&app_version=5.0.1&code=app_1562916241&uLinkId=usr1mkqgl919blen《基于文本挖掘的情人节微信聊天记录情感分析》https://blog.csdn.net/weixin_42007766/article/details/89824318?utm_source=app&app_version=5.0.1&code=app_1562916241&uLinkId=usr1mkqgl919blensnownlp:自定义训练样本与模型保存_AI数据工厂-CSDN博客_snownlp训练模型本文介绍了snownlp包的情感分析模型训练、保存以及如何使用自己训练的模型,从文件结构、源码设置等角度进行了描述。按照此方法,可以轻松玩转snownlp的情感分析。《基于文本挖掘的情人节微信聊天记录情感分析》https://blog.csdn.net/oYeZhou/article/details/82868683?utm_source=app&app_version=5.0.1&code=app_1562916241&uLinkId=usr1mkqgl919blen        我这里也直接放代码和效果图:

line = open("清洗后文本.txt","r", encoding='utf8').readlines()
sentimentslist = []
for i in line:
    s = SnowNLP(i)
    print(s.sentiments)
    sentimentslist.append(s.sentiments)

#区间转换为[-0.5, 0.5]
result = []
i = 0
while i<len(sentimentslist):
    result.append(sentimentslist[i]-0.5)
    i = i + 1

#可视化画图

plt.plot(np.arange(0,2228,1),result, 'r-')
plt.xlabel('the number of wechat')
plt.ylabel('Sentiments')
plt.title('Sentiments of XHB and YYX since 2020.5')
plt.show()

《基于文本挖掘的情人节微信聊天记录情感分析》

        从上面的这个情感分析可以看出总体波动比较大,0以上的为积极情绪,0以下的为消极情绪,可以反映出两个人平时说话是否阳间哈哈,感情是否和睦,当然,我这里为了方便没有自己训练模型,用的是自带的模型,所以可能不是很准确,我们平时讲话都是很和睦的哈哈哈

3.4 其他深度学习应用

        除了这些,还可以进行进一步的探索,如word2vec语义相似度,输入某个人名,看看你们有没有情敌哈哈,还可以做一些细粒度的情感分析,看看你到底有多少“戏”~。

        深度学习识别细粒度情感这块我也一直在学习,后续会进行一个记录~

        以上就是所有的内容啦~如果对您有帮助,记得点一个关注哈哈哈~~~

    原文作者:#温室里的土豆
    原文地址: https://blog.csdn.net/m0_52488320/article/details/122907886
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞