doc2vec计算文本类似度--python实现

    Boblee人工智能硕士毕业,擅长及爱好python,基于python研究人工智能、群体智能、区块链等技术,并使用python开发先后端、爬虫等。html

1.背景    python

   doc2vec的目标是建立文档的向量化表示,而无论其长度如何。但与单词不一样的是,文档并无单词之间的逻辑结构,所以必须找到另外一种方法。nginx

    Mikilov和Le使用的概念很简单但很聪明:他们使用了word2vec模型,并添加了另外一个向量(下面的段落ID),以下所示:git

    上图是word2vec中CBOW模型的一个小扩展。它不是仅是使用一些单词来预测下一个单词,咱们还添加了另外一个特征向量,即文档Id。github

    所以,当训练单词向量W时,也训练文档向量D,而且在训练结束时,它包含了文档的向量化表示。算法

    上面的模型称为段落向量的分布式记忆的版本(PV-DM)。它充当记忆器,它能记住当前上下文中缺乏的内容 - 或者段落的主题。虽然单词向量表示单词的概念,但文档向量旨在表示文档的概念。后端

    如在doc2vec中,另外一种相似于skip-gram的算法,段落向量的分布式词袋版本(PV-DBOW)。微信

    该算法实际上更快(与word2vec相反)而且消耗更少的内存,由于不须要保存词向量。app

    在论文中,做者建议使用两种算法的组合,尽管PV-DM模型是优越的,而且一般会本身达到最优的结果。分布式

    doc2vec模型的使用方式:对于训练,它须要一组文档。为每一个单词生成词向量W,并为每一个文档生成文档向量D. 该模型还训练softmax隐藏层的权重。在推理阶段,能够呈现新文档,而且固定全部权重以计算文档向量。

2.python实现

    本文使用今日头条提供的文本分类数据集进行实验,https://github.com/skdjfla/toutiao-text-classfication-dataset。

    python中提供了doc2vec、word2vec封装好的库sklearn。sklearn使用doc2vec请见https://radimrehurek.com/gensim/models/doc2vec.html。

pip install sklearn

1.句子分词

import gensimimport numpy as npimport jiebafrom gensim.models.doc2vec import Doc2Vec
def jieba_tokenize(text): """ 文本分词 :param text: 文本 :return: 分词list """ return jieba.lcut(text)

2.获取训练集

def get_datasest(): """ 获取doc2vec文本训练数据集 :return: 文本分词list,及id """ TaggededDocument = gensim.models.doc2vec.TaggedDocument x_train = [] for file in open('toutiao_cat_data.txt', encoding='utf8'): file = file.split('_!_') if len(file) > 3: document = TaggededDocument(file[3], tags=[int(file[1])]) x_train.append(document) return x_train

3.训练


def train(x_train, size=2000, epoch_num=10): model_dm = Doc2Vec(x_train,min_count=1, window = 3, size = size, sample=1e-3, negative=5, workers=4) model_dm.train(x_train, total_examples=model_dm.corpus_count, epochs=epoch_num) model_dm.save('model') return model_dm

4.测试

def getVecs(model, corpus, size): vecs = [np.array(model.docvecs[z.tags[0]].reshape(1, size)) for z in corpus] return np.concatenate(vecs)def test(): model_dm = Doc2Vec.load("model") test_text = ['想换个', '30', '万左右', '的', '车', ',', '如今', '开科鲁兹', ',', '有', '什么', '好', '推荐', '的', '?'] inferred_vector_dm = model_dm.infer_vector(test_text) sims = model_dm.docvecs.most_similar([inferred_vector_dm], topn=10) return sims
if __name__ == '__main__': x_train = get_datasest() model_dm = train(x_train)
sims = test() for count, sim in sims: sentence = x_train[count] words = '' for word in sentence[0]: words = words + word + ' ' print (words, sim, len(sentence[0]))

感受效果仍是不错。对应车的句子可以提取出来。

本文分享自微信公众号 - python制霸(pythonzhiba)。
若有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一块儿分享。

相关文章
相关标签/搜索