Okunabilirlik, URL'lerden metin çıkarmak için hangi algoritmayı kullanır?


102

Bir süredir, reklamlarla ilgili metni ve diğer tüm karmaşayı ortadan kaldırarak bir URL'den "alakalı" metni akıllıca çıkarmanın bir yolunu bulmaya çalışıyorum. Birkaç aylık araştırmadan sonra, bir sorun olarak bıraktım. bu tam olarak belirlenemez. (Farklı yollar denedim ama hiçbiri güvenilir değildi)

Bir hafta önce, herhangi bir URL'yi okunabilir metne dönüştüren bir eklenti olan Okunabilirlik ile karşılaştım . Bana oldukça doğru görünüyor. Benim tahminim, bir şekilde ilgili metni çıkaracak kadar akıllı bir algoritmaya sahip olmaları.

Bunu nasıl yaptıklarını bilen var mı? Ya da bunu güvenilir bir şekilde nasıl yapabilirim?


3
Soru, SO'nun hangi algoritmayı kullandığı, Okunabilirliğin sayfalarını işlemediğidir? :)
Piotr Dobrogost

Yanıtlar:


170

Okunabilirlik, temelde çoğu durumda "bir şekilde iyi çalışan" buluşsal yöntemlerden oluşur.

Bu konuyla ilgili bazı araştırma makaleleri yazdım ve neden iyi çalışan bir çözüm bulmanın kolay olduğunu ve% 100'e yaklaşmanın zorlaştığı zamanların arka planını açıklamak istiyorum.

İnsan dilinin temelinde yatan bir dil yasası var gibi görünüyor ve bu aynı zamanda (ancak tamamen değil) Web sayfası içeriğinde de açıkça ortaya çıkıyor ve iki tür metni (tam metin veya tam olmayan metin veya kabaca, " ana içerik "ve" standart metin ").

HTML'den ana içeriği elde etmek için, çoğu durumda yalnızca yaklaşık 10 kelimeden fazla olan HTML metin öğelerini (yani işaretlemeyle kesintiye uğramayan metin bloklarını) saklamak yeterlidir. İnsanların metin yazmanın iki farklı motivasyonu için iki tür metin arasından seçim yaptıkları ("kısa" ve "uzun", yaydıkları kelimelerin sayısı ile ölçülür) görünmektedir. Ben bunlara "gezinme" ve "bilgi amaçlı" motivasyonlar derdim.

Bir yazar , yazılanı hızlı bir şekilde almanızı istiyorsa , "gezinme" metni, yani birkaç kelime kullanır ("DURDUR", "Bunu oku", "Burayı tıklayın" gibi). Bu, gezinme öğelerinde (menüler vb.) En çok öne çıkan metin türüdür.

Bir yazar ne demek istediğini derinlemesine anlamanızı istiyorsa, birçok kelime kullanır. Bu şekilde, fazlalıktaki artış pahasına belirsizlik ortadan kaldırılır. Makale benzeri içerik, yalnızca birkaç kelimeden fazlasını içerdiği için genellikle bu sınıfa girer.

Bu ayrım, birçok durumda işe yarıyor gibi görünse de, başlıklar, kısa cümleler, sorumluluk reddi beyanları, telif hakkı altbilgileri vb. İle karmaşıklaşıyor.

Ana içeriği standart metinden ayırmaya yardımcı olan daha karmaşık stratejiler ve özellikler vardır. Örneğin, bağlantı yoğunluğu (bloktaki toplam kelime sayısına karşı bağlantılı bir bloktaki kelimelerin sayısı), önceki / sonraki blokların özellikleri, "bütün" Web'deki belirli bir blok metnin frekansı, HTML belgesinin DOM yapısı, sayfanın görsel görüntüsü vb.

Teorik bir perspektiften biraz fikir edinmek için en son makalem olan " Sığ Metin Özelliklerini Kullanarak Klişe Tespiti " ni okuyabilirsiniz . Ayrıca VideoLectures.net'te bildiri sunumumun videosunu da izleyebilirsiniz.

"Okunabilirlik" bu özelliklerden bazılarını kullanır. SVN değişiklik günlüğünü dikkatlice izlerseniz, stratejilerin sayısının ve Okunabilirliğin ayıklama kalitesinin zaman içinde değiştiğini göreceksiniz. Örneğin, Aralık 2009'da bağlantı yoğunluğunun tanıtılması, gelişmeye çok yardımcı oldu.

Benim görüşüme göre, tam sürüm numarasından bahsetmeden "Okunabilirlik böyle yapar" demenin bir anlamı yok.

Birkaç farklı çıkarma stratejisi sağlayan boilerpipe adlı bir Açık Kaynak HTML içerik çıkarma kitaplığı yayınladım . Kullanım durumuna bağlı olarak, bir veya diğer çıkarıcı daha iyi çalışır. Google AppEngine'deki tamamlayıcı boilerpipe-web uygulamasını kullanarak bu aspiratörleri seçtiğiniz sayfalarda deneyebilirsiniz.

