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.
- Oblicz głębokość każdego elementu html.
- Znajdź głębokość z największą ilością treści tekstowych.
- 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
ciekawy pomysł. Zdecydowanie nie jest to coś, o czym natychmiast pomyślałem ...:] –
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
W takim przypadku prawdopodobnie będziesz musiał użyć jakiejś heurystyki na nazwie/identyfikatorze kontenera. Czy masz URL instancji, o której wspomniałeś? –