유연한 DIFF 구현을위한 휴리스틱 접근법


12

직장에서 문서 개정판을 비교하기 위해 DIFF 구현을 작성했습니다. 그것은 O (ND) 차이 알고리즘 및 그 변형에 기초한다 .

중요한 것은 변경 목록을 가져 와서 사람이 읽을 수있는 텍스트로 해석하는 것입니다. 현재 알고리즘은 매우 효율적이지만 확장하기가 너무 많습니다.

짧은 질문

A *와 휴리스틱을 사용하여 "턴"에 대한 벌칙을 추가하려고했습니다. 아이디어는 할 수있는 부드럽게 인간이 읽을 수있는 무언가로 분석하는 것이 더 쉽습니다 그래서 "삭제, 추가, 추가, 삭제, 추가, 삭제"불필요한. 기본적으로 가장 짧은 경로 문제를 가장 간단한 경로 문제 로 바꾸십시오 .

물론 항상 출력을 생성하지의 그리고 "삭제 모든 추가 "

이것이 합리적으로 들립니까?

DIFF 구현에서 휴리스틱을 사용하는 데 우선 순위가 있습니까? 휴리스틱이란 무엇입니까?

문제 :

긴 문장이 삭제되고 다른 긴 문장이 제거되었지만 적어도 한 단어를 공유하는 경우 "with"라고 말합니다. 공통 단어를 그대로두면 (추가 및 삭제하지 않음) 가장 짧은 경로가 만들어집니다. 그러나 이것은 실제로 변경 내용을 인쇄하려는 인간에게 변화의 맥락을 혼란스럽게합니다.

현재 DIFF를 사용한 예 :

  • 기존 문구 : 청소 : 작업장 공기로 파워 워시 및 블로우 드라이.
  • 새 텍스트 : 청소 : 아세톤과 보풀없는 천으로 닦습니다.
  • 메모 목록 변경 :
    • "파워 워시 및 블로우 드라이"를 "아세톤으로 닦아 내기"로 변경
    • "샵 에어"를 "아세톤 및 보풀없는 천"으로 변경

참고 : " 'shop air'를 삭제하고 'acetone'을 추가 하십시오."대신 "Change"가 사용됩니다.

보시다시피, 두 번째 노트는 모든 컨텍스트를 잃어 버리고 이전 텍스트와 새 텍스트 세트를 전혀 보지 않으면 의미를 이해할 수 없습니다.

구두점에 대한 참고 사항 :

구두점을 별도의 "단어"로 구분하여

  • "("추가

대신에

  • "수리"를 "(수리)"로 변경

이것은 독특했기 때문입니다. 그러나 두 텍스트 모두에 쉼표가있는 경우 (이전 예에서 "with"라는 단어와 반대되는 경우) 동일한 일이 발생합니다.

가능한 해결책:

나는 다른 경로 찾기 알고리즘을 대신 사용할 수 있다고 생각한다. 이것은 사람에게 더 의미가있는 다른 변화 "경로"에 가중치를 추가 할 수있는 유연성을 제공한다. 어쩌면 구두점을 포함하는 노드로 여행 할 때 무게가 거의 들지 않을 수도 있습니다 (이것이 다른 것들에 어떤 영향을 줄지 잘 모르겠습니다).

그런 다음 이전 예제에서 다음을 나열 할 수 있습니다.

  • 메모 목록 변경 :
    • "작업장 공기로 파워 워시 및 블로우 드라이"를 "아세톤 및 보풀없는 천으로 닦기"로 변경

보다! 훨씬 더 명확하다!

나는 성능에 타격을 줄 것이라는 것을 알고 있으며, 프로그램을 상당히 대대적으로 점검해야 할 수도 있지만, 원하는 최종 결과를 얻는 것이 더 중요합니다.

결론 :

DIFF 구현에서 휴리스틱을 사용하는 데 우선 순위가 있습니까?

다른 생각들? 합리적인 시간 투자? 다른 아이디어? 다른 알고리즘?

미리 감사드립니다!

편집하다:

A *를 사용하지 않고 알고리즘에 휴리스틱을 추가하도록 내 질문을 명확하게 / 고화시키고 질문을 일반화하려고했습니다. 이 경우 기본적으로 같은 것이지만 지금은 여전히 ​​더 정확하다고 생각합니다. 이 게시물 은 통찰력 있었습니다.

답변:


1

vimdiff와 같은 버전으로 할 수 있습니다.

1 단계 : 추가, 삭제 및 수정 된 문장 식별

2 단계 : 수정 된 각 문장에 대해 첫 번째와 마지막으로 변경된 단어를 찾아서이 두 단어 사이에없는 것을 잘라냅니다.

보다 일관성있는 문법 구조를 유지해야하는 경우 http://www.languagetool.org/ 의 내부 또는 이 게시물에 표시된 다른 내용을 살펴보십시오 .

프리젠 테이션 정보 : 해당 문장의 두 가지 버전을 서로 아래에 표시 할 수 있습니다. 각 변경에 대한 컨텍스트를 표시 할 수 있습니다. 영감을 얻으려면 추가 된 텍스트를 파란색으로 인쇄 할 수있는 latexdiff를 확인하십시오. 텍스트의 최종 버전에서 마지막 위치이며 삭제 된 텍스트는 각주로 (심지어 호환 가능합니다 \usepackage[para]{footmisc}).


이것은 휴리스틱 매칭의 주요 질문이 아닌 디스플레이 문제만을 다룹니다.
Adam Zuckerman

내 두 번째 단락을 읽었습니까?
user2987828

나는했다. 설명하려는 내용을 확장 할 수 있습니까? 나의 첫 번째 (그리고 두 번째) 독서는 정보를 처리하는 것이 아니라 표시하는 방법을 여전히 설명하고 있다고 생각하게했습니다.
Adam Zuckerman

현재 html을 사용하여 추가 및 제거 형식을 지정할 수 있으며 stackexchange 편집 뷰어가 나에게 영감을주었습니다. 이것은 내 문제가 아닙니다.
ptpaterson

1
차이점을 찾기 위해 다른 그래프 검색 방법을 사용하는 방법을 더 잘 이해해야합니다. 원래 내가 가지고있는 것은 효과적으로 모든 가장자리의 가중치가 동일한 그래프를 만들고 깊이 우선 검색을 수행하여 모든 추가 / 제거 / 유지 이동을 끝까지 찾습니다. 가장자리에 다른 가중치를 추가하고 휴리스틱을 추가하는 것을 고려하고 있습니다.
ptpaterson
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.