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.
fuente