自然语言处理之使用gensim.Word2Vec训练词向量进行词义消歧

NLP中进行词义消歧的一个非常方便且简单的方法就是训练词向量,通过词向量计算余弦值,来推断某个词在句子中的含义。python中的gensim提供了一个非常方便的方法,一句话就可以训练词向量。不过嘛,正如我们想的那样,肯定是语料库越大越好,但越大呢就训练的时间越长,这也是没办法的事情。
我建议大家用GPU来训练,当当当,强烈推荐AIstudio,非常好用,免费GPU10小时,不用白不用。
哇塞,我刚刚发现百度AIstudio新推出了至尊GPU,赶紧来体验一下,这名字听起来太霸气了!

完整项目的aistudio链接:http://www.sogou.com/labs/resource/cs.php.
可以直接fork哦,有问题的话及时联系我哦。

训练词向量

首先我们来训练词向量,我使用的是搜狗实验室提供的新闻语料,链接如下:
http://www.sogou.com/labs/resource/list_yuliao.php.
我下载的是这个完整版的,648MB,对我来说应该够用了,不过搜狗实验室还提供了一些更大的语料,还有1GB以上的,大家有兴趣的话,可以尝试一下,语料越大,效果越好哦。
下载好语料之后,对语料进行解压

!cd data/data83697 && unzip -q news_sohusite_xml.full.zip

因为语料是新闻的格式,我们这里的话只需要文本部分也就是content部分,所以提取content部分,保存到content.txt文件里面。

cat data/data83697/news_sohusite_xml.dat | iconv -f gbk -t utf-8 -c | grep "<content>"  > corpus.txt

接下来,对文本进行一个分词处理,因为是中文,不像英文那样可以直接以空格隔开,所以使用jieba来进行分词。

import jieba
import numpy as np
filePath='corpus.txt'
fileSegWordDonePath ='corpusSegDone_1.txt'
# 打印中文列表
def PrintListChinese(list):for i in range(len(list)):print (list[i]) # 读取文件内容到列表
fileTrainRead = []
with open(filePath,'r') as fileTrainRaw:for line in fileTrainRaw:  # 按行读取文件fileTrainRead.append(line)# jieba分词后保存在列表中
fileTrainSeg=[]
for i in range(len(fileTrainRead)):fileTrainSeg.append([' '.join(list(jieba.cut(fileTrainRead[i][9:-11],cut_all=False)))])if i % 100 == 0:print(i)# 保存分词结果到文件中
with open(fileSegWordDonePath,'w',encoding='utf-8') as fW:for i in range(len(fileTrainSeg)):fW.write(fileTrainSeg[i][0])fW.write('\n')

分好词之后,我们就可以快乐训练啦,有种要炼丹的感觉。
我是在AIStudio里面做的实验,要先安装gensim库,一句话就好,告诉它,把gensim库给我安装上。

!pip install gensim

接下来,我们导入一下各种会用到的包,这一步我基本上都是导入许许多多。

import warnings
import logging
import os.path
import sys
import multiprocessingimport gensim
from gensim.models import Word2Vec
from gensim.models.word2vec import LineSentence
# 忽略警告
warnings.filterwarnings(action='ignore', category=UserWarning, module='gensim')

正式开始训练词向量

program = os.path.basename(sys.argv[0]) # 读取当前文件的文件名
logger = logging.getLogger(program)
logging.basicConfig(format='%(asctime)s: %(levelname)s: %(message)s',level=logging.INFO)
logger.info("running %s" % ' '.join(sys.argv))# inp为输入语料, outp1为输出模型, outp2为vector格式的模型
inp = 'corpusSegDone_1.txt'
out_model = 'corpusSegDone_1.model'
out_vector = 'corpusSegDone_1.vector'# 训练模型
model = Word2Vec(LineSentence(inp), vector_size=50, window=5, min_count=5,workers=multiprocessing.cpu_count())# 保存模型
model.save(out_model)
# 保存词向量
model.wv.save_word2vec_format(out_vector, binary=False)

这一步真的还挺漫长的,GPU大概半个多小时左右,如果使用至尊GPU(我还没试过)应该可能会更快一点。

开始词义消歧

首先我们用“苹果”来做一个示范:
先引入刚刚训练好的模型

from gensim.models import Word2Vec
import numpy as np
model = Word2Vec.load('corpusSegDone_1.model')

来查看一下和苹果相似的词

model.wv.most_similar(u"苹果")

