微博语料情感分析

目录

独创性说明

第一章 绪论

1.1研究背景

1.2课题研究

第一章 情感分析准备

2.1情感分析知识基础

2.2 SnowNLP库

2.3 Word2vec方式

2.3 词向量工作原理

第三章没想好......

第四章 没想好......

第五章 没想好......

写在末尾:

Chat一出,码农已死,代码在此,拿走!

Word2vec方式:

直接调用SnowNLP

文献参考:


独创性说明

        本次实验本人是抱着较大的兴趣去完成的,其中加入了一些我对于当前关于NLP的相关技术的简单了解和初步的看法,某些地方语言描述并不是很严肃。为了节省时间,在论述实验中我引入了一些学术论文的研究成果和理论,所以有些地方并不是我的原创,我也并没有具体标注这些成果的出处,但是本着学习的态度,我坚持写了这样的一篇报告,所以这不能算是一篇正式的论文报告。对了,其中的一些用词可能不是很准确,但是我觉得有逼格,就使用了,所以各位不必深究,经不起推敲的东西看一看就可以了,所以其中有不足之处还请谅解。

第一章 绪论

1.1研究背景

        随着计算机技术的飞速发展,人们已经踏入了人工智能时代。尤其是今年极为火爆的由美国人工智能研究实验室OpenAI新推出的一种人工智能技术驱动的自然语言处理(Natural Language Processing)工具ChatGPTChatGPT技术的出现,让人工智能技术在语言交互方面的应用变得更加普及和广泛。在twitter上,使用过ChatGPT的用户反馈表示,基于21年语料库训练出来的3.0版本的Chat的智力已经是相当于小狗的水平,而GPT-3只是ChatGPT(这里我们直接跳过1、2版本)的基础模型,后续版本的Chat都是在这个模型上进行改进的,目前最新版本的GPT-4更精确且更多样化同时GPT-4已经接入到各种平台的软件上,这就相当于给这颗本就很强大的大脑接上了手和脚,在给用户增添更多实用性和趣味性的同时可以让它在人类的各个领域充分发挥其该有的作用,带动着人类的科技文明向更高层次发展。唯一美中不足的一点就是国内用户想使用该技术有一定的困难,而且ChatGPT的定价比较高,想要使用最新版本的ChaGPT(据说5.0版本也要上线了),用户需要每月支付20美刀,按最新汇率计算6.8680截至2023-03-25 05:00,国内用户每个月至少要花费137元,对于我这种穷鬼来说,简直无法接受!所以还是用3.5版本的吧,要是能白嫖4.0的话...hhh

ChatGPT推出后不久,国内涌现出的一批公司,立马推出关于ChatGP的套壳产品,迅速占领国内市场,割取韭菜,谋取利益,主打的就是一个信息差,这也算是数字鸿沟的一个具体体现了。同时,百度在今年三月份推出了一款类似的产品——文心一言,比较有意思的是在发布会当天,李彦宏介绍玩该产品后,百度股票开始下跌,而且大多数网友都认为文心一言相较于ChatGPT简直不值一提。最近媒体也在炒作关于腾讯将要推出的盘古模型,对此,了解国情的大部分网友持着不是很看好的态度。我只申请了newbing的API接口,和openAI的ChatGPT4的接口,只有微软的通过了(其实它是3.0版本的GPT),openAI至今也没有回我消息。文心一言我只听过,昨儿申请的,其他的再没关注过。我觉得国内的人工智能技术还是有待进步的,国内人工智能技术任重而道远。

1.2课题研究

        网上的沟通平台各式各样,中国互联网发展至今,各大网络公司推出了QQ、微信、贴吧、微博、知乎等目不暇接的社交软件供人们使用。这些APP极大的改变了人与人之间的交流方式,让人们可以更加高效、准确的表达思想,而人们对待每个问题都有不同的看法,或多或少带有个人的感情倾向,作为一名NLP学者,我们自然是要对这些包含情感的观点进行分析,判断出这些人的喜怒哀乐,至于我将要使用的分析方法,后面会讲到。在各种社交软件中,微博的覆盖群体较广,每日用户活跃数量上亿。随着这几年的发展,微博用户数量的增加使微博的交互内容更加多元化,而丰富多元的内容生态又可使用户得到更好的使用体验。微博上每时每刻产生的海量情感文本,内容涉及政治、经济、娱乐、体育等多种领域,且一般饱含情感倾向和个人立场,带有非常丰富的研究价值。因此这次的课题我们以微博为例,利用自然语言处理技术(NLP),对获取的微博语料建立一个模型,然后利用训练好的模型对训练集进行分词处理和情感分析。


