2016-03-23 2 views
2

Ich habe ein Word2Vec-Modell mit Python und gensim in meinem Korpus berechnet.Mit NearestNeighbors und Word2vec, um Satzähnlichkeit zu erkennen

Dann berechnete ich den Mittelwert word2vec Vektor für jeden Satz (Mittelung aller Vektoren für alle Wörter im Satz) und speicherte es in einem Pandas Datenrahmen. Die Spalten des Pandas Datenrahmen df sind:

  • Satz
  • Buchtitel (das Buch, in dem der Satz stammt)
  • mean-Vektor (der Mittelwert der word2vec Vektoren im Satz - Größe
  • 100)

ich versuche scikit-learn zu verwenden NearestNeighbors Satz Ähnlichkeit zu erkennen (ich wahrscheinlich doc2vec stattdessen verwenden könnte, aber eines der Ziele ist es, dieses Verfahren gegen doc2vec vergleichen).

Dies ist mein Code:

X = df['mean_vector'].values 
nbrs = NearestNeighbors(n_neighbors=2, algorithm='ball_tree').fit(X) 

ich die folgende Fehlermeldung erhalten:

ValueError: setting an array element with a sequence. 

Ich denke, irgendwie sollte ich die Vektoren, iteriert die nächsten Nachbarn auf einer row == sentence Basis berechnen zu können, von jeder Reihe, aber es scheint, dass dies meine derzeitigen (begrenzten) Python-Fähigkeiten übersteigt.

Dies sind die Daten der ersten Zelle in df['mean_vector'][0]. Es ist eine vollständige Vektorgröße 100 gemittelt über die Vektoren des Satzes.

array([ -2.14208905e-02, 2.42093615e-02, -5.78106642e-02, 
    1.32915592e-02, -2.43393257e-02, -1.41872400e-02, 
    2.83471867e-02, -2.02910602e-02, -5.49359620e-02, 
    -6.70913085e-02, -5.56188896e-02, -2.95186806e-02, 
    4.97652516e-02, 7.16793686e-02, 1.81338750e-02, 
    -1.50108105e-02, 1.79438610e-02, -2.41483524e-02, 
    4.97504435e-02, 2.91026086e-02, -6.87966943e-02, 
    3.27585079e-02, 5.10644279e-02, 1.97029337e-02, 
    7.73109496e-02, 3.23865712e-02, -2.81659551e-02, 
    -9.69715789e-03, 5.23059331e-02, 3.81100960e-02, 
    -3.62489261e-02, -3.40068117e-02, -4.90736961e-02, 
    8.72346922e-04, 2.27111522e-02, 1.06063476e-02, 
    -3.93234752e-02, -1.10617064e-01, 8.05142429e-03, 
    4.56497036e-02, -1.73281748e-02, 2.35153548e-02, 
    5.13465842e-03, 1.88336968e-02, 2.40451116e-02, 
    3.79024050e-03, -4.83284928e-02, 2.10295208e-02, 
    -4.92134318e-03, 1.01532964e-02, 8.02216958e-03, 
    -6.74675079e-03, -1.39653292e-02, -2.07276996e-02, 
    9.73508134e-03, -7.37899616e-02, -2.58320477e-02, 
    -1.10700730e-05, -4.53227758e-02, 2.31859135e-03, 
    1.40053956e-02, 1.61973312e-02, 3.01702786e-02, 
    -6.96818605e-02, -3.47468331e-02, 4.79541793e-02, 
    -1.78820305e-02, 5.99209731e-03, -5.92620336e-02, 
    7.34678581e-02, -5.23381204e-05, -5.07357903e-02, 
    -2.55154949e-02, 5.06089740e-02, -3.70467864e-02, 
    -2.04878468e-02, -7.62404222e-03, -5.38200373e-03, 
    7.68705690e-03, -3.27000804e-02, -2.18365286e-02, 
    2.34392099e-03, -3.02998684e-02, 9.42565035e-03, 
    3.24523374e-02, -1.10793915e-02, 3.06244520e-03, 
    -1.82240941e-02, -5.70741761e-03, 3.13486941e-02, 
    -1.15621388e-02, 1.10221673e-02, -3.55655849e-02, 
    -4.56304513e-02, 5.54837054e-03, 4.38252240e-02, 
    1.57828294e-02, 2.65670624e-02, 8.08797963e-03, 
    4.55569401e-02], dtype=float32) 

