Python实现中文的word2vec

1、语料相关说明


第一种方法是去网上下载相关语料,我这里有一份复旦大学中文文本分类时用的语料模型,分为训练集测试集两部分,约220M,包括了常用的中文词汇。训练文本的大小直接决定了算法的训练效果,如果你有更合适的语料库可以用自己的。

2、中文训练语料的处理

首先去网下载相关的语料文本,然后将其打开后另存为,注意选utf-8编码格式。

文本文件准备好,现在开始用python对此txt文档进行处理。

# 此函数作用是对初始语料进行分词处理后,作为训练模型的语料
def cut_txt(old_file):
    import jieba
    global cut_file     # 分词之后保存的文件名
    cut_file = old_file + '_cut.txt'

    try:
        fi = open(old_file, 'r', encoding='utf-8')
    except BaseException as e:  # 因BaseException是所有错误的基类,用它可以获得所有错误类型
        print(Exception, ":", e)    # 追踪错误详细信息

    text = fi.read()  # 获取文本内容
    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('’', '')     # 去掉标点符号
    fo = open(cut_file, 'w', encoding='utf-8')
    fo.write(str_out)

注意open中必须指明编码方式,否则就会报错;上面的函数若要单独运行,须要更改old_file变量为原文件名。

3、训练模型

准备好训练语料(注意训练语料文件越大越好,越大最后的训练效果越好),之后就开始写训练模型了,训练模型的代码如下所示:

def model_train(train_file_name, save_model_file):  # model_file_name为训练语料的路径,save_model为保存模型名
    from gensim.models import word2vec
    import gensim
    import logging
    # 模型训练,生成词向量
    logging.basicConfig(format='%(asctime)s : %(levelname)s : %(message)s', level=logging.INFO)
    sentences = word2vec.Text8Corpus(train_file_name)  # 加载语料
    model = gensim.models.Word2Vec(sentences, size=200)  # 训练skip-gram模型; 默认window=5
    model.save(save_model_file)
    model.wv.save_word2vec_format(save_model_name + ".bin", binary=True)   # 以二进制类型保存模型以便重用

训练后的模型用普通方式和二进制方式进行保存,以便下次直接使用,避免每次训练耗费大量时间。

4、word2vec模型调用

两个功能都以函数方式实现了,现在准备编写主函数代码,在主函数中负责调用各个方法实现预处理和模型训练,以此做后面的相关计算。

from gensim.models import word2vec
import os
import gensim

# if not os.path.exists(cut_file):    # 判断文件是否存在,参考:https://www.cnblogs.com/jhao/p/7243043.html
cut_txt('复旦大学文本分类语料训练集.txt')  # 须注意文件必须先另存为utf-8编码格式

save_model_name = '复旦大学文本分类语料训练集.model'
if not os.path.exists(save_model_name):     # 判断文件是否存在
    model_train(cut_file, save_model_name)
else:
    print('此训练模型已经存在,不用再次训练')

# 加载已训练好的模型
model_1 = word2vec.Word2Vec.load(save_model_name)
# 计算两个词的相似度/相关程度
y1 = model_1.similarity("新闻", "热度")
print(u"新闻和热度的相似度为:", y1)
print("-------------------------------\n")

# 计算某个词的相关词列表
y2 = model_1.most_similar("校园", topn=10)  # 10个最相关的
print(u"和校园最相关的词有:\n")
for item in y2:
    print(item[0], item[1])
print("-------------------------------\n")

最终的结果一定程序上还是取决于分词的准确率,使用jieba分词时可以针对性的加入用户自定义词典(jieba.load_userdict(“userDict.txt”) # 加载用户自定义词典),可以提高对人名,地名等未登陆词的识别效果,提高分词性能。

  • 1
    点赞
  • 35
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值