2017-04-20 3 views
0

Ich habe eine Liste von doppelten Dokumentpaaren in einer CSV-Datei gespeichert. Jede ID aus der Spalte 1 ist ein Duplikat an die entsprechende ID in Spalte 2 Die Datei etwas geht: istKosinusähnlichkeit für bereits bekannte Duplikatpaare

Document_ID1 Document_ID2 
12345   87565 
34546   45633 
56453   78645 
35667   67856 
13636   67845 

Jedes Dokument-ID mit dem Text zugeordnet, die woanders gespeichert wird. Ich habe diesen Text gezogen und jede Spalte mit IDs und zugehörigen Texten in zwei lsm-Datenbanken gespeichert.
So habe ich db1, die die IDs alle von Document_ID1 als Schlüssel hat und die entsprechenden Texte wie die Werte für die jeweiligen Tasten. Daher wie ein Wörterbuch. In ähnlicher Weise db2 für alle IDs von Document_ID2.
Also, wenn ich sage, db1[12345], erhalte ich den Text mit der ID zugeordnet 12345.

Nun, ich möchte die Cosinus Ähnlichkeitswerte zwischen jedem dieser Paare bekommen, um ihre doppelte Heit zu bestimmen. Bis jetzt habe ich ein Tfidf-Modell ausgeführt, um das Gleiche zu tun. Ich habe eine tfidf-Matrix mit allen Dokumenten in db1 als Corpus erstellt und die Kosinusähnlichkeit jedes der tfidf-Vektoren von db2 mit der tfidf-Matrix gemessen. Aus Sicherheitsgründen kann ich den vollständigen Code nicht bereitstellen. Code lautet wie folgt:

# Generator function to pick one key (document) at a time for comparison against other documents 
def generator(db): 
    for key in db.keys(): 
     text = db[key] 
     yield text 

# Use spaCy to create a function to preprocess text from the generator function 
nlp = spacy.load('en') 
def spacy(generator_object): 
    for doc in generator_object: 
     words = <code to make words lower case, remove stop words, spaces and punctuations> 
     yield u' '.join(words) 

# TF-IDF Vectorizer 
tfidf = TfidfVectorizer(min_df = 2) 

# Applying tf-idf transformer to each key from db1 individually in the generator function. 
tfidf_matrix = tfidf.fit_transform(spacy(generator(db1))) 

# Function to calculate cosine similarity values between the tfidf matrix and the tfidf vector of a new key 
def similarity(tfidf_vector, tfidf_matrix, keys):  
    sim_vec = <code to get cosine similarity> 
    return sim_vec.sort_values(ascending=False) 

# Applying tf-idf transformer on db2 keys on a loop and getting cosine similarity scores for each key from db2. 
for key in db2.keys(): 
    # Create a new temporary db for each key from db2 to enter into generator function 
    new = <code to create a temporary new lsm database> 
    text = db2[key] 
    new[key] = text 
    new_key = <code to get next key from the temporary new lsm database> 
    tfidf_vector = tfidf.transform(spacy_proc(corpus_gen(new))) 
    similarity_values = similarity(tfidf_vector, tfidf_matrix, list(db1.keys())) 
    for idx, i in similarity_values.iteritems(): 
      print new_key, idx, i 
    del new[key] 

Aber das gibt mir Kosinusähnlichkeit Noten gegen alle Tasten in db1 für jeden Schlüssel in db2. Beispiel: Wenn in db2 5 Schlüssel in db1 und 5 Schlüssel vorhanden sind, erhalte ich als Ergebnis 25 Zeilen mit diesem Code.
Was ich will, ist die Cosinus Ähnlichkeit Noten nur für entsprechende Schlüssel aus db1 für den Schlüssel in db2 erhalten. Das heißt, wenn es in db1 und db2 jeweils 5 Schlüssel gibt, sollte ich nur 5 Zeilen haben - die Cosinus-Ähnlichkeitsbewertung nur für jedes Duplikatpaar.

Wie soll ich meinen Code optimieren, um das zu bekommen?

Antwort

0

Da gibt es noch keine definitive Antwort, ich bekomme den Dataframe mit allen Zeilen (25 Zeilen des Ergebnisses wie im obigen Beispiel) und inner-Beitritt/Zusammenführung mit einem Datenrahmen, der die Liste der doppelten Paare hat (dh die 5 Zeilen der Ausgabe, die ich brauche). Auf diese Weise hat der resultierende Datenrahmen die Ähnlichkeitswerte für die doppelten Dokumentpaare. Dies ist eine temporäre Lösung. Wenn jemand eine sauberere Lösung finden kann, werde ich das als Antwort akzeptieren, wenn es funktioniert.

Verwandte Themen