Rakamların konuşmasına izin vermek için, kazan borusu, Okunabilirlik ve Apple Safari dahil olmak üzere bazı çıkarma stratejilerini karşılaştıran kazan borusu wiki'sindeki " Karşılaştırmalar " sayfasına bakın .

Bu algoritmaların ana içeriğin aslında tam metin olduğunu varsaydığını belirtmeliyim. "Ana içeriğin" başka bir şey olduğu durumlar vardır, örneğin bir resim, bir tablo, bir video vb. Algoritmalar bu gibi durumlarda iyi çalışmayacaktır.

Şerefe,

Hıristiyan


3
Bu kazan borusu projesi hala aktif mi?
Abby,

5
Açık kaynak geliştiriciler tarafından sosyal olarak büyümesi için projenizi GitHub'a yerleştirseniz iyi olur.
İnanç Gümüş

1
Dr. Kohlschütter'in açıklamasının güzel bir örneği aslında bu web sayfasıdır, Safari'de Reader'ı kullandıysanız, bağlantı yoğunluğu sayesinde cevabının ana metin olarak görüntülendiğini göreceksiniz. Bağlantılı metin, bu nedenle diğer bloklarla karşılaştırıldığında ana metin olarak tanınır.
Abdelrahman Eid


16

okunabilirlik bir javascript yer imidir. DOM'u işleyen istemci tarafı kodu anlamına gelir. Javascript'e bakın ve neler olup bittiğini görebilmelisiniz.

Okunabilirliğin iş akışı ve kodu:

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

Ve yukarıdaki kodun çektiği JS ve CSS dosyalarını takip ederseniz, resmin tamamını görürsünüz:

http://lab.arc90.com/experiments/readability/js/readability.js (bu oldukça iyi yorumlanmış, ilginç okuma)

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


12

Elbette bunu yapmanın% 100 güvenilir bir yolu yok. Okunabilirlik kaynak koduna buradan göz atabilirsiniz.

Temel olarak, yaptıkları şey olumlu ve olumsuz metin bloklarını belirlemeye çalışmaktır . Pozitif tanımlayıcılar (yani div kimlikleri) şunun gibi bir şey olacaktır:

  • makale
  • vücut
  • içerik
  • Blog
  • hikaye

Negatif tanımlayıcılar şöyle olur:

  • yorum Yap
  • tartışmak

Ve sonra olası olmayan ve belki adayları var. Yapacakları şey, sitenin ana içeriği olma olasılığı en yüksek olanı belirlemektir 678, okunabilirlik kaynağındaki satıra bakın . Bu, çoğunlukla paragrafların uzunluğunu, tanımlayıcılarını (yukarıya bakın), DOM ağacını (yani paragraf son bir alt düğüm ise), gereksiz her şeyi çıkararak, biçimlendirmeyi kaldırarak vb. Analiz edilerek yapılır.

Kodun 1792 satırı vardır. Önemsiz bir sorun gibi görünüyor, bu yüzden belki ilhamınızı oradan alabilirsiniz.


2
Kodlarının açık kaynak olup olmadığını ve ticari ürünlerde kullanılıp kullanılamayacağını biliyor musunuz?
user300981

2
Kaynak kodun Apache License 2.0 altında yayınlandığını söylüyor, yani onu kullanabilir, dağıtabilir, değiştirilmiş sürümlerini değiştirebilir ve dağıtabilirsiniz. Yine de ayrıntılar konusunda çok net değilim.
slhck

2
@bobsmith Apple, Safari'nin son sürümünde bunu kullandı. Sürüm notlarında Arc90'a atıfta bulundular.
s4y

7

İlginç. Benzer bir PHP betiği geliştirdim. Temel olarak makaleleri tarar ve tüm metne konuşma bölümlerini ekler (Brill Tagger). Ardından, dilbilgisi açısından geçersiz cümleler anında ortadan kaldırılır. Daha sonra zamirlerde veya geçmiş zamanda ani değişiklikler, makalenin bittiğini veya henüz başlamadığını gösterir. Sayfada on kez "Yahoo haber spor finansmanı" göründüğü gibi, tekrarlanan ifadeler aranır ve elenir. Ayrıca çeşitli duygularla ilgili çok sayıda kelime bankası içeren tonla ilgili istatistikler de alabilirsiniz. Aktif / negatif / finansaldan pasif / pozitif / politik tonda ani değişimler bir sınırı belirtir. Ne kadar derin kazmak isterseniz isteyin gerçekten sonsuzdur.

Başlıca sorunlar bağlantılar, gömülü anormallikler, komut dosyası stilleri ve güncellemelerdir.


3
Bu gerçekten ilginç bir yaklaşım gibi görünüyor - bundan paylaşacak herhangi bir kodunuz var mı?
lsh

2
İkinci olarak bakabileceğimiz kodunuzu çevreleyen herhangi bir örnek kodunuz veya bilginiz var mı?
userabuser
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.