Python实现Word2vec学习笔记

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
-------------------------------

你可能感兴趣的:(python,word2vec,gensim)