Ich habe auch versucht zu tun:

for vec in df['mean_vector']: 
X = vec 
nbrs = NearestNeighbors(n_neighbors=2, algorithm='ball_tree').fit(X) 

Aber ich folgende Warnung nur erhalten:

DeprecationWarning: Passing 1d arrays as data is deprecated in 0.17 and willraise ValueError in 0.19. Reshape your data either using X.reshape(-1, 1) if your data has a single feature or X.reshape(1, -1) if it contains a single sample. 

Wenn es ein Beispiel auf Github mit word2vec und NearestNeighbors in ähnlicher ist Szenario würde ich es gerne sehen.

+1

wie funktioniert X aussehen? Können Sie Frage mit Probe X aktualisieren? –

+0

Benötigen Sie Daten für ein MWE. Ich habe gerade "NearestNeighbors" mit Daten von 'Gensim' getestet und es hat mir gut funktioniert. – ncfirth

+0

@Abhishek Thakur Ich habe einen Beispielvektor hinzugefügt (es gibt einen für jeden Satz im Korpus, also ist es eine ganze Zahl). – Enzo

Antwort

2

Der Grund für die Bearbeitung eines Fehlers ist, dass sklearn eine 2D-Eingabe erwartet, wobei sich jedes Beispiel in einer neuen Zeile befindet. Sie können entweder X.reshape(1, -1) oder [X] verwenden, die erste ist eine bessere Übung. Ohne die rohen Daten oder ein richtiges MWE ist es schwer zu sagen, dass genau das falsch läuft, aber ich vermute, dass etwas schief läuft, entweder indem man die Daten in den Datenrahmen einfügt oder aus dem Datenrahmen entfernt. Überprüfen Sie, ob X.shape für Sie sinnvoll ist.

Unten ist das Beispiel, das ich verwenden, um alles für mich zu überprüfen gearbeitet:

from sklearn.neighbors import NearestNeighbors 
from gensim.models import Word2Vec 
import numpy as np 

a = """Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore 
magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea 
commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla 
pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est 
laborum.""" 
a = [x.split(' ') for x in a.split('\n') if len(x)] 
model = Word2Vec(a, min_count=1) 

# Get the average of all of the words to get data for a sentence 
b = np.array([np.mean([model[xx] for xx in x], axis=0) for x in a]) 
# Check it's the correct shape 
print b.shape 

nbrs = NearestNeighbors(n_neighbors=2, algorithm='ball_tree').fit(b) 
+0

Ich denke, mein Problem ist, dass ich einen Pandas-Datenrahmen verwende, um die mittleren Vektoren zu speichern. 'drucken (df ['mean_vector'].shape) 'gibt' (67680,) 'aber' X = df ['mean_vector']. reshape (1, -1) 'und' nbrs = NearestNeighbors (n_neighbors = 2, algorithm = 'ball_tree'). fit (X) '' gibt immer noch 'setzen ein Array-Element mit einer Sequenz. ' – Enzo

+0

Wie viele Sätze gibt es in Ihrem Datenrahmen, 67680? Wenn ja, dann würde man erwarten, dass die Größe von 'X' zurückkehrt. (67680,100)' – ncfirth

+0

Wenn ich Ihr Beispiel betrachte (sehr nützlich!), Denke ich, dass das Problem in der Form meines Datenrahmens liegt. Ich bin mir nicht sicher, wie ich das beheben kann ... – Enzo

Verwandte Themen