Readability ใช้อัลกอริทึมใดในการแยกข้อความจาก URL


102

มาระยะหนึ่งแล้วฉันพยายามหาวิธีแยกข้อความที่ "เกี่ยวข้อง" ออกจาก URL อย่างชาญฉลาดโดยการกำจัดข้อความที่เกี่ยวข้องกับโฆษณาและความยุ่งเหยิงอื่น ๆ ทั้งหมดหลังจากค้นคว้ามาหลายเดือนฉันก็ล้มเลิกมันเป็นปัญหา ที่ไม่สามารถระบุได้อย่างแม่นยำ (ฉันลองหลายวิธีแล้วแต่ไม่มีใครเชื่อถือได้)

สัปดาห์ก่อนฉันสะดุดกับReadabilityซึ่งเป็นปลั๊กอินที่แปลง URL เป็นข้อความที่อ่านได้ มันดูถูกต้องสำหรับฉัน ฉันเดาว่าพวกเขามีอัลกอริทึมที่ฉลาดพอที่จะดึงข้อความที่เกี่ยวข้องออกมา

ไม่มีใครรู้ว่าพวกเขาทำได้อย่างไร? หรือฉันจะทำได้อย่างน่าเชื่อถือ?


3
คำถามคือ SO ใช้อัลกอริทึมอะไรที่ Readability ไม่จัดการเพจของมัน? :)
Piotr Dobrogost

คำตอบ:


170

ความสามารถในการอ่านส่วนใหญ่ประกอบด้วยฮิวริสติกที่ "ใช้ได้ผลดี" ในหลาย ๆ กรณี

ฉันได้เขียนงานวิจัยเกี่ยวกับหัวข้อนี้แล้วและฉันอยากจะอธิบายถึงความเป็นมาว่าเหตุใดจึงเป็นเรื่องง่ายที่จะหาวิธีแก้ปัญหาที่ใช้งานได้ดีและเมื่อยากที่จะเข้าใกล้ความแม่นยำ 100%

ดูเหมือนว่าจะมีกฎหมายภาษาศาสตร์แฝงอยู่ในภาษามนุษย์ซึ่งปรากฏ (แต่ไม่เฉพาะ) ในเนื้อหาของหน้าเว็บซึ่งแยกข้อความออกเป็นสองประเภทอย่างชัดเจนอยู่แล้ว (ข้อความเต็มกับข้อความที่ไม่ใช่ข้อความเต็มหรือโดยประมาณ " เนื้อหาหลัก "เทียบกับ" สำเร็จรูป ")

ในการรับเนื้อหาหลักจาก HTML ในหลาย ๆ กรณีก็เพียงพอที่จะเก็บเฉพาะองค์ประกอบข้อความ HTML (เช่นบล็อกของข้อความที่ไม่ถูกขัดจังหวะด้วยมาร์กอัป) ซึ่งมีมากกว่า 10 คำ ดูเหมือนว่ามนุษย์เลือกจากข้อความสองประเภท ("สั้น" และ "ยาว" โดยวัดจากจำนวนคำที่เปล่งออกมา) สำหรับแรงจูงใจในการเขียนข้อความสองแบบ ฉันจะเรียกสิ่งเหล่านี้ว่า "การเดินเรือ" และ "การให้ข้อมูล"

หากผู้เขียนต้องการให้คุณอ่านสิ่งที่เขียนได้อย่างรวดเร็วเขา / เธอใช้ข้อความ "การนำทาง" คือไม่กี่คำ (เช่น "STOP", "อ่านนี้", "คลิกที่นี่") นี่คือประเภทข้อความที่โดดเด่นที่สุดในองค์ประกอบการนำทาง (เมนู ฯลฯ )

หากผู้เขียนต้องการให้คุณเข้าใจอย่างลึกซึ้งว่าเขาหมายถึงอะไรเขา / เธอใช้คำหลายคำ ด้วยวิธีนี้ความคลุมเครือจะถูกลบออกด้วยต้นทุนของความซ้ำซ้อนที่เพิ่มขึ้น เนื้อหาที่คล้ายบทความมักจะจัดอยู่ในชั้นนี้เนื่องจากมีมากกว่าสองสามคำ

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

มีกลยุทธ์และคุณลักษณะที่ซับซ้อนมากขึ้นซึ่งช่วยแยกเนื้อหาหลักออกจากเอกสารสำเร็จรูป ตัวอย่างเช่นความหนาแน่นของลิงก์ (จำนวนคำในบล็อกที่เชื่อมโยงกับจำนวนคำทั้งหมดในบล็อก) คุณลักษณะของบล็อกก่อนหน้า / ถัดไปความถี่ของข้อความบล็อกเฉพาะในเว็บ "ทั้งหมด" โครงสร้าง DOM ของเอกสาร HTML ภาพของหน้าเป็นต้น

