前言

万物皆可Embedding

入坑cs224N后看完第二周和相关论文。觉得word2vec非常有意思,将一段具有上下文关系的短文(实体)词语学习嵌入到语义空间成为一个向量,然后判断两个词语(实体)的相关性。又发现有造好的轮子gensim,何不先做一些简单又有意思的实验,再深入的学习。

本来想爬豆瓣用户历史记录,用word2Vec做一个推荐,但最近进入考期,预习刷网课要紧。先埋个伏笔,以后有时间再弄吧,技多不压身。于是先利用《三国演义》作为语料,练练手gensim,看看embedding能学到啥有趣的结论。

准备语料

利用request和beautifoup解析工具先从某网站上爬下我小学爱不释手的历史小说《三国演义》(复习爬虫技能)。简单对文本里标点符号消去并利用jieba分好词,由于小说近似是文言文,分出词语效果并不好。

def crawl(url = None):"""从http://www.purepen.com/sgyy/爬下《三国演义》到本地txt文件:param url::return:"""print('Waitting for crawling sentence!')url  = 'http://www.purepen.com/sgyy/'contents = ''for num in range(1,121):num_str = str(num)if len(num_str) == 1 : num_str = '00'+ num_strif len(num_str) == 2 : num_str = '0'+ num_strurls = url + num_str + '.htm'html = requests.get(urls)html.encoding = html.apparent_encoding # 保证中文编码方式的正确soup =  BeautifulSoup(html.text,'lxml')title  = soup.find(align = 'center').textcontents += titlecontent = soup.find(face = '宋体').textcontents += contentwith open('三国演义.txt','w') as f:f.write(contents)def segment(document_path= '三国演义.txt'):""":param document_path::return:"""with open(document_path) as f:document = f.read()document = re.sub('[()::?“”《》,。!·、\d ]+', ' ', document)  # 去标点document_cut = jieba.cut(document)result = ' '.join(document_cut)with open('segement.txt', 'w') as f2:f2.write(result)print('Segement Endding')

利用 gensim里word2vec训练模型

首先安装gensim是很容易的,使用"pip install gensim"即可。但是需要注意的是gensim对numpy的版本有要求,所以安装过程中可能会偷偷的升级你的numpy版本。而windows版的numpy直接装或者升级是有问题的。此时我们需要卸载numpy,并重新下载带mkl的符合gensim版本要求的numpy。
 
在gensim中,word2vec 相关的API都在包gensim.models.word2vec中。和算法有关的参数都在类gensim.models.word2vec.Word2Vec中,建议阅读官方文档。
算法需要注意的参数有:

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

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

  • window:即词向量上下文最大距离,这个参数在我们的算法原理篇中标记为c
    ,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即Negative Sampling。

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

  • cbow_mean: 仅用于CBOW在做投影的时候,为0,则算法中的xw
    为上下文的词向量之和,为1则为上下文的词向量的平均值。在我们的原理篇中,是按照词向量的平均值来描述的。个人比较喜欢用平均值来表示xw,默认值也是1,不推荐修改默认值。

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

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

  • alpha: 在随机梯度下降法中迭代的初始步长。算法原理篇中标记为η,默认是0.025。

  • min_alpha: 由于算法支持在迭代的过程中逐渐减小步长,min_alpha给出了最小的迭代步长值。随机梯度下降中每轮的迭代步长可以由iter,alpha, min_alpha一起得出。这部分由于不是word2vec算法的核心内容,因此在原理篇我们没有提到。对于大语料,需要对alpha, min_alpha,iter一起调参,来选择合适的三个值。
      
    用预处理好的语料,训练模型:

 sentences = word2vec.LineSentence(sentence_path)model = word2vec.Word2Vec(sentences, hs=1,min_count=1,window=3,size=100)

保存模型:

# 保存模型,以便重用
model.save("test_01.model")#不能利用文本编辑器查看,但是保存了训练的全部信息,可以在读取后追加训练可以再次读取训练
model.wv.save_word2vec_format('test_01.model.txt',binary=False)
# 将模型保存成文本格式,但是保存时丢失了词汇树等部分信息,不能追加训练

