Confronto di due stringhe grandi per vedere quanto corrispondono [duplicate]

6

C'è un modo semplice per confrontare due diverse dimensioni del testo della stringa per vedere quanto percentuale sono simili?

Ci sto provando, ma mi sto imbattendo in questo problema di seguito. L'area di testo a sinistra è il testo da copiare. Il diritto è l'utente che tenta di copiare il testo (in questo esempio l'utente non ha ottenuto tutto digitato correttamente, ci sono parole errate e alcune parole che l'utente ha dimenticato di digitare).

Dopocheuncontoallarovesciaèscaduto,cercodicalcolarelapercentualediquantol'utentehacopiatocorrettamenteiltestoindicatoasinistra.Esottoasinistrahoiltestodellacaselladitestoinaltoasinistramessoinunarrayusandoilcomandosplit("") sul campo di testo. E in basso a destra faccio lo stesso per il testo inserito dall'utente.

Prima di calcolare quanta percentuale l'utente ha digitato correttamente provo ad avere una somma di quante parole l'utente ha digitato correttamente come mostra il mio codice qui sotto:

for(var counter = 0; counter < userArr.length; counter++)
{
    if(userArr[counter] === textArr[counter])
    {
        correct++;
    }
}

Nell'indice 3 dell'array, l'utente ha digitato in modo errato qualcosa che è ok. Ma all'indice 6 l'utente mancava completamente di digitare una parola. In modo che il resto degli indici venga eliminato almeno da uno per ottenere la quantità di parole digitate correttamente. Senza di ciò non riesco a calcolare la percentuale digitata correttamente.

A me sembra che dovrei creare una serie di controlli condizionali all'interno del ciclo for per tener conto di ciò. Ma sembra un po 'disordinato.

Quindi, tornando alla mia domanda iniziale, c'è un modo semplice per fare questo calcolo senza creare un gran casino di istruzioni if? Esiste un metodo open source o un metodo javascript incorporato per gestire questo?

    
posta CD VA Programmer 21.11.2015 - 03:03
fonte

3 risposte

2

Credo che tu stia cercando Modifica distanza che fornisce un modo numerico per analizzare la vicinanza di due parole, che ovviamente può essere estrapolato su frasi complete.

    
risposta data 21.11.2015 - 04:58
fonte
2

Se non stai utilizzando una funzione di libreria esistente (come l'utilità della riga di comando di Linux diff , la parola T-SQL NEAR , o anche la funzione PHP array_intersect() ), puoi sviluppare il tuo algoritmo per questo ... e ci sono molte varianti possibili ... anche se alcune possono essere complesse. Ecco una bozza di una soluzione che ho trovato. Ha una complessità temporale di O (log (n)) (che significa una quantità decrescente di looping all'interno di un ciclo, che non è particolarmente veloce).

  1. Spezza le parole nelle stringhe in elementi di array basati su spazi bianchi e altri segni di punteggiatura, come ha fatto l'autore sopra.
  2. Inizia a ripetere il primo array.
  3. Confronta il suo 1 ° elemento con il 1 ° elemento del 2 ° array.
  4. Se gli elementi corrispondono, fai comparire i tuoi puntatori (2 ° al 2 °, ecc.) e continua a farlo finché trovi corrispondenze consecutive.
  5. Quando raggiungi una mancata corrispondenza, memorizza i punti iniziale e finale della serie di corrispondenze consecutive (che chiameremo una "sezione comune") in un array separato. Ad esempio, gli elementi di matrice da 4 a 12 nella prima matrice potrebbero corrispondere agli elementi da 7 a 15 nella seconda matrice.
  6. Al primo istante di una mancata corrispondenza, reimpostare i puntatori e tornare indietro per iterare gli array in punti che non sono ancora stati inclusi in una "sezione comune" ... e saltare quelli già contrassegnati come "coperti" "(o contrassegnato in un sottoelemento o coperto da un intervallo di una delle" sezioni comuni "esistenti).
  7. Una volta terminato l'iterazione degli array, "districa" tutte le "sezioni comuni" fuori ordine, privilegiando quelle più lunghe e / o quelle che determinano l'area di copertura più ampia.
  8. Conta i tuoi elementi confrontati con quelli non abbinati al tuo set finale di "sezioni comuni" e calcola una percentuale coperta.
risposta data 21.11.2015 - 03:18
fonte
0

Stai cercando una delle varie forme di modifica distanza . La definizione formale della distanza di modifica è:

Given two strings a and b on an alphabet Σ (e.g. the set of ASCII characters, the set of bytes [0..255], C T A G, etc.), the edit distance d(a, b) is the minimum-weight series of edit operations that transforms a into b.

Da questo, non hai 26 o 28 stringhe, hai una stringa. È grande - ma lo guardi nella sua interezza.

Esistono molti tipi di modifica della distanza che sono focalizzati su diverse trasformazioni e alfabeti. Ad esempio, la distanza Levenshtein funziona sulle trasformazioni di inserimento, cancellazione e sostituzione su una stringa arbitraria, dove come < a href="https://en.wikipedia.org/wiki/Hamming_distance"> La distanza di Hamming è il numero di posizioni in cui due stringhe differiscono. La distanza Damerau-Levenshtein aggiunge la trasposizione di due personaggi adiacenti alla distanza di Levenshtein (così che hte a the è una distanza di 1, non 2) ed è più utile per il controllo ortografico e la variazione del DNA (sebbene il L'algoritmo di Needleman-Wunsch potrebbe funzionare meglio per stringhe di DNA).

    
risposta data 21.11.2015 - 17:10
fonte

Leggi altre domande sui tag