python——word2vec

来源:互联网 发布:java post 二进制 编辑:程序博客网 时间:2024/05/22 11:36

使用gensim提供的模型word2vec训练从网上获得的语料。gensim是Radim Řehůřek博士提供的库。

比较简单的参考资料:getting-started-with-word2vec-and-glove-in-python

更进一步的word2vec的使用可以参考这篇文章:

Word2vec Tutorial


1、处理原始语料,得到word2vec需要的输入格式

这次实验使用的语料是yelp(共2225213条)和amazon electronic(共计1689188条)上的评论语料,都是json格式的。

首先清楚word2vec模型的输入是什么样子的。可以是内建的列表,其中每个元素表示一句话,每个元素又是一个列表组成,比如

sentences=[['i', 'am', 'wei'], ['hello','everyone']]model = gensim.models.Word2Vec(sentences, min_count=1)

当然这样只能训练出来的词向量没有任何意思。也不可能把所有的语料全部存在一个list中,全部加载进内存。word2vec还提供了一个通过读取文件的方式获得输入:

word2vec(filename)

需要注意的就是file里面的内容的格式,需要是utf-8编码的,并且每行为一个句子,每个句子中的单词由空格隔开,比如:

i am wei

hello everyone

本次实验采用的就是从文件中读取的方式。首先把json文件中我们需要的review text提取出来,然后只做简单的lower处理,这里保留了标点符号:

import jsonfrom nltk.tokenize import word_tokenizetext = []with open("elec.txt", "w+") as f1:with open("Electronics_5.json", "r") as f2:for o in f2:    #这里需要注意一点:json.load()要求文件中只有一个记录,也就是只有一个{},但原始文件有多个{},于是采用这种读取方式data = json.loads(o) #json.loads(json_str)是把json编码的字符串恢复line = data['reviewText']line = line.lower()line = word_tokenize(line)for word in line:f1.write(word + ' ')f1.write('\n')text.append(line)print len(text), text[0]


于是得到yelp.txt(快一小时)和elec.txt(半小时的样子).


2、训练词向量

调用gensim提供的word2vec模块,根据上面得到的输入文件训练词向量。首先介绍word2vec的几个重要参数(注意,原模型中有窗口大小等参数,不予考虑,我们只关注维度):

min_count:默认值是5,一般可以设在0-100之间

word2vec在训练之前,首先会遍历一边数据,生成一个词典。mincount的作用是设置一个频数阈值,过滤掉字典中出现次数低于此阈值的单词,因为这些单词一般不重要,另外技术上的原因是没有足够多的训练数据训练出这些单词的词向量。

size:神经网络层的大小,默认值是100,可以设在几十到几百之间。一般来说越大,越准确,但size越大要求训练数据越多。


import sysfrom gensim.models import Word2Vecfrom gensim.models.word2vec import LineSentence #这个LineSentence到底是什么用处?if __name__ == "__main__":if len(sys.argv) < 4:print globals()['__doc__'] % locals()        sys.exit(1)input_file = sys.argv[1]output_model, output_vec = sys.argv[2:4]model = Word2Vec(LineSentence(input_file), min_count=5, size=100)model.save(output_model)#save model, so next time load the model again and usemodel.save_word2vec_foramt(output_vec, binary=False)#save the obtained word vec        #训练好的模型下次可以直接加载使用model = gensim.models.Word2Vec.load("wiki.en.text.model")model = gensim.models.Word2Vec.load_word2vec_format("wiki.en.text.vector", binary=False)model.most_similar("man")model.similarity("woman", "man")#想要得到某个单词的词向量model["hello"] #生成的词典model.vocab 








0 0
原创粉丝点击