Word2vec训练中文词向量
将所有的语料读入到列表中,把每一句已经分好词的句子作为列表中的一个元素,类似:
[[‘i’,’am’,’a’,’girl’],[‘he’,’is’,’a’,’boy’]]
from gensim.models import Word2Vec
import os
import sys
##下面的代码是训练字向量的代码
sentence = []
word = []
tag = 0
with open('data_all.txt',encoding='utf-8') as fp: ##
print(type(fp))
for line in fp.readlines():
# print(line)
line = line.strip()
if line == '':
continue
tag += 1
print(tag)
if tag >10000:
break
if tag == 1:
line1 = ['']+line.split()
sentence.append(line1)
word.append('')
else:
sentence.append(line.split())
for each in line.split():
if each not in word:
word.append(each)
# print(len(sentence))
model = Word2Vec(sentence, sg=1, size=100, window=5, min_count=1, negative=3, sample=0.001, hs=1, workers=4)
model.save('dict_data_model')
model = Word2Vec.load('dict_data_model') #加载模型
f1 = open('data_vec.txt','w',encoding='utf-8')
f1.write(str(len(word))+' '+str(100)+'\n')
for each in word:
# print (each)
str1 = ''
for e in model[each]:
if str1 == '':
str1 = str(e)
else:
str1 = str1+' '+str(e)
f1.write(each+' '+str1+'\n')
f1.close()
print(len(word))
print(len(list(set(word))))
当训练词向量的语料比较大时,会出现内存不够的问题,于是可以使用下面的代码进行修改:
class sentences_generator():
def __init__(self,filename):
self.filename = filename
def __iter__(self):
for line in open(self.filename):
sentence = line.rstrip(' ')
yield sentence
sentence = sentences_generator('data_all.txt')
model = Word2Vec(sentence, sg=1, size=100, window=5, min_count=1, negative=3, sample=0.001, hs=1, workers=4)
model.save('dict_data_model')
model = Word2Vec.load('dict_data_model') #加载模型
f1 = open('data_vec.txt','w',encoding='utf-8')
f1.write(str(len(word))+' '+str(100)+'\n')
for each in word:
# print (each)
str1 = ''
for e in model[each]:
if str1 == '':
str1 = str(e)
else:
str1 = str1+' '+str(e)
f1.write(each+' '+str1+'\n')
f1.close()
print(len(word))
print(len(list(set(word))))
相关的博客网址:https://blog.csdn.net/thriving_fcl/article/details/51406780
第一种方法是将语料转换为一个python的list作为输入,但是语料较大时,大到报内存不够的错误时,该方法就失效了
第二种方法主要是为了解决第一种方法出现的问题,“gensim的API并不要求sentences必须是list对象,只要输入的sentences是iterable的就行,那我们只要一次载入一个句子,训练完之后再将其丢弃,内存就不会因为语料过大而不够了。我们通过下面的代码就可以生成一个iterator。事先已经将训练语料分词,词与词之间采用空格分开,并保存在一个文档里。其实用一个函数也可以生成一个迭代器,只不过函数生成的迭代器迭代一轮就失效了,而这里需要迭代多轮。第一轮统计词频,用于生成哈夫曼树。后续用于训练,因此封装成一个类。”(此段是引用上面博客中的内容)
##相关参数的解释
sg 定义训练算法,默认是sg=0,采用CBOW,否则sg=1采用skip-gram
size 是特征向量的维数,默认值为100维
window 设置当前词汇与上下文词汇的最大间距,默认值为5窗口
alpha 是最初学习速率,随着训练的进行,逐渐减少至0
seed 用于随机数生成器
min_count 设置最低有效词频,过滤掉一些低频词
max_vocab_size 设置词向量训练期间的最大RAM,如果词汇量超过这个就减掉词频最小的那个,设置None则不限制,每1000万字大概需要1Gb内存
sample 设置高频词随机下采样的阈值,默认值为1e-3,有效范围为(0,1e-5)
workers 设置几个工作线程来训练模型(有效利用多核机器)
hs 如果设置为1,将用于模型训练。如果设置为0(默认),同时negative设置为非零,将使用负采样
negative 如果> 0,将使用负采样,该数值指定应取出多少“噪声字”(通常在5-20之间)。默认值为5,如果设置为0,则不使用负采样
cbow_mean = 如果设置为0,使用上下文词向量的和。如果设为1(默认),则使用平均值,仅适用于使用cbow时。
hashfxn 散列函数,用于随机初始化权重以增加训练的可重复性。默认是Python的基本内置哈希函数
iter 语料库中的迭代次数(epochs),默认值为5
trim_rule 词汇修剪规则,指定某些词是否应保留在词汇表中,被修剪掉或使用默认值处理(如果字计数 sorted_vocab 如果设为1(默认),在分配词索引之前,通过降序对词汇表进行排序。 batch_words 传递给工作线程(以及此cython例程)的示例批次的目标大小(以字为单位)。默认值为10000.(如果单个文本长度大于10000个字,则会传递更大的批次,但标准的cython代码会截断到最大值。)