第一章 情感分析准备

2.1情感分析知识基础

        情感分析又被称作评论挖掘或者意见挖掘,在情感信息分类方面,一般可根据目标任务划分为粗粒度情感分类和细粒度情感分类,其中粗粒度情感分类是指判断出文本整体所表现出的情感,以此表明一个人对某件事或对某个物体的整体评价。粗粒度情感分类有两种方式,一种是情感倾向性分类,即分为褒、贬、中三类;第二种是情绪分类,表示将个人主观情绪分为喜、怒、悲、恐、惊等类别。迄今为止,文本情感分析的方法主要可划分为三大类,分别为:基于情感词典、基于机器学习、基于深度学习模型。害,这些理论就先别管了,都有ChatGPT了,我们只管提要求就是,再说,现在很多库都能直接调用,直接上项目(注:其实就是一个简单的语言处理作业,还不配被称为项目,但是就当它是了)!

2.2 SnowNLP库

        在这次的数据挖掘实验中,我用到了SnowNLP库,这个库是国人自己开发的python类库,专门针对中文文本进行挖掘,里面已经有了算法,需要自己调用函数,根据不同的文本构建语料库就可以,真的很方便。其中有很多算法,这几天我也在努力学习其中的算法原理。不过遇到不少困难,因为我在学习这个库的时候,我查了很多资料发现很少或者基本没有写这个库的具体详解,很多都是转载官网对这个库的简介,有些解释也是模糊不清。我搜到的有关SnowNLP的案例有些是英文写的(包括SonwNLP官网介绍也都是英文),所以英文理解也是学习过程中的一大困难,不过在这个过程中,我确实有所收获,在这我就简单记录一下一些模块的调用,具体的原理就...

        首先准备好语料,neg.csv和pos.csv,用他们训练自己的模型,具体步骤如下:调用SnowNLP库里的snetiment模块,然后保存自己模型,把它放到自己的文件夹中,后续会用到。这里的训练语料不是很多,每个文件也就一万多条微博语料数据,大概五分钟就训练好了,卷王们就可以趁这个时间背几个英文单词了

        然后加载自己的模型对测试语料进行情感分析,在这之前记得加载自己的模型,把默认的模型文件路劲改成自己的,以下代码的运行结果显示出这两个路劲是不一样的。

        加载完模型,直接处理数据,然后情感分析。一眼望去,代码都懂,那就不罗嗦了,简而言之就是,这里的valid_data数据里面每一行都有一条文博语句,所以在每一行语句后面必然有个回车(就是换行符),所以我们利用x.strip()方法得到需要分析的语句,写入列表中,然后直接调用SnowNLP.sentiments模块,对每一条语句计算它的分析结果并返回一个区间为[0,1]的sentiment值,然后写入列表。

        之后我就用简而言之的方法论述我剩下的实验过程:

        然后这么的......

        再然后就这么的......

        再然后实验结束

        ......

        文档备份:

        Ok,如果想更深入一点,就接着Copy,下面我简单Copy一下Word2vec模型的原理(注:词向量模型不止这一个)。

