Эвристический подход для гибкой реализации DIFF

12

Я создал реализацию DIFF для сравнения редакций документов на работе. Он основан на O (ND) разностном алгоритме и его вариациях .

Одна вещь, которая стала важной, состоит в том, чтобы взять список изменений и интерпретировать их в удобочитаемый текст. Хотя текущий алгоритм очень эффективен, он настолько сложен, что его трудно расширить.

Короткий вопрос

Я думал о попытке использовать A * и эвристику, которая добавляет штрафы за «повороты». Идея состоит в том, чтобы сгладить ненужные «добавить, удалить, добавить, удалить, добавить, удалить», чтобы легче было разобрать то, что может прочитать человек. По сути, превратить мою проблему кратчайшего пути в простейшую проблему пути .

И, конечно, не создавать вывод, который всегда "Удалить все , Добавить все "

Это звучит разумно?

Есть ли какой-либо приоритет для использования эвристики в реализации DIFF? Что такое эвристика?

Проблема:

Если длинное предложение удалено, а другое длинное предложение удалено, но в них есть хотя бы одно слово, скажите «с». Оставляя только общее слово (не добавляя и не удаляя его), вы получите кратчайший путь. Тем не менее, это действительно просто запутывает контекст изменения человека, пытающегося прочитать распечатку изменений.

Пример с текущим DIFF:

  • Старый текст: Очистить: вымыть и высушить продувочным воздухом.
  • Новый текст: Очистить: протереть ацетоном и безворсовой тканью.
  • Изменить список заметок:
    • Замените «Powerwash and blow dry» на «Протирать ацетоном»
    • Замените "магазин воздуха" на "ацетон и безворсовая ткань"

Примечание: «Изменить» используется вместо «удалить« магазин воздуха », добавить« ацетон »»

Как видите, вторая заметка теряет ВЕСЬ контекст, и, не смотря на все старые и новые текстовые наборы, вы не сможете понять, что это значит.

Примечание о пунктуации:

Я выделил пунктуацию как отдельные слова, чтобы получить

  • Добавлять "("

вместо того

  • Измените «Ремонт» на «(Ремонт»)

потому что это было противно Однако это означает, что если в обоих текстах есть даже запятая (в отличие от слова «с» в предыдущем примере), происходит то же самое.

Возможное решение:

Я думаю, что вместо этого я мог бы использовать другой алгоритм поиска пути, который может дать мне гибкость, чтобы добавить вес различным «путям» изменения, которые могут иметь больше смысла для человека. Возможно, я мог бы даже сделать так, чтобы путешествия в узлы, содержащие пунктуацию, имели небольшой вес (не уверен, как это повлияет на другие вещи).

Тогда я мог бы получить предыдущий пример, чтобы перечислить следующее:

  • Изменить список заметок:
    • Замените «Powerwash и высушите феном» на «Протрите ацетоном и безворсовой тканью»

Видеть! Намного понятнее!

Я знаю, что получу удар по производительности, и мне, возможно, придется серьезно пересмотреть мою программу, но более важно получить желаемый конечный результат.

Нижняя линия:

Опять же, есть ли приоритет использования эвристики в реализации DIFF, и что это?

Другие мысли? Разумное вложение времени? Другие идеи? Другие алгоритмы?

Заранее спасибо!

РЕДАКТИРОВАТЬ:

Я попытался уточнить / уточнить мой вопрос и обобщить мой вопрос, добавив эвристику в мой алгоритм, вместо того, чтобы использовать A *. В основном то же самое в этом случае, но я все еще думаю более точным сейчас. Этот пост был проницательным.

ptpaterson
источник

Ответы:

1

Вы можете сделать в vimdiff-подобной версии:

Шаг 1: определение добавленных, удаленных и измененных предложений.

Шаг 2: для каждого измененного предложения найдите первое и последнее измененные слова и обрежьте все, что не находится между этими двумя словами.

Если вам нужно сохранить более последовательную грамматическую структуру, посмотрите на http://www.languagetool.org/ или другую информацию, представленную в этом посте .

О презентации: вы можете представить обе версии этого предложения одну под другой. Возможно, вы захотите показать контекст для каждого изменения. Для вдохновения посмотрите на latexdiff, который может печатать добавленный текст синим цветом, это последнее место в окончательной версии текста, а удаленный текст в сносках (даже совместимый с \usepackage[para]{footmisc}).

user2987828
источник
Это касается только вопросов отображения, а не основного вопроса эвристического сопоставления.
Адам Цукерман
Вы читали мой второй абзац?
user2987828
Я сделал. Не могли бы вы рассказать о том, что вы пытаетесь объяснить? Мое первое (и второе) прочтение заставило меня подумать, что вы все еще описывали, как отображать информацию, а не обрабатывать ее.
Адам Цукерман
В настоящее время я могу использовать html для форматирования операций добавления и удаления, меня вдохновило средство просмотра редактора stackexchange. Это не моя проблема.
ptpaterson
1
Мне нужно лучше понять, как я могу использовать другой метод поиска по графику, чтобы найти различия. Исходный файл, который у меня есть, эффективно создает график с равными весами всех ребер и выполняет поиск в глубину, чтобы найти все шаги добавления / удаления / сохранения до конца. Я рассматриваю возможность добавления различных весов к краям и добавления эвристики.
ptpaterson