Những thuật toán nào tôi có thể sử dụng để phát hiện nếu bài viết hoặc bài viết là trùng lặp?


17

Tôi đang cố gắng phát hiện nếu một bài viết hoặc bài đăng trên diễn đàn là một mục trùng lặp trong cơ sở dữ liệu. Tôi đã suy nghĩ một chút, đi đến kết luận rằng ai đó sao chép nội dung sẽ làm như vậy bằng cách sử dụng một trong ba (khó giảm dần):

  1. sao chép đơn giản dán toàn bộ văn bản
  2. sao chép và dán các phần của văn bản hợp nhất nó với văn bản của riêng họ
  3. sao chép một bài báo từ một trang web bên ngoài và giả trang là của riêng họ

Văn bản chuẩn bị cho phân tích

Về cơ bản bất kỳ sự bất thường; mục tiêu là làm cho văn bản "thuần" nhất có thể. Để có kết quả chính xác hơn, văn bản được "chuẩn hóa" bởi:

  1. Tước các khoảng trắng trùng lặp và cắt tỉa hàng đầu và dấu.
  2. Các dòng mới được chuẩn hóa thành \ n.
  3. Các thẻ HTML được xóa.
  4. Sử dụng một RegEx được gọi là URL Fireball Daring bị tước.
  5. Tôi sử dụng mã BB trong ứng dụng của mình để đi đến đó.
  6. (ä) có nguồn gốc và nước ngoài (bên cạnh Extgish) được chuyển đổi thành dạng không phải nước ngoài.

Tôi lưu trữ thông tin về mỗi bài viết trong (1) bảng thống kê và trong (2) bảng từ khóa.

(1) Bảng thống kê Các thống kê sau được lưu trữ về nội dung văn bản (giống như bài đăng này)

  1. độ dài văn bản
  2. đếm thư
  3. số từ
  4. số câu
  5. từ trung bình mỗi câu
  6. chỉ số dễ đọc tự động
  7. điểm sương mù

Đối với các ngôn ngữ châu Âu, Coleman-Liau và Chỉ số dễ đọc tự động nên được sử dụng vì chúng không sử dụng cách đếm âm tiết, do đó sẽ tạo ra một số điểm chính xác hợp lý.

(2) Bảng từ khóa

Các từ khóa được tạo bằng cách loại trừ một danh sách lớn các từ dừng (từ thông dụng), ví dụ: 'the', 'a', 'of', 'to', v.v., v.v.

Dữ liệu mẫu

  • văn bản_length, 3963
  • thư_count, 3052
  • word_count, 684
  • câu_count, 33
  • word_per_sentence, 21
  • gunning_fog, 11,5
  • auto_read_index, 9,9
  • từ khóa 1, bị giết
  • từ khóa 2, sĩ quan
  • từ khóa 3, cảnh sát

Cần lưu ý rằng một khi một bài viết được cập nhật, tất cả các số liệu thống kê ở trên được tạo lại và có thể là các giá trị hoàn toàn khác nhau.

Làm cách nào tôi có thể sử dụng thông tin trên để phát hiện nếu một bài viết được xuất bản lần đầu tiên, đã tồn tại trong cơ sở dữ liệu chưa?


Tôi biết bất cứ điều gì tôi sẽ thiết kế sẽ không hoàn hảo, rủi ro lớn nhất là (1) Nội dung không trùng lặp sẽ được gắn cờ là trùng lặp (2) Hệ thống cho phép nội dung trùng lặp thông qua.

Vì vậy, thuật toán sẽ tạo ra một số đánh giá rủi ro từ 0 không có rủi ro trùng lặp 5 có thể trùng lặp và 10 là trùng lặp. Bất cứ điều gì trên 5 thì có khả năng là nội dung trùng lặp. Trong trường hợp này, nội dung có thể được gắn cờ và liên kết với các bài viết có thể trùng lặp và một con người có thể quyết định xóa hay cho phép.

Như tôi đã nói trước khi tôi lưu trữ từ khóa cho toàn bộ bài viết, tuy nhiên tôi tự hỏi liệu tôi có thể làm tương tự trên cơ sở đoạn văn không; điều này cũng có nghĩa là tiếp tục tách dữ liệu của tôi trong DB nhưng nó cũng giúp phát hiện (2) trong bài viết ban đầu của tôi dễ dàng hơn.

Tôi đang nghĩ trung bình có trọng số giữa các số liệu thống kê, nhưng theo thứ tự và hậu quả sẽ là gì ...


Nếu đó là một kết hợp chính xác, bạn có thể chỉ cần đặt một trường thành duy nhất. Nếu không, bạn cần phải quyết định tại thời điểm nào một văn bản có thể được coi là một bản sao hoặc một tác phẩm có nguồn gốc chặt chẽ.
James P.

