【转】python-word2vec模块使用详解

缺乏、安全感 2022-10-07 07:48 283阅读 0赞

安装

安装方法:pip install --upgrade gensim
安装分词:pip install jieba

中文训练预料处理

首先去网上下载一本小书,然后将其另存为utf-8格式
在这里插入图片描述
文本文件准备好,现在开始用python对此txt文档进行处理。

  1. from gensim.models import word2vec
  2. import os
  3. import gensim
  4. from word2vec import model_train
  5. import jieba
  6. # 此函数作用是对初始语料进行分词处理后,作为训练模型的语料
  7. def cut_txt(old_file):
  8. global cut_file # 分词之后保存的文件名
  9. cut_file = old_file + '_cut.txt'
  10. try:
  11. fi = open(old_file, 'r', encoding='utf-8')
  12. except BaseException as e: # 因BaseException是所有错误的基类,用它可以获得所有错误类型
  13. print(Exception, ":", e) # 追踪错误详细信息
  14. text = fi.read() # 获取文本内容
  15. new_text = jieba.cut(text, cut_all=False) # 精确模式
  16. str_out = ' '.join(new_text).replace(',', '').replace('。', '').replace('?', '').replace('!', '') \
  17. .replace('“', '').replace('”', '').replace(':', '').replace('…', '').replace('(', '').replace(')', '') \
  18. .replace('—', '').replace('《', '').replace('》', '').replace('、', '').replace('‘', '') \
  19. .replace('’', '') # 去掉标点符号
  20. fo = open(cut_file, 'w', encoding='utf-8')
  21. fo.write(str_out)

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

模型训练

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

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

参数说明:

  1. model=gensim.models.Word2Vec(sentences,sg=1,size=100,window=5,min_count=2,negative=3,sample=0.001,hs=1,workers=4)
  2. #该步骤也可分解为以下三步(但没必要):
  3. #model=gensim.model.Word2Vec() 建立一个空的模型对象
  4. #model.build_vocab(sentences) 遍历一次语料库建立词典
  5. #model.train(sentences) 第二次遍历语料库建立神经网络模型
  6. #sg=1是skip—gram算法,对低频词敏感,默认sg=0为CBOW算法
  7. #size是神经网络层数,值太大则会耗内存并使算法计算变慢,一般值取为100到200之间。
  8. #window是句子中当前词与目标词之间的最大距离,3表示在目标词前看3-b个词,后面看b个词(b在0-3之间随机)
  9. #min_count是对词进行过滤,频率小于min-count的单词则会被忽视,默认值为5。
  10. #negative和sample可根据训练结果进行微调,sample表示更高频率的词被随机下采样到所设置的阈值,默认值为1e-3,
  11. #negative: 如果>0,则会采用negativesamping,用于设置多少个noise words
  12. #hs=1表示层级softmax将会被使用,默认hs=0且negative不为0,则负采样将会被选择使用。
  13. #workers是线程数,此参数只有在安装了Cpython后才有效,否则只能使用单核

我们并不需要全部了解,大部分参数都可以使用其默认值(不输入),而其中比较重要的有:

  1. # min_count,是去除小于min_count的单词
  2. # size,神经网络层数
  3. # sg, 算法选择
  4. # window, 句子中当前词与目标词之间的最大距离
  5. # workers,线程数

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

word2vec模型调用

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

  1. # if not os.path.exists(cut_file): # 判断文件是否存在,参考:https://www.cnblogs.com/jhao/p/7243043.html
  2. cut_txt('倚天屠龙记.txt') # 须注意文件必须先另存为utf-8编码格式
  3. save_model_name = '倚天屠龙记.model'
  4. if not os.path.exists(save_model_name): # 判断文件是否存在
  5. model_train(cut_file, save_model_name)
  6. else:
  7. print('此训练模型已经存在,不用再次训练')
  8. # 加载已训练好的模型
  9. model_1 = word2vec.Word2Vec.load(save_model_name)
  10. # 计算两个词的相似度/相关程度
  11. word_1 = "金毛狮"
  12. word_2 = "谢逊"
  13. y1 = model_1.similarity(word_1, word_2)
  14. print(word_1, "和", word_2, "的相似度为:", y1)
  15. print("-------------------------------\n")
  16. # 计算某个词的相关词列表
  17. word_3 = "张无忌"
  18. y2 = model_1.most_similar(word_3, topn=10) # 10个最相关的
  19. print(u"和", word_3, "最相关的词有:\n")
  20. for item in y2:
  21. print(item[0], item[1])
  22. print("-------------------------------\n")
  23. # 某个词的词向量
  24. print(model_1['张无忌'])

最后的运行结果如下所示:
在这里插入图片描述
最终的结果一定程序上还是取决于分词的准确率,使用jieba分词时可以针对性的加入用户自定义词典(jieba.load_userdict(“userDict.txt”) # 加载用户自定义词典),可以提高对人名,地名等未登陆词的识别效果,提高分词性能。

发表评论

表情:
评论列表 (有 0 条评论,283人围观)

还没有评论,来说两句吧...

相关阅读

    相关 word2vec

    Word2Vec 是一种词嵌入模型,用于将文本中的单词映射到一个固定大小的向量空间中。它的主要目的是通过计算单词之间的相似度来增强自然语言处理的性能。Word2Vec 通常用于

    相关 word2vec学习笔记[]

    谷歌已经使用Deep Learning技术开发了许多新方法来解析语言,目前,谷歌开源了一款基于Deep Learning的学习工具——word2vec,这是首款面向大众的Dee