Word2Vec的基本使用
gensim 是 Python 中一款强大的 自然语言处理工具,它包含了常见的模型,其中便有 Word2Vec 这一优秀的 词向量训练工具,可以使用 pip install gensim
命令安装 gensim,本博客主要参考 官方文档 对 Word2Vec 作简单的介绍
1、建立模型
首先,我们需要从 gensim 导入 Word2Vec
from gensim.models import Word2Vec
然后,可以通过以下三个步骤建立一个简单的 Word2Vec 模型
model = Word2Vec() // 建立空的模型对象
model.build_vocab(sentences) // 遍历一次训练语料,建立词典
model.train(sentences) // 遍历一次训练语料,建立神经网络模型
其实,还可以使用一条语句同时完成以上三个步骤
model = Word2Vec(sentences)
并在以上语句中指定训练参数,除 sentences 用于指定训练语料外,还有其它 20 个参数
sentences
:指定训练语料,默认为 Nonesize
:定义特征向量维度,一般取值在 100 到 200 之间,默认为 100alpha
:定义初始学习率,随着训练进行,线性下降到 min_alpha,默认值为 0.025window
:句子中当前和预测单词之间的最大距离,默认值为 5min_count
:词过滤的阈值,频率小于 min_count 的单词会被过滤,默认值为 5max_vocab_size
:在构建词汇期间使用的最大 RAM,默认设置为 None,表示无限制sample
:高频词语被随机采样的阈值,默认值为 1e-3,有效范围为(0, 1e-5)seed
:随机数生成器,用于初始化向量,默认值为 1workers
:使用多线程训练模型,定义线程数,默认值为 3,只有在安装 Cpython 后才有效min_alpha
:定义最小学习率,随着训练进行,从 alpha 线性到 min_alpha,默认值为 0.0001sg
:定义训练算法,若sg=0
,则使用 CBOW 算法,默认值;若sg=1
,则使用 skip-gram 算法hs
:若hs=0
且 negative 不等于 0,则使用负采样,默认值;若hs=1
,则使用层级 softmax 训练模型negative
:若negative>0
,则使用负采样,若negative=0
,则不使用负采样,通常取值在 5 到 20 之间,默认值为 5cbow_mean
:仅适用于使用 CBOW 算法时,若cbow_mean=1
,则使用均值,默认值;若cbow_mean=0
,则使用上下文单词向量的总和hashfxn
:用于随机初始化权重的哈希函数,默认是 Python 内置的哈希函数iter
:语料库上的迭代次数,默认值为 5null_word
:默认值为 0trim_rule
:词汇修剪规则,指定是否保留某些词,默认值为 Nonesorted_vocab
:如果sorted_vocab=1
(默认值),则在分配单词索引之前按降序频率对词汇表进行排序batch_words
:传递给工作线程的目标大小,以字单位,默认值为 MAX_WORDS_IN_BATCHcompute_loss
:定义是否同时计算损失率,默认为 False
以下的例子使用 gensim 中内置的训练语料 common_texts,建立一个简单的 Word2Vec 模型
>>> from gensim.test.utils import common_texts # 导入 common_texts
>>> print(type(common_texts))
# <class 'list'>
>>> from gensim.models import Word2Vec # 导入 Word2Vec
>>> print(type(Word2Vec))
# <class 'type'>
>>> model = Word2Vec(common_texts, min_count=1) # 建立模型
>>> print(type(model))
# <class 'gensim.models.word2vec.Word2Vec'>
2、保存与加载模型
(1)完整对象状态模型
我们可以保存和加载完整的对象状态模型,并可以在以后继续训练该模型
>>> # 保存模型
>>> model.save('word2vec.model')
>>> # 加载模型
>>> model = Word2Vec.load('word2vec.model')
>>> # 继续训练
>>> model.train([['hello', 'world']], total_examples=1, epochs=1)
(2)KeyedVectors
训练过的单词向量 KeyedVectors 存储在 model.wv 中
>>> vector = model.wv['hello']
>>> print(type(vector))
<class 'numpy.ndarray'>
我们可以保存和加载 KeyedVectors
>>> from gensim.models import KeyedVectors
>>> # 保存 KeyedVectors
>>> model.wv.save('word2vec.wv')
>>> # 加载 KeyedVectors
>>> wv = KeyedVectors.load("word2vec.wv", mmap='r')
也可以保存和加载 C 格式的 KeyedVectors
在以下语句中,若 binary = False
,则使用 C text format
;若 binary = True
,则使用 C bin format
>>> from gensim.models import KeyedVectors
>>> # 保存 C bin 格式的 KeyedVectors
>>> model.wv.save_word2vec_format('word2vec.bin', binary=True)
>>> # 加载 C bin 格式的 KeyedVectors
>>> wvb = KeyedVectors.load_word2vec_format('word2vec.bin', binary=True)
注意:之所以使用 KeyedVectors 的原因,是因为当不再需要完整的模型状态,即模型不再进行更新,仅用于查询时,可以丢弃状态,从而产生可以 mmap 的更小更快的对象
>>> word_vectors = model.wv
>>> del model
3、使用模型
(1)获取词向量
>>> word_vectors['computer']
(2)计算相关词
most_similar(positive=None, negative=None, topn=10, restrict_vocab=None, indexer=None)
positive
:对相似度有正贡献的词语列表negative
:对相似度有负贡献的词语列表topn
:返回 topn 个最相似值,默认为 10restrict_vocab
:限制搜索最相似值的范围
>>> word_vectors.most_similar(positive=['computer'],negative=['human'],topn=5)
# [('interface', 0.16314822435379028),
# ('eps', 0.04694916307926178),
# ('minors', 0.02557777240872383),
# ('system', -0.003941739443689585),
# ('time', -0.043815042823553085)]
(3)计算余弦相似度
计算两个词语之间的余弦相似度:similarity(w1, w2)
>>> word_vectors.similarity('computer', 'user')
# -0.16924392
计算两个集合之间的余弦相似度:similarity(ws1, ws2)
>>> word_vectors.n_similarity(['computer','system'], ['user', 'response'])
# -0.032896347
(4)选出不同类的词
doesnt_match(words)
words
:词语列表
>>> word_vectors.doesnt_match(['computer','system','interface','trees'])
# 'trees'
Word2Vec的基本使用的更多相关文章
- word2vec 中的数学原理详解
word2vec 是 Google 于 2013 年开源推出的一个用于获取 word vector 的工具包,它简单.高效,因此引起了很多人的关注.由于 word2vec 的作者 Tomas Miko ...
- Java豆瓣电影爬虫——使用Word2Vec分析电影短评数据
在上篇实现了电影详情和短评数据的抓取.到目前为止,已经抓了2000多部电影电视以及20000多的短评数据. 数据本身没有规律和价值,需要通过分析提炼成知识才有意义.抱着试试玩的想法,准备做一个有关情感 ...
- word2vec参数调整 及lda调参
一.word2vec调参 ./word2vec -train resultbig.txt -output vectors.bin -cbow 0 -size 200 -window 5 -neg ...
- [Algorithm & NLP] 文本深度表示模型——word2vec&doc2vec词向量模型
深度学习掀开了机器学习的新篇章,目前深度学习应用于图像和语音已经产生了突破性的研究进展.深度学习一直被人们推崇为一种类似于人脑结构的人工智能算法,那为什么深度学习在语义分析领域仍然没有实质性的进展呢? ...
- Word2Vec 使用总结
word2vec 是google 推出的做词嵌入(word embedding)的开源工具. 简单的说,它在给定的语料库上训练一个模型,然后会输出所有出现在语料库上的单词的向量表示,这个向量称为&qu ...
- Word2vec多线程(tensorflow)
workers = [] for _ in xrange(opts.concurrent_steps): t = threading.Thread(target=self._train_thread_ ...
- Word2vec 模型载入(tensorflow)
opts = Options() with tf.Graph().as_default(), tf.Session() as session: model = Word2Vec(opts, sessi ...
- Forward-backward梯度求导(tensorflow word2vec实例)
考虑不可分的例子 通过使用basis functions 使得不可分的线性模型变成可分的非线性模型 最常用的就是写出一个目标函数 并且使用梯度下降法 来计算 梯度的下降法的梯度 ...
- Tensorflow word2vec编译运行
Word2vec 更完整版本(非demo)的代码在 tensorflow/models/embedding/ 首先需要安装bazel 来进行编译 bazel可以下载最新的binary安装文件, ...
- 中英文维基百科语料上的Word2Vec实验
最近试了一下Word2Vec, GloVe 以及对应的python版本 gensim word2vec 和 python-glove,就有心在一个更大规模的语料上测试一下,自然而然维基百科的语料进入了 ...
随机推荐
- bzoj 1924 所驼门王的宝藏
题目大意: 有一个r*c的矩阵,上面有n个点有宝藏 每个有宝藏的点上都有传送门 传送门有三种:第一种可以传到该行任意一个有宝藏的点,第二种可以传到该列任意一个有宝藏的点,第三种可以传到周围的八连块上有 ...
- python 之filter()函数
filter()函数是 Python 内置的另一个有用的高阶函数,filter()函数接收一个函数 f 和一个list,这个函数 f 的作用是对每个元素进行判断,返回 True或 False,filt ...
- http-2.4
http-2.4 1)新特性 (1)MPM 支持运行为DSO 机制:以模块形式按需加载 (2)event MPM 生产环境可用 (3)异步读写机制 (4)支持每模块及每目录的单独日志级别定义 (5)每 ...
- bzoj 3231: [Sdoi2008]递归数列【矩阵乘法】
今天真是莫名石乐志 一眼矩阵乘法,但是这个矩阵的建立还是挺有意思的,就是把sum再开一列,建成大概这样 然后记!得!开!long!long!! #include<iostream> #in ...
- bzoj 1492: [NOI2007]货币兑换Cash【贪心+斜率优化dp+cdq】
参考:http://www.cnblogs.com/lidaxin/p/5240220.html 虽然splay会方便很多,但是懒得写,于是写了cdq 首先要想到贪心的思路,因为如果在某天买入是能得到 ...
- npm更换为淘宝镜像源
1.通过config命令 1 2 npm config set registry http://registry.cnpmjs.org npm info underscore (如果上面配置正确这 ...
- 修复mysql的表
数据损坏原因 MySQL表损坏一般是数据损坏,引起损坏的原因可能是由于磁盘损坏.系统崩溃或者MySQL服务器被崩溃等外部原因.例如有人使用kill -9终止进程,导致MySQL进程未能正常关闭,那么就 ...
- ADSI和其他内容
ADSI (Active Directory Services Interface)是Microsoft推出的一项技术,它统一了许多底层服务的编程接口,程序员可以使用一致的对象技术来访问这些底层服务. ...
- CSS 潜藏着的BFC
在写样式时,往往是添加了一个样式,又或者是修改了某个属性,就达到了我们的预期. 而BFC就潜藏在其中,当你修改样式时,一不小心就能触发它而毫无察觉,因此没有意识到BFC的神奇之处. 什么是BFC(Bl ...
- 利用反射重写toString()方法
为了方便输出对象,Object类提供了toString()方法.但是该方法的默认值是由类名和哈希码组成的,实用性并不强.通常需要重写该方法以提供更多的信息.本实例使用反射输出类的包.类的名字.类的公共 ...