Python实现Word2vec学习笔记
参考:
中文word2vec的python实现
python初步实现word2vec
中英文维基百科语料上的Word2Vec实验
GitHub代码地址
1 文件目录结构:
[.../vord2vec]$ls
data model_train.py word2vec_test.py word_cut.py
[.../vord2vec]$ ls ./data/*
./data/倚天屠龙记.txt
2 word_cut.py文件内容:
#该文件实现了加载原始文件,进行切词服务
# coding: utf-8
import io
import sys
import jieba
file_name = './data/倚天屠龙记.txt'
cut_file = './data/倚天屠龙记_cut.txt'
reload(sys)
sys.setdefaultencoding('utf8')
# 此函数作用是对初始语料进行分词处理后,作为训练模型的语料
def cut_txt(old_file, cut_file):
print 'cut_txt begin.'
try:
# read file context
fi = io.open(old_file, 'r', encoding='utf-8')
text = fi.read() # 获取文本内容
# cut word
new_text = jieba.cut(text, cut_all=False) # 精确模式
str_out = ' '.join(new_text).replace(',', '').replace('。', '').replace('?', '').replace('!', '') \
.replace('“', '').replace('”', '').replace(':', '').replace('…', '').replace('(', '').replace(')', '') \
.replace('—', '').replace('《', '').replace('》', '').replace('、', '').replace('‘', '') \
.replace('’', '') # 去掉标点符号
# write to cut_file
fo = io.open(cut_file, 'w', encoding='utf-8')
fo.write(str_out)
except BaseException as e: # 因BaseException是所有错误的基类,用它可以获得所有错误类型
print(Exception, ":", e) # 追踪错误详细信息
print 'cut_txt end.'
if __name__ == "__main__":
cut_txt(file_name, cut_file)
3 model_train.py
#该文件中实现通过切词生成的文件,通过该文件来训练模型并写入相应的文件。
# coding: utf-8
import sys
import logging
from gensim.models import word2vec
reload(sys)
sys.setdefaultencoding('utf8')
train_file_name = "./data/倚天屠龙记_cut.txt"
save_model_file = "./data/倚天屠龙记.model"
def model_train(train_file_name, save_model_file): # model_file_name为训练语料的路径,save_model为保存模型名
print 'model_train begin.'
try:
# 模型训练,生成词向量
logging.basicConfig(format='%(asctime)s : %(levelname)s : %(message)s', level=logging.INFO)
sentences = word2vec.Text8Corpus(train_file_name) # 加载语料
model = word2vec.Word2Vec(sentences, size=200) # 训练skip-gram模型; 默认window=5
model.save(save_model_file)
model.wv.save_word2vec_format(save_model_file + ".bin", binary=True) # 以二进制类型保存模型以便重用
except BaseException as e: # 因BaseException是所有错误的基类,用它可以获得所有错误类型
print(Exception, ":", e) # 追踪错误详细信息
print 'model_train end.'
if __name__ == "__main__":
model_train(train_file_name, save_model_file)
4 word2vec_test.py
# 该文件中调用切词功能文件word_cut.py和模型训练功能文件model_train.py,使用训练出的模型写测试实例。
# coding: utf-8
import os
import sys
import logging
import word_cut
import model_train
from gensim.models import word2vec
reload(sys)
sys.setdefaultencoding('utf8')
file_name = './data/倚天屠龙记.txt'
train_file_name = file_name + '_cut'
model_file = file_name + '.model'
model_file_bin = file_name + '.model.bin'
def word2vec_test():
print 'word2vec_test begin.'
try:
# 加载日志输出配置
logging.basicConfig(format='%(asctime)s : %(levelname)s : %(message)s', level=logging.INFO)
# 加载文件切词
print '加载文件:%s 切词后存放为:%s.' % (file_name, train_file_name)
if not os.path.exists(file_name): # 判断文件是否存在,参考:https://www.cnblogs.com/jhao/p/7243043.html
print '加载文件切词失败。'
exit(0)
else:
word_cut.cut_txt(file_name, train_file_name) # 须注意文件必须先另存为utf-8编码格式
# 训练模型
print '从文件:%s 训练模型存放在: %s' % (train_file_name, model_file)
if not os.path.exists(model_file): # 判断文件是否存在
model_train.model_train(train_file_name, model_file)
else:
print('此训练模型已经存在,不用再次训练')
# 加载已训练好的模型
print '从文件:%s 中加载模型' % model_file
# model_1 = gensim.models.KeyedVectors.load_word2vec_format(model_file_bin, binary=True)
model_1 = word2vec.Word2Vec.load(model_file)
# 计算两个词的相似度/相关程度
y1 = model_1.similarity(u"赵敏", u"韦一笑")
print u"赵敏和韦一笑的相似度为: %g" % y1
print "-------------------------------\n"
# 计算某个词的相关词列表
y2 = model_1.most_similar(u"张三丰", topn=20) # 20个最相关的
print(u"和张三丰最相关的词有:\n")
for item in y2:
print "%s: %g" % (item[0], item[1])
print("-------------------------------\n")
except Exception, e:
print "Exception", e
print 'word2vec_test end.'
if __name__ == "__main__":
word2vec_test()
5 测试结果:
//执行命令:python word2vec_test.py
//执行生成的文件:
[.../word2vec/data]$ ls
倚天屠龙记.txt 倚天屠龙记.txt_cut 倚天屠龙记.txt.model 倚天屠龙记.txt.model.bin
输出信息:
赵敏和韦一笑的相似度为: 0.832561
-------------------------------
2018-07-16 17:01:05,815 : INFO : precomputing L2-norms of word weight vectors
和张三丰最相关的词有:
高姓大名: 0.978904
拱手: 0.978083
铁冠道人: 0.977918
启禀: 0.977619
初次: 0.977287
喃喃: 0.976283
周先生: 0.976194
冷然: 0.975955
阳前: 0.975153
仇深似: 0.974774
属下: 0.974182
彭莹玉: 0.973856
宋远桥: 0.973482
贵帮: 0.972765
鹿: 0.970881
万里迢迢: 0.970759
张松溪: 0.970717
还礼: 0.970527
调兵遣将: 0.970323
李天垣: 0.969962
-------------------------------