2011-08-28 12 views

Odpowiedz

6

To dość trudne zadanie, ale zacznę od liczenia spacji wewnątrz elementów DOM. Znakiem rozpoznawczym treści czytelnej dla człowieka są spacje i kropki. Większość artykułów zdaje się enkapsulować treść w znacznikach akapitów, aby można było spojrzeć na wszystkie znaczniki p, zawierające n spacji i co najmniej jeden znak interpunkcyjny.

Można również użyć liczby zgrupowanych znaczników akapitu wewnątrz elementu. Więc jeśli element div ma N akapitów podrzędnych, może to być zawartość, którą chcesz wyodrębnić.

+0

ciekawy pomysł. Zdecydowanie nie jest to coś, o czym natychmiast pomyślałem ...:] –

+0

Pomyślałem o tym, próbowałem grupować akapity przez rodziców. Ale w praktyce mogą istnieć inne akapity, które mogą odwrócić uwagę od głównego kontenera. – Andrew

+0

W takim przypadku prawdopodobnie będziesz musiał użyć jakiejś heurystyki na nazwie/identyfikatorze kontenera. Czy masz URL instancji, o której wspomniałeś? –

1

Wydaje się, że najlepszą odpowiedzią jest „to zależy”. W zależności od tego, w jaki sposób dana witryna jest oznaczona.

  1. Jeśli autor używa „wspólne” tagów, można spojrzeć na pojemnik elementu zidentyfikował jako „treści” lub „główny”.
  2. Jeśli autor używa HTML5, teoretycznie powinieneś zapytać o element <article>, jeśli jest to strona zawierająca tylko jedną "historię".
0

To zależy w dużej mierze od strony. Czy wiesz wcześniej coś o strukturze strony? Jeśli masz szczęście, możesz podać kanał RSS, z którego możesz skorzystać lub który może być oznaczony niektórymi nowymi znacznikami HTML5, takimi jak <article>, <section> itd. (Które carry more semantic power than pre-HTML5 tags).

6

Istnieją pewne ramy, które mogą to zarchiwizować, jednym z nich jest http://code.google.com/p/boilerpipe/, który wykorzystuje pewne statystyki. Niektóre funkcje, które mogą wykryć blok HTML z głównej zawartości:

  1. p, znaczniki div
  2. ilość tekstu wewnątrz/na zewnątrz
  3. ilość linków wewnątrz/na zewnątrz (czyli usunąć munus)
  4. niektóre css klasy i ID (frequntly tych bloków mają klas i identyfikatory z głównym main_block, zawartości itp)
  5. relacji tytule i tekst, na treści
2

Można rozważyć:

  • Boilerpipe: „Biblioteka boilerpipe zapewnia algorytmów do wykrywania i usuwania nadmiaru«bałagan»(boilerplate, szablony) wokół głównej zawartości tekstowej strony internetowej. Biblioteka zapewnia już określone strategie dla typowych zadań (na przykład: wyodrębnianie artykułów) i może być również łatwo rozszerzona na indywidualne ustawienia problemów. "
  • Ruby Readability:" Czytelność rubla jest narzędziem do wyodrębniania podstawowej czytelnej treści strony internetowej. Jest to port czytelności Ruby projektu arc90."
  • The Readability API:" Jeśli chcesz mieć bezpośredni dostęp do analizatora czytelności, interfejs API Content jest dostępny na żądanie. Skontaktuj się z nami, jeśli jesteś zainteresowany. "
0

Ostatnio zmierzyłem się z tym samym problemem: opracowałem skrobaczkę do artykułów i musiałem wykryć główną zawartość tekstową stron z artykułami. Wiele witryn z wiadomościami wyświetla wiele innych treść tekstowa obok "głównego artykułu" (np. "czytaj dalej", "możesz być zainteresowany"). Moje pierwsze podejście polegało na zebraniu całego tekstu między tagami <p>. Ale to nie działało, ponieważ istniały serwisy informacyjne, które korzystały z <p> do innych elementów, takich jak nawigacja, „czytaj dalej”, itd. też. Jakiś czas temu natknąłem się na tej Boilerpipe libary.

biblioteka zapewnia już konkretne strategie typowe zadania (na przykład: wyodrębnianie artykułów z wiadomości) i można je łatwo rozszerzyć dla indywidualnych ustawień problemów.

To brzmiało jak idealne rozwiązanie dla mojego problemu, ale tak nie było. Nie powiodło się na wielu serwisach informacyjnych, ponieważ często nie było w stanie przeanalizować całego tekstu artykułu. Nie wiem dlaczego, ale myślę, że algorytm bojlerów nie radzi sobie z źle napisanym html. W wielu przypadkach po prostu zwrócił pusty ciąg, a nie główną treść artykułu.

Po tym złym doświadczeniu próbowałem opracować własny algorytm "wyodrębniania tekstu artykułu". Główną ideą było podzielić html na różnych głębokościach, na przykład:

<html> 
<!-- depth: 1 --> 
<nav> 
    <!-- depth: 2 --> 
    <ul> 
     <!-- depth: 3 --> 
     <li><a href="/mhh">Site<!-- depth: 5 --></a></li> 
     <li><a href="/bla">Site<!--- depth: 5 ---></a></li> 
    </ul> 
</nav> 
<div id='text'> 
    <!--- depth: 2 ---> 
    <p>Thats the main content...<!-- depth: 3 --></p> 
    <p>main content, bla, bla bla ... <!-- depth: 3 --></p> 
    <p>bla bla bla interesting bla bla! <!-- depth: 3 --></p> 
    <p>whatever, bla... <!-- depth: 3 --></p> 
</div> 

</html> 

Jak widać, do filer się nadmiar „bałagan” z tego algorytmu, takie rzeczy elementów nawigacyjnych, „ty lubić” sekcje itp. muszą znajdować się na innej głębokości niż główna treść. Innymi słowy: nadmiar "bałaganu" musi być opisany za pomocą większej ilości (lub mniej) znaczników html niż główna treść tekstowa.

  1. Oblicz głębokość każdego elementu html.
  2. Znajdź głębokość z największą ilością treści tekstowych.
  3. Zaznacz wszystkie treści tekstowe z tej głębokości

celu udowodnienia tej koncepcji Napisałem Ruby script, który działa obecnie dobrze, ze większość witryn informacyjnych. Oprócz skryptu Ruby opracowałem także model textracto.com api, z którego można korzystać bezpłatnie.

Pozdrowienia, David

0

Mam przeniesiony oryginalny kod boilerpipe Java w czystej realizacji ruby ​​Ruby Boilerpipe również wersja JRuby zawijania oryginalnego kodu Java Jruby Boilerpipe