Google diff-match-patch API là giống nhau cho tất cả các ngôn ngữ được thực hiện trong (Java, JavaScript, Dart, C++, C#, Mục tiêu C, Lua và Python 2.x hoặc python 3.x). Do đó, người ta thường có thể sử dụng các đoạn mã mẫu trong các ngôn ngữ khác với ngôn ngữ đích của một người để tìm ra các cuộc gọi API cụ thể nào là cần thiết cho các tác vụ khác nhau/khớp/vá.
Trong trường hợp của một sự so sánh đơn giản "ngữ nghĩa" đây là những gì bạn cần
import diff_match_patch
textA = "the cat in the red hat"
textB = "the feline in the blue hat"
#create a diff_match_patch object
dmp = diff_match_patch.diff_match_patch()
# Depending on the kind of text you work with, in term of overall length
# and complexity, you may want to extend (or here suppress) the
# time_out feature
dmp.Diff_Timeout = 0 # or some other value, default is 1.0 seconds
# All 'diff' jobs start with invoking diff_main()
diffs = dmp.diff_main(textA, textB)
# diff_cleanupSemantic() is used to make the diffs array more "human" readable
dmp.diff_cleanupSemantic(diffs)
# and if you want the results as some ready to display HMTL snippet
htmlSnippet = dmp.diff_prettyHtml(diffs)
Một từ trên "ngữ nghĩa" chế biến bởi diff-match-vá
Ghi chú rằng như vậy việc xử lý rất hữu ích để trình bày sự khác biệt với người xem vì nó có xu hướng tạo ra một danh sách ngắn hơn về sự khác biệt bằng cách tránh đồng bộ hóa các văn bản không liên quan (ví dụ: hai từ riêng biệt xảy ra để có các chữ cái chung ở giữa). Tuy nhiên, các kết quả được tạo ra không hoàn hảo, vì quá trình xử lý này chỉ là các giả thiết đơn giản dựa trên độ dài của các khác biệt và các mẫu bề mặt, thay vì xử lý NLP thực tế dựa trên lexicons và các thiết bị ngữ nghĩa khác.
Ví dụ, textA
và textB
giá trị sử dụng trên sản xuất sau "trước và sau diff_cleanupSemantic" giá trị cho các diffs
mảng
[(0, 'the '), (-1, 'cat'), (1, 'feline'), (0, ' in the '), (-1, 'r'), (1, 'blu'), (0, 'e'), (-1, 'd'), (0, ' hat')]
[(0, 'the '), (-1, 'cat'), (1, 'feline'), (0, ' in the '), (-1, 'red'), (1, 'blue'), (0, ' hat')]
Nice! chữ cái 'e' phổ biến với màu đỏ và màu xanh làm cho diff_main() nhìn thấy vùng văn bản này là bốn sửa đổi, nhưng các sửa chữa cleanupSemantic() chỉ là hai chỉnh sửa, độc đáo chỉ ra các cụm khác nhau 'xanh dương' và ' màu đỏ '.
Tuy nhiên, nếu chúng ta có, ví dụ
textA = "stackoverflow is cool"
textb = "so is very cool"
Các trước/sau mảng sản xuất bao gồm:
[(0, 's'), (-1, 'tack'), (0, 'o'), (-1, 'verflow'), (0, ' is'), (1, ' very'), (0, ' cool')]
[(0, 's'), (-1, 'tackoverflow is'), (1, 'o is very'), (0, ' cool')]
nào cho thấy bị cáo buộc ngữ nghĩa cải thiện sau có thể khá quá đáng " bị tra tấn "so với trước. Lưu ý, ví dụ, cách hàng đầu của 'được' giữ như là một trận đấu và làm thế nào thêm 'rất' từ được trộn lẫn với các phần của biểu thức 'là mát mẻ'. Lý tưởng nhất, chúng tôi có thể mong đợi một cái gì đó như
[(-1, 'stackoverflow'), (1, 'so'), (0, ' is '), (-1, 'very'), (0, ' cool')]
Cảm ơn bạn đã trả lời nhanh! Điều này rất hữu ích và thuật toán rất tốt, nhưng tôi không thấy nó chính xác là "dễ đọc". Có thể cung cấp cho một đầu ra định dạng [như thế này] (http://neil.fraser.name/software/diff_match_patch/svn/trunk/demos/demo_diff.html) thay vì sử dụng Python và các API này? Và làm thế nào tôi sẽ đi về nó nếu nó có thể? – shortstheory
Xem chỉnh sửa, ở cuối phần mã đầu tiên. Về cơ bản bạn cần gọi 'dmp.diff_prettyHtml (diffs) 'trong đó tạo ra một đoạn mã HTML phù hợp để hiển thị các chỉnh sửa khác nhau (chèn và xóa) trong mã màu. – mjv
Cảm ơn! Điều này là hoàn hảo và nó chỉ là những gì tôi đang tìm kiếm! Tôi đánh giá cao tất cả sự giúp đỡ của bạn! Mặc dù, tôi cũng muốn biết liệu có thể cung cấp cho đầu ra thô hay không. Tôi đã upvoted câu trả lời của bạn, nhưng tôi không có đủ danh tiếng. – shortstheory