Ähnlichkeit der Score-Matrix-Zeichenfolge


8

Ich habe eine Menge Dokumente, die eine Menge Schlüsselwertpaare enthalten. Der Schlüssel ist möglicherweise nicht eindeutig, sodass möglicherweise mehrere Schlüssel desselben Typs mit unterschiedlichen Werten vorhanden sind.

Ich möchte die Ähnlichkeit der Schlüssel zwischen 2 Dokumenten vergleichen. Insbesondere die String-Ähnlichkeit dieser Werte. Ich denke darüber nach, so etwas wie den Smith-Waterman-Algorithmus zu verwenden, um die Ähnlichkeit zu vergleichen.

Also habe ich ein Bild davon gezeichnet, wie ich über die Darstellung der Daten nachdenke -

Geben Sie hier die Bildbeschreibung ein

Die Werte in den Zellen sind das Ergebnis des Smith-Waterman-Algorithmus (oder einer anderen String-Ähnlichkeitsmetrik).

Bild, dass diese Matrix einen Schlüsseltyp von "Dingen" darstellt Ich muss dann die Ähnlichkeitsbewertung "Dinge" zu einem Vektor von 0 oder 1 hinzufügen. Das ist in Ordnung.

Was ich nicht herausfinden kann, ist, wie ich feststelle, ob die Matrix ähnlich oder nicht ähnlich ist - idealerweise möchte ich die Matrix in eine Zahl zwischen 0 und 1 konvertieren und dann einfach einen Schwellenwert festlegen, um sie entweder als 0 oder als zu bewerten 1.

Irgendwelche Ideen, wie ich eine Partitur der Matrix erstellen kann? Kennt jemand irgendwelche Algorithmen, die diese Art von Dingen machen (offensichtlich sind Dinge wie die Funktionsweise von Smith Waterman anwendbar).


2
Es ist möglicherweise einfacher, Ihre Frage zu beantworten, wenn Sie ein Beispiel für eine Matrix angeben, die Sie als ähnlich wie die erste betrachten würden, und erklären, nach welchen Eigenschaften Sie hinsichtlich der Ähnlichkeit suchen. Oder wenn es hier ein allgemeines Ziel gibt, welche Aufgabe möchten Sie erfüllen?
Air

Ja, ich würde gerne ein Beispiel sehen, wie eine 1 aussehen würde und wie eine 0 aussehen würde.
Ben

Antworten:


2

Wie ich verstanden habe, können Dokument 1 und Dokument 2 unterschiedliche Anzahlen von Schlüsseln haben. Und Sie erhalten eine endgültige Ähnlichkeitsbewertung zwischen 0 und 1. Wenn ja, würde ich folgenden Algorithmus vorschlagen:

  1. Summe von max. vals ist gleich 0.
  2. Wählen Sie den Maximalwert aus der doc-doc-Matrix aus und addieren Sie ihn zur Summe von max. vals.
  3. Entfernen Sie Zeile und Spalte mit dem Maximalwert aus der Matrix.
  4. Wiederholen Sie die Schritte 2-3, bis Zeilen oder Spalten beendet sind.
  5. Nennsumme von max. Werte nach durchschnittlicher Anzahl von Schlüsselwörtern in zwei Texten.

Die endgültige Schätzung wäre gleich 1, wenn beide Dokumente die gleiche Länge haben und jedes Wort aus Dokument 1 in Dokument 2 gleichwertig ist.

Sie haben keine Software erwähnt, die Sie verwenden, aber hier ist R Beispiel für Funktion, wie ähnlichkeitsberechnende (es dauert Objekt der Klasse Matrix als Eingabe):

eval.sim <- function(sim.matrix){
  similarity <- 0
  denominator <- sum(dim(sim.matrix)) / 2
  for(i in 1:(min(c(nrow(sim.matrix), ncol(sim.matrix))) - 1)){
    extract <- which(sim.matrix == max(sim.matrix), arr.ind=T)[1, ]
    similarity <- similarity + sim.matrix[extract[1], extract[2]]
    sim.matrix <- sim.matrix[-extract[1], -extract[2]]
  }
  similarity <- similarity + max(sm.copy)
  similarity <- similarity / denominator
}

In Python -

import numpy as np

def score_matrix(sim_matrix):
    similarity = 0
    denominator = sum(sim_matrix.shape) / 2
    for i in range(min(sim_matrix.shape)):
        x, y = np.where(sim_matrix == np.max(sim_matrix))[0][0], np.where(sim_matrix == np.max(sim_matrix))[1][0]
        similarity += sim_matrix[x, y]
        sim_matrix = np.delete(sim_matrix,(x),axis=0)
        sim_matrix = np.delete(sim_matrix,(y),axis=1)
    return similarity / denominator

Dies scheint ziemlich gut zu funktionieren, außer dass die Zahlen zwischen 0 und 1 skaliert werden. Sie sind sich nicht sicher, ob die Python-Version wie beabsichtigt ist?
David

Ich habe deine Python-Version vereinfacht. Und was ist falsch an der Skalierung? Unter der Annahme, dass alle Werte in der ursprünglichen Matrix zwischen 0 und 1 liegen, sollte das Ergebnis ebenfalls dieselbe Skala haben.
Sobach

An der Skalierung ist jetzt nichts mehr auszusetzen ... Ich muss einen Fehler in meinem Code gehabt haben. Vielen Dank für die Hilfe, die auf meinem Datensatz großartig funktioniert
David

2

Wenn Sie Ihre Matrix in eine Zahl umwandeln möchten (Ihr Ähnlichkeitsmaß), möchten Sie möglicherweise eine Matrixnorm verwenden .

Wenn Sie beispielsweise die Frobenius-Norm in Ihrem Beispiel verwenden, wird 1.488086 zurückgegeben.


Es stimmt, ich hatte Normen vergessen, ich werde diesen Dank untersuchen.
David

0

Ich denke, Ihr Ziel ist es, herauszufinden, wie ähnlich zwei Dokumente sind. Wenn dies der Fall ist, schlage ich vor, folgenden Algorithmus anzuwenden:

Dieser Ansatz gibt an, wie ähnlich Doc1 Doc2 ist. (Die Ähnlichkeitswerte für Doc2 und Doc1 sind unterschiedlich, wenn es sich nicht um eine quadratische Matrix handelt.)

  1. Ermitteln Sie in Ihrer Matrix zwischen Doc1 und Doc2 zeilenweise den maximalen Ähnlichkeitswert.
    1. Nehmen Sie die Summe und dividieren Sie durch die Anzahl der Zeilen
    2. Dies gibt Ihnen den Ähnlichkeitsindex. Zum Beispiel. In Ihrem Matrixbild sehe ich die maximale Ähnlichkeit Zeile für Zeile: 0,88, 1, 0,6 Also (0,88 + 1 + 0,6) / 3 = 82,67%

Dies bedeutet, dass Doc2 zu 82,67% Doc1 ähnlich ist . Die Ähnlichkeit kann diesen Wert nicht überschreiten, da wir in jeder Zeile maximal ähnliche Elemente ausgewählt haben.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.