web-dev-qa-db-fra.com

Doc2Vec Obtenez les documents les plus similaires

J'essaie de créer un modèle de récupération de documents qui renvoie la plupart des documents classés en fonction de leur pertinence par rapport à une requête ou à une chaîne de recherche. Pour cela, j'ai formé un modèle doc2vec en utilisant le Doc2Vec modèle en gensim. Mon ensemble de données se présente sous la forme d'un ensemble de données pandas) dans lequel chaque document est stocké sous forme de chaîne sur chaque ligne. C'est le code que j'ai jusqu'à présent.

import gensim, re
import pandas as pd

# TOKENIZER
def tokenizer(input_string):
    return re.findall(r"[\w']+", input_string)

# IMPORT DATA
data = pd.read_csv('mp_1002_prepd.txt')
data.columns = ['merged']
data.loc[:, 'tokens'] = data.merged.apply(tokenizer)
sentences= []
for item_no, line in enumerate(data['tokens'].values.tolist()):
    sentences.append(LabeledSentence(line,[item_no]))

# MODEL PARAMETERS
dm = 1 # 1 for distributed memory(default); 0 for dbow 
cores = multiprocessing.cpu_count()
size = 300
context_window = 50
seed = 42
min_count = 1
alpha = 0.5
max_iter = 200

# BUILD MODEL
model = gensim.models.doc2vec.Doc2Vec(documents = sentences,
dm = dm,
alpha = alpha, # initial learning rate
seed = seed,
min_count = min_count, # ignore words with freq less than min_count
max_vocab_size = None, # 
window = context_window, # the number of words before and after to be used as context
size = size, # is the dimensionality of the feature vector
sample = 1e-4, # ?
negative = 5, # ?
workers = cores, # number of cores
iter = max_iter # number of iterations (epochs) over the corpus)

# QUERY BASED DOC RANKING ??

Ce qui me pose problème, c'est de trouver les documents les plus similaires/pertinents pour la requête. J'ai utilisé le infer_vector mais a ensuite réalisé qu'il considérait la requête comme un document, met à jour le modèle et renvoie les résultats. J'ai essayé d'utiliser le most_similar et most_similar_cosmul _ mais je reçois des mots avec un score de similarité (je suppose) en retour. Ce que je veux faire, c'est lorsque je saisis une chaîne de recherche (une requête), je devrais obtenir les documents (identifiants) les plus pertinents, ainsi qu'un score de similarité (cosinus, etc.). Comment puis-je obtenir cette partie?

31
Clock Slave

Vous devez utiliser infer_vector pour obtenir un vecteur de document du nouveau texte - qui ne modifie pas le modèle sous-jacent.

Voici comment vous le faites:

tokens = "a new sentence to match".split()

new_vector = model.infer_vector(tokens)
sims = model.docvecs.most_similar([new_vector]) #gives you top 10 document tags and their cosine similarity

Modifier:

Voici un exemple de la façon dont le modèle sous-jacent ne change pas après infer_vec est appelé.

import numpy as np

words = "king queen man".split()

len_before =  len(model.docvecs) #number of docs

#Word vectors for king, queen, man
w_vec0 = model[words[0]]
w_vec1 = model[words[1]]
w_vec2 = model[words[2]]

new_vec = model.infer_vector(words)

len_after =  len(model.docvecs)

print np.array_equal(model[words[0]], w_vec0) # True
print np.array_equal(model[words[1]], w_vec1) # True
print np.array_equal(model[words[2]], w_vec2) # True

print len_before == len_after #True
45
Erock