Một số cách hiệu quả để tìm sự khác biệt giữa hai văn bản lớn có nội dung tương tự nhưng có thứ tự khác nhau là gì?


8

Tôi có hai tệp lớn chứa các đoạn văn bản tiếng Anh:

  1. Văn bản đầu tiên dài khoảng 200 trang và có khoảng 10 đoạn trên mỗi trang (mỗi đoạn dài 5 câu).
  2. Văn bản thứ hai chứa gần như chính xác các đoạn văn bản và văn bản như văn bản thứ nhất. Nó cũng dài 200 trang với 10 đoạn trên mỗi trang. Tuy nhiên, các đoạn văn được ngẫu nhiên hóa và theo một thứ tự khác khi so sánh với văn bản đầu tiên. Ngoài ra, một tỷ lệ lớn các đoạn văn có những thay đổi nhỏ về từ ngữ so với các đoạn tương tự. Ví dụ, một đoạn văn trong văn bản đầu tiên có thể có một câu như Like Jimmy, I wanted to go to the palacetrong khi câu tương ứng trong đoạn văn bản thứ hai sẽ đọc Like Jimmy, I really wanted to go to the castle.

Tôi muốn có thể nắm bắt các thay đổi ở đây như bổ sung reallyvà xóa palacebằng thay thế castle. Nếu các đoạn văn được căn chỉnh gần đúng, thì điều này sẽ khá tầm thường vì có rất nhiều cách để khác biệt văn bản. Tuy nhiên, vì các đoạn văn không được căn chỉnh, đó không phải là trường hợp.

Nếu các tệp nhỏ (một số đoạn), Khoảng cách Levenshtein có thể sẽ hoạt động tốt, nhưng vì các tệp rất lớn, sẽ không hiệu quả khi so sánh từng đoạn văn bản 1 với từng đoạn văn bản 2 để tìm ra đoạn nào phù hợp.

Điều gì sẽ là một số cách tiếp cận khác cho vấn đề này để xử lý nó một cách hiệu quả?


Các đoạn văn ít nhất có gần nhau không, nói trong "bán kính" 10 hay hơn? Một ý tưởng chung sẽ là tiền xử lý theo một cách nào đó. Chẳng hạn, tìm ra những từ hiếm khi thay đổi (tên?) Và chỉ so sánh những từ chia sẻ ít nhất những từ này.
Raphael

Bạn có thể thử một công cụ phát hiện bản sao. Chúng được sử dụng cho các ngôn ngữ lập trình, nhưng ngoài ra, được thiết kế cho vấn đề này. CC Downloader có thể sẽ hoạt động.
rebierpost

3
Đây là một vấn đề tương tự với một số câu trả lời: cs.stackexchange.com/questions/47794/ trên
wvxvw

1
Bạn đã thử tiện ích dòng lệnh "diff" chưa?
usul

@Raphael Bạn có thể mở rộng ý nghĩa của bạn bằng cách tiền xử lý ở đây không? Ngoài ra, các đoạn xảy ra trong "các phần" của tài liệu, một phần có thể khá dài (như 50-60 đoạn) và không có thứ tự.
vikram7

Câu trả lời:


1

So sánh 2000 đoạn văn với 2000 đoạn văn chỉ là bốn triệu so sánh.

Chìa khóa của vấn đề không phải là sử dụng hàm tính khoảng cách Levenshtein mà là sử dụng hàm tính khoảng cách Levenshtein nếu khoảng cách nhỏ hơn một ngưỡng nhất định và thất bại (hoặc, thay vào đó, trả về + ∞) nếu khoảng cách là lớn hơn ngưỡng.

Điều này là do bạn chỉ quan tâm đến các đoạn gần giống nhau. Bạn hoàn toàn không có hứng thú với khoảng cách chính xác giữa các đoạn đủ khác nhau để không liên quan. Vì vậy, ngay khi khoảng cách đã đủ cao để không thú vị, chức năng có thể thoát ngay lập tức; và điều này chủ yếu sẽ xảy ra rất sớm trên thực tế trong quá trình thực thi chức năng.

Ngưỡng càng cao, thời gian chạy càng dài nhưng tỷ lệ âm tính giả càng nhỏ.

Nếu bạn biết nhiều hơn về các tài liệu (chẳng hạn như mỗi đoạn khớp với nhiều nhất một đoạn trong tài liệu khác) thì bạn có thể thực hiện một lượt với ngưỡng thấp, loại trừ các đoạn phù hợp khỏi xem xét thêm, hãy giảm một đoạn qua kho văn bản với ngưỡng cao hơn, loại trừ những đoạn giảm, v.v.

Chi tiết triển khai: Có lẽ bạn sẽ tính khoảng cách Levenshtein trên các từ hơn là trên các ký tự. Nếu đó là trường hợp, trước tiên bạn nên gán một số cho mỗi từ - ví dụ: bằng cách sắp xếp toàn bộ kho văn bản, gọi từ đầu tiên '1', từ thứ hai '2', v.v. Bằng cách đó, việc so sánh đoạn văn của bạn sẽ được thực hiện bằng cách so sánh các con số hơn là các từ, nhanh hơn.


-1

Có thể sử dụng phương pháp ghép. Có lẽ ai đó có thể xây dựng trên ...

Băm nội dung của đoạn văn theo cách các đoạn chỉ có sự khác biệt nhỏ có băm tương tự, sau đó ra lệnh băm để xác định đoạn nào sẽ so sánh thông qua một phương thức chính xác hơn (khác hoặc tương tự).

Ví dụ, như một thuật toán băm thô sơ, điều gì sẽ xảy ra nếu bạn cộng các giá trị ascii của các ký tự và sau đó sửa đổi tổng của một số lượng lớn như 2.000.000.000? Điều này sẽ khiến 2 đoạn văn chỉ có một vài từ được thêm hoặc bớt có giá trị băm có khả năng gần nhau hơn các đoạn có các từ rất khác nhau, và do đó, chúng sẽ gần nhau hơn trong danh sách so với các đoạn rất khác nhau (bạn có thể nói băm gần đó trong trường hợp này là cần thiết nhưng không đủ cho các đoạn tương tự). Rõ ràng là bạn phải tính đến sự bao bọc gây ra bởi modulo và xem xét một đoạn văn có giá trị băm 1.999.999.999 vì chỉ là khoảng cách 1 từ một với giá trị 0, v.v.

Do đó, có thể giảm số lượng so sánh giữa các đoạn mà bạn cần thực hiện với số lượng đáng kể (bạn sẽ không phải so sánh từng đoạn trong một văn bản với mỗi đoạn trong văn bản khác) - bạn có thể so sánh một đoạn với các đoạn văn bản 2 theo thứ tự mức độ băm của chúng gần như thế nào (thực hiện các giá trị băm gần nhất trước tiên) và gọi một thuật toán đắt tiền hơn ở đây để xác định xem chúng có "tương tự nhau" không.


2
Nếu bạn đang nói về các đoạn văn bản, tổng của các giá trị ASCII mod hai tỷ là tổng của các giá trị ASCII. Trừ khi đoạn văn của bạn có hơn tám triệu ký tự, nghĩa là ... Vì vậy, câu trả lời này có vẻ khá khó hiểu, dựa trên những gì bạn tình cờ nghĩ về lúc đó. Bạn có bất cứ bằng chứng nào cho thấy cách tiếp cận mà bạn đề xuất là hiệu quả không? Được hỗ trợ bởi các thí nghiệm hoặc nghiên cứu được công bố?
David Richerby
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.