2012-04-26 16 views
11

Sto cercando un algoritmo semplice e leggero per confrontare due stringhe semplici.Algoritmo di parole semplici

Per esempio, se prendiamo questi due stringhe:

  • "The quick brown fox salta sul cane pigro"
  • "La volpe marrone Plick tumps sopra il cane pazzo"

Dovrebbe segnalarmi che le 2 prime lettere della seconda parola sono diverse, ecc.

Per ora ho un algoritmo molto semplice che confronta le parole:

/// <summary> 
    /// Make a diff between two strings and returns words indices 
    /// </summary> 
    /// <param name="a"></param> 
    /// <param name="b"></param> 
    /// <returns></returns> 
    public static List<int> Diff(string a, string b) 
    { 
     List<int> indices = new List<int>(); 

     string[] asplit = a.Split(' '); 
     string[] bsplit = b.Split(' '); 

     for (int i = 0; i < asplit.Length; i++) 
     { 
      if (bsplit.Length > i) 
      { 
       if (asplit[i].CompareTo(bsplit[i]) != 0) 
       { 
        indices.Add(i); 
       } 
      } 
     } 

     return indices; 
    } 

Quindi questo mi dirà quali parole (utilizzando una divisione su caratteri dello spazio) sono diverse.

Ho letto molti argomenti qui intorno sull'implementazione dell'algoritmo complesso o sull'uso di una libreria esistente.

Ma io sono riqualificato dal .NET Compact Framework (WP7) e non voglio qualcosa che possa confrontare due file o due testi, ho solo bisogno di un confronto di parole.

C'è una libreria o un algoritmo che potrebbe adattarsi? Grazie :).

+1

Cosa succede se una parola viene inserita nel mezzo di una delle frasi in modo da deviare la corrispondenza? Dovrebbe riportare ogni parola successiva diversa? –

+9

Il metodo standard per risolvere questo problema consiste nell'implementare l'algoritmo Long Success Common Subsequence. È un algoritmo piuttosto semplice. Ho un'implementazione JScript qui: http://blogs.msdn.com/b/ericlippert/archive/2004/07/21/189974.aspx la conversione in C# è lasciata come esercizio. –

+0

@James Michael Hare: diciamo che ho "il mio piccolo pony" e "il mio dolce piccolo pony", dovrebbe solo riportare "dolce". Penso che il mio algoritmo troppo semplice non riesca per questo. – Valryon

risposta

3

Si potrebbe dare un'occhiata al progetto DiffPlex.

La funzionalità di base è simile a \ DiffPlex \ Differ.cs. Ha persino un visualizzatore Silverlight ma potrebbe richiedere alcuni passaggi.

Edit:

volevo aggiungere che DiffPlex supporta in modo specifico confronto parola secondo la vostra domanda. Potrebbe non essere stato ovvio essere sepolto tra tutti gli altri metodi di confronto di carattere, linea, ecc.

+0

Questo sembra davvero carino, cercherò di integrare solo il core e vedere se non è troppo per il mio piccolo requisito. Grazie! – Valryon

+0

Funziona davvero bene, grazie ancora. Il diff core è davvero leggero e potente, con un'interfaccia facile da capire. Utilizzando un esempio aggiuntivo (UnidiffSeqFormater da http://diffplex.codeplex.com/discussions/254392), sono stato in grado di eseguire una differenza di caratteri complessa in poche righe. – Valryon

Problemi correlati