Jakiego algorytmu używa czytelność do wyodrębniania tekstu z adresów URL?


102

Od jakiegoś czasu próbowałem znaleźć sposób na inteligentne wyodrębnienie „odpowiedniego” tekstu z adresu URL poprzez wyeliminowanie tekstu związanego z reklamami i całego innego bałaganu. Po kilku miesiącach poszukiwań porzuciłem to jako problem których nie można dokładnie określić. (Próbowałem różnych sposobów, ale żaden nie był wiarygodny)

Tydzień temu natknąłem się na Readability - wtyczkę, która konwertuje dowolny adres URL na czytelny tekst. Wydaje mi się to całkiem dokładne. Domyślam się, że w jakiś sposób mają algorytm, który jest wystarczająco inteligentny, aby wyodrębnić odpowiedni tekst.

Czy ktoś wie, jak oni to robią? Albo jak mogłem to zrobić niezawodnie?


3
Pytanie brzmi, jakiego algorytmu używa SO, że czytelność nie obsługuje jego stron? :)
Piotr Dobrogost

Odpowiedzi:


170

Na czytelność składają się głównie heurystyki, które w wielu przypadkach „po prostu jakoś dobrze działają”.

Napisałem kilka artykułów naukowych na ten temat i chciałbym wyjaśnić, dlaczego łatwo jest znaleźć rozwiązanie, które działa dobrze, a kiedy trudno jest uzyskać dokładność bliską 100%.

Wydaje się, że istnieje prawo językowe leżące u podstaw ludzkiego języka, które jest również (ale nie wyłącznie) widoczne w treści strony internetowej, które już dość wyraźnie oddziela dwa rodzaje tekstu (pełny tekst i niepełny tekst lub, z grubsza, „ treść główna „a„ szablonowy ”).

Aby uzyskać główną zawartość z HTML, w wielu przypadkach wystarczy zachować tylko elementy tekstowe HTML (tj. Bloki tekstu, które nie są przerywane przez znaczniki), które mają więcej niż około 10 słów. Wydaje się, że ludzie wybierają jeden z dwóch typów tekstu („krótki” i „długi”, mierzony liczbą słów, które emitują) dla dwóch różnych motywacji pisania tekstu. Nazwałbym je motywacjami „nawigacyjnymi” i „informacyjnymi”.

Jeśli autor chce, abyś szybko zrozumiał to, co jest napisane, używa tekstu „nawigacyjnego”, czyli kilku słów (np. „STOP”, „Przeczytaj to”, „Kliknij tutaj”). Jest to najbardziej widoczny typ tekstu w elementach nawigacyjnych (menu itp.)

Jeśli autor chce, abyś głęboko zrozumiał, co ma na myśli, używa wielu słów. W ten sposób niejednoznaczność jest usuwana kosztem wzrostu liczby zwolnień. Treść podobna do artykułu zwykle mieści się w tej klasie, ponieważ zawiera więcej niż tylko kilka słów.

Chociaż ta separacja wydaje się działać w wielu przypadkach, staje się trudna w przypadku nagłówków, krótkich zdań, zastrzeżeń, stopek dotyczących praw autorskich itp.

Istnieją bardziej wyrafinowane strategie i funkcje, które pomagają oddzielić główną treść od schematu. Na przykład gęstość linków (liczba słów w bloku, które są połączone w porównaniu z całkowitą liczbą słów w bloku), cechy poprzednich / następnych bloków, częstotliwość określonego tekstu bloku w „całej” sieci, Struktura DOM dokumentu HTML, wizualny obraz strony itp.

Możesz przeczytać mój najnowszy artykuł „ Wykrywanie tablic kotłowych przy użyciu funkcji płytkiego tekstu ”, aby uzyskać wgląd z teoretycznej perspektywy. Możesz również obejrzeć wideo z mojej prezentacji na VideoLectures.net.

„Czytelność” wykorzystuje niektóre z tych funkcji. Jeśli uważnie przyjrzysz się dziennikowi zmian SVN, zobaczysz, że liczba strategii zmieniała się w czasie, podobnie jak jakość ekstrakcji czytelności. Na przykład wprowadzenie gęstości linków w grudniu 2009 r. Bardzo pomogło w ulepszeniu.

Moim zdaniem nie ma zatem sensu mówienie „Czytelność robi to w ten sposób” bez podawania dokładnego numeru wersji.

Opublikowałem bibliotekę do ekstrakcji treści HTML Open Source o nazwie boilerpipe , która zapewnia kilka różnych strategii ekstrakcji. W zależności od przypadku użycia jeden lub drugi ekstraktor działa lepiej. Możesz wypróbować te ekstraktory na wybranych stronach, korzystając z towarzyszącej aplikacji sieciowej boilerpipe w Google AppEngine.