追加训练:

model = gensim.models.Word2Vec.load('/tmp/mymodel')
model.train(more_sentences)

加载模型:

model = gensim.models.Word2Vec.load('/tmp/mymodel')

模型的使用 - 词向量分析人物关系

  • 求与某个词最相关的词:
    model.most_similar()

举例:
我们在根据《三国演义》的语料训练好模型里测试一下我们的学习得到向量(word vector)学习了哪些英雄豪杰们之间潜在相关性:

首先测试早生华发(最爱)的周瑜:
print('Nearest 周瑜:',model.most_similar('周瑜'))

学习到的结果很满意:

Nearest 周瑜:[('孙策', 0.6876850128173828), ('孔明', 0.6875529289245605), ('司马懿', 0.6733481287956238), ('孟获', 0.6705329418182373), ('先主', 0.6662196516990662), ('鲁肃', 0.6605409383773804), ('孙权', 0.6458742022514343), ('孙夫人', 0.643887996673584), ('姜维', 0.6326993703842163), ('有人', 0.6321758031845093)]

相关性排第一是与周瑜有总角之好,后同为江东双壁的小霸王 孙策。他历史上与周瑜不仅从小交好,惺惺相惜,长大后一起平定江东乱世,建立功勋。同时迎娶了三国里著名一对国色天香的姐妹花大乔,小乔,传为一段佳话!

第二是即生瑜,何生亮的诸葛亮的字号:孔明。《三国演义》里一个劲为了凸显诸葛亮的神机妙算,狂黑周瑜成一个气量小的小人。同时赤壁大战,这两人代表孙,刘阵营出力最多的将领谋士。故这两人的联系必然十分紧密。

第三是司马懿,曹魏后期智力,政治最高的谋士,大都督!

后面的鲁肃孙权吴老太,也是和周瑜关系最亲密的人物。

其他学习到的结果还有:

Nearest 刘备:, [('东吴', 0.7638486623764038), ('袁绍', 0.6992679238319397), ('刘表', 0.6835019588470459), ('吴侯', 0.6756551265716553), ('司马懿', 0.6602287888526917), ('曹', 0.6518967747688293), ('曹操', 0.6457493305206299), ('刘玄德', 0.6447073817253113), ('蜀', 0.6380304098129272), ('诸葛亮', 0.6250388026237488)]
Nearest 曹操: [('袁绍', 0.6900763511657715), ('刘备', 0.6457493901252747), ('孙策', 0.6446478962898254), ('司马懿', 0.6381756067276001), ('吴侯', 0.6193397641181946), ('孙权', 0.6192417144775391), ('蜀', 0.6191484928131104), ('周瑜', 0.6183933019638062), ('东吴', 0.6114454865455627), ('马超', 0.5959264039993286)]
Nearest 孙策: [('姜维', 0.6926037073135376), ('周瑜', 0.687684953212738), ('邓艾', 0.687220573425293), ('孙坚', 0.6793218851089478), ('司马懿', 0.6556568741798401), ('钟会', 0.6528347730636597), ('郭淮', 0.6527595520019531), ('孔明自', 0.6470344066619873), ('曹操', 0.6446478962898254), ('王平', 0.6399298906326294)]
Nearest 貂蝉: [('卓', 0.7048295140266418), ('允', 0.6404716968536377), ('身', 0.6323765516281128), ('妾', 0.6265878677368164), ('瑜', 0.6257222890853882), ('吴', 0.6242125034332275), ('父', 0.6216113567352295), ('众官', 0.6189900636672974), ('后主', 0.6172502636909485), ('干', 0.6154900789260864)]
Nearest 诸葛亮: [('亮', 0.7160214185714722), ('贤弟', 0.7146532535552979), ('子敬', 0.6765022277832031), ('此人', 0.6603602766990662), ('表曰', 0.6592696905136108), ('既', 0.6532598733901978), ('奈何', 0.6503086090087891), ('大王', 0.6495622992515564), ('吾主', 0.6492528915405273), ('玄德问', 0.6449695825576782)]
  • 选出集合中不同类的词语
    比如:print(model.wv.doesnt_match(u"周瑜 鲁肃 吕蒙 陆逊 诸葛亮".split()))