คุณสามารถอ่านบทความล่าสุดของฉัน "การตรวจจับ Boilerplate โดยใช้คุณสมบัติข้อความตื้น " เพื่อรับข้อมูลเชิงลึกจากมุมมองทางทฤษฎี คุณสามารถดูวิดีโอการนำเสนอเอกสารของฉันได้ที่ VideoLectures.net

"ความสามารถในการอ่าน" ใช้คุณลักษณะบางอย่างเหล่านี้ หากคุณดูบันทึกการเปลี่ยนแปลง SVN อย่างรอบคอบคุณจะเห็นว่าจำนวนของกลยุทธ์แตกต่างกันไปตามช่วงเวลาและคุณภาพการสกัดของ Readability ก็เช่นกัน ตัวอย่างเช่นการเปิดตัวความหนาแน่นของลิงก์ในเดือนธันวาคม 2552 ช่วยปรับปรุงได้มาก

ในความคิดของฉันดังนั้นจึงไม่สมเหตุสมผลที่จะพูดว่า "Readability does it like that" โดยไม่ต้องระบุหมายเลขเวอร์ชันที่แน่นอน

ฉันได้เผยแพร่ไลบรารีการแยกเนื้อหา HTML ของโอเพ่นซอร์สที่เรียกว่าboilerpipeซึ่งมีกลยุทธ์การแยกข้อมูลที่แตกต่างกัน ขึ้นอยู่กับกรณีการใช้งานตัวแยกหนึ่งหรือตัวอื่นจะทำงานได้ดีกว่า คุณสามารถลองใช้ตัวแยกเหล่านี้ในหน้าที่คุณเลือกได้โดยใช้แอปเว็บ boilerpipe ที่ใช้ร่วมกันบน Google AppEngine

หากต้องการให้ตัวเลขพูดให้ดูหน้า " Benchmarks " บนวิกิ boilerpipe ซึ่งเปรียบเทียบกลยุทธ์การแยกข้อมูลบางอย่างเช่น boilerpipe, Readability และ Apple Safari

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

ไชโย

คริสเตียน


3
โครงการ boilerpipe นี้ยังคงทำงานอยู่หรือไม่
Abby

5
ฉันเชื่อว่าคุณควรวางโครงการของคุณไว้ใน GitHub เพื่อให้นักพัฒนาโอเพ่นซอร์สเติบโตในสังคม
Inanc Gumus

1
ตัวอย่างที่ดีของคำอธิบายของDr.Kohlschütterคือหน้าเว็บนี้ใน Safari หากคุณใช้ Reader คุณจะพบว่าคำตอบของเขาแสดงเป็นข้อความหลักด้วยความหนาแน่นของลิงก์ เป็นข้อความที่เชื่อมโยงกันจึงรับรู้ว่าเป็นข้อความหลักเมื่อเปรียบเทียบกับบล็อกอื่น ๆ
Abdelrahman Eid

1
"ย้ายข้อมูล" สำเนาไปยัง repo github.com/k-bx/boilerpipeของฉันเผื่อจะหาย :)
Konstantine Rybnikov

16

การอ่านเป็น bookmarklet จาวาสคริปต์ หมายถึงรหัสฝั่งไคลเอ็นต์ที่จัดการ DOM ดูที่จาวาสคริปต์และคุณควรจะเห็นว่าเกิดอะไรขึ้น

ขั้นตอนการทำงานและรหัสของความสามารถในการอ่าน:

/*
     *  1. Prep the document by removing script tags, css, etc.
     *  2. Build readability's DOM tree.
     *  3. Grab the article content from the current dom tree.
     *  4. Replace the current DOM tree with the new one.
     *  5. Read peacefully.
*/

javascript: (function () {
    readConvertLinksToFootnotes = false;
    readStyle = 'style-newspaper';
    readSize = 'size-medium';
    readMargin = 'margin-wide';
    _readability_script = document.createElement('script');
    _readability_script.type = 'text/javascript';
    _readability_script.src = 'http://lab.arc90.com/experiments/readability/js/readability.js?x=' + (Math.random());
    document.documentElement.appendChild(_readability_script);
    _readability_css = document.createElement('link');
    _readability_css.rel = 'stylesheet';
    _readability_css.href = 'http://lab.arc90.com/experiments/readability/css/readability.css';
    _readability_css.type = 'text/css';
    _readability_css.media = 'all';
    document.documentElement.appendChild(_readability_css);
    _readability_print_css = document.createElement('link');
    _readability_print_css.rel = 'stylesheet';
    _readability_print_css.href = 'http://lab.arc90.com/experiments/readability/css/readability-print.css';
    _readability_print_css.media = 'print';
    _readability_print_css.type = 'text/css';
    document.getElementsByTagName('head')[0].appendChild(_readability_print_css);
})();

