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.