Windows下基于python3使用word2vec训练中文维基百科语料(二)

在上一篇对中文维基百科语料处理将其转换成.txt的文本文档的基础上,我们要将为文本转换成向量,首先都要对文本进行预处理

步骤四:由于得到的中文维基百科中有许多繁体字,所以我们现在就是将繁体字转换成简体字

opencc工具进行繁简转换,首先去下载opencc:https://bintray.com/package/files/byvoid/opencc/OpenCC
下载完成之后解压即可,随后使用命令:
opencc -i wiki.zh.text -o wiki.zh.jian.text -c t2s.json进行转换
将之前获得的wiki.zh.text和解压后的opencc放在一个文件夹中,然后用上述命令执行,将转换后的简体中文保存在 wiki.zh.jian.text
 
步骤五:得到简体中文文档后,对中文首先进行分词,分词采用jieba,代码如下:
 1 #文章分词
 2 import jieba
 3 import jieba.analyse
 4 import codecs
 5 def cut_words(sentence):
 6    #print sentence
 7     return " ".join(jieba.cut(sentence)).encode('utf-8')
 8 f=codecs.open('wiki.zh.jian.text','r',encoding="utf8")
 9 target = codecs.open("wiki.zh.jian.seg.txt", 'w',encoding="utf8")
10 print ('open files')
11 line_num=1
12 line = f.readline()
13 while line:
14     print('---- processing', line_num, 'article----------------')
15     line_seg = " ".join(jieba.cut(line))
16     target.writelines(line_seg)
17     line_num = line_num + 1
18     line = f.readline()
19 f.close()
20 target.close()
21 exit()
22 while line:
23     curr = []
24     for oneline in line:
25         #print(oneline)
26         curr.append(oneline)
27     after_cut = map(cut_words, curr)
28     target.writelines(after_cut)
29     print ('saved',line_num,'articles')
30     exit()
31     line = f.readline1()
32 f.close()
33 target.close()

如图:分词完毕

步骤六:分词结束,就可以训练词向量

参数说明:

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=<built-in function hash>,iter=5,null_word=0, trim_rule=None, sorted_vocab=1, batch_words=10000)  
参数含义如下(转自http://blog.csdn.net/szlcw1/article/details/52751314):
· sentences:可以是一个·ist,对于大语料集,建议使用BrownCorpus,Text8Corpus或·ineSentence构建。
· sg: 用于设置训练算法,默认为0,对应CBOW算法;sg=1则采用skip-gram算法。
· size:是指特征向量的维度,默认为100。大的size需要更多的训练数据,但是效果会更好. 推荐值为几十到几百。
· window:表示当前词与预测词在一个句子中的最大距离是多少
· alpha: 是学习速率
· seed:用于随机数发生器。与初始化词向量有关。
· min_count: 可以对字典做截断. 词频少于min_count次数的单词会被丢弃掉, 默认值为5
· max_vocab_size: 设置词向量构建期间的RAM限制。如果所有独立单词个数超过这个,则就消除掉其中最不频繁的一个。每一千万个单词需要大约1GB的RAM。设置成None则没有限制。
· sample: 高频词汇的随机降采样的配置阈值,默认为1e-3,范围是(0,1e-5)
· workers参数控制训练的并行数。
· hs: 如果为1则会采用hierarchica·softmax技巧。如果设置为0(defau·t),则negative sampling会被使用。
· negative: 如果>0,则会采用negativesamp·ing,用于设置多少个noise words
· cbow_mean: 如果为0,则采用上下文词向量的和,如果为1(defau·t)则采用均值。只有使用CBOW的时候才起作用。
· hashfxn: hash函数来初始化权重。默认使用python的hash函数
· iter: 迭代次数,默认为5
· trim_rule: 用于设置词汇表的整理规则,指定那些单词要留下,哪些要被删除。可以设置为None(min_count会被使用)或者一个接受()并返回RU·E_DISCARD,uti·s.RU·E_KEEP或者uti·s.RU·E_DEFAU·T的函数。
· sorted_vocab: 如果为1(defau·t),则在分配word index 的时候会先对单词基于频率降序排序。
· batch_words:每一批的传递给线程的单词的数量,默认为10000
 
具体代码如下:
 1 #!/usr/bin/env python
 2 # -*- coding:utf-8 -*-
 3 import logging
 4 import os
 5 import sys
 6 import multiprocessing
 7 wiki.zh.text.model wiki.zh.text.vector
 8 from gensim.models import Word2Vec
 9 from gensim.models.word2vec import LineSentence
10 
11 if __name__ == '__main__':
12     program = os.path.basename(sys.argv[0])
13     logger = logging.getLogger(program)
14 
15     logging.basicConfig(format='%(asctime)s: %(levelname)s: %(message)s')
16     logging.root.setLevel(level=logging.INFO)
17     logger.info("running %s" % ' '.join(sys.argv))
18 
19     # check and process input arguments
20     if len(sys.argv) < 4:
21         print(globals()['__doc__'] % locals())
22         sys.exit(1)
23     inp, outp1, outp2 = sys.argv[1:4]
24 
25     model = Word2Vec(LineSentence(inp), size=400, window=5, min_count=5,
26                      workers=multiprocessing.cpu_count(),iter=100)#向量维度是400维,迭代100次
27 
28     # trim unneeded model memory = use(much) less RAM
29     # model.init_sims(replace=True)
30     model.save(outp1)
31     model.wv.save_word2vec_format(outp2, binary=False)

使用命令开始训练
python train_word2vec_model.py wiki.zh.jian.seg.txt wiki.zh.text.model wiki.zh.text.vector

训练过程如下图:

迭代到100轮:

保存结果如图,表示结束:

这时候就表示训练好了,现在就可以开始使用啦!!!

 

 

 
 
 


posted @ 2018-05-29 17:29  每天坚持一点点  阅读(1562)  评论(0编辑  收藏  举报