2.3 Word2vec方式

        采用Word2vec词向量的步骤可分为:中文分词、去停用词、训练词向量。由于实验语料源自中文微博网络平台,所以文本语言以中文为主,极少数语句中参杂个别英文词汇。由于英文词汇间有空格作为天然的分词界限,所以无需进行分词操作,而中文则需要采用分词算法将句子中的词汇、符号依次分隔开来。

        实验中应用基于Python的开源分词工具“jieba”对微博评论文本进行分词。该工具拥有三种分词模式,分别为全模式、精确模式和搜索引擎模式,可根据任务目标进行选择。计算机在读取语料文件后,调用jieba.cut()方法开始对每句文本分词处理。其中,需要设置jieba.cut()函数内的三个参数:第一个参数是在引号内输入需要分词的字符串;第二个参数cut_all需要填写True或False来决定采用全模式或精确模式;第三个是HMM参数用来控制是否借助HMM模型。实验中选择使用精确模式以保证分词的准确性。 分词处理的下一阶段是过滤停用词。由于网络评论的文本具有很强的原创性、随意性,所以语句中会夹杂着许多没有实际意义的词,例如“的”“是”“了”等。除此之外,文本中还存在许多对于情感分类无用的标点符号,例如“,”、“*”、“:”、“#”、“?”、“@”、“ [”、“]”等。过多的冗余信息将为情感分析任务带来困难,同时还会影响分析正确率,应在进行进一步分析处理前将其剔除。之后提取其中的关键词。

        在这说一下model.Word2Vec的各个参数:

        sentences: 我们要分析的语料,可以是一个列表,或者从文件中遍历读出。

        size: 词向量的维度,默认值是100。这个维度的取值一般与我们的语料的大小相关,如果是不大的语料,比如小于100M的文本语料,则使用默认值一般就可以了。如果是超大的语料,建议增大维度。

        window:即词向量上下文最大距离,这个参数在我们的算法原理篇中标记为cc,window越大,则和某一词较远的词也会产生上下文关系。默认值为5。在实际使用中,可以根据实际的需求来动态调整这个window的大小。如果是小语料则这个值可以设的更小。对于一般的语料这个值推荐在[5,10]之间。

        sg: 即我们的word2vec两个模型的选择了。如果是0,则是CBOW模型,是1则是Skip-Gram模型,默认是0即CBOW模型。

        hs: 即我们的word2vec两个解法的选择了,如果是0则是Negative Sampling,是1的话并且负采样个数negative大于0,则是Hierarchical Softmax。默认是0即NegativeSampling。

        negative:即使用Negative Sampling时负采样的个数,默认是5。推荐在[3,10]之间。这个参数在我们的算法原理篇中标记为neg。

        cbow_mean: 仅用于CBOW在做投影的时候,为0则为上下文的词向量之和,为1则为上下文的词向量的平均值。是按照词向量的平均值来描述的。

        min_count:需要计算词向量的最小词频。这个值可以去掉一些很生僻的低频词,默认是5。如果是小语料,可以调低这个值。

        iter: 随机梯度下降法中迭代的最大次数,默认是5。对于大语料,可以增大这个值。

        alpha: 在随机梯度下降法中迭代的初始步长。默认是0.025。

        min_alpha: 由于算法支持在迭代的过程中逐渐减小步长,min_alpha给出了最小迭代步长值。随机梯度下降中每轮的迭代步长可以由iter,alpha, min_alpha一起得出。

        对于大语料,需要对alpha, min_alpha,iter一起调参,来选择合适的三个值。

2.3 词向量工作原理

        基本想法是:通过训练将某种语言中的每一个词映射成一个固定长度的短向量(这里的“短”是相对于one-hot representation的“长”而言),将所有这些向量放在一起形成一个词向量空间,而每一向量则可视为该空间中的一个点,在这个空间上引入“距离”,则可以根据词之间的距离来判断它们之间的(词法、语义上的)相似性。举个例子:假设每个词向量是分布在二维平面上的N 个不同的点,给定其中的某个点,想在平面上找到与这个点最相近的一个点,为解决这个问题,我们按以下步骤:首先,建立一个直角坐标系,基于该坐标系,其上的每个点就唯一地对应一个坐标;接着引入欧氏距离;最后分别计算这个词与其他 N-1 个词之间的距离,对应最小距离值的那个词便是我们要找的词。

        当然这里可以直接交给GPT(我这里用的是3.5版本的,4.0用不起,各位魔法师们请谅解),可以看到它给出的答案比我所理解的还要系统一些,也更专业一些,不可否认的是它的知识框架确实很好用,在很多地方都很便利。如果能嫖到4.0版本的API就更完美了

        代码展示如下:中间有个停用词处理的代码没写,要是写上,就截两次图,所以... 


第三章没想好......

第四章 没想好......

第五章 没想好......


写在末尾:

        如果对结果不满意,可以尝试更多模型或者优化数据和模型。做法思路如下:加载模型,读入微博语料(.txt),将Word2vec分别连接到LSTM、Bi-LSTM、Self-Attention、CNN网络模型上进行训练,计算各个模型的准确率、F1分数,写入excel表中...

        还有就是我的封面是GPT3.5生成的,看着挺抽象,但也够逼格的。有一说一ChatGPT真挺好用,各位魔法师们要是愿意,可以一起交流学习


Chat一出,码农已死,代码在此,拿走!

Word2vec方式:

