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源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。

相關文章
相關標籤/搜索