Я створив реалізацію DIFF для порівняння змін документів на роботі. Він заснований на алгоритмі різниці O (ND) та його варіаціях .
Одне, що стало важливим, - це взяти список змін та інтерпретувати їх у тексті, читаному людиною. Хоча поточний алгоритм дуже ефективний, він настільки настільки, що його важко розширити.
Коротке запитання
Я думав про спробу використання A * та евристики, яка додає штрафних санкцій за "повороти". Ідея полягає в тому, щоб згладити непотрібне "додати, видалити, додати, видалити, додати, видалити", щоб було легше розібратися в тому, що людина може прочитати. В основному перетворіть мою найкоротшу проблему шляху в найпростішу проблему шляху .
І звичайно не створювати вихід, який завжди є "Видалити все , додати все "
Це звучить розумно?
Чи є якийсь пріоритет для використання евристики в реалізації DIFF? Що таке евристика?
Проблема:
Якщо довге речення буде видалено, а інше довге речення вилучено, але вони поділяють принаймні одне слово, скажіть "з" Залишаючи загальне слово в спокої (не додаючи і не видаляючи його) створить найкоротший шлях. Однак це насправді просто пригнічує контекст зміни людини, яка намагається прочитати друк із змін.
Приклад з поточним DIFF:
- Старий текст: Очистити: Powerwash та продуйте сухим повітрям у магазині.
- Новий текст: Чистий: протирайте ацетоном і тканиною, що не залишається.
- Змінити список приміток:
- Змініть "Powerwash і висушіть" на "Протріть ацетоном"
- Змініть "магазинне повітря" на "ацетон і тканину, що не залишається"
Примітка: "Зміна" використовується замість "видалити" магазин повітря ", додайте" ацетон ""
Як бачите, друга примітка втрачає ВСІ контексти і, не дивлячись на цілі старі та нові текстові набори тексту, ви не можете зрозуміти, що це означає.
Примітка про пунктуацію:
Я розділив розділові знаки як окремі "слова", щоб я отримав
- Додати "("
замість
- Змініть "Ремонт" на "(Ремонт"
бо це було неприємно. Однак це означає, що якщо в обох текстах є навіть кома (на відміну від слова "з" у попередньому прикладі), відбувається те саме.
Можливе рішення:
Я думаю, що я міг би використовувати інший алгоритм пошуку шляхів, який може надати мені гнучкості, щоб додати ваги різним змінам "шляхів", які можуть мати більше сенсу для людини. Можливо, я навіть міг би зробити так, щоб подорожі до вузлів, що містять пунктуацію, мали невелику вагу (не впевнений, як це вплине на інші речі).
Тоді я міг би отримати попередній приклад, щоб перерахувати наступне:
- Змінити список приміток:
- Змініть "Powerwash і продуйте сухим повітрям магазину" на "Протріть ацетоном і тканиною, що не залишається"
Побачити! Набагато чіткіше!
Я знаю, що став би хітом на виставу, і мені, можливо, доведеться зробити досить капітальний ремонт своєї програми, але важливіше мати остаточний результат, якого я хочу.
Нижня лінія:
Знову ж, чи є пріоритет використання евристики в реалізації DIFF, і що це?
Інші думки? Розумна інвестиція в час? Інші ідеї? Інші алгоритми?
Спасибі заздалегідь!
Редагувати:
Я намагався уточнити / затвердити своє запитання та узагальнити своє запитання, додавши евристику до мого алгоритму, а не використовуючи A *. В основному те саме в цьому випадку, але я все одно думаю більш точним. Цей пост був проникливим.