gensim实现Doc2Vec和Word2Vec

╰半夏微凉° 2022-05-15 09:49 419阅读 0赞

本文作者:合肥工业大学 管理学院 钱洋 email:1563178220@qq.com 内容可能有不到之处,欢迎交流。

未经本人允许禁止转载。

在处理文本时,经常需要将其转化成向量的形式,然后去做分类和聚类,而word2vec和doc2vec方法是一种较为常用的方法。
在python的gensim包中实现了这两种算法,为了以后个人使用方便,这里写成博客,以供翻阅。
以下为数据集的形式:

这里写图片描述

每一行的每一个数字表示词的编号,这里也可以用具体的词。且数据保存在工程的/data/test.txt文本里。以下为Doc2vec的处理程序:

  1. # -*- coding: utf-8 -*-
  2. import sys
  3. import logging
  4. import os
  5. import gensim
  6. import re
  7. import numpy as np
  8. # 引入doc2vec
  9. from gensim.models import Doc2Vec
  10. curPath = os.path.abspath(os.path.dirname(__file__))
  11. rootPath = os.path.split(curPath)[0]
  12. sys.path.append(rootPath)
  13. # 引入日志配置
  14. logging.basicConfig(format='%(asctime)s : %(levelname)s : %(message)s', level=logging.INFO)
  15. # 加载数据
  16. documents = []
  17. # 使用第一列当做每个句子的“标签”,标签和每个句子是一一对应的
  18. count = 0
  19. with open('../data/test.txt','r') as f:
  20. for line in f:
  21. # 使用正则表达式切词
  22. words = re.split(r'[\s]',line)
  23. #添加到数组中
  24. documents.append(gensim.models.doc2vec.TaggedDocument(words, [str(count)]))
  25. count += 1
  26. # 模型训练
  27. model = Doc2Vec(documents, dm=1, size=100, window=8, min_count=5, workers=4)
  28. # 保存模型
  29. model.save('doc2vec.model')
  30. # 保存向量
  31. corpus = model.docvecs
  32. np.savetxt("../data/d2v.corpus.txt", corpus)

运行该程序便能够成功训练模型,通过numpy的保存操作,就可以将模型得到的向量保存到文本中了,具体如下:

这里写图片描述

加入将上述数据的每一个词表示成指定维度向量的形式,可以使用word2vec方法,以下为测试程序:

  1. # -*- coding: utf-8 -*-
  2. import sys
  3. import logging
  4. import os
  5. # 引入word2vec
  6. from gensim.models import word2vec
  7. curPath = os.path.abspath(os.path.dirname(__file__))
  8. rootPath = os.path.split(curPath)[0]
  9. sys.path.append(rootPath)
  10. # 引入日志配置
  11. logging.basicConfig(format='%(asctime)s : %(levelname)s : %(message)s', level=logging.INFO)
  12. sentences = word2vec.LineSentence(u"../data/test.txt") # 加载语料
  13. model = word2vec.Word2Vec(sentences, size=100, window=20,min_count=1) #训练skip-gram模型,默认window=5
  14. # 计算两个词的相似度/相关程度
  15. try:
  16. y1 = model.similarity(u"564", u"657")
  17. except KeyError:
  18. y1 = 0
  19. print u"【2123】和【3204】的相似度为:", y1
  20. print"-----\n"
  21. # 计算某个词的相关词列表
  22. y2 = model.most_similar(u"564", topn=20) # 20个最相关的
  23. print u"和词【564】最相关的词有:\n"
  24. for item in y2:
  25. print item[0], item[1]
  26. print"-----\n"
  27. # 保存模型,以便重用
  28. model.save("wordvec.model")
  29. # 保存向量
  30. model.wv.save_word2vec_format('word2vec.txt', binary=False)

如下为控制台输出的结果:

这里写图片描述

发表评论

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

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

相关阅读