from snownlp import sentiment
import gensim
from gensim.models import Word2Vec
import jieba
import os

sentiment.train("train_neg_data.txt",
                "train_pos_data.txt")
sentiment.save('./saved_model/weibo.marshal')

# 读取积极语料
pos_file = "train_pos_data.txt"
with open(pos_file, 'r', encoding='utf-8') as f:
    pos_text = f.read()

# 读取消极语料
neg_file = "train_neg_data.txt"
with open(neg_file, 'r', encoding='utf-8') as f:
    neg_text = f.read()

# 对积极语料和消极语料进行分词
pos_words = jieba.lcut(pos_text)
neg_words = jieba.lcut(neg_text)

#停用词处理

# 建立Word2Vec模型
sentences = [pos_words, neg_words]
model = Word2Vec(sentences, vector_size=100, window=5, min_count=1)

# 保存模型
model_file = '../saved_model/sentiment_analysis.model'
model.save(model_file)

# 加载模型
model = Word2Vec.load(model_file)

# 查看词向量
# print(model.wv['好'])

直接调用SnowNLP

import pandas as pd
import snownlp
from snownlp import sentiment
from snownlp import SnowNLP

#数据格式转换
neg = pd.read_excel("neg.xls")
pos = pd.read_excel("pos.xls")

neg.to_csv("neg.csv")
pos.to_csv("pos.csv")

#训练语料,构建模型
sentiment.train("neg.csv",
                "pos.csv")
sentiment.save('../saved_model/weibo_pro.marshal_2.0')#这里差不多要五分钟


# Use the saved model to analyze the sentiment of test data
# sentiment = sentiment.classifier.load('../saved_model/weibo_pro.marshal_2.0')
# print("默认的模型文件路径:", sentiment.data_path)
sentiment.data_path ="../saved_model/weibo_pro.marshal_2.0.3"#加载文件路径
# print("自己训练的模型路径:", sentiment.data_path)

#对测试数据进行情感分析
data  = []
data_file = "valid_data.txt"
with open(data_file, "r", encoding="utf-8") as f:
    data_line = f.readlines()
    f.close()
for line in data_line:
    data_sentence = line.strip("\n")
    data.append(data_sentence)
data_text = pd.DataFrame(data, columns=["sentence"])

data_text_file = "valid_data.xls"
test_data = pd.read_excel(data_text_file)

#把分析结果写入excel文件
test_data["sentiment"] = test_data["sentence"].apply(lambda x: SnowNLP(x).sentiments)
test_data["sentiment"].to_excel("../results/marshal_2.0_test_result.xls")#写入文件
import snownlp
from snownlp import SnowNLP
import pandas as pd

#加载训练好的模型
# model_path = "./saved_model/weibo.marshal.3"
# s = SnowNLP(model_path)
snownlp.sentiment.DATA_PATH ="./saved_model/weibo_pro.marshal_2.0.3"

# df = pd.DataFrame(columns=['text', 'sentiment'])

text = []
sent = []
with open("valid_data.txt", 'r', encoding='utf-8') as f:
    data = f.readlines()
for line in data:
    sentence = line.strip("\n")
    sentiment = SnowNLP(sentence).sentiments
    text.append(sentence)
    sent.append(sentiment)
        # df = pd.concat({'text': line, 'sentiment': sentiment}, ignore_index=True)
        # df = pd.concat({'text': line, 'sentiment': sentiment}, ignore_index=True)
df_text = pd.DataFrame(text, columns=['text'])
df_sent = pd.DataFrame(sent, columns=['sentiment'])

pf = pd.concat([df_text, df_sent], ignore_index=True)
pf.to_excel('./results/SnowNLP_result.xlsx', index=False)

文献参考:

[1] 郎聪.(2021).基于深度学习的微博文本情感分析(硕士学位论文,沈阳工业学).基于深度学习的微博文本情感分析 - 中国知网

[2]基于LSTM搭建一个文本情感分类的深度学习模型:准确率往往有95%以上_情感分类准确度_YiqiangXu的博客-CSDN博客

[3]https://www.cnblogs.com/always-fight/p/10310418.html

[4]https://louyu.cc/articles/machine-learning/2019/09/?p=1933/

[5]Python实现购物评论文本情感分析操作【基于中文文本挖掘库snownlp】 / 张生荣 

猜你喜欢

转载自blog.csdn.net/weixin_51206451/article/details/129917512
今日推荐