周瑜,鲁肃,吕蒙,陆逊都是东吴大奖并历任大都督,只有诸葛亮是蜀国大丞相,输出结果也是诸葛亮。说明我们向量学习到这层关系。

同样的还有:

print(model.wv.doesnt_match(u"曹操 刘备 孙权 关羽".split())) #关羽不是主公
print(model.wv.doesnt_match(u"关羽 张飞 赵云 黄忠 马超 典韦".split())) #典韦不是蜀国五虎将
print(model.wv.doesnt_match(u"诸葛亮 贾诩  张昭 马超".split()))#马超是唯一武将

当然也不是所有关系都能被学习到,学习结果的好坏也取决于我们训练语料的数量和质量。《三国演义》小说才1.8Mb,所以无法学习到更多实体之间详细相关的关系。

完整代码

#!/usr/bin/env python
# encoding: utf-8import jieba
import jieba.analyse
from gensim.models import word2vec
import requests
from bs4 import BeautifulSoup
import redef crawl(url = None):"""从http://www.purepen.com/sgyy/爬下《三国演义》到本地txt文件:param url::return:"""print('Waitting for crawling sentence!')url  = 'http://www.purepen.com/sgyy/'contents = ''for num in range(1,121):num_str = str(num)if len(num_str) == 1 : num_str = '00'+ num_strif len(num_str) == 2 : num_str = '0'+ num_strurls = url + num_str + '.htm'html = requests.get(urls)html.encoding = html.apparent_encoding # 保证中文编码方式的正确soup =  BeautifulSoup(html.text,'lxml')title  = soup.find(align = 'center').textcontents += titlecontent = soup.find(face = '宋体').textcontents += contentwith open('三国演义.txt','w') as f:f.write(contents)def segment(document_path= '三国演义.txt'):""":param document_path::return:"""with open(document_path) as f:document = f.read()document = re.sub('[()::?“”《》,。!·、\d ]+', ' ', document)  # 去标点document_cut = jieba.cut(document) # 结巴分词result = ' '.join(document_cut)with open('segement.txt', 'w') as f2:f2.write(result)print('Segement Endding')def train_model(sentence_path ,model_path):sentences = word2vec.LineSentence(sentence_path)model = word2vec.Word2Vec(sentences, hs=1,min_count=1,window=3,size=100)print('Word2Vec Training Endding!')model.save(model_path)def analyse_wordVector(model_path):model =  word2vec.Word2Vec.load(model_path)print('Nearest 周瑜:',model.most_similar('周瑜'))print('Nearest 刘备:,',model.most_similar(['刘备']))print('Nearest 曹操:',model.most_similar(['曹操']))print('Nearest 孙策:',model.most_similar(['孙策']))print('Nearest 貂蝉:',model.most_similar(['貂蝉']))print('Nearest 诸葛亮:', model.most_similar(['诸葛亮']))print(model.wv.doesnt_match(u"周瑜 鲁肃 吕蒙 陆逊 诸葛亮".split()))print(model.wv.doesnt_match(u"曹操 刘备 孙权 关羽".split()))print(model.wv.doesnt_match(u"关羽 张飞 赵云 黄忠 马超 典韦".split()))print(model.wv.doesnt_match(u"诸葛亮 贾诩  张昭 马超".split()))print(model.wv.similarity('周瑜','孙策'))print(model.wv.similarity('周瑜','小乔'))print(model.wv.similarity('吕布', '貂蝉'))if __name__ == '__main__':crawl()segment()train_model('segement.txt','model1')analyse_wordVector('model1')

利用gensim里word2vec训练实例——分析三国里人物关系相关推荐

  1. Tensorflow和Gensim里word2vec训练

    Tensorflow里word2vec训练 # -*- coding:utf-8 -*- import tensorflow as tf import numpy as np import math ...

  2. 利用gensim构建word2vec词向量模型并保存词向量

    利用gensim包的word2vec模块构建CBOW或Skip-Gram模型来进行词向量化比较方便. 具体gensim.models.Word2Vec模型的参数可以看官网介绍: https://rad ...

  3. 用word2vec解读延禧攻略人物关系

    原文来自公众号 无界社区mixlab 链接如下: https://mp.weixin.qq.com/s/zRqt9OL6G1s3UZY1AJR9ag 关系图谱地址 https://shadowcz00 ...

  4. NLP(4) | 用词向量技术简单分析红楼梦人物关系用n-gramma生成词向量word2vect进行模型训练

    NLP(1) | 词向量one hot编码词向量编码思想 NLP(2) | 中文分词分词的概念分词方法分类CRFHMM分词 NLP(3)| seq to seq 模型 前言:出于种种原因,总是不自觉把 ...

  5. 利用Gensim在英文Wikipedia训练词向量

    最近在SemEval 2010 Task 8上做关系分类的实验,主要是实现了一下这篇论文的模型:A neural network framework for relation extraction: ...

  6. gensim Word2Vec 训练和使用

    训练模型 利用gensim.models.Word2Vec(sentences)建立词向量模型 该构造函数执行了三个步骤:建立一个空的模型对象,遍历一次语料库建立词典,第二次遍历语料库建立神经网络模型 ...

  7. 数据库范式——(1NF,2NF,3NF,BCNF,含实例分析)

    概述 范式:英文名是Normal Form,它是英国人E.F.Codd(关系数据库的老祖宗)在上个世纪70年代提出关系数据库模型后总结处理的,范式是关系数据库理论的基础,是在设计数据库结构过程中所要遵 ...

  8. 利用Gensim训练关于英文维基百科的Word2Vec模型(Training Word2Vec Model on English Wikipedia by Gensim)

    Training Word2Vec Model on English Wikipedia by Gensim 更新:发现另一篇译文:中英文维基百科语料上的Word2Vec实验,该译文还提供了中文维基百 ...

  9. 利用word2vec训练词向量

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

最新文章

  1. [异常笔记] spring cloud 服务消费者启动-2018040501
  2. 怎样冷静地看待“小米智能新品”?
  3. 一封建议信,不知道这样写可以吗?
  4. java接收数据_java 如何接收数据集参数
  5. 网站建设想要出类拔萃还要从基础上做创新
  6. Golden Master Pattern :一种在.NET Core中重构遗留代码的利器
  7. python treeview文本自动换行显示_在tkinter.ttk.Treeview列中设置文本格式
  8. ActivePython 百科指南
  9. 2022年9月中国数据库排行榜:榜眼、探花纷纷易主,AnalyticDB蝉联榜单十强
  10. steam移动所有文件至新库文件夹失败_VBA进阶 | 文件操作17:File对象与Files集合详解...
  11. 2021认证杯 第二阶段 思路加代码
  12. MySQL面试:索引为啥使用B+树而不是B树
  13. MySQL--创建表
  14. PAKDD 21: GRAPH INFOCLUST 明尼苏达
  15. 【成功实现】python对tif图片的读取与保存
  16. 阿里云服务器部署网站
  17. 学计算机的高数学什么,儿子大一,学的计算机科学与技术,感觉高数特别难,都学不会怎么办呢?有什么好办法?...
  18. Linux常用基本命令大全
  19. 125万“墨子量子奖“的获得者,研究成果连发《自然》和《科学》
  20. BlockChange | 对话路印协议创始人王东:从谷歌工程师到区块链创业者,一个运营良好的区块链社区如何建设?

热门文章

  1. 硬件开发:嵌入式系统知识和接口技术(值得收藏)
  2. MS2109/HDMI转USB2.0高清视频采集
  3. iOS微信聊天记录迁移时报错:当前网络状况复杂
  4. redis安装及部署模式
  5. redhawk: create STA file
  6. 网络渗透作业202105110124郭静
  7. 怎样成为一位程序员大佬
  8. IDEA2021版本的安装和使用教程
  9. potplayer最佳设置_PotPlayer调整常用设置让播放器效果更佳的具体操作流程
  10. 数据结构—回溯法、子集树、排列树