最近写论文跑模型,要用到word2vec,但是发现自己怎么也看不懂网上的帖子,还是自己笨吧,所以就有了我的第一篇博客!!!  关于word2vec工具打算写一个系列的,当然今天这篇文章只打算写:

  • 如何加载word2vec模型
  • 如何利用word2vec模型求解词向量
  • 如何保存word2vec模型

一、word2vec 简介

  2013年,Google开源了一款用于词向量计算的工具——word2vec,引起了工业界和学术界的关注。首先,word2vec可以在百万数量级的词典和上亿的数据集上进行高效地训练;其次,该工具得到的训练结果——词向量(word embedding),可以很好地度量词与词之间的相似性。关于word2vec工具的内在算法我懂得不是很多,看过几篇博客,链接如下感兴趣得朋友可以看看:

  https://www.cnblogs.com/guoyaohua/p/9240336.html

  

二、word2vec的使用

  

 1 #加载模型
2 from gensim.models import word2vec
3
4 #加载语料库,语料库的格式
5
6 sentences=[['外形', '外观', '好看', '屏幕', '音效', '挺大', '待机时间', '长', '拍照', '效果', '特别'], ['手机', '好看', '段时间'], ['手机', '收到', '很漂亮', '后续', '评价']]
7
8 #加载模型
9 model=model=word2vec.Word2Vec(sentences,size=4,window=5,min_count=1)
10 #求解词向量以及相似度
11 model.most_similar(u'外形')
12 model['外形']
13
1 #输出
2 #外形的相似度,默认是输出10个最相似的词语,输出形式是list
3
4 [('挺大', 0.7367413640022278), ('音效', 0.657544732093811), ('后续', 0.5379071235656738), ('长', 0.5151427984237671), ('段时间', 0.4361593723297119), ('手机', 0.33148619532585144), ('特别', 0.19552142918109894), ('评价', 0.09857006371021271), ('待机时间', 0.08498627692461014), ('收到', -0.01799720525741577)]
5
6
7 #输出“外形”一词的词向量
8
9 array([-0.03313196, 0.04037894, -0.11632963, -0.08618639], dtype=float32)

  看完上面的例子,是不是觉得超级简单,当然上面只是一个简单的例子,接下来你们会看到对于一个txt文件,拿到之后经过哪些处理可以作为参数输入,下面先插播一下word2vec函数的参数详解:

  

#参数详解

word2vec.Word2Vec(sentences=None,size=100,alpha=0.025,window=5,
min_count=5, max_vocab_size=None, sample=0.001,seed=1,
workers=3,min_alpha=0.0001, sg=0, hs=0, negative=5,
cbow_mean=1, hashfxn=<built-in function hash>,iter=5,null_word=0,
trim_rule=None, sorted_vocab=1, batch_words=10000) ---sentence:可以是一个list,对于大语料集,建议使用BrownCorpus,Text8Corpus或·ineSentence构建。
---size:是词向量的维度,默认是100
---window:表示当前词与预测词在一个句子中的最大距离是多少,在求解词向量的时候我们会考虑当前词所在句子的前后window个词语
--- sg:用于设置训练算法,默认为0,对应CBOW算法;sg=1则采用skip-gram算法。
---alpha: 是学习速率
---seed:用于随机数发生器。与初始化词向量有关。
---min_count: 可以对字典做截断. 词频少于min_count次数的单词会被丢弃掉, 默认值为5
---max_vocab_size: 设置词向量构建期间的RAM限制。如果所有独立单词个数超过这个,则就消除掉其中最不频繁的一个。每一千万个单词需要大约1GB的RAM。设置成None则没有限制。
---sample: 高频词汇的随机降采样的配置阈值,默认为1e-3,范围是(0,1e-5)
---workers参数控制训练的并行数。
---hs: 如果为1则会采用hierarchica·softmax技巧。如果设置为0(defau·t),则negative sampling会被使用。
---negative: 如果>0,则会采用negativesamp·ing,用于设置多少个noise words
---cbow_mean: 如果为0,则采用上下文词向量的和,如果为1(defau·t)则采用均值。只有使用CBOW的时候才起作用。
---hashfxn: hash函数来初始化权重。默认使用python的hash函数
---iter: 迭代次数,默认为5
---trim_rule: 用于设置词汇表的整理规则,指定那些单词要留下,哪些要被删除。可以设置为None(min_count会被使用)或者一个接受()并返回RU·E_DISCARD,uti·s.RU·E_KEEP或者uti·s.RU·E_DEFAU·T的函数。
---sorted_vocab: 如果为1(defau·t),则在分配word index 的时候会先对单词基于频率降序排序。
---batch_words:每一批的传递给线程的单词的数量,默认为10000

  下面举个使用word2vec工具进行txt文件词向量的求解的例子:

  

 1 #文本处理  语料库使用了3个文本,文本自行爬取吧