哦豁,有点意思哦,和“苹果”最相关的是“微软”、“谷歌”和“苹果公司”。可能有人要疑惑了,奇怪哦,为什么和苹果相似的不是“香蕉”、“葡萄”、“水蜜桃”之类的呢?没错,你发现了我们模型的问题!这个其实是因为我们的新闻语料库的原因,看来我们的新闻语料更偏向于科技方面。
后来,试了一下搜狗实验室的其他语料,惊讶的发现和苹果最相关的竟然是“月饼”还有“水果”!所以这个语料的选择真的非常重要!
接下来我们就来测验一下,看看“用苹果性能好,分辨率高”中的“苹果”究竟是手机还是水果还是其他物品。
我给苹果的含义分了三种语义,“水果”、“手机”、“电影”,它们的使用场景分别是“这个()真好吃,营养价值高”、“()手机配置不高,但整体性能优化的很好”、“()上映了,听说非常精彩”。把这三句话jieba分词一下,来看一看我们的目标句子和这三句话哪个更接近。

content=['用','苹果','性能','好','分辨率','高']
des1=['这个','真','好吃','营养价值','高']
des2=['手机','配置','不高','但','整体','性能','优化','的','很','好']
des3=['上映','了','听说','非常','精彩']
def w2v_mean(essay,model):ls=np.zeros(50)for unit in essay:try:ls+=np.array(model.wv[unit])except:passreturn ls/len(essay)

通过余弦值大小来判断,目标句子与三种语境的相似程度,余弦值越大,代表越接近。

content=w2v_mean(content,model)
d1=w2v_mean(des1,model)
d2=w2v_mean(des2,model)
d3=w2v_mean(des3,model)
print(np.dot(d1,content)/(np.linalg.norm(d1)*(np.linalg.norm(content))))
print(np.dot(d2,content)/(np.linalg.norm(d2)*(np.linalg.norm(content))))
print(np.dot(d3,content)/(np.linalg.norm(d3)*(np.linalg.norm(content))))

来看一看结果吧!
很明显看到,第二种语境下的余弦值大于另外两个,所以我们可以说我们目标句子中的“苹果”就是手机的意思。
是不是非常有趣!
那我们再来试一下“算账”,算账有两种意思,一种是计算账目。如,“你别打扰他,他正在算账呢。” 还有一种是吃亏或失败后与人较量.如,“好了,这回算你赢,下回我再跟你算账!”

首先来看看我们的语料中和“算账”相似的词,效果还可以。

model.wv.most_similar(u"算账")

我相看一看“我正要找你算账”中的“算账”应该是什么意思。(在自我推敲之后,自己也有点不确定,这句话中的“算账”该怎么解释)

content=['我','正要','找你','算账']
des1=['你别','打扰','他','他','正在','呢']
des2=['好','了','这回','算','你','赢','下回','我','再','跟','你']
def w2v_mean(essay,model):ls=np.zeros(50)for unit in essay:try:ls+=np.array(model.wv[unit])except:passreturn ls/len(essay)
content=w2v_mean(content,model)
d1=w2v_mean(des1,model)
d2=w2v_mean(des2,model)
print(np.dot(d1,content)/(np.linalg.norm(d1)*(np.linalg.norm(content))))
print(np.dot(d2,content)/(np.linalg.norm(d2)*(np.linalg.norm(content))))

来看看结果,非常相近,不过第二种对应的余弦值更大一些,那这里的“算账”就解释为“吃亏或失败后与人较量”吧。
语义消歧就是这样啦,大家可以直接点击连接去运行一下代码,非常方便哦!
哦对啦,我开始把讲解更新B站和抖音啦,名字都叫猫猫头丁,欢迎大家来关注啊!!!
B站:https://space.bilibili.com/410893912.

