python使用Word2Vec进行情感分析解析

python实现情感分析(Word2Vec)

** 前几天跟着老师做了几个项目,老师写的时候劈里啪啦一顿敲,写了个啥咱也布吉岛,线下自己就瞎琢磨,终于实现了一个最简单的项目。输入文本,然后分析情感,判断出是好感还是反感。看最终结果:↓↓↓↓↓↓

1


2

大概就是这样,接下来实现一下。

实现步骤

加载数据,预处理

数据就是正反两类,保存在neg.xls和pos.xls文件中,

数据内容类似购物网站的评论,分别有一万多个好评和一万多个差评,通过对它们的处理,变成我们用来训练模型的特征和标记。

首先导入几个python常见的库,train_test_split用来对特征向量的划分,numpy和pands是处理数据常见的库,jieba库用来分词,joblib用来保存训练好的模型,sklearn.svm是机器学习训练模型常用的库,我觉得核心的就是Word2Vec这个库了,作用就是将自然语言中的字词转为计算机可以理解的稠密向量。

from sklearn.model_selection import train_test_split
import numpy as np
import pandas as pd
import jieba as jb
from sklearn.externals import joblib
from sklearn.svm import SVC
from gensim.models.word2vec import Word2Vec

加载数据,将数据分词,将正反样本拼接,然后创建全是0和全是1的向量拼接起来作为标签,

 neg =pd.read_excel("data/neg.xls",header=None,index=None)
 pos =pd.read_excel("data/pos.xls",header=None,index=None)
 # 这是两类数据都是x值
 pos['words'] = pos[0].apply(lambda x:list(jb.cut(x)))
 neg['words'] = neg[0].apply(lambda x:list(jb.cut(x)))
 #需要y值 0 代表neg 1代表是pos
 y = np.concatenate((np.ones(len(pos)),np.zeros(len(neg))))
 X = np.concatenate((pos['words'],neg['words']))

切分训练集和测试集

利用train_test_split函数切分训练集和测试集,test_size表示切分的比例,百分之二十用来测试,这里的random_state是随机种子数,为了保证程序每次运行都分割一样的训练集和测试集。否则,同样的算法模型在不同的训练集和测试集上的效果不一样。训练集和测试集的标签无非就是0和1,直接保存,接下来单独处理特征向量。

 X_train,X_test,y_train,y_test = train_test_split(X,y,test_size=0.2,random_state=3)
 #保存数据
 np.save("data/y_train.npy",y_train)
 np.save("data/y_test.npy",y_test)

词向量计算

网上搜到的专业解释是这样说的:使用一层神经网络将one-hot(独热编码)形式的词向量映射到分布式形式的词向量。使用了Hierarchical softmax, negative sampling等技巧进行训练速度上的优化。作用:我们日常生活中使用的自然语言不能够直接被计算机所理解,当我们需要对这些自然语言进行处理时,就需要使用特定的手段对其进行分析或预处理。使用one-hot编码形式对文字进行处理可以得到词向量,但是,由于对文字进行唯一编号进行分析的方式存在数据稀疏的问题,Word2Vec能够解决这一问题,实现word embedding
专业解释的话我还是一脸懵,后来看了一个栗子,大概是这样:
word2vec也叫word embeddings,中文名“词向量”,作用就是将自然语言中的字词转为计算机可以理解的稠密向量(Dense Vector)。在word2vec出现之前,自然语言处理经常把字词转为离散的单独的符号,也就是One-Hot Encoder。

在语料库中,杭州、上海、宁波、北京各对应一个向量,向量中只有一个值为1,其余都为0。但是使用One-Hot Encoder有以下问题。一方面,城市编码是随机的,向量之间相互独立,看不出城市之间可能存在的关联关系。其次,向量维度的大小取决于语料库中字词的多少。如果将世界所有城市名称对应的向量合为一个矩阵的话,那这个矩阵过于稀疏,并且会造成维度灾难。
使用Vector Representations可以有效解决这个问题。Word2Vec可以将One-Hot Encoder转化为低维度的连续值,也就是稠密向量,并且其中意思相近的词将被映射到向量空间中相近的位置。
如果将embed后的城市向量通过PCA降维后可视化展示出来,那就是这个样子。

计算词向量

#初始化模型和词表
 wv = Word2Vec(size=300,min_count=10)
 wv.build_vocab(x_train)
 # 训练并建模
 wv.train(x_train,total_examples=1, epochs=1)
 #获取train_vecs
 train_vecs = np.concatenate([ build_vector(z,300,wv) for z in x_train])
 #保存处理后的词向量
 np.save('data/train_vecs.npy',train_vecs)
 #保存模型
 wv.save("data/model3.pkl")

 wv.train(x_test,total_examples=1, epochs=1)
 test_vecs = np.concatenate([build_vector(z,300,wv) for z in x_test])
 np.save('data/test_vecs.npy',test_vecs)

•对句子中的所有词向量取均值,来生成一个句子的vec

def build_vector(text,size,wv):
 #创建一个指定大小的数据空间
 vec = np.zeros(size).reshape((1,size))
 #count是统计有多少词向量
 count = 0
 #循环所有的词向量进行求和
 for w in text:
 try:
 vec += wv[w].reshape((1,size))
 count +=1
 except:
 continue

 #循环完成后求均值
 if count!=0:
 vec/=count
 return vec

训练SVM模型

训练就用SVM,sklearn库已经封装了具体的算法,只需要调用就行了,原理也挺麻烦,老师讲课的时候我基本都在睡觉,这儿就不装哔了。(想装装不出来。。😭)

 #创建SVC模型
 cls = SVC(kernel="rbf",verbose=True)
 #训练模型
 cls.fit(train_vecs,y_train)
 #保存模型
 joblib.dump(cls,"data/svcmodel.pkl")
 #输出评分
 print(cls.score(test_vecs,y_test))

预测

训练完后也得到了训练好的模型,基本这个项目已经完成了,然后为了使看起来好看,加了个图形用户界面,看起来有点逼格,

from tkinter import *
import numpy as np
import jieba as jb
import joblib
from gensim.models.word2vec import Word2Vec

class core():
 def __init__(self,str):
 self.string=str

 def build_vector(self,text,size,wv):
 #创建一个指定大小的数据空间
 vec = np.zeros(size).reshape((1,size))
 #count是统计有多少词向量
 count = 0
 #循环所有的词向量进行求和
 for w in text:
 try:
 vec += wv[w].reshape((1,size))
 count +=1
 except:
 continue
 #循环完成后求均值
 if count!=0:
 vec/=count
 return vec
 def get_predict_vecs(self,words):
 # 加载模型
 wv = Word2Vec.load("data/model3.pkl")
 #将新的词转换为向量
 train_vecs = self.build_vector(words,300,wv)
 return train_vecs
 def svm_predict(self,string):
 # 对语句进行分词
 words = jb.cut(string)
 # 将分词结果转换为词向量
 word_vecs = self.get_predict_vecs(words)
 #加载模型
 cls = joblib.load("data/svcmodel.pkl")
 #预测得到结果
 result = cls.predict(word_vecs)
 #输出结果
 if result[0]==1:
 return "好感"
 else:
 return "反感"
 def main(self):
 s=self.svm_predict(self.string)
 return s

root=Tk()
root.title("情感分析")
sw = root.winfo_screenwidth()
#得到屏幕宽度
sh = root.winfo_screenheight()
#得到屏幕高度
ww = 500
wh = 300
x = (sw-ww) / 2
y = (sh-wh) / 2-50
root.geometry("%dx%d+%d+%d" %(ww,wh,x,y))
# root.iconbitmap('tb.ico')

lb2=Label(root,text="输入内容,按回车键分析")
lb2.place(relx=0, rely=0.05)

txt = Text(root,font=("宋体",20))
txt.place(rely=0.7, relheight=0.3,relwidth=1)

inp1 = Text(root, height=15, width=65,font=("宋体",18))
inp1.place(relx=0, rely=0.2, relwidth=1, relheight=0.4)

def run1():
 txt.delete("0.0",END)
 a = inp1.get('0.0',(END))
 p=core(a)
 s=p.main()
 print(s)
 txt.insert(END, s) # 追加显示运算结果

def button1(event):
 btn1 = Button(root, text='分析', font=("",12),command=run1) #鼠标响应
 btn1.place(relx=0.35, rely=0.6, relwidth=0.15, relheight=0.1)
 # inp1.bind("<Return>",run2) #键盘响应

button1(1)
root.mainloop()

运行一下:


项目已经完成了,简单的实现了一下情感分析,不过泛化能力一般般,输入的文本风格类似与网上购物的评论那样才看起来有点准确,比如喜欢,讨厌,好,不好,质量,态度这些网店评论经常出现的词汇分析起来会很准,但是例如温柔,善良,平易近人这些词汇分析的就会很差。优化的话我感觉可以训练各种风格的样本,或集成学习多个学习器进行分类,方法很多,但是实现起来又是一个大工程,像我这最后一排的学生,还是去打游戏去咯。

项目中的训练样本,训练好的模型以及完整项目代码
↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓

http://xiazai.jb51.net/202007/yuanma/data_jb51.rar

到此这篇关于python使用Word2Vec进行情感分析解析的文章就介绍到这了,更多相关python  Word2Vec  情感分析 内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Python实现购物评论文本情感分析操作【基于中文文本挖掘库snownlp】

    本文实例讲述了Python实现购物评论文本情感分析操作.分享给大家供大家参考,具体如下: 昨晚上发现了snownlp这个库,很开心.先说说我开心的原因.我本科毕业设计做的是文本挖掘,用R语言做的,发现R语言对文本处理特别不友好,没有很多强大的库,特别是针对中文文本的,加上那时候还没有学机器学习算法.所以很头疼,后来不得已用了一个可视化的软件RostCM,但是一般可视化软件最大的缺点是无法调参,很死板,准确率并不高.现在研一,机器学习算法学完以后,又想起来要继续学习文本挖掘了.所以前半个月开始了用

  • python snownlp情感分析简易demo(分享)

    SnowNLP是国人开发的python类库,可以方便的处理中文文本内容,是受到了TextBlob的启发而写的,由于现在大部分的自然语言处理库基本都是针对英文的,于是写了一个方便处理中文的类库,并且和TextBlob不同的是,这里没有用NLTK,所有的算法都是自己实现的,并且自带了一些训练好的字典.注意本程序都是处理的unicode编码,所以使用时请自行decode成unicode.MIT许可下发行. 其 github主页 我自己修改了上文链接中的python代码并加入些许注释,以方便你的理解:

  • python使用Word2Vec进行情感分析解析

    python实现情感分析(Word2Vec) ** 前几天跟着老师做了几个项目,老师写的时候劈里啪啦一顿敲,写了个啥咱也布吉岛,线下自己就瞎琢磨,终于实现了一个最简单的项目.输入文本,然后分析情感,判断出是好感还是反感.看最终结果:↓↓↓↓↓↓ 1 2 大概就是这样,接下来实现一下. 实现步骤 加载数据,预处理 数据就是正反两类,保存在neg.xls和pos.xls文件中, 数据内容类似购物网站的评论,分别有一万多个好评和一万多个差评,通过对它们的处理,变成我们用来训练模型的特征和标记. 首先导

  • 利用python实现简单的情感分析实例教程

    目录 1 数据导入及预处理 1.1 数据导入 1.2 数据描述 1.3 数据预处理 2 情感分析 2.1 情感分 2.2 情感分直方图 2.3 词云图 2.4 关键词提取 3 积极评论与消极评论 3.1 积极评论与消极评论占比 3.2 消极评论分析 总结 python实现简单的情感分析 1 数据导入及预处理 1.1 数据导入 # 数据导入 import pandas as pd data = pd.read_csv('../data/京东评论数据.csv') data.head() 1.2 数据

  • Python实现word2Vec model过程解析

    这篇文章主要介绍了Python实现word2Vec model过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 import gensim, logging, os logging.basicConfig(format='%(asctime)s : %(levelname)s : %(message)s', level=logging.INFO) import nltk corpus = nltk.corpus.brown.sents()

  • 使用pycallgraph分析python代码函数调用流程以及框架解析

    技术背景 在上一篇博客中,我们介绍了使用量子计算模拟器ProjectQ去生成一个随机数,也介绍了随机数的应用场景等.但是有些时候我们希望可以打开这里面实现的原理,去看看在产生随机数的过程中经历了哪些运算,调用了哪些模块.只有梳理清楚这些相关的内容,我们才能够更好的使用这个产生随机数的功能.这里我们就引入一个工具pycallgraph,可以根据执行的代码,给出这些代码背后所封装和调用的所有函数.类的关系图,让我们一起来了解下这个工具的安装和使用方法. Manjaro Linux平台安装graphv

  • python 爬取京东指定商品评论并进行情感分析

    项目地址 https://github.com/DA1YAYUAN/JD-comments-sentiment-analysis 爬取京东商城中指定商品下的用户评论,对数据预处理后基于SnowNLP的sentiment模块对文本进行情感分析. 运行环境 Mac OS X Python3.7 requirements.txt Pycharm 运行方法 数据爬取(jd.comment.py) 启动jd_comment.py,建议修改jd_comment.py中变量user-agent为自己浏览器用户

  • Python基于jieba分词实现snownlp情感分析

    情感分析(sentiment analysis)是2018年公布的计算机科学技术名词. 它可以根据文本内容判断出所代表的含义是积极的还是负面的,也可以用来分析文本中的意思是褒义还是贬义. 一般应用场景就是能用来做电商的大量评论数据的分析,比如好评率或者差评率的统计等等. 我们这里使用到的情感分析的模块是snownlp,为了提高情感分析的准确度选择加入了jieba模块的分词处理. 由于以上的两个python模块都是非标准库,因此我们可以使用pip的方式进行安装. pip install jieba

  • Python构建网页爬虫原理分析

    既然本篇文章说到的是Python构建网页爬虫原理分析,那么小编先给大家看一下Python中关于爬虫的精选文章: python实现简单爬虫功能的示例 python爬虫实战之最简单的网页爬虫教程 网络爬虫是当今最常用的系统之一.最流行的例子是 Google 使用爬虫从所有网站收集信息.除了搜索引擎之外,新闻网站还需要爬虫来聚合数据源.看来,只要你想聚合大量的信息,你可以考虑使用爬虫. 建立一个网络爬虫有很多因素,特别是当你想扩展系统时.这就是为什么这已经成为最流行的系统设计面试问题之一.在这篇文章中

  • Python断言assert的用法代码解析

    在开发一个程序时候,与其让它运行时崩溃,不如在它出现错误条件时就崩溃(返回错误).这时候断言assert 就显得非常有用. python assert断言是声明布尔值必须为真的判定,如果发生异常就说明表达式为假. 可以理解assert断言语句为raise-if-not,用来测试表示式,其返回值为假,就会触发异常. assert的语法格式: assert expression 它的等价语句为: if not expression: raise AssertionError 这段代码用来检测数据类型

随机推荐