2016-12-07 1 views
0

J'utilise gensim pour construire un corpus LSI, puis appliquer la similarité de requête suivante tutoriels gensim (tut1, tut2 n tut3)cartographie doc2id dans gensim

Mon problème est que lorsque je tente de calcualte similitude de requête comme indiqué dans le code ci-dessous je reçois le résultat sous forme de tuples (docID, simScore).

je dois utiliser que docID retrive une chaîne représentant du document. (Similaire à la cartographie token2id dans le corpora.Dictionary)

recherche sur Google que je ne pouvais pas trouver quelque chose d'utile

Mon code pour la recherche

def search(self): 
    #Load necessary information 
    dictionary = corpora.Dictionary.load('dictionary.dict') 
    corpus_tfidf = corpora.MmCorpus('corpus.mm') # comes from the first tutorial, "From strings to vectors" 
    #print(corpus_tfidf) 

    #Generate LSI model 
    #lsi = models.LsiModel(corpus, id2word=dictionary, num_topics=2) 
    lsi = LsiModel(corpus_tfidf,num_topics=2) 

    #construct index 
    index = similarities.MatrixSimilarity(lsi[corpus_tfidf]) # transform corpus to LSI space and index it 

    #Construct query vector 
    doc = "Human machine interface for lab abc computer applications" 
    vec_bow = dictionary.doc2bow(doc.lower().split()) 
    vec_lsi = lsi[vec_bow] # convert the query to LSI space 

    #Calcualte similarity 
    sims = index[vec_lsi] # perform a similarity query against the corpus 
    sims = sorted(enumerate(sims), key=lambda item: -item[1]) 

    print(sims) # print sorted (document number, similarity score) 2-tuples 

Résultats de l'échantillon

[(1, 0.9962855), (4, 0.99420911), (2, 0.98064679), (3, 0.97580492), (0, 0.9755646), (8, 0.34740543), (6, 0.1566827), (7, 0.15566549), (5, 0.13825497)] 

Répondre

0

Vous avez un corpus de documents, ce que je suppose est un liste de textes, vous avez également une liste de similarités, contenant des ID de docs. Vous pouvez donc la carte id de des textes avec quelque chose comme ceci:

corpus = ['a','b','c'] 
sims = [(0,0.1),(1,0.2),(2,0.3)] 
labeled_sims = [(corpus[id],sim) for id,sim in sims] 

qui retournera:

[('a',0.1),('b',0.2),('c',0.3)] 

ou bien vous pouvez simplement le faire avant le tri:

labeled_sims = zip(corpus,sims) 

qui retournera :

[('a',(0,0.1)),('b',(1,0.2)),('c',(2,0.3))] 

qui peut être trié avec:

labeled_sims = sorted(enumerate(labeled_sims), key=lambda item: -item[1][1])