首先需要具备gensim包,然后需要一个语料库用来训练,这里用到的是skip-gram或CBOW方法,具体细节可以去查查相关资料,这两种方法大致上就是把意思相近的词映射到词空间中相近的位置。
语料库test8下载地址:
http://mattmahoney.net/dc/text8.zip
这个语料库是从http://blog.csdn.net/m0_37681914/article/details/73861441这篇文章中找到的。
将数据下载好了解压出来,在做词向量之前我们需要了解数据的存储结构,判断它是否满足gensim包里word2vec函数对输入数据的形式要求。word2vec函数的输入最好是一整篇文字,不含标点符号以及换行符。那么我们应该检查test8数据是否符合。然而双击打开test8是行不通的,因为文件过大。那么就需要我们用程序打开它。代码如下:
with open('/text8','r',encoding='utf-8') as file:
for line in file.readlines():
print(line)
程序会返回警告,内存不够,打印不出来。明显是因为有一行内容太多导致的。可以进行如下验证:
with open('/text8','r',encoding='utf-8') as file:
for line in file.readlines():
print(len(line))
输出只有一个值,表示数据只有一行,且显示这一行有100000000个字符长度。由于文件内数据结构一致,那么我们没有必要将数据全部输出来看,只需要输出一部分就知道它的数据结构,那么修改代码如下:
a = 0
b = 0
with open('/text8','r',encoding='utf-8') as file:
line = file.read()
for char in line:
b+=1
print(char,end='')
if b-a == 100:
a = b
print('\n')
if a == 5000:
break
我们输出前5000个字符来看看,并且每100个字符换一行。
这里只是开头一部分,可以看到数据完全没有标点符号,且之前验证过所有数据都是在同一行,表示没有换行符。那么我们无需对数据进行预处理。接下来是数据处理部分。
from gensim.models import word2vec
import logging
logging.basicConfig(format='%(asctime)s : %(levelname)s : %(message)s', level=logging.INFO)
sentences = word2vec.Text8Corpus('/text8')
model = word2vec.Word2Vec(sentences, sg=1, size=100, window=5, min_count=5, negative=3, sample=0.001, hs=1, workers=4)
model.save('/text82.model')
print(model['man'])
那么
logging.basicConfig(format='%(asctime)s : %(levelname)s : %(message)s', level=logging.INFO)
这一行表示我们的程序会输出日志信息,形式(format)为日期(asctime):信息级别(levelname):日志信息(message),信息级别为正常信息(logging.INFO)。关于logging的知识,大家可以去自行学习。https://www.cnblogs.com/bjdxy/archive/2013/04/12/3016820.html点击打开链接
上图就是输出的日志信息。实际工作中,我们也可以不加这个日志,但这么做的前提是我们确定程序一定正确,不会出错,因为一旦出错我们就需要根据日志信息来推断错误发生的可能。
将语料库保存在sentence中
sentences = word2vec.Text8Corpus('/text8')
生成词向量空间模型
model = word2vec.Word2Vec(sentences, sg=1, size=100, window=5, min_count=5, negative=3, sample=0.001, hs=1, workers=4)
这里讲下参数含义:
class gensim.models.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=in function hash>,iter=5,null_word=0, trim_rule=None, sorted_vocab=1, batch_words=10000)
这里再把生成的空间模型保存下来,以便下次使用。
model.save('/text8.model')
下次使用就不在需要加载语料库和生成模型了。只需要:
''' sentences = word2vec.Text8Corpus('/text8') model = word2vec.Word2Vec(sentences, sg=1, size=100, window=5, min_count=5, negative=3, sample=0.001, hs=1, workers=4) model.save('/text8.model') ''' model = word2vec.Word2Vec.load('/text8.model')
最后是查看某个词的词向量:
print(model['man'])
当然model函数还可以做更多的事情,比如查看两个词的相似度等等,想知道的请自行百度