Phương pháp tiếp cận heuristic để thực hiện DIFF linh hoạt


12

Tôi đã tạo ra một triển khai DIFF để so sánh các sửa đổi tài liệu tại nơi làm việc. Nó dựa trên thuật toán khác biệt An O (ND) và biến thể của nó .

Một điều đã trở nên quan trọng là lấy danh sách các thay đổi và diễn giải chúng thành văn bản có thể đọc được của con người. Mặc dù thuật toán hiện tại rất hiệu quả, nhưng nó rất khó để mở rộng.

Câu hỏi ngắn

Tôi đã suy nghĩ về việc cố gắng sử dụng A * và một heuristic có thêm hình phạt cho "lượt". Ý tưởng là làm mịn "không cần thêm, xóa, thêm, xóa, thêm, xóa" để dễ dàng phân tích thành thứ mà con người có thể đọc được. Về cơ bản, biến vấn đề đường đi ngắn nhất của tôi thành vấn đề đường dẫn đơn giản nhất .

Và tất nhiên không tạo đầu ra luôn là "Xóa mọi thứ , Thêm mọi thứ "

Điều này nghe có vẻ hợp lý?

Có bất kỳ ưu tiên nào cho việc sử dụng heuristic trong triển khai DIFF không? Các heuristic là gì?

Vấn đề:

Nếu một câu dài bị xóa và một câu dài khác bị xóa, nhưng họ chia sẻ ít nhất một từ, nói "với". Để lại từ chung một mình (bằng cách không thêm và xóa nó) sẽ tạo ra con đường ngắn nhất. Tuy nhiên, điều này thực sự chỉ làm xáo trộn bối cảnh của sự thay đổi đối với một con người đang cố gắng đọc một bản in ra khỏi những thay đổi.

Ví dụ với DIFF hiện tại:

  • Văn bản cũ: Clean: Powerwash và thổi khô với không khí cửa hàng.
  • Văn bản mới: Làm sạch: Lau bằng acetone và một miếng vải không có xơ.
  • Thay đổi danh sách ghi chú:
    • Thay đổi "Powerwash và thổi khô" thành "Lau bằng acetone"
    • Thay đổi "không khí cửa hàng" thành "acetone và một miếng vải không có xơ"

Lưu ý: "Thay đổi" được sử dụng thay vì "xóa 'cửa hàng', thêm 'acetone'"

Như bạn có thể thấy, ghi chú thứ hai mất TẤT CẢ bối cảnh và không nhìn vào toàn bộ bộ văn bản cũ và mới mà bạn không thể hiểu ý nghĩa của nó.

Lưu ý về dấu câu:

Tôi có dấu chấm câu được phân cách là "từ" riêng biệt để tôi có thể nhận được

  • Thêm vào "("

thay vì

  • Thay đổi "Sửa chữa" thành "(Sửa chữa"

bởi vì điều này thật đáng ghét Tuy nhiên, điều đó có nghĩa là nếu thậm chí có một dấu phẩy trong cả hai văn bản (trái ngược với từ "với" trong ví dụ trước) thì điều tương tự cũng xảy ra.

Giải pháp có thể:

Tôi nghĩ rằng tôi có thể sử dụng thuật toán tìm đường khác thay vào đó có thể giúp tôi linh hoạt thêm trọng lượng vào các "đường dẫn" thay đổi khác nhau có thể có ý nghĩa hơn đối với một người. Có lẽ, tôi thậm chí có thể làm cho việc di chuyển đến các nút có dấu chấm câu có trọng lượng nhỏ (không chắc điều này sẽ ảnh hưởng đến những thứ khác như thế nào).

Sau đó, tôi có thể lấy ví dụ trước để liệt kê các mục sau:

  • Thay đổi danh sách ghi chú:
    • Thay đổi "Powerwash và thổi khô với không khí cửa hàng" thành "Lau bằng acetone và một miếng vải không có xơ"

Xem! Rõ ràng hơn nhiều!

Tôi biết tôi sẽ đạt được thành tích cao và tôi có thể phải thực hiện một cuộc đại tu khá lớn cho chương trình của mình, nhưng điều quan trọng hơn là có kết quả cuối cùng mà tôi muốn.

Tóm lại:

Một lần nữa, có bất kỳ ưu tiên nào cho việc sử dụng heuristic trong triển khai DIFF không, và đó là gì?

Những suy nghĩ khác? Đầu tư thời gian hợp lý? Những ý tưởng khác? Các thuật toán khác?

Cảm ơn trước!

BIÊN TẬP:

Tôi đã cố gắng làm rõ / củng cố câu hỏi của mình và khái quát hóa câu hỏi của mình để thêm một heuristic vào thuật toán của tôi, thay vì sử dụng A *. Về cơ bản điều tương tự trong trường hợp này, nhưng tôi vẫn nghĩ chính xác hơn bây giờ. Bài này là sâu sắc.

Câu trả lời:


1

Bạn có thể làm trong một phiên bản giống như vimdiff:

Bước 1: xác định các câu được thêm, xóa và sửa đổi.

Bước 2: cho mỗi câu được sửa đổi, xác định vị trí của các từ thay đổi đầu tiên và cuối cùng, và cắt bất cứ thứ gì không nằm giữa hai từ này.

Nếu bạn cần giữ cấu trúc ngữ pháp mạch lạc hơn, hãy xem phần bên trong của http://www.languagetool.org/ hoặc một nội dung khác được hiển thị trên bài đăng này .

Về cách trình bày: bạn có thể trình bày cả hai phiên bản của câu này dưới câu kia. Bạn có thể muốn hiển thị bối cảnh cho mỗi thay đổi. Để có cảm hứng, hãy xem latexdiff có thể in văn bản đã thêm màu xanh lam ở vị trí cuối cùng trong phiên bản cuối cùng của văn bản và văn bản đã xóa trong chú thích (thậm chí tương thích với \usepackage[para]{footmisc}).


Điều này chỉ giải quyết các vấn đề về hiển thị, không phải là câu hỏi chính của kết hợp heuristic.
Adam Zuckerman

Bạn đã đọc đoạn thứ hai của tôi?
dùng2987828

Tôi đã làm. Bạn có thể mở rộng dựa trên những gì bạn đang cố gắng giải thích? Lần đọc đầu tiên (và thứ hai) của tôi về nó khiến tôi nghĩ rằng bạn vẫn đang mô tả cách hiển thị thông tin chứ không phải xử lý nó.
Adam Zuckerman

Tôi hiện có thể sử dụng html để định dạng các phần thêm và xóa, trình xem chỉnh sửa stackexchange là thứ đã truyền cảm hứng cho tôi. Đây không phải là vấn đề của tôi.
ptpaterson

1
Tôi cần hiểu rõ hơn về cách tôi có thể sử dụng một phương pháp tìm kiếm biểu đồ khác để tìm sự khác biệt. Bản gốc tôi đã tạo một biểu đồ có trọng số bằng nhau của tất cả các cạnh và thực hiện tìm kiếm theo chiều sâu trước tiên để tìm tất cả các bước thêm / xóa / giữ di chuyển đến cuối. Tôi đang xem xét việc thêm các trọng lượng khác nhau cho các cạnh và thêm một heuristic.
ptpaterson
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.