2012-04-26 27 views
11

Actualmente estoy buscando un algoritmo simple y ligero para comparar dos cadenas simples.Algoritmo de diferencia de palabra simple

Por ejemplo, si tomamos esos dos cadenas:

  • "El rápido zorro marrón salta sobre el perro perezoso"
  • "El zorro marrón plick tumps sobre el perro loco"

Debería indicarme que las 2 primeras letras de la segunda palabra son diferentes, etc.

Por ahora tengo un algoritmo muy simple que compara palabras:

/// <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; 
    } 

Así que esto me va a decir qué palabras (usando un espacio dividido en caracteres) son diferentes.

He leído muchos temas aquí sobre la implementación de algoritmos complejos o el uso de una biblioteca existente.

Pero estoy entrenado por .NET compact framework (WP7) y no quiero algo que pueda comparar dos archivos o dos textos, solo necesito una comparación de palabras.

¿Hay alguna biblioteca o algoritmo que pueda caber? Gracias :).

+1

¿Qué sucede si una palabra se inserta en el medio de una de las oraciones, por lo que sesga la coincidencia? ¿Debería informar cada palabra siguiente diferente? –

+9

La forma estándar de resolver este problema es implementar el algoritmo de subsecuencia común más larga. Es un algoritmo bastante directo. Tengo una implementación de JScript aquí: http://blogs.msdn.com/b/ericlippert/archive/2004/07/21/189974.aspx convirtiéndolo en C# se deja como un ejercicio. –

+0

@James Michael Hare: digamos que tengo "mi pequeño pony" y "mi dulce pequeño pony", solo debería informar "dulce". Creo que mi algoritmo demasiado simple falla para esto. – Valryon

Respuesta

3

Puede echar un vistazo al proyecto DiffPlex.

La funcionalidad principal parece que está en \ DiffPlex \ Differ.cs Incluso tiene un visor Silverlight pero podría requerir un poco de portabilidad.

Editar:

que quería añadir que DiffPlex apoya específicamente comparación palabra como por su pregunta. Podría no haber sido obvio ser enterrado entre todos los otros métodos de comparación de caracteres, líneas, etc.

+0

Esto parece realmente bueno, intentaré integrar solo el núcleo y ver si no es demasiado para mi pequeño requerimiento. Gracias! – Valryon

+0

Funciona muy bien, gracias de nuevo. El núcleo del difusor es realmente ligero y potente, con una interfaz fácil de entender. Utilizando un ejemplo adicional (UnidiffSeqFormater de http://diffplex.codeplex.com/discussions/254392), pude realizar un diff complejo de caracteres en pocas líneas. – Valryon

Cuestiones relacionadas