ฉันสามารถใช้อัลกอริทึมใดเพื่อตรวจสอบว่าบทความหรือโพสต์ซ้ำกันหรือไม่


17

ฉันพยายามตรวจสอบว่าบทความหรือโพสต์ฟอรัมเป็นรายการซ้ำภายในฐานข้อมูลหรือไม่ ฉันได้รับความคิดนี้มาสรุปว่าคนที่ทำซ้ำเนื้อหาจะใช้หนึ่งในสาม (จากมากไปหายากที่จะตรวจจับ):

  1. คัดลอกง่ายวางข้อความทั้งหมด
  2. คัดลอกและวางส่วนของข้อความที่รวมเข้ากับของตนเอง
  3. คัดลอกบทความจากไซต์ภายนอกและปลอมแปลงเป็นบทความของตนเอง

เตรียมข้อความสำหรับการวิเคราะห์

โดยทั่วไปมีความผิดปกติใด ๆ เป้าหมายคือการทำให้ข้อความเป็น "บริสุทธิ์" ที่สุด เพื่อผลลัพธ์ที่แม่นยำยิ่งขึ้นข้อความจะได้รับการ "มาตรฐาน" โดย:

  1. การลอกช่องว่างสีขาวที่ซ้ำกันและตัดส่วนนำและต่อท้าย
  2. บรรทัดใหม่มีมาตรฐานถึง \ n
  3. แท็ก HTML ถูกลบออก
  4. การใช้ RegEx เรียกว่า Daring Fireball URL จะถูกปล้น
  5. ฉันใช้รหัส BB ในแอปพลิเคชันของฉันเพื่อไปที่
  6. (ä) ccented และต่างประเทศ (นอกเหนือจาก Enlgish) จะถูกแปลงเป็นแบบฟอร์มที่ไม่ใช่ต่างประเทศ

ฉันเก็บข้อมูลเกี่ยวกับแต่ละบทความใน (1) ตารางสถิติและใน (2) ตารางคำหลัก

(1) ตารางสถิติสถิติ ต่อไปนี้จัดเก็บเกี่ยวกับเนื้อหาที่เป็นข้อความ (คล้ายกับโพสต์นี้)

  1. ความยาวข้อความ
  2. นับจดหมาย
  3. การนับจำนวนคำ
  4. การนับประโยค
  5. คำเฉลี่ยต่อประโยค
  6. ดัชนีการอ่านอัตโนมัติ
  7. คะแนนหมอก

สำหรับภาษายุโรป Coleman-Liau และดัชนีความสามารถในการอ่านอัตโนมัติควรใช้เนื่องจากไม่ใช้การนับพยางค์ดังนั้นควรให้คะแนนที่แม่นยำ

(2) ตารางคำหลัก

คำหลักนั้นสร้างขึ้นโดยไม่รวมรายการคำหยุด (คำทั่วไป) จำนวนมากเช่น 'the', 'a', 'of', 'to', 'ฯลฯ '

ตัวอย่างข้อมูล

  • ข้อความ _ ความยาว 3963
  • letter_count, 3052
  • คำ _ 684
  • ประโยค _, 33
  • word_per_sentence, 21
  • gunning_fog, 11.5
  • auto_read_index, 9.9
  • คำค้นหา 1 ถูกฆ่า
  • คำหลัก 2, เจ้าหน้าที่
  • คำหลัก 3, ตำรวจ

ควรสังเกตว่าเมื่อบทความได้รับการอัพเดตสถิติข้างต้นทั้งหมดจะถูกสร้างใหม่และอาจเป็นค่าที่แตกต่างกันโดยสิ้นเชิง

ฉันจะใช้ข้อมูลข้างต้นเพื่อตรวจสอบได้อย่างไรว่าบทความที่เผยแพร่เป็นครั้งแรกมีอยู่ในฐานข้อมูลแล้วหรือไม่


ฉันรู้ว่าสิ่งที่ฉันจะออกแบบจะไม่สมบูรณ์แบบความเสี่ยงที่ใหญ่ที่สุด (1) เนื้อหาที่ไม่ซ้ำกันจะถูกทำเครื่องหมายว่าซ้ำกัน (2) ระบบอนุญาตเนื้อหาที่ซ้ำกันผ่าน

ดังนั้นอัลกอริทึมควรสร้างหมายเลขการประเมินความเสี่ยงจาก 0 ที่ไม่มีความเสี่ยงซ้ำซ้อน 5 เป็นความซ้ำซ้อนที่เป็นไปได้และ 10 ซ้ำกัน สิ่งใดที่สูงกว่า 5 มีความเป็นไปได้ที่เนื้อหาจะถูกทำซ้ำ ในกรณีนี้เนื้อหาอาจถูกตั้งค่าสถานะและเชื่อมโยงกับบทความที่เป็นไปได้ซ้ำและมนุษย์สามารถตัดสินใจว่าจะลบหรืออนุญาต

อย่างที่ฉันพูดก่อนที่ฉันจะเก็บคำหลักสำหรับบทความทั้งหมด แต่ฉันสงสัยว่าฉันสามารถทำเช่นเดียวกันในแต่ละย่อหน้า; นี่จะหมายถึงการแยกข้อมูลของฉันในฐานข้อมูลต่อไป แต่มันจะทำให้ง่ายขึ้นสำหรับการตรวจจับ (2) ในโพสต์เริ่มต้นของฉัน

ฉันกำลังคิดค่าเฉลี่ยถ่วงน้ำหนักระหว่างสถิติ แต่ในลำดับใดและสิ่งที่จะเป็นผลที่ตามมา ...


