Enfoque heurístico para la implementación flexible de DIFF

12

He creado una implementación DIFF para comparar revisiones de documentos en el trabajo. Se basa en un algoritmo de diferencia An O (ND) y sus variaciones .

Una cosa que se ha vuelto importante es tomar la lista de cambios e interpretarlos en texto legible para humanos. Si bien el algoritmo actual es muy eficiente, lo es tanto que es difícil ampliarlo.

Pregunta corta

Estaba pensando en tratar de usar A * y una heurística que agrega penalizaciones por "turnos". La idea es suavizar innecesariamente "agregar, eliminar, agregar, eliminar, agregar, eliminar" para que sea más fácil analizar algo que un humano pueda leer. Básicamente, convierta mi problema de ruta más corta en un problema de ruta más simple .

Y, por supuesto, no crear resultados que siempre sean "Eliminar todo , Agregar todo "

¿Suena esto razonable?

¿Hay alguna prioridad para usar una heurística en una implementación DIFF? ¿Qué es la heurística?

El problema:

Si se elimina una oración larga y se elimina otra oración larga, pero comparten al menos una palabra, diga "con". Dejar solo la palabra común (al no agregarla ni eliminarla) creará el camino más corto. Sin embargo, esto realmente ofusca el contexto del cambio a un humano que intenta leer una impresión de los cambios.

Ejemplo con DIFF actual:

  • Texto antiguo: Limpiar: Powerwash y secar con aire comprimido.
  • Texto nuevo: Limpiar: Limpiar con acetona y un paño sin pelusa.
  • Cambiar lista de notas:
    • Cambie "Powerwash and blow dry" a "Limpie con acetona"
    • Cambie "aire de tienda" a "acetona y un paño sin pelusa"

Nota: "Cambiar" se usa en lugar de "eliminar 'shop air', agregar 'acetona'"

Como puede ver, la segunda nota pierde TODO el contexto y sin mirar aún los conjuntos de texto completo de texto antiguo y nuevo no puede comprender lo que significa.

Nota sobre la puntuación:

He delimitado la puntuación como "palabras" separadas para obtener

  • Añadir "("

en lugar de

  • Cambie "Reparar" a "(Reparar"

porque esto era desagradable. Sin embargo, eso significa que si incluso hay una coma en ambos textos (a diferencia de la palabra "con" en el ejemplo anterior) sucede lo mismo.

Solución posible:

Creo que podría utilizar un algoritmo de búsqueda de ruta diferente que me da la flexibilidad para agregar peso a las diferentes "rutas" de cambio que podrían tener más sentido para una persona. Tal vez, incluso podría hacer que viajar a los nodos que contienen puntuación tenga poco peso (no estoy seguro de cómo esto afectaría otras cosas).

Entonces podría obtener el ejemplo anterior para enumerar lo siguiente:

  • Cambiar lista de notas:
    • Cambie "Powerwash y seque con aire de taller" a "Limpie con acetona y un paño sin pelusa"

¡Ver! Mucho más claro!

Sé que tomaría un éxito en el rendimiento, y podría tener que hacer una revisión bastante importante de mi programa, pero es más importante tener el resultado final que quiero.

Línea de fondo:

Nuevamente, ¿hay alguna prioridad para usar una heurística en una implementación DIFF, y qué es?

¿Otros pensamientos? ¿Una inversión de tiempo razonable? ¿Otras ideas? Otros algoritmos?

¡Gracias por adelantado!

EDITAR:

Traté de aclarar / solidificar mi pregunta y generalizarla para agregar una heurística a mi algoritmo, en lugar de usar A *. Básicamente lo mismo en este caso, pero todavía pienso más preciso ahora. Esta publicación fue perspicaz.

ptpaterson
fuente

Respuestas:

1

Puede hacerlo en una versión similar a vimdiff:

Paso 1: identificación de oraciones agregadas, eliminadas y modificadas.

Paso 2: para cada oración modificada, ubique la primera y la última palabra cambiada, y corte cualquier cosa que no esté entre estas dos palabras.

Si necesita mantener una estructura gramatical más coherente, mire las partes internas de http://www.languagetool.org/ u otra que se muestra en esta publicación .

Acerca de la presentación: puede presentar ambas versiones de esa oración una debajo de la otra. Es posible que desee mostrar el contexto para cada cambio. Para inspirarse, mire latexdiff, que puede imprimir el texto agregado en azul en su lugar final en la versión final del texto, y el texto eliminado en las notas al pie (incluso compatible con \usepackage[para]{footmisc}).

usuario2987828
fuente
Esto solo aborda problemas de visualización, no la cuestión principal de la coincidencia heurística.
Adam Zuckerman
¿Leíste mi segundo párrafo?
user2987828
Yo hice. ¿Podría ampliar lo que está tratando de explicar? Mi primera (y segunda) lectura me llevó a pensar que todavía describías cómo mostrar la información, no cómo procesarla.
Adam Zuckerman
Actualmente puedo usar html para formatear las adiciones y eliminaciones, el visor de edición de stackexchange es lo que me inspiró. Este no es mi problema.
ptpaterson
1
Necesito entender mejor cómo podría usar un método de búsqueda gráfica diferente para encontrar las diferencias. El original que tengo efectivamente crea un gráfico con pesos iguales de todos los bordes y realiza una búsqueda profunda primero para encontrar todos los movimientos de agregar / quitar / mantener hasta el final. Estoy considerando agregar diferentes pesos a los bordes y agregar una heurística.
ptpaterson