Finden der ähnlichsten Sätze unter allen in Python
Vorschläge / Links / Codes werden geschätzt.
Ich habe Daten mit mehr als 1500 Zeilen. Jede Zeile hat einen Satz. Ich versuche, die beste Methode zu finden, um die ähnlichsten Sätze unter allen zu finden.
Was ich versucht habe
Ich habe einen K-Mean-Algorithmus ausprobiert, der ähnliche Sätze in einem Cluster gruppiert. Aber ich habe einen Nachteil gefunden, bei dem ich K übergeben muss , um einen Cluster zu erstellen. Es ist schwer zu erraten , K . Ich habe die Elbo-Methode ausprobiert, um die Cluster zu erraten, aber eine Gruppierung reicht nicht aus. Bei diesem Ansatz werden alle Daten gruppiert. Ich suche nach Daten, die über 0,90% ähnlich sind. Daten sollten mit ID zurückgegeben werden.
Ich habe die Kosinusähnlichkeit ausprobiert, bei der ich
TfidfVectorizereine Matrix erstellt habe, und dann die Kosinusähnlichkeit übergeben. Auch dieser Ansatz hat nicht richtig funktioniert.
Was ich suche
Ich möchte einen Ansatz, bei dem ich ein Schwellenwertbeispiel übergeben kann. Beispiel 0,90 Daten in allen Zeilen, die einander über 0,90% ähnlich sind, sollten als Ergebnis zurückgegeben werden.
Data Sample
ID | DESCRIPTION
-----------------------------
10 | Cancel ASN WMS Cancel ASN
11 | MAXPREDO Validation is corect
12 | Move to QC
13 | Cancel ASN WMS Cancel ASN
14 | MAXPREDO Validation is right
15 | Verify files are sent every hours for this interface from Optima
16 | MAXPREDO Validation are correct
17 | Move to QC
18 | Verify files are not sent
Erwartetes Ergebnis
Über Daten, die bis zu 0,90% ähnlich sind, sollte als Ergebnis mit ID erhalten werden
ID | DESCRIPTION
-----------------------------
10 | Cancel ASN WMS Cancel ASN
13 | Cancel ASN WMS Cancel ASN
11 | MAXPREDO Validation is corect # even spelling is not correct
14 | MAXPREDO Validation is right
16 | MAXPREDO Validation are correct
12 | Move to QC
17 | Move to QC
Antworten
Warum hat es bei Ihnen mit Cosinus-Ähnlichkeit und dem TFIDF-Vektorisierer nicht funktioniert?
Ich habe es versucht und es funktioniert mit diesem Code:
import pandas as pd
import numpy as np
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.metrics.pairwise import cosine_similarity
df = pd.DataFrame(columns=["ID","DESCRIPTION"], data=np.matrix([[10,"Cancel ASN WMS Cancel ASN"],
[11,"MAXPREDO Validation is corect"],
[12,"Move to QC"],
[13,"Cancel ASN WMS Cancel ASN"],
[14,"MAXPREDO Validation is right"],
[15,"Verify files are sent every hours for this interface from Optima"],
[16,"MAXPREDO Validation are correct"],
[17,"Move to QC"],
[18,"Verify files are not sent"]
]))
corpus = list(df["DESCRIPTION"].values)
vectorizer = TfidfVectorizer()
X = vectorizer.fit_transform(corpus)
threshold = 0.4
for x in range(0,X.shape[0]):
for y in range(x,X.shape[0]):
if(x!=y):
if(cosine_similarity(X[x],X[y])>threshold):
print(df["ID"][x],":",corpus[x])
print(df["ID"][y],":",corpus[y])
print("Cosine similarity:",cosine_similarity(X[x],X[y]))
print()
Der Schwellenwert kann ebenfalls angepasst werden, liefert jedoch nicht die gewünschten Ergebnisse mit einem Schwellenwert von 0,9.
Die Ausgabe für einen Schwellenwert von 0,4 ist:
10 : Cancel ASN WMS Cancel ASN
13 : Cancel ASN WMS Cancel ASN
Cosine similarity: [[1.]]
11 : MAXPREDO Validation is corect
14 : MAXPREDO Validation is right
Cosine similarity: [[0.64183024]]
12 : Move to QC
17 : Move to QC
Cosine similarity: [[1.]]
15 : Verify files are sent every hours for this interface from Optima
18 : Verify files are not sent
Cosine similarity: [[0.44897995]]
Bei einem Schwellenwert von 0,39 sind alle erwarteten Sätze Merkmale in der Ausgabe, es kann jedoch auch ein zusätzliches Paar mit den Indizes [15,18] gefunden werden:
10 : Cancel ASN WMS Cancel ASN
13 : Cancel ASN WMS Cancel ASN
Cosine similarity: [[1.]]
11 : MAXPREDO Validation is corect
14 : MAXPREDO Validation is right
Cosine similarity: [[0.64183024]]
11 : MAXPREDO Validation is corect
16 : MAXPREDO Validation are correct
Cosine similarity: [[0.39895808]]
12 : Move to QC
17 : Move to QC
Cosine similarity: [[1.]]
14 : MAXPREDO Validation is right
16 : MAXPREDO Validation are correct
Cosine similarity: [[0.39895808]]
15 : Verify files are sent every hours for this interface from Optima
18 : Verify files are not sent
Cosine similarity: [[0.44897995]]
Eine mögliche Möglichkeit wäre die Verwendung von Worteinbettungen, um Vektordarstellungen Ihrer Sätze zu erstellen. So wie Sie vorab trainierte Worteinbettungen verwenden und eine RNN-Ebene eine Satzvektordarstellung erstellen lassen, in der die Worteinbettungen jedes Satzes kombiniert werden. Dann haben Sie einen Vektor, in dem Sie Entfernungen zwischen berechnen können. Sie müssen jedoch entscheiden, welchen Schwellenwert Sie festlegen möchten, damit ein Satz als ähnlich akzeptiert wird, da die Skalen für Worteinbettungen nicht festgelegt sind.
Aktualisieren
Ich habe einige Experimente gemacht. Meiner Meinung nach ist dies eine praktikable Methode für eine solche Aufgabe. Sie möchten jedoch möglicherweise selbst herausfinden, wie gut sie in Ihrem Fall funktioniert. Ich habe ein Beispiel in meinem Git- Repository erstellt .
Auch der Word-Mover-Distanz-Algorithmus kann für diese Aufgabe verwendet werden. Weitere Informationen zu diesem Thema finden Sie in diesem Artikel .