Algoritme apa yang digunakan Readability untuk mengekstrak teks dari URL?


102

Untuk sementara, saya telah mencoba menemukan cara cerdas mengekstrak teks "relevan" dari URL dengan menghilangkan teks yang terkait dengan iklan dan semua kekacauan lainnya. Setelah beberapa bulan meneliti, saya menyerah sebagai masalah yang tidak dapat ditentukan secara akurat. (Saya sudah mencoba berbagai cara tetapi tidak ada yang dapat diandalkan)

Seminggu yang lalu, saya menemukan Readability - plugin yang mengubah URL apa pun menjadi teks yang dapat dibaca. Ini terlihat cukup akurat bagi saya. Dugaan saya adalah bahwa mereka memiliki algoritme yang cukup pintar untuk mengekstrak teks yang relevan.

Adakah yang tahu bagaimana mereka melakukannya? Atau bagaimana saya dapat melakukannya dengan andal?


3
Pertanyaannya adalah algoritma apa yang digunakan SO sehingga Readability tidak menangani halamannya? :)
Piotr Dobrogost

Jawaban:


170

Keterbacaan terutama terdiri dari heuristik yang "bekerja dengan baik" dalam banyak kasus.

Saya telah menulis beberapa makalah penelitian tentang topik ini dan saya ingin menjelaskan latar belakang mengapa mudah menghasilkan solusi yang berfungsi dengan baik dan ketika sulit untuk mendekati akurasi 100%.

Tampaknya ada hukum linguistik yang mendasari bahasa manusia yang juga (tetapi tidak eksklusif) terwujud dalam konten halaman Web, yang sudah cukup jelas memisahkan dua jenis teks (teks lengkap vs. non-teks lengkap atau, secara kasar, " konten utama "vs." boilerplate ").

Untuk mendapatkan konten utama dari HTML, dalam banyak kasus cukup hanya menyimpan elemen teks HTML (yaitu blok teks yang tidak terganggu oleh markup) yang memiliki lebih dari 10 kata. Tampaknya manusia memilih dari dua jenis teks ("pendek" dan "panjang", diukur dari jumlah kata yang mereka pancarkan) untuk dua motivasi penulisan teks yang berbeda. Saya menyebutnya motivasi "navigasi" dan "informasiasional".

Jika seorang penulis ingin Anda cepat mendapatkan apa yang tertulis, dia menggunakan teks "navigasi", yaitu beberapa kata (seperti "STOP", "Read this", "Click here"). Ini adalah jenis teks yang paling menonjol dalam elemen navigasi (menu, dll.)

Jika seorang penulis ingin Anda memahami secara mendalam apa yang dia maksud, dia menggunakan banyak kata. Dengan cara ini, ambiguitas dihilangkan dengan biaya peningkatan redundansi. Konten seperti artikel biasanya termasuk dalam kelas ini karena memiliki lebih dari beberapa kata.

Meskipun pemisahan ini tampaknya berhasil dalam banyak kasus, pemisahan ini menjadi rumit dengan tajuk utama, kalimat pendek, penafian, footer hak cipta, dll.

Ada strategi dan fitur yang lebih canggih, yang membantu memisahkan konten utama dari boilerplate. Misalnya kepadatan tautan (jumlah kata dalam blok yang ditautkan versus jumlah keseluruhan kata dalam blok), fitur blok sebelumnya / berikutnya, frekuensi teks blok tertentu di "keseluruhan" Web, Struktur DOM dari dokumen HTML, gambar visual halaman, dll.

Anda dapat membaca artikel terbaru saya " Deteksi Boilerplate menggunakan Fitur Teks Dangkal " untuk mendapatkan beberapa wawasan dari perspektif teoritis. Anda juga dapat menonton video presentasi makalah saya di VideoLectures.net.

"Keterbacaan" menggunakan beberapa fitur ini. Jika Anda mengamati dengan cermat log perubahan SVN, Anda akan melihat bahwa jumlah strategi bervariasi dari waktu ke waktu, dan begitu pula kualitas ekstraksi Keterbacaan. Misalnya, pengenalan kepadatan tautan pada bulan Desember 2009 sangat membantu peningkatan.

Menurut saya, oleh karena itu tidak masuk akal untuk mengatakan "Readability do it like that", tanpa menyebutkan nomor versi pastinya.

Saya telah menerbitkan pustaka ekstraksi konten Open Source HTML yang disebut boilerpipe , yang menyediakan beberapa strategi ekstraksi yang berbeda. Tergantung pada kasus penggunaan, satu atau ekstraktor lain bekerja lebih baik. Anda dapat mencoba ekstraktor ini pada halaman pilihan Anda menggunakan aplikasi web boilerpipe-pengiring di Google AppEngine.

Untuk membiarkan angka berbicara, lihat halaman " Benchmarks " di wiki boilerpipe yang membandingkan beberapa strategi ekstraksi, termasuk boilerpipe, Readability dan Apple Safari.

