Word2vec教程
Word2vec Tutorial
RADIM ŘEHŮŘEK 2014-02-02GENSIM, PROGRAMMING157 COMMENTS
I never got round to writing a tutorial on how to use word2vec in gensim. It’s simple enough and the API docs are straightforward, but I know some people prefer more verbose formats. Let this post be a tutorial and a reference example.
UPDATE: the complete HTTP server code for the interactive word2vec demo below is now open sourced on Github. For a high-performance similarity server for documents, see ScaleText.com.
Preparing the Input
Starting from the beginning, gensim’s word2vec expects a sequence of sentences as its input. Each sentence a list of words (utf8 strings):
1
2
3
4
5
6
7
|
# import modules & set up logging import gensim, logging logging.basicConfig( format = '%(asctime)s : %(levelname)s : %(message)s' , level = logging.INFO) sentences = [[ 'first' , 'sentence' ], [ 'second' , 'sentence' ]] # train word2vec on the two sentences model = gensim.models.Word2Vec(sentences, min_count = 1 ) |
Keeping the input as a Python built-in list is convenient, but can use up a lot of RAM when the input is large.
Gensim only requires that the input must provide sentences sequentially, when iterated over. No need to keep everything in RAM: we can provide one sentence, process it, forget it, load another sentence…
For example, if our input is strewn across several files on disk, with one sentence per line, then instead of loading everything into an in-memory list, we can process the input file by file, line by line:
1
2
3
4
5
6
7
8
9
10
11
|
class MySentences( object ): def __init__( self , dirname): self .dirname = dirname def __iter__( self ): for fname in os.listdir( self .dirname): for line in open (os.path.join( self .dirname, fname)): yield line.split() sentences = MySentences( '/some/directory' ) # a memory-friendly iterator model = gensim.models.Word2Vec(sentences) |
Say we want to further preprocess the words from the files — convert to unicode, lowercase, remove numbers, extract named entities… All of this can be done inside the MySentences iterator and word2vec doesn’t need to know. All that is required is that the input yields one sentence (list of utf8 words) after another.
Note to advanced users: calling Word2Vec(sentences, iter=1) will run two passes over the sentences iterator (or, in general iter+1 passes; default iter=5). The first pass collects words and their frequencies to build an internal dictionary tree structure. The second and subsequent passes train the neural model. These two (or, iter+1) passes can also be initiated manually, in case your input stream is non-repeatable (you can only afford one pass), and you’re able to initialize the vocabulary some other way:
1
2
3
|
model = gensim.models.Word2Vec( iter = 1 ) # an empty model, no training yet model.build_vocab(some_sentences) # can be a non-repeatable, 1-pass generator model.train(other_sentences) # can be a non-repeatable, 1-pass generator |
In case you’re confused about iterators, iterables and generators in Python, check out our tutorial on Data Streaming in Python.
Training
Word2vec accepts several parameters that affect both training speed and quality.
One of them is for pruning the internal dictionary. Words that appear only once or twice in a billion-word corpus are probably uninteresting typos and garbage. In addition, there’s not enough data to make any meaningful training on those words, so it’s best to ignore them:
1
|
model = Word2Vec(sentences, min_count = 10 ) # default value is 5 |
A reasonable value for min_count is between 0-100, depending on the size of your dataset.
Another parameter is the size of the NN layers, which correspond to the “degrees” of freedom the training algorithm has:
1
|
model = Word2Vec(sentences, size = 200 ) # default value is 100 |
Bigger size values require more training data, but can lead to better (more accurate) models. Reasonable values are in the tens to hundreds.
The last of the major parameters (full list here) is for training parallelization, to speed up training:
1
|
model = Word2Vec(sentences, workers = 4 ) # default = 1 worker = no parallelization |
The workers parameter has only effect if you have Cython installed. Without Cython, you’ll only be able to use one core because of the GIL (and word2vec training will be miserably slow).
Note from Radim: Get my latest machine learning tips & articles delivered straight to your inbox (it's free).
Unsubscribe anytime, no spamming. Max 2 posts per month, if lucky.
Memory
At its core, word2vec model parameters are stored as matrices (NumPy arrays). Each array is #vocabulary (controlled by min_count parameter) times #size (size parameter) of floats(single precision aka 4 bytes).
Three such matrices are held in RAM (work is underway to reduce that number to two, or even one). So if your input contains 100,000 unique words, and you asked for layer size=200, the model will require approx. 100,000*200*4*3 bytes = ~229MB.
There’s a little extra memory needed for storing the vocabulary tree (100,000 words would take a few megabytes), but unless your words are extremely loooong strings, memory footprint will be dominated by the three matrices above.
Evaluating
Word2vec training is an unsupervised task, there’s no good way to objectively evaluate the result. Evaluation depends on your end application.
Google have released their testing set of about 20,000 syntactic and semantic test examples, following the “A is to B as C is to D” task: https://raw.githubusercontent.com/RaRe-Technologies/gensim/develop/gensim/test/test_data/questions-words.txt.
Gensim support the same evaluation set, in exactly the same format:
1
2
3
4
5
6
7
8
9
10
11
|
model.accuracy( '/tmp/questions-words.txt' ) 2014 - 02 - 01 22 : 14 : 28 , 387 : INFO : family: 88.9 % ( 304 / 342 ) 2014 - 02 - 01 22 : 29 : 24 , 006 : INFO : gram1 - adjective - to - adverb: 32.4 % ( 263 / 812 ) 2014 - 02 - 01 22 : 36 : 26 , 528 : INFO : gram2 - opposite: 50.3 % ( 191 / 380 ) 2014 - 02 - 01 23 : 00 : 52 , 406 : INFO : gram3 - comparative: 91.7 % ( 1222 / 1332 ) 2014 - 02 - 01 23 : 13 : 48 , 243 : INFO : gram4 - superlative: 87.9 % ( 617 / 702 ) 2014 - 02 - 01 23 : 29 : 52 , 268 : INFO : gram5 - present - participle: 79.4 % ( 691 / 870 ) 2014 - 02 - 01 23 : 57 : 04 , 965 : INFO : gram7 - past - tense: 67.1 % ( 995 / 1482 ) 2014 - 02 - 02 00 : 15 : 18 , 525 : INFO : gram8 - plural: 89.6 % ( 889 / 992 ) 2014 - 02 - 02 00 : 28 : 18 , 140 : INFO : gram9 - plural - verbs: 68.7 % ( 482 / 702 ) 2014 - 02 - 02 00 : 28 : 18 , 140 : INFO : total: 74.3 % ( 5654 / 7614 ) |
This accuracy takes an optional parameter restrict_vocab which limits which test examples are to be considered.
Once again, good performance on this test set doesn’t mean word2vec will work well in your application, or vice versa. It’s always best to evaluate directly on your intended task.
Storing and loading models
You can store/load models using the standard gensim methods:
1
2
|
model.save( '/tmp/mymodel' ) new_model = gensim.models.Word2Vec.load( '/tmp/mymodel' ) |
which uses pickle internally, optionally mmap‘ing the model’s internal large NumPy matrices into virtual memory directly from disk files, for inter-process memory sharing.
In addition, you can load models created by the original C tool, both using its text and binary formats:
1
2
3
|
model = Word2Vec.load_word2vec_format( '/tmp/vectors.txt' , binary = False ) # using gzipped/bz2 input works too, no need to unzip: model = Word2Vec.load_word2vec_format( '/tmp/vectors.bin.gz' , binary = True ) |
Online training / Resuming training
Advanced users can load a model and continue training it with more sentences:
1
2
|
model = gensim.models.Word2Vec.load( '/tmp/mymodel' ) model.train(more_sentences) |
You may need to tweak the total_words parameter to train(), depending on what learning rate decay you want to simulate.
Note that it’s not possible to resume training with models generated by the C tool, load_word2vec_format(). You can still use them for querying/similarity, but information vital for training (the vocab tree) is missing there.
Using the model
Word2vec supports several word similarity tasks out of the box:
1
2
3
4
5
6
|
model.most_similar(positive = [ 'woman' , 'king' ], negative = [ 'man' ], topn = 1 ) [( 'queen' , 0.50882536 )] model.doesnt_match( "breakfast cereal dinner lunch" ;.split()) 'cereal' model.similarity( 'woman' , 'man' ) 0.73723527 |
If you need the raw output vectors in your application, you can access these either on a word-by-word basis
1
2
|
model[ 'computer' ] # raw NumPy vector of a word array([ - 0.00449447 , - 0.00310097 , 0.02421786 , ...], dtype = float32) |
…or en-masse as a 2D NumPy matrix from model.syn0.
Bonus app
As before with finding similar articles in the English Wikipedia with Latent Semantic Analysis, here’s a bonus web app for those who managed to read this far. It uses the word2vec model trained by Google on the Google News dataset, on about 100 billion words:
If you don’t get “queen” back, something went wrong and baby SkyNet cries.
Try more examples too: “he” is to “his” as “she” is to ?, “Berlin” is to “Germany” as “Paris” is to ? (click to fill in).
is to as is to ?
Try: U.S.A.; Monty_Python; PHP; Madiba (click to fill in).
Get most similar
Also try: “monkey ape baboon human chimp gorilla”; “blue red green crimson transparent” (click to fill in).
Which phrase doesn’t fit?
The model contains 3,000,000 unique phrases built with layer size of 300.
Note that the similarities were trained on a news dataset, and that Google did very little preprocessing there. So the phrases are case sensitive: watch out! Especially with proper nouns.
On a related note, I noticed about half the queries people entered into the LSA@Wikidemo contained typos/spelling errors, so they found nothing. Ouch.
To make it a little less challenging this time, I added phrase suggestions to the forms above. Start typing to see a list of valid phrases from the actual vocabulary of Google News’ word2vec model.
The “suggested” phrases are simply ten phrases starting from whatever bisect_left(all_model_phrases_alphabetically_sorted, prefix_you_typed_so_far) from Python’s built-in bisect module returns.
See the complete HTTP server code for this “bonus app” on github (using CherryPy).
Outro
Full word2vec API docs here; get gensim here. Original C toolkit and word2vec papers by Google here.
Word2vec教程的更多相关文章
- 干货 | 请收下这份2018学习清单:150个最好的机器学习,NLP和Python教程
机器学习的发展可以追溯到1959年,有着丰富的历史.这个领域也正在以前所未有的速度进化.在之前的一篇文章中,我们讨论过为什么通用人工智能领域即将要爆发.有兴趣入坑ML的小伙伴不要拖延了,时不我待! 在 ...
- 理解 Word2Vec 之 Skip-Gram 模型
理解 Word2Vec 之 Skip-Gram 模型 天雨粟 模型师傅 / 果粉 https://zhuanlan.zhihu.com/p/27234078 508 人赞同了该文章 注明:我发现知乎有 ...
- Gensim进阶教程:训练word2vec与doc2vec模型
本篇博客是Gensim的进阶教程,主要介绍用于词向量建模的word2vec模型和用于长文本向量建模的doc2vec模型在Gensim中的实现. Word2vec Word2vec并不是一个模型--它其 ...
- 自然语言处理工具:中文 word2vec 开源项目,教程,数据集
word2vec word2vec/glove/swivel binary file on chinese corpus word2vec: https://code.google.com/p/wor ...
- word2vec 入门(二)使用教程篇
word2vec 要解决问题: 在神经网络中学习将word映射成连续(高维)向量,这样通过训练,就可以把对文本内容的处理简化为K维向量空间中向量运算,而向量空间上的相似度可以用来表示文本语义上的相似度 ...
- 一步一步理解word2Vec
一.概述 关于word2vec,首先需要弄清楚它并不是一个模型或者DL算法,而是描述从自然语言到词向量转换的技术.词向量化的方法有很多种,最简单的是one-hot编码,但是one-hot会有维度灾难的 ...
- Python Tensorflow下的Word2Vec代码解释
前言: 作为一个深度学习的重度狂热者,在学习了各项理论后一直想通过项目练手来学习深度学习的框架以及结构用在实战中的知识.心愿是好的,但机会却不好找.最近刚好有个项目,借此机会练手的过程中,我发现其实各 ...
- Word2Vec在Tensorflow上的版本以及与Gensim之间的运行对比
接昨天的博客,这篇随笔将会对本人运行Word2Vec算法时在Gensim以及Tensorflow的不同版本下的运行结果对比.在运行中,参数的调节以及迭代的决定本人并没有很好的经验,所以希望在展出运行的 ...
- R语言︱文本挖掘——jiabaR包与分词向量化的simhash算法(与word2vec简单比较)
每每以为攀得众山小,可.每每又切实来到起点,大牛们,缓缓脚步来俺笔记葩分享一下吧,please~ --------------------------- <数据挖掘之道>摘录话语:虽然我比 ...
随机推荐
- 2018-2019-2 20175207 实验一《JAVA开发环境的熟悉》实验报告
目录 使用JDK编译运行简单程序 使用IDEA对程序进行调试 实验练习 产生一个随机数,让用户猜测,猜错了告诉用户是大了还是小了. 并进行测试(正常情况,异常情况,边界情况) 实验总结 使用IDEA编 ...
- python MySQL执行SQL查询结果返回字典
写自动化测试的时候我希望执行数据库前置任务,把数据库查询的结果作为请求的参数,但是正常返回结果为列表嵌套里面,这样就会影响到关键字准确的获取,特别的受限于SQL的查询字段的的顺序,所以希望返回的单条数 ...
- SSD硬盘测速较低的原因备忘
SATA3 SSD测速度盘速度只有200MB/s,可能原因有: 原因分为几种:没开AHCI 没有4K对齐 虽然接的是SATA3接口但SATA3有分为3G和6G这些传输速度接口的分别,同理SATA线3G ...
- Camp 前三日简单总结
1.#include <bits/stdc++.h> 后面别再忘了写 using namespace std; 2.在#include <bits/stdc++.h> 中 可以 ...
- webview之如何设计一个优雅健壮的Android WebView?(下)(转)
转载:https://iluhcm.com/2018/02/27/design-an-elegant-and-powerful-android-webview-part-two/ (这篇文章写得有点晚 ...
- MySQL binlog2sql-闪回数据
binlog2sql 从MySQL binlog解析出你要的SQL.根据不同选项,你可以得到原始SQL.回滚SQL.去除主键的INSERT SQL等. 用途 数据快速回滚(闪回) 主从切换后新mast ...
- winserver2012 下安装 sqlserver2008
sqlserver2008 安装要求 winserver2012 必须装 .netframework3.5. 但是 winserver2012下,安装 .netframework3.5 ,必须要 wi ...
- jQuery属性操作总结
jquery属性包括以下几个: attr(name|pro|key,val|fn) removeAttr(name) prop(n|p|k,v|f)1.6+ removeProp(name)1.6+ ...
- Django基础回顾与补充(79-80)
Django框架之回顾与补充(d79-80)一 HTTP协议:(重点) 1 请求 -请求首行 -GET /index HTTP/1.1 -请求头部(在django框架中,可以从META ...
- MySQL如何查询多少行,多少列
查找表中有多少列: SELECT count(*) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA='cpm888' AND table_name ...