自然语言处理之使用gensim.Word2Vec训练词向量进行词义消歧相关推荐

  1. 利用word2vec训练词向量

    利用word2vec训练词向量 这里的代码是在pycharm上运行的,文件列表如下: 一.数据预处理 我选用的数据集是新闻数据集一共有五千条新闻数据,一共有四个维度 数据集:https://pan.b ...

  2. word2vec训练词向量 python_使用Gensim word2vector训练词向量

    注意事项 Skip-Gram models:输入为单个词,输出目标为多个上下文单词: CBOW models:输入为多个上下文单词,输出目标为一个单词: 选择的训练word2vec的语料要和要使用词向 ...

  3. 使用jieba对新闻标题进行切词,然后使用word2vec训练词向量及相似词计算的一个小例子

    这个主要是我想记下来方便以后用的时候好直接copy 这个例子就是跑流程的,里面的参数都是随便设的,效果不怎么好,但是流程总得跑通吧. 首先是停用词表见 https://blog.csdn.net/qq ...

  4. Python Word2vec训练医学短文本字/词向量实例实现,Word2vec训练字向量,Word2vec训练词向量,Word2vec训练保存与加载模型,Word2vec基础知识

    一.Word2vec概念 (1)Word2vec,是一群用来产生词向量的相关模型.这些模型为浅而双层的神经网络,用来训练以重新建构语言学之词文本.网络以词表现,并且需猜测相邻位置的输入词,在word2 ...

  5. Python word2vec训练词向量,电子病历训练词向量,超简单训练电子病历的词向量,医学电子病历词向量预训练模型

    1.词向量预训练模型的优势: (1)训练和保存含有语义信息的词向量,在用于模型训练之前,enbedding的过程同样带有语义信息,使模型训练的效果更好: (2)可以用预训练好的词向量模型直接计算两个词 ...

  6. 使用word2vec训练词向量

    安装gensim:pip install gensim 准备预料:word2vec中需要sens是经过预处理且用空格进行分词的 训练模型 w2v_model = gensim.models.Word2 ...

  7. Python Djang 搭建自动词性标注网站(基于Keras框架和维基百科中文预训练词向量Word2vec模型,分别实现由GRU、LSTM、RNN神经网络组成的词性标注模型)

    引言 本文基于Keras框架和维基百科中文预训练词向量Word2vec模型,分别实现由GRU.LSTM.RNN神经网络组成的词性标注模型,并且将模型封装,使用python Django web框架搭建 ...

  8. 用维基百科训练word2vec中文词向量

    主要参考: https://blog.csdn.net/weixin_40547993/article/details/97781179 https://www.kaggle.com/jeffd23/ ...

  9. word2vec预训练词向量+通俗理解word2vec+CountVectorizer+TfidfVectorizer+tf-idf公式及sklearn中TfidfVectorizer

    文章目录 文分类实(一) word2vec预训练词向量 2 数据集 3 数据预处理 4 预训练word2vec模型 canci 通俗理解word2vec 独热编码 word2vec (Continuo ...

最新文章

  1. opencv中的waitKey(0)不起作用
  2. 【Spring】Resource接口:ClassPathResource
  3. linux 标准输入句柄,标准文件描述符与标准文件句柄
  4. Java消息服务~开发者分配的消息头
  5. python文本筛选html_python 正则表达式过滤文本中的html标签 源代码解析
  6. 机器学习经典算法笔记——PCA和梯度上升算法
  7. 贝叶斯网络(Bayesian network))简介(PRML第8.1节总结)概率图模型(Graphical models)...
  8. Python小游戏-接苹果
  9. 【Flask】flask不能访问静态文件问题
  10. DevExpress 主从表折叠显示
  11. python矩形法计算定积分_矩形、梯形法计算定积分的黎曼和
  12. 华为p20位置服务器在哪打开,华为p20在哪里打开北斗定位 | 手游网游页游攻略大全...
  13. vscode编程常用快捷键
  14. 计算机网络的对学生的利弊英语作文,关于电脑利弊的英语作文
  15. OSChina 周一乱弹 —— 无双什么都好,但不是芙妹
  16. C语言将三个整数进行排序
  17. Unity Shader - Predefined Shader preprocessor macros 着色器预处理宏
  18. java生成矢量条形码二维码
  19. 按学号和姓名进行查询c语言,数据库实验4 数据查询(答案)
  20. matlab ifs植物形态,matlab练习程序(IFS分形)

热门文章

  1. python自动微信抢红包_抢红包,我还真没落下过!每个都抢得到!用Python实现自动抢红包...
  2. 二重积分(Double Integral)
  3. 我的世界化石种子java_【我的世界】《我的世界》巨型化石种子 挖矿五年也不一定能见到_玩得好游戏攻略...
  4. Redis配置文件参数解释
  5. windows OneDrive 同步任意文件夹 同步被挂起
  6. 一篇顶级论文,让31岁的他破格晋升为仅次于院士级级教授,如今这个80后“土学者”已是211副校长...
  7. Deepin 微信经常出现假死问题解决办法。
  8. 使用Qt的QPainter绘制阿基米德螺旋线
  9. 鸡蛋壳发软怎么治疗 增强鸡蛋壳质量的特效药
  10. 计算机科学家的摇篮,科学网—科学家有多少摇篮? - 籍利平的博文