Saya harus menyebutkan bahwa algoritme ini mengasumsikan bahwa konten utama sebenarnya adalah teks lengkap. Ada kasus di mana "konten utama" adalah sesuatu yang lain, misalnya gambar, tabel, video, dll. Algoritme tidak akan berfungsi dengan baik untuk kasus seperti itu.

Bersulang,

Kristen


3
Apakah proyek boilerpipe ini masih aktif?
Abby

5
Saya yakin Anda lebih baik memasukkan proyek Anda ke GitHub sehingga akan tumbuh secara sosial oleh pengembang sumber terbuka.
Inanc Gumus

1
Contoh bagus dari penjelasan Dr. Kohlschütter sebenarnya adalah halaman web ini, di Safari, jika Anda menggunakan Pembaca, Anda akan menemukan bahwa jawabannya ditampilkan sebagai teks utama, berkat kerapatan tautan. Ini teks yang ditautkan, oleh karena itu dikenali sebagai teks utama, jika dibandingkan dengan blok lain.
Abdelrahman Idul Fitri

1
"Memigrasi" salinan ke repo saya github.com/k-bx/boilerpipe kalau-kalau hilang :)
Konstantine Rybnikov

16

keterbacaan adalah bookmarklet javascript. artinya kode sisi kliennya yang memanipulasi DOM. Lihatlah javascriptnya dan Anda akan dapat melihat apa yang sedang terjadi.

Alur kerja dan kode keterbacaan:

/*
     *  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);
})();

Dan jika Anda mengikuti file JS dan CSS yang ditarik oleh kode di atas, Anda akan mendapatkan gambaran keseluruhan:

http://lab.arc90.com/experiments/readability/js/readability.js (ini dikomentari dengan cukup baik, bacaan yang menarik)

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


12

Tidak ada cara yang 100% andal untuk melakukan ini, tentu saja. Anda dapat melihat kode sumber Keterbacaan di sini

Pada dasarnya, yang mereka lakukan adalah mencoba mengidentifikasi blok teks positif dan negatif . Pengenal positif (yaitu ID div) akan menjadi seperti:

  • artikel
  • tubuh
  • kandungan
  • blog
  • cerita

Pengidentifikasi negatif adalah:

  • komentar
  • Bahas

Dan kemudian mereka memiliki kandidat yang tidak mungkin dan mungkin . Apa yang akan mereka lakukan adalah menentukan apa yang paling mungkin menjadi konten utama situs, lihat baris 678di sumber keterbacaan. Hal ini dilakukan dengan menganalisis sebagian besar panjang paragraf, pengenalnya (lihat di atas), pohon DOM (yaitu jika paragraf adalah simpul anak terakhir), menghapus semua yang tidak perlu, menghapus format, dll.

Kode tersebut memiliki 1792 baris. Ini memang tampak seperti masalah yang tidak sepele, jadi mungkin Anda bisa mendapatkan inspirasi dari sana.


2
Apakah Anda kebetulan mengetahui apakah kode mereka open source dan apakah dapat digunakan dalam produk komersial?
pengguna300981

2
Ia mengatakan bahwa kode sumber dirilis di bawah Lisensi Apache 2.0, itu berarti Anda dapat menggunakannya, mendistribusikannya, memodifikasi dan mendistribusikan versi modifikasi itu. Saya tidak terlalu jelas tentang detailnya.
slhck

2
@bobsmith Apple menggunakannya di Safari versi terbaru. Mereka menyebut Arc90 dalam catatan rilis.
s4y

7

Menarik. Saya telah mengembangkan skrip PHP serupa. Ini pada dasarnya memindai artikel dan melampirkan bagian dari ucapan ke semua teks (Brill Tagger). Kemudian, kalimat yang secara tata bahasa tidak valid langsung dihilangkan. Kemudian, pergeseran kata ganti atau bentuk lampau yang tiba-tiba menandakan artikel sudah selesai, atau belum dimulai. Frasa yang berulang akan dicari dan dihilangkan, seperti "Yahoo news sports finance" muncul sepuluh kali di halaman. Anda juga bisa mendapatkan statistik tentang nada dengan sejumlah besar bank kata yang berkaitan dengan berbagai emosi. Perubahan nada yang tiba-tiba, dari aktif / negatif / finansial, menjadi pasif / positif / politik menunjukkan adanya batasan. Benar-benar tidak ada habisnya, betapapun Anda ingin menggali lebih dalam.

Masalah utamanya adalah tautan, anomali yang disematkan, gaya skrip, dan pembaruan.


3
Ini terdengar seperti pendekatan yang sangat menarik sebenarnya - apakah Anda memiliki kode untuk dibagikan dari ini?
lsh

2
Saya setuju, apakah Anda memiliki kode contoh atau informasi seputar kode Anda yang dapat kami lihat?
userabuser
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.