2 import jieba
3 from zhon.hanzi import punctuation
4 path1='C:/Users/Administrator/Desktop/data/新闻/健康新闻/2019年“世界流感日”科普活动 暨学术会议在京召开.txt'
5 path2='C:/Users/Administrator/Desktop/data/新闻/健康新闻/67岁产妇称自然受孕产女 专家感到困惑.txt'
6 path3='C:/Users/Administrator/Desktop/data/新闻/健康新闻/90后养生:保健品“吃不掉”健康焦虑.txt'
7
8 def get_load(path):
9 f=open(path,'r',encoding='utf-8')
10 data=f.read()
11 new_s=re.sub(r'[%s,\t,\\]+'%punctuation, " ", data)
12 cut_s=jieba.lcut(new_s)
13 sentences=[]
14 for word in cut_s:
15 if word !='\n'and word !=' ':
16 sentences.append(word)
17 return sentences
18 data1=get_load(path1)
19 data2=get_load(path2)
20 data3=get_load(path3)
21 final_data=[data1,data2,data3]
22
23 #模型建立
24
25 model=word2vec.Word2Vec(final_data,size=50,window=4)
26
27 model['健康']
#输出
>>>model['健康']
array([ 8.6532356e-03, 2.1515305e-03, 3.4037780e-03, -4.4254097e-03,
-8.4194457e-03, -1.5364622e-03, 1.0745996e-02, 5.3538852e-03,
-1.1601291e-03, 6.8697990e-03, 8.7537011e-03, 8.6077927e-03,
1.4498243e-03, 2.6482970e-03, -3.4553630e-03, 8.2870452e-03,
3.5420412e-03, 8.8039534e-03, -3.6633634e-03, 5.4932209e-03,
-7.5302450e-03, 9.6533290e-04, -1.9622964e-03, 6.5719029e-03,
-3.7521331e-04, -9.1459788e-04, -8.3307233e-03, 2.9766238e-03,
7.6092435e-03, -8.3235843e-04, -9.2809896e-05, -6.7277048e-03,
1.5067700e-03, -8.0193384e-03, -1.0153291e-02, 5.9706415e-03,
4.3323904e-04, -9.5779281e-03, -9.3199704e-03, 3.5575093e-03,
3.0641828e-03, 4.4296687e-03, 2.8934417e-04, -1.8675557e-03,
-4.8446902e-03, -3.5805893e-03, -1.1002035e-03, -1.0306393e-02,
4.5978278e-03, 6.8134381e-03], dtype=float32) >>>model.most_similar(‘健康') [('67', 0.37046998739242554), ('会', 0.363727331161499), ('在', 0.30487531423568726), ('国家', 0.2739967703819275), ('社会', 0.26224130392074585), ('新闻', 0.19897636771202087), ('产妇', 0.19829007983207703), ('-', 0.19742634892463684), ('岁', 0.16749148070812225), ('后', 0.15823742747306824)]
#这个结果不太好,没有去停用词的结果

上面文本的处理过程,我只写了切分过程,正常情况下还得进行停用词处理,低频词的处理,这些我就不写了,懒

下面使用word2vec自带的文件处理工具进行文本的处理:

#该文件是已经分好词的中文语料---关于oppo 手机的京东评论
from gensim.models import word2vec
import logging # 主程序
logging.basicConfig(format='%(asctime)s : %(levelname)s : %(message)s', level=logging.INFO) path2='C:/Users/Administrator/Desktop/data/评论/cut_comment.txt' sentences = word2vec.Text8Corpus(path2)
model = word2vec.Word2Vec(sentences, size=20) model['oppo']
model.most_similar('好评')
model.similarity(u"好评", "oppo")
>>> model.most_similar('oppo')
[('第一次', 0.9777179956436157), ('信赖', 0.9736739993095398), ('希望', 0.9670151472091675), ('价格', 0.9577376842498779), ('内容', 0.9538010954856873), ('未填写', 0.9495989084243774), ('包装', 0.9487740993499756), ('这款', 0.9475699663162231), ('破损', 0.9475245475769043), ('评价', 0.9470676779747009)]
>>> model.most_similar('好评')
[('质量', 0.9727074503898621), ('购物', 0.9600175619125366), ('正品', 0.9578911066055298), ('战斗机', 0.9555199146270752), ('喜欢', 0.9444591999053955), ('老婆', 0.9358581304550171), ('手机', 0.9266927242279053), ('推荐', 0.9224187731742859), ('货已', 0.9196405410766602), ('朋友', 0.917504072189331)]
>>> model.most_similar('手机')
[('宝贝', 0.9600850343704224), ('几天', 0.9596285820007324), ('购物', 0.9558006525039673), ('一段时间', 0.9556002020835876), ('质量', 0.9525821208953857), ('正品', 0.9524366855621338), ('到货', 0.9513840079307556), ('真心', 0.9481478929519653), ('收到', 0.9459341764450073), ('下次', 0.9382076263427734)]
>>> model.similarity(u"好评", "oppo")
0.81516

上面的文件的格式如下,你可以把拿到的所有文件进行处理之后汇总成一个文件即可

  

保存语料库的词语库以及相应的词向量,之后可以利用得到的词向量进行聚类等分析:

word_list=model.wv.index2word

with open('C:/Users/Administrator/Desktop/data/评论/word_vocabulary.txt','r',encoding='utf-8') as f:
for word in word_list:
f.write(word+','+model[word]+' ')
f.write('\r\n\r\n')
f.close()

终于结束了,以上是本人的学习笔记,希望能对看到这篇文章的人有所帮助,如果有错误的地方麻烦在下方评论区给出!!!

  

gensim word2vec |来自渣渣硕的学习笔记的更多相关文章

  1. mybatis学习笔记--常见的错误

    原文来自:<mybatis学习笔记--常见的错误> 昨天刚学了下mybatis,用的是3.2.2的版本,在使用过程中遇到了些小问题,现总结如下,会不断更新. 1.没有在configurat ...

  2. <老友记>学习笔记

    这是六个人的故事,从不服输而又有强烈控制欲的monica,未经世事的千金大小姐rachel,正直又专情的ross,幽默风趣的chandle,古怪迷人的phoebe,花心天真的joey——六个好友之间的 ...

  3. AI学习笔记:特征工程

    一.概述 Andrew Ng:Coming up with features is difficult, time-consuming, requires expert knowledge. &quo ...

  4. PyQt4入门学习笔记(一)

    PyQt4入门学习笔记(一) 一直没有找到什么好的pyqt4的教程,偶然在google上搜到一篇不错的入门文档,翻译过来,留以后再复习. 原始链接如下: http://zetcode.com/gui/ ...

  5. swift学习笔记5——其它部分(自动引用计数、错误处理、泛型...)

    之前学习swift时的个人笔记,根据github:the-swift-programming-language-in-chinese学习.总结,将重要的内容提取,加以理解后整理为学习笔记,方便以后查询 ...

  6. swift学习笔记4——扩展、协议

    之前学习swift时的个人笔记,根据github:the-swift-programming-language-in-chinese学习.总结,将重要的内容提取,加以理解后整理为学习笔记,方便以后查询 ...

  7. 0035 Java学习笔记-注解

    什么是注解 注解可以看作类的第6大要素(成员变量.构造器.方法.代码块.内部类) 注解有点像修饰符,可以修饰一些程序要素:类.接口.变量.方法.局部变量等等 注解要和对应的配套工具(APT:Annot ...

  8. Python学习笔记—Python基础1 介绍、发展史、安装、基本语法

    第一周学习笔记: 一.Python介绍      1.Python的创始人为吉多·范罗苏姆.1989年的圣诞节期间,吉多·范罗苏姆为了在阿姆斯特丹打发时间,决心开发一个新的脚本解释程序,作为ABC语言 ...

  9. Golang 语法学习笔记

    Golang 语法学习笔记 包.变量和函数. 包 每个 Go 程序都是由包组成的. 程序运行的入口是包 main. 包名与导入路径的最后一个目录一致."math/rand" 包由 ...

随机推荐

  1. easyui禁止下拉框

    $("#"+vpcid).combobox({disabled: true}); $("#"+vpcid).combobox('setValue',parent ...

  2. centos 无界面安装selenium+chrome+chromedirver的设置

    配了一中午的,好不容易正好记录下. 1.我的centos的位数 输入rpm -q centos-release 结果:centos-release-7-4.1708.el7.centos.x86_64 ...

  3. 【转】 C语言深度解剖读书笔记(1.关键字的秘密)

    本文出处:http://blog.csdn.net/mbh_1991/article/details/10149805 开始本节学习笔记之前,先说几句题外话.其实对于C语言深度解剖这本书来说,看完了有 ...

  4. Mongodb php扩展及安装

                            Mongodb php扩展 Mongodb安装 1: 下载mongodb www.mongodb.org 下载最新的stable版 2: 解压文件 3: ...

  5. c++虚函数与重载

    class base{ public: virtual void f(int n){ cout << "base"<<endl; } }; class De ...

  6. 【HANA系列】SAP HANA的特点总结

    公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[HANA系列]SAP HANA的特点总结   ...

  7. SQLMap使用总结

    支持模式:布尔/时间/报错/联合查询/堆查询 支持数据库:MySQL, Oracle, PostgreSQL, Microsoft SQL Server, Microsoft Access, IBM ...

  8. github编程类书籍

    https://github.com/justjavac/free-programming-books-zh_CN

  9. ELK+Filebeat (1)

    1 Filebeat介绍 Filebeat是Beat成员之一,基于Go语言,无任何依赖,并且比logstash更加轻量,非常适合安装在生产机器上,不会带来过高的资源占用,轻量意味着简单,所以Fileb ...

  10. jQuery基础--CSS操作、class操作、attr操作、prop操作

    1.1.1    css操作 功能:设置或者修改样式,操作的是style属性. 设置单个样式 //name:需要设置的样式名称 //value:对应的样式值 css(name, value); //使 ...