หากเป็นการจับคู่ที่ตรงกันคุณสามารถตั้งค่าฟิลด์ให้ไม่ซ้ำกันได้ หากไม่คุณจะต้องตัดสินใจว่าข้อความใดที่สามารถพิจารณาเป็นสำเนาหรืองานที่ได้มาอย่างใกล้ชิด
James P.

2
มีหลายทิศทางที่การวิเคราะห์ประเภทนี้สามารถไปได้ ผู้คนเขียนหนังสือทั้งเล่มในหัวข้อประเภทนี้ ถ้าเป้าหมายของคุณคือการกำหนด "ญาติใกล้ชิด" จริงๆคุณมีทางเลือกน้อย แต่ขุดลงไปในสิ่งที่เรียกว่าการประมวลผลภาษาธรรมชาติและการเรียนรู้ของเครื่อง นั่นคือสิ่งที่นักวิทยาศาสตร์คอมพิวเตอร์เรียกมัน แต่มันเป็นเพียงการวิเคราะห์ทางสถิติขั้นสูง จุดเริ่มต้นที่ดีอาจดูระยะทางของ levenshtein แต่สถิติ "โง่" อย่างการนับคำ / ประโยคมีแนวโน้มที่จะทำให้คุณน้อยมาก
rdlowrey

1
นอกจากนี้ก่อนที่จะถูกย้ายจากดังนั้นนี่คือการติดแท็ก [php] ดังนั้นคุณอาจตรวจสอบฟังก์ชันlevenshteinดั้งเดิมของ php
rdlowrey

ความคิดที่ดีที่จะมีการตรวจสอบซ้ำของมนุษย์มีแนวโน้ม! คุณอาจตัดสินใจโดยอัตโนมัติว่า> 7 ซ้ำกันและ <6 แตกต่างกันและมีคะแนนตรวจสอบจากมนุษย์เพียง 6 หรือ 7 เท่านั้นฉันรู้ว่าด้วยการระบุสแปมมีเครื่องที่ไม่ทราบและเป็นมนุษย์ - หมวดหมู่ที่ไม่รู้จัก พื้นที่สีเทาระหว่างงานที่ใกล้เคียงกันและงานต้นฉบับที่ดีที่สุดที่คุณสามารถทำได้คือการเรียกการตัดสินตามอำเภอใจ
GlenPeterson

@rdlowrey - อัลกอริทึม Levenshtein เป็นสิ่งที่ฉันใช้ในโครงการที่คล้ายกันที่ฉันทำใน C # ฉันเห็นด้วยเป็นจุดเริ่มต้นที่ดีและอาจเพียงพอ
jfrankcarr

คำตอบ:


4

มีอัลกอริทึมมากมายที่จัดการกับความคล้ายคลึงกันของเอกสารใน NLP ต่อไปนี้เป็นกระดาษเชื้อที่อธิบายขั้นตอนวิธีต่าง ๆ นอกจากนี้วิกิพีเดียมีคอลเลกชันขนาดใหญ่ ฉันชอบวัด Jaro Winkler และใช้มันสำหรับโครงการระดับบัณฑิตศึกษาในวิธีการจัดกลุ่มแบบ aglomerative


6

ลองดูที่ที่algborithm ราบิน-คาร์พ มันใช้แฮชกลิ้งคล้ายกับ rsync ใช้เพื่อลดจำนวนไบต์ที่ส่งระหว่างการซิงค์ ด้วยการปรับขนาดของหน้าต่างที่คุณใช้สำหรับแฮชคุณสามารถทำให้มีความไวมากขึ้นหรือน้อยลง RK ใช้สำหรับการตรวจจับการลอกเลียนแบบซึ่งโดยทั่วไปแล้วจะมองหาการเรียงลำดับของคู่หู


4
ปัญหาที่ OP อธิบายนั้นเหมือนกับการตรวจจับการลอกเลียนแบบและฉันขอแนะนำให้เป็นสถานที่แรกที่จะขอความช่วยเหลือ (อย่าลืมระบุแหล่งที่มาของคุณด้วย!)
Caleb

4

ครั้งแรกที่นี่อาจเป็นการตรวจสอบประโยค (หรือบล็อกอื่น ๆ ที่เหมาะสมของข้อมูลใช้บล็อกเหล่านั้นและตัดข้อมูล mete ใด ๆ html white space สุ่มส่งคืน ฯลฯ ใช้ MD5 ของผลลัพธ์และเก็บไว้ในตารางคุณสามารถ จากนั้นจับคู่กับบล็อกเหล่านี้เพื่อพยายามค้นหาการจับคู่

หากวิธีนี้ใช้ไม่ได้คุณอาจลอง n-grams ที่นี่คุณต้องป้อนหนึ่งคำของแต่ละคำบนหน้า แต่ควรจะสามารถจับคู่ที่ดีได้

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


การวัดตาม n-g นั้นดีกว่า mash5 โดยเฉพาะอย่างยิ่งสำหรับข้อมูลกึ่งโครงสร้างเช่น html
Candide

1

สำหรับคณิตศาสตร์คณิตศาสตร์ที่แน่นอนฉันจะเก็บแฮชแล้วเปรียบเทียบมัน

ฉันคิดว่าระบบที่ใช้สำหรับการสอบวัดกลุ่มคำและความถี่ของกลุ่มแต่ละขนาด ตัวอย่างเช่นสายโซ่ของ 30 คำที่คัดลอกจะมีคะแนน 5 คะแนนความเสี่ยงและ 5 ครั้งจาก 10 คำลูกโซ่ทุ่งคะแนน 5 คะแนน ถ้าอย่างนั้นคุณจะมีการถือ 30 คะแนนต่อ 500 คำ

คุณต้องการอัลกอริทึม semantic จริง ๆ เพื่อให้คำเช่น 'ยัง' และ 'และ' และ 'ถูกแยกวิเคราะห์เหมือนกัน

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.