Somiglianza della stringa della matrice del punteggio


8

Ho un sacco di documenti, che contengono un sacco di coppie chiave-valore. La chiave potrebbe non essere univoca, quindi potrebbero esserci più chiavi dello stesso tipo con valori diversi.

Voglio confrontare la somiglianza delle chiavi tra 2 documenti. Più in particolare la somiglianza delle stringhe di questi valori. Sto pensando di usare qualcosa come l' algoritmo di Smith-Waterman per confrontare la somiglianza.

Quindi ho disegnato un'immagine di come sto pensando di rappresentare i dati -

inserisci qui la descrizione dell'immagine

I valori nelle celle sono il risultato dell'algoritmo smith-waterman (o di qualche altra metrica di somiglianza delle stringhe).

Immagine che questa matrice rappresenta un tipo chiave di "cose", quindi ho bisogno di aggiungere il punteggio di somiglianza "cose" in un vettore di 0 o 1. Va bene.

Quello che non riesco a capire è come determinare se la matrice è simile o non simile - idealmente voglio convertire la matrice in un numero compreso tra 0 e 1 e quindi imposterò una soglia per segnarla come 0 o 1.

Qualche idea su come posso creare un punteggio della matrice? Qualcuno conosce qualche algoritmo che fa questo tipo di cose (ovviamente cose come smith waterman funziona in un certo senso).


2
Potrebbe essere più semplice rispondere alla tua domanda se fornissi un esempio di matrice che considereresti simile alla prima e spiegando quali qualità stai cercando in termini di somiglianza. O se qui c'è un obiettivo generale, qual è il compito che intendi realizzare?
Air

Sì, mi piacerebbe vedere un esempio di come sarebbe un 1 e che aspetto avrebbe uno 0.
Ben

Risposte:


2

Come ho capito, il documento 1 e il documento 2 possono avere un numero diverso di chiavi. E tu bacchetta per ottenere la valutazione finale della somiglianza tra 0 e 1. In tal caso, proporrei il seguente algoritmo:

  1. Somma di max. vals è uguale a 0.
  2. Seleziona il valore massimo dalla matrice doc-doc e aggiungilo alla somma di max. vals.
  3. Rimuovi riga e colonna con il valore massimo dalla matrice.
  4. Ripetere i passaggi 2-3 fino al termine delle righe o delle colonne.
  5. Somma nominale di max. val per numero medio di parole chiave in due testi.

La stima finale sarebbe uguale a 1, se entrambi i documenti hanno lunghezza identica e ogni parola del Doc 1 ha un equivalente nel Doc 2.

Non hai menzionato il software che stai utilizzando, ma qui c'è un esempio di funzione R , che calcola tale somiglianza (accetta come input l'oggetto della matrice di classe):

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 pitone -

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

Questo sembra funzionare abbastanza bene tranne il ridimensionamento dei numeri tra 0 e 1. Non sei sicuro che la versione di Python sia come previsto?
David,

Ho semplificato la tua versione di Python. E cosa c'è di sbagliato nel ridimensionamento? Supponendo che tutti i valori nella matrice originale siano compresi tra 0 e 1, anche il risultato dovrebbe essere della stessa scala.
Sobach,

Ora non c'è niente di sbagliato nel ridimensionamento ... Devo aver avuto un bug nel mio codice. Grazie per l'aiuto funziona perfettamente nel mio set di dati
David,

2

Se il tuo obiettivo è trasformare la tua matrice in un numero (la tua misura di somiglianza), potresti voler usare una norma matriciale .

Ad esempio, l'utilizzo della norma Frobenius sul tuo esempio restituirebbe 1.488086.


È vero, mi ero dimenticato delle norme, esaminerò questo grazie.
David,

0

Penso che il tuo obiettivo sia scoprire quanto siano simili due documenti, in tal caso suggerisco di applicare il seguente algoritmo:

Questo approccio fornisce quanto Doc1 è simile a Doc2. (I valori di similarità saranno diversi per Doc2 wrt Doc1 se non è una matrice quadrata)

  1. Nella tua matrice tra Doc1 e Doc2, ottieni il massimo valore di somiglianza riga per riga.
    1. Prendi la somma e dividi per numero di righe
    2. Questo ti darà l'indice di somiglianza. Per es. Nell'immagine matrice, vedo che la massima somiglianza riga per riga è: 0,88, 1, 0,6 Quindi (0,88 + 1 + 0,6) / 3 = 82,67%

Ciò significa che Doc2 è simile all'82,67% di Doc1 . La somiglianza non può andare oltre questo valore poiché abbiamo selezionato un numero massimo di elementi simili in ogni riga.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.