2
Có nhiều hướng mà loại phân tích này có thể đi. Mọi người viết toàn bộ sách về loại chủ đề này. Nếu mục tiêu của bạn là xác định "sự gần gũi tương đối" thì bạn thực sự có rất ít sự lựa chọn ngoài việc tìm hiểu về cái gọi là Xử lý ngôn ngữ tự nhiênHọc máy . Đó là những gì các nhà khoa học máy tính gọi nó, nhưng nó thực sự chỉ là phân tích thống kê tiên tiến. Một điểm khởi đầu tốt có thể là nhìn vào khoảng cách levenshtein, nhưng các số liệu thống kê "ngu ngốc" như số từ / câu có thể sẽ làm rất ít cho bạn.
rdlowrey

1
Ngoài ra, trước khi nó được di chuyển từ SO, nó đã được gắn thẻ [php], vì vậy bạn có thể kiểm tra chức năng levenshtein tự nhiên của php
rdlowrey

Ý tưởng tuyệt vời để kiểm tra con người có khả năng trùng lặp! Bạn có thể tự động quyết định rằng> 7 là một bản sao và <6 là khác nhau và chỉ có con người kiểm tra điểm 6 hoặc 7. Tôi biết rằng với nhận dạng thư rác, có một máy không biết và con người- không biết loại nào; một khu vực màu xám giữa một bản sao gần và một tác phẩm gốc nơi mà điều tốt nhất bạn có thể làm là thực hiện một cuộc gọi phán đoán có phần tùy tiện.
GlenPeterson

@rdlowrey - Thuật toán Levenshtein là những gì tôi đã sử dụng trong một dự án tương tự tôi đã làm trong C #. Tôi đồng ý, đó là một nơi tốt để bắt đầu và có thể là đủ.
jfrankcarr

Câu trả lời:


4

nhiều thuật toán xử lý sự tương tự tài liệu trong NLP. Đây là một bài báo mô tả các thuật toán khác nhau. Ngoài ra wikipedia có một bộ sưu tập lớn hơn. Tôi ủng hộ biện pháp Jaro Winkler và đã sử dụng nó cho các dự án trường học lớp trong các phương pháp phân cụm.


6

Hãy nhìn vào đại số Rabin-Karp . Nó sử dụng hàm băm giống như rsync sử dụng để giảm thiểu byte được truyền trong quá trình đồng bộ hóa. Bằng cách điều chỉnh kích thước của cửa sổ bạn sử dụng cho hàm băm, bạn có thể làm cho nó nhạy hơn hoặc ít hơn. RK được sử dụng cho, trong số những thứ khác, phát hiện đạo văn, về cơ bản là tìm kiếm các bản sao.


4
Vấn đề mà OP mô tả có vẻ giống hệt như phát hiện đạo văn và tôi đề nghị đó là nơi đầu tiên để tìm kiếm sự giúp đỡ. (Chỉ cần chắc chắn để xác định nguồn của bạn!)
Caleb

4

Việc đầu tiên có thể là phát hiện các câu (hoặc một số khối dữ liệu hợp lý khác. Lấy các khối đó và loại bỏ bất kỳ dữ liệu mete nào, khoảng trắng ngẫu nhiên html, trả về, v.v. Lấy kết quả MD5 và lưu trữ trong bảng. sau đó kết hợp với các khối này để cố gắng tìm trận đấu.

Nếu điều này không hiệu quả, bạn có thể thử n-gram. Ở đây bạn cần một mục nhập của mỗi từ trên trang, nhưng nó sẽ có thể cung cấp cho bạn các kết quả khá tốt.

http://en.wikipedia.org/wiki/N-gram


Các biện pháp dựa trên n-gram tốt hơn nhiều so với băm md5, đặc biệt đối với dữ liệu bán cấu trúc như html.
Candide

1

Đối với một phép toán chính xác, tôi sẽ lưu trữ một hàm băm và sau đó so sánh nó.

Tôi nghĩ rằng các hệ thống được sử dụng cho các kỳ thi đo lường các nhóm từ và sau đó là tần suất của các nhóm của mỗi kích thước. Ví dụ, một chuỗi gồm 30 từ được sao chép sẽ ghi được 5 điểm rủi ro và 5 lần xuất hiện của 10 chuỗi từ sẽ ghi được 5 điểm. Sau đó, bạn sẽ có 30 điểm trên 500 từ.

Thực sự bạn cần một thuật toán ngữ nghĩa để các từ như 'cũng' và 'và' được phân tích cú pháp giống nhau.

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.