และหากคุณติดตามไฟล์ JS และ CSS ที่โค้ดด้านบนดึงเข้ามาคุณจะได้ภาพรวม:

http://lab.arc90.com/experiments/readability/js/readability.js (นี่เป็นความคิดเห็นที่ค่อนข้างดีการอ่านที่น่าสนใจ)

http://lab.arc90.com/experiments/readability/css/readability.css


12

แน่นอนว่าไม่มีวิธีใดที่เชื่อถือได้ 100% คุณสามารถดูซอร์สโค้ดความสามารถในการอ่านได้ที่นี่

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

  • บทความ
  • ร่างกาย
  • เนื้อหา
  • บล็อก
  • เรื่องราว

ตัวระบุเชิงลบจะเป็น:

  • แสดงความคิดเห็น
  • หารือ

และพวกเขาก็มีน่าและบางทีผู้สมัคร สิ่งที่พวกเขาจะทำคือกำหนดสิ่งที่น่าจะเป็นเนื้อหาหลักของไซต์ดูบรรทัด678ในแหล่งที่มาของความสามารถในการอ่าน สิ่งนี้ทำได้โดยการวิเคราะห์ความยาวของย่อหน้าส่วนใหญ่ตัวระบุ (ดูด้านบน) ทรี DOM (เช่นถ้าย่อหน้าเป็นโหนดลูกสุดท้าย) ตัดทุกอย่างที่ไม่จำเป็นออกลบการจัดรูปแบบ ฯลฯ

รหัสมี 1792 บรรทัด ดูเหมือนจะเป็นปัญหาที่ไม่สำคัญดังนั้นคุณอาจได้รับแรงบันดาลใจจากที่นั่น


2
คุณรู้หรือไม่ว่าโค้ดของพวกเขาเป็นโอเพ่นซอร์สและสามารถใช้ในผลิตภัณฑ์เชิงพาณิชย์ได้หรือไม่?
user300981

2
มันบอกว่าซอร์สโค้ดเผยแพร่ภายใต้ Apache License 2.0 นั่นหมายความว่าคุณสามารถใช้แจกจ่ายแก้ไขและแจกจ่ายเวอร์ชันที่แก้ไขได้ ฉันไม่ชัดเจนในรายละเอียดมากเกินไป
slhck

2
@bobsmith Apple ใช้ใน Safari เวอร์ชันล่าสุด พวกเขาให้เครดิต Arc90 ในบันทึกประจำรุ่น
s4y

7

น่าสนใจ. ฉันได้พัฒนาสคริปต์ PHP ที่คล้ายกัน โดยทั่วไปจะสแกนบทความและแนบบางส่วนของคำพูดกับข้อความทั้งหมด (Brill Tagger) จากนั้นประโยคที่ไม่ถูกต้องตามหลักไวยากรณ์จะถูกตัดออกทันที จากนั้นการเปลี่ยนคำสรรพนามหรืออดีตกาลอย่างกะทันหันบ่งบอกว่าบทความจบลงแล้วหรือยังไม่ได้เริ่มต้น มีการค้นหาและกำจัดวลีซ้ำ ๆ เช่น "Yahoo news sports finance" ปรากฏสิบครั้งในหน้า คุณยังสามารถรับสถิติเกี่ยวกับน้ำเสียงที่มีธนาคารคำศัพท์มากมายที่เกี่ยวข้องกับอารมณ์ต่างๆ การเปลี่ยนแปลงอย่างกะทันหันในน้ำเสียงจากเชิงรุก / เชิงลบ / การเงินไปจนถึงเชิงรับ / เชิงบวก / การเมืองบ่งบอกถึงขอบเขต มันไม่มีที่สิ้นสุดจริงๆ แต่คุณต้องการขุดลึก

ปัญหาหลักคือลิงก์ความผิดปกติที่ฝังอยู่รูปแบบสคริปต์และการอัปเดต


3
ดูเหมือนจะเป็นแนวทางที่น่าสนใจจริงๆ - คุณมีรหัสที่จะแบ่งปันจากสิ่งนี้หรือไม่?
lsh

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