Евристичний підхід до гнучкої реалізації DIFF


12

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

Одне, що стало важливим, - це взяти список змін та інтерпретувати їх у тексті, читаному людиною. Хоча поточний алгоритм дуже ефективний, він настільки настільки, що його важко розширити.

Коротке запитання

Я думав про спробу використання A * та евристики, яка додає штрафних санкцій за "повороти". Ідея полягає в тому, щоб згладити непотрібне "додати, видалити, додати, видалити, додати, видалити", щоб було легше розібратися в тому, що людина може прочитати. В основному перетворіть мою найкоротшу проблему шляху в найпростішу проблему шляху .

І звичайно не створювати вихід, який завжди є "Видалити все , додати все "

Це звучить розумно?

Чи є якийсь пріоритет для використання евристики в реалізації DIFF? Що таке евристика?

Проблема:

Якщо довге речення буде видалено, а інше довге речення вилучено, але вони поділяють принаймні одне слово, скажіть "з" Залишаючи загальне слово в спокої (не додаючи і не видаляючи його) створить найкоротший шлях. Однак це насправді просто пригнічує контекст зміни людини, яка намагається прочитати друк із змін.

Приклад з поточним DIFF:

  • Старий текст: Очистити: Powerwash та продуйте сухим повітрям у магазині.
  • Новий текст: Чистий: протирайте ацетоном і тканиною, що не залишається.
  • Змінити список приміток:
    • Змініть "Powerwash і висушіть" на "Протріть ацетоном"
    • Змініть "магазинне повітря" на "ацетон і тканину, що не залишається"

Примітка: "Зміна" використовується замість "видалити" магазин повітря ", додайте" ацетон ""

Як бачите, друга примітка втрачає ВСІ контексти і, не дивлячись на цілі старі та нові текстові набори тексту, ви не можете зрозуміти, що це означає.

Примітка про пунктуацію:

Я розділив розділові знаки як окремі "слова", щоб я отримав

  • Додати "("

замість

  • Змініть "Ремонт" на "(Ремонт"

бо це було неприємно. Однак це означає, що якщо в обох текстах є навіть кома (на відміну від слова "з" у попередньому прикладі), відбувається те саме.

Можливе рішення:

Я думаю, що я міг би використовувати інший алгоритм пошуку шляхів, який може надати мені гнучкості, щоб додати ваги різним змінам "шляхів", які можуть мати більше сенсу для людини. Можливо, я навіть міг би зробити так, щоб подорожі до вузлів, що містять пунктуацію, мали невелику вагу (не впевнений, як це вплине на інші речі).

Тоді я міг би отримати попередній приклад, щоб перерахувати наступне:

  • Змінити список приміток:
    • Змініть "Powerwash і продуйте сухим повітрям магазину" на "Протріть ацетоном і тканиною, що не залишається"

Побачити! Набагато чіткіше!

Я знаю, що став би хітом на виставу, і мені, можливо, доведеться зробити досить капітальний ремонт своєї програми, але важливіше мати остаточний результат, якого я хочу.

Нижня лінія:

Знову ж, чи є пріоритет використання евристики в реалізації DIFF, і що це?

Інші думки? Розумна інвестиція в час? Інші ідеї? Інші алгоритми?

Спасибі заздалегідь!

Редагувати:

Я намагався уточнити / затвердити своє запитання та узагальнити своє запитання, додавши евристику до мого алгоритму, а не використовуючи A *. В основному те саме в цьому випадку, але я все одно думаю більш точним. Цей пост був проникливим.

Відповіді:


1

Ви можете зробити це у схожій на vimdiff версії:

Крок 1: визначення доданих, видалених та змінених пропозицій.

Крок 2. У кожному модифікованому реченні знайдіть перше та останнє змінені слова та виріжте все, що не є між цими двома словами.

Якщо вам потрібно зберегти більш цілісну структуру граматики, перегляньте внутрішні сайти http://www.languagetool.org/ або інше, що відображається в цій публікації .

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


Це стосується лише питань відображення, а не головного питання евристичної відповідності.
Адам Цукерман

Ви читали мій другий абзац?
користувач2987828

Я зробив. Чи можете ви розширити те, що ви намагаєтесь пояснити? Перше (і друге) її читання змусило мене думати, що ви все ще описуєте, як відображати інформацію, а не обробляти її.
Адам Цукерман

Наразі я можу використовувати html для форматування додавань та видалень, переглядач редагування stackexchange - це те, що мене надихнуло. Це не моє питання.
ptpaterson

1
Мені потрібно краще зрозуміти, як я можу використовувати інший метод пошуку графіків, щоб знайти відмінності. Оригінальний, який у мене ефективно, створює графік з рівними вагами всіх країв і здійснює перший пошук по глибині, щоб знайти всі переміщення "додавання / видалення / збереження" до кінця. Я розглядаю можливість додавання різних ваг до країв та додавання евристики.
ptpaterson
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.