Aby liczby przemówiły, odwiedź stronę „ Benchmarks ” na wiki boilerpipe, która porównuje niektóre strategie ekstrakcji, w tym boilerpipe, Readability i Apple Safari.

Powinienem wspomnieć, że te algorytmy zakładają, że główna treść jest w rzeczywistości pełnym tekstem. Zdarzają się przypadki, w których „treść główna” jest czymś innym, np. Obrazem, tabelą, filmem itp. Algorytmy nie sprawdzą się dobrze w takich przypadkach.

Twoje zdrowie,

chrześcijanin


3
Czy ten projekt kotłowni jest nadal aktywny?
Abby

5
Wierzę, że lepiej umieść swój projekt na GitHub, aby rozwijał się społecznie przez programistów open source.
Inanc Gumus

1
Dobrym przykładem wyjaśnienia dr Kohlschüttera jest w rzeczywistości ta strona internetowa, w Safari, jeśli używałeś Czytnika, zobaczysz, że jego odpowiedź jest wyświetlana jako tekst główny, dzięki gęstości linków. Jest to połączony tekst, dlatego jest rozpoznawany jako tekst główny w porównaniu z innymi blokami.
Abdelrahman Eid

1
„Migrowanych” kopię do mojego repo github.com/k-bx/boilerpipe tylko w przypadku, gdy ginie :)
Konstantine Rybnikov

16

czytelność to bookmarklet javascript. czyli kod po stronie klienta, który manipuluje DOM. Spójrz na javascript i powinieneś być w stanie zobaczyć, co się dzieje.

Czytelność przepływu pracy i kod:

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

A jeśli podążasz za plikami JS i CSS, które wciąga powyższy kod, otrzymasz pełny obraz:

http://lab.arc90.com/experiments/readability/js/readability.js (to całkiem dobrze skomentowane, ciekawa lektura)

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


12

Oczywiście nie ma w 100% niezawodnego sposobu, aby to zrobić. Możesz rzucić okiem na kod źródłowy czytelności tutaj

Zasadniczo próbują zidentyfikować pozytywne i negatywne bloki tekstu. Identyfikatory dodatnie (tj. Identyfikatory div) wyglądałyby następująco:

  • artykuł
  • ciało
  • zadowolony
  • blog
  • fabuła

Negatywne identyfikatory to:

  • komentarz
  • omawiać

A potem mają mało prawdopodobnych i być może kandydatów. To, co zrobiliby, to określić, co najprawdopodobniej będzie główną treścią witryny, patrz wiersz 678w źródle czytelności. Odbywa się to poprzez analizę głównie długości akapitów, ich identyfikatorów (patrz wyżej), drzewa DOM (tj. Jeśli akapit jest ostatnim węzłem potomnym), usunięcie wszystkiego, co jest niepotrzebne, usunięcie formatowania itp.

Kod ma 1792 linie. Wydaje się, że to nietrywialny problem, więc może stamtąd możesz czerpać inspiracje.


2
Czy wiesz, czy ich kod jest open source i czy można go używać w produktach komercyjnych?
user300981,

2
Mówi się, że kod źródłowy jest udostępniany na warunkach Apache License 2.0, co oznacza, że ​​można go używać, rozpowszechniać, modyfikować i rozpowszechniać zmodyfikowane wersje. Nie znam jednak szczegółów.
slhck

2
@bobsmith Apple użył go w najnowszej wersji Safari. W informacjach o wydaniu przypisali Arc90.
s4y

7

Ciekawy. Opracowałem podobny skrypt PHP. Zasadniczo skanuje artykuły i dołącza części mowy do całego tekstu (Brill Tagger). Następnie zdania niepoprawne gramatycznie są natychmiast eliminowane. Nagłe zmiany zaimków lub czasu przeszłego wskazują, że artykuł się skończył lub jeszcze się nie rozpoczął. Powtarzające się frazy są wyszukiwane i usuwane, np. „Yahoo news sports finance” pojawia się na stronie dziesięć razy. Możesz również uzyskać statystyki dotyczące tonu z mnóstwem banków słów odnoszących się do różnych emocji. Nagłe zmiany tonu, od aktywnego / negatywnego / finansowego do pasywnego / pozytywnego / politycznego, wskazują granicę. To naprawdę nieskończone, jakkolwiek chcesz kopać głęboko.

Głównymi problemami są łącza, osadzone anomalie, style skryptów i aktualizacje.


3
To brzmi jak naprawdę interesujące podejście - czy masz jakiś kod do udostępnienia z tego?
lsh

2
Po drugie, czy masz przykładowy kod lub informacje otaczające Twój kod, którym możemy się przyjrzeć?
userabuser
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.