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 urlopen 使用小示例
Sep 06 Python
python中for语句简单遍历数据的方法
May 07 Python
在Python中通过threading模块定义和调用线程的方法
Jul 12 Python
Python自动化测试ConfigParser模块读写配置文件
Aug 15 Python
python编程实现12306的一个小爬虫实例
Dec 27 Python
python批量从es取数据的方法(文档数超过10000)
Dec 27 Python
使用python实现男神女神颜值打分系统(推荐)
Oct 31 Python
python 使用raw socket进行TCP SYN扫描实例
May 05 Python
解决python3中os.popen()出错的问题
Nov 19 Python
python使用scapy模块实现ping扫描的过程详解
Jan 21 Python
Spy++的使用方法及下载教程
Jan 29 Python
python使用PySimpleGUI设置进度条及控件使用
Jun 10 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
discuz论坛 用户登录 后台程序代码
2008/11/27 PHP
php $_SERVER当前完整url的写法
2009/11/12 PHP
php中修改浏览器的User-Agent来伪装你的浏览器和操作系统
2011/07/29 PHP
表格展示无限级分类(PHP版)
2012/08/21 PHP
解析PHP中的file_get_contents获取远程页面乱码的问题
2013/06/25 PHP
详解php中反射的应用
2016/03/15 PHP
Extjs学习过程中新手容易碰到的低级错误积累
2010/02/11 Javascript
jquery蒙版控件实现代码
2010/12/08 Javascript
JavaScript中for..in循环陷阱介绍
2013/11/12 Javascript
JavaScript实现大数的运算
2014/11/24 Javascript
node.js使用cluster实现多进程
2016/03/17 Javascript
JavaScript编写点击查看大图的页面半透明遮罩层效果实例
2016/05/09 Javascript
js监听键盘事件的方法_原生和jquery的区别详解
2016/10/10 Javascript
JS实现淡入淡出图片效果的方法分析
2016/12/20 Javascript
EasyUI Tree树组件无限循环的解决方法
2017/09/27 Javascript
10行原生JS实现文字无缝滚动(超简单)
2018/01/02 Javascript
微信小程序返回上一页传参并刷新过程解析
2019/12/13 Javascript
Vue中ref和$refs的介绍以及使用方法示例
2021/01/11 Vue.js
python学习之第三方包安装方法(两种方法)
2015/07/30 Python
Python编程实现双击更新所有已安装python模块的方法
2017/06/05 Python
使用Numpy读取CSV文件,并进行行列删除的操作方法
2018/07/04 Python
python linecache 处理固定格式文本数据的方法
2019/01/08 Python
python实现画五角星和螺旋线的示例
2019/01/20 Python
Python企业编码生成系统总体系统设计概述
2019/07/26 Python
Python Web程序搭建简单的Web服务器
2019/07/31 Python
tensorflow实现从.ckpt文件中读取任意变量
2020/05/26 Python
解决python打开https出现certificate verify failed的问题
2020/09/03 Python
python 服务器运行代码报错ModuleNotFoundError的解决办法
2020/09/16 Python
澳大利亚最好的在线时尚精品店:Princess Polly
2018/01/03 全球购物
党员自我评价分享
2013/12/13 职场文书
2016庆祝国庆67周年宣传语
2015/11/25 职场文书
小学班级标语口号大全
2015/12/26 职场文书
2019年大学生职业生涯规划书最新范文
2019/03/25 职场文书
HTML+CSS+JS实现图片的瀑布流布局的示例代码
2021/04/22 HTML / CSS
MySQL的join buffer原理
2021/04/29 MySQL
简单聊聊Vue中的计算属性和属性侦听
2021/10/05 Vue.js