Я создал реализацию DIFF для сравнения редакций документов на работе. Он основан на O (ND) разностном алгоритме и его вариациях .
Одна вещь, которая стала важной, состоит в том, чтобы взять список изменений и интерпретировать их в удобочитаемый текст. Хотя текущий алгоритм очень эффективен, он настолько сложен, что его трудно расширить.
Короткий вопрос
Я думал о попытке использовать A * и эвристику, которая добавляет штрафы за «повороты». Идея состоит в том, чтобы сгладить ненужные «добавить, удалить, добавить, удалить, добавить, удалить», чтобы легче было разобрать то, что может прочитать человек. По сути, превратить мою проблему кратчайшего пути в простейшую проблему пути .
И, конечно, не создавать вывод, который всегда "Удалить все , Добавить все "
Это звучит разумно?
Есть ли какой-либо приоритет для использования эвристики в реализации DIFF? Что такое эвристика?
Проблема:
Если длинное предложение удалено, а другое длинное предложение удалено, но в них есть хотя бы одно слово, скажите «с». Оставляя только общее слово (не добавляя и не удаляя его), вы получите кратчайший путь. Тем не менее, это действительно просто запутывает контекст изменения человека, пытающегося прочитать распечатку изменений.
Пример с текущим DIFF:
- Старый текст: Очистить: вымыть и высушить продувочным воздухом.
- Новый текст: Очистить: протереть ацетоном и безворсовой тканью.
- Изменить список заметок:
- Замените «Powerwash and blow dry» на «Протирать ацетоном»
- Замените "магазин воздуха" на "ацетон и безворсовая ткань"
Примечание: «Изменить» используется вместо «удалить« магазин воздуха », добавить« ацетон »»
Как видите, вторая заметка теряет ВЕСЬ контекст, и, не смотря на все старые и новые текстовые наборы, вы не сможете понять, что это значит.
Примечание о пунктуации:
Я выделил пунктуацию как отдельные слова, чтобы получить
- Добавлять "("
вместо того
- Измените «Ремонт» на «(Ремонт»)
потому что это было противно Однако это означает, что если в обоих текстах есть даже запятая (в отличие от слова «с» в предыдущем примере), происходит то же самое.
Возможное решение:
Я думаю, что вместо этого я мог бы использовать другой алгоритм поиска пути, который может дать мне гибкость, чтобы добавить вес различным «путям» изменения, которые могут иметь больше смысла для человека. Возможно, я мог бы даже сделать так, чтобы путешествия в узлы, содержащие пунктуацию, имели небольшой вес (не уверен, как это повлияет на другие вещи).
Тогда я мог бы получить предыдущий пример, чтобы перечислить следующее:
- Изменить список заметок:
- Замените «Powerwash и высушите феном» на «Протрите ацетоном и безворсовой тканью»
Видеть! Намного понятнее!
Я знаю, что получу удар по производительности, и мне, возможно, придется серьезно пересмотреть мою программу, но более важно получить желаемый конечный результат.
Нижняя линия:
Опять же, есть ли приоритет использования эвристики в реализации DIFF, и что это?
Другие мысли? Разумное вложение времени? Другие идеи? Другие алгоритмы?
Заранее спасибо!
РЕДАКТИРОВАТЬ:
Я попытался уточнить / уточнить мой вопрос и обобщить мой вопрос, добавив эвристику в мой алгоритм, вместо того, чтобы использовать A *. В основном то же самое в этом случае, но я все еще думаю более точным сейчас. Этот пост был проницательным.