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


Posted in Python onJuly 31, 2020

python实现情感分析(Word2Vec)

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

1

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

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

实现步骤

加载数据,预处理

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

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

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

首先导入几个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。

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

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

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

计算词向量

#初始化模型和词表
 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()

运行一下:

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

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

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

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

Python 相关文章推荐
python中django框架通过正则搜索页面上email地址的方法
Mar 21 Python
python清理子进程机制剖析
Nov 23 Python
Python实现嵌套列表去重方法示例
Dec 28 Python
python破解zip加密文件的方法
May 31 Python
详解Numpy中的广播原则/机制
Sep 20 Python
pandas.DataFrame删除/选取含有特定数值的行或列实例
Nov 07 Python
对dataframe数据之间求补集的实例详解
Jan 30 Python
Python中asyncio模块的深入讲解
Jun 10 Python
Python循环中else,break和continue的用法实例详解
Jul 11 Python
安装PyInstaller失败问题解决
Dec 14 Python
Python函数基本使用原理详解
Mar 19 Python
python 下载m3u8视频的示例代码
Nov 11 Python
Python爬虫基于lxml解决数据编码乱码问题
Jul 31 #Python
Python如何定义有可选参数的元类
Jul 31 #Python
Python爬虫爬取糗事百科段子实例分享
Jul 31 #Python
Python如何对齐字符串
Jul 30 #Python
Python3爬虫关于代理池的维护详解
Jul 30 #Python
Python读写压缩文件的方法
Jul 30 #Python
Python3爬虫里关于代理的设置总结
Jul 30 #Python
You might like
说明的比较细的php 正则学习实例
2008/07/30 PHP
php可生成缩略图的文件上传类实例
2014/12/17 PHP
摘自织梦CMS的HTTP文件下载类
2015/08/08 PHP
解决laravel groupBy 对查询结果进行分组出现的问题
2019/10/09 PHP
TP5框架使用QueryList采集框架爬小说操作示例
2020/03/26 PHP
Apache+PHP+MySQL搭建PHP开发环境图文教程
2020/08/06 PHP
lib.utf.js
2007/08/21 Javascript
js 覆盖和重载 函数
2009/09/25 Javascript
express的中间件cookieParser详解
2014/12/04 Javascript
javascript实现五星评分功能
2015/11/10 Javascript
jquery ztree实现模糊搜索功能
2016/02/25 Javascript
浅析jquery数组删除指定元素的方法:grep()
2016/05/19 Javascript
原生js实现焦点轮播图效果
2017/01/12 Javascript
Angular 4依赖注入学习教程之ValueProvider的使用(七)
2017/06/04 Javascript
vue实现图书管理demo详解
2017/10/17 Javascript
jQuery实现的中英文切换功能示例
2019/01/11 jQuery
jQuery实现合并表格单元格中相同行操作示例
2019/01/28 jQuery
超详细的5个Shell脚本实例分享(值得收藏)
2019/08/15 Javascript
Python的Flask开发框架简单上手笔记
2015/11/16 Python
python leetcode 字符串相乘实例详解
2018/09/03 Python
python爬虫之自动登录与验证码识别
2020/06/15 Python
CentOS 7 安装python3.7.1的方法及注意事项
2018/11/01 Python
pycharm运行程序时在Python console窗口中运行的方法
2018/12/03 Python
深入解析Python小白学习【操作列表】
2019/03/23 Python
python爬虫开发之使用Python爬虫库requests多线程抓取猫眼电影TOP100实例
2020/03/10 Python
Django更新models数据库结构步骤
2020/04/01 Python
解决Python Matplotlib绘图数据点位置错乱问题
2020/05/16 Python
python查询MySQL将数据写入Excel
2020/10/29 Python
selenium学习教程之定位以及切换frame(iframe)
2021/01/04 Python
如何用Python编写一个电子考勤系统
2021/02/08 Python
浅谈HTML5 defer和async的区别
2016/06/07 HTML / CSS
计算机大学生职业生涯规划书范文
2014/02/19 职场文书
高考作弊检讨书1500字
2015/02/16 职场文书
计算机实训心得体会
2016/01/14 职场文书
解除合同协议书范本
2016/03/21 职场文书
使用Python通过企业微信应用给企业成员发消息
2022/04/18 Python