2012-02-13 13 views
6

Próbuję użyć biblioteki java boilerpipe, aby wyodrębnić artykuły z zestawu stron internetowych. Działa doskonale w przypadku tekstów w języku angielskim, ale w przypadku tekstu ze znakami specjalnymi, na przykład ze znakami akcentującymi (historia), znaki specjalne nie są pobierane poprawnie. Myślę, że to jest problem z kodowaniem.Używanie bojówki do wypakowywania nieanglojęzycznych artykułów

W opisie potoku bojlerowego jest napisane: "Jeśli wypiszesz tekst w języku innym niż angielski, być może będziesz musiał zmienić niektóre parametry", a następnie odnosi się do paper. Nie znalazłem rozwiązania w tym dokumencie.

Moje pytanie brzmi, czy są jakieś parametry podczas używania bojlera, w którym mogę określić kodowanie? Czy jest jakiś sposób, aby przejść i uzyskać poprawny tekst?

Jak używam biblioteki: (pierwsza próba na podstawie URL):

URL url = new URL(link); 
String article = ArticleExtractor.INSTANCE.getText(url); 

(drugi na kod źródłowy HTLM)

String article = ArticleExtractor.INSTANCE.getText(html_page_as_string); 

Odpowiedz

1

Ok, mam rozwiązanie. Jak powiedział Andrei, musiałem zmienić HTMLFecther klasy, który znajduje się w pakiecie de.l3s.boilerpipe.sax Co zrobiłem, aby przekonwertować cały tekst, który został pobrany, do UTF-8. Pod koniec funkcji zwrcania, musiałem dodać dwie linie, a także zmienić ostatni:

final byte[] data = bos.toByteArray(); //stays the same 
byte[] utf8 = new String(data, cs.displayName()).getBytes("UTF-8"); //new one (convertion) 
cs = Charset.forName("UTF-8"); //set the charset to UFT-8 
return new HTMLDocument(utf8, cs); // edited line 
1

Cóż, z tego co widzę , jeśli użyjesz go w ten sposób, biblioteka automatycznie wybierze kodowanie do użycia. Od źródła HTMLFetcher:

public static HTMLDocument fetch(final URL url) throws IOException { 
    final URLConnection conn = url.openConnection(); 
    final String ct = conn.getContentType(); 

    Charset cs = Charset.forName("Cp1252"); 
    if (ct != null) { 
     Matcher m = PAT_CHARSET.matcher(ct); 
     if(m.find()) { 
      final String charset = m.group(1); 
      try { 
       cs = Charset.forName(charset); 
      } catch (UnsupportedCharsetException e) { 
       // keep default 
      } 
     } 
    } 

Spróbuj debugowania kodu ich trochę, począwszy ArticleExtractor.getText(URL), i sprawdzić, czy można zmienić kodowanie

+0

Dziękuję za odpowiedź. Przykro mi, że teraz zwracam na to uwagę, ale utknąłem w innym projekcie. Próbowałem wydrukować enconding, który został ustawiony na zmiennej cs po tym fragmencie kodu, a wynikiem był zawsze ISO-8859-1. Próbowałem również wymusić kodowanie na UTF-8, ale nie otrzymałem lepszych wyników. Problem musi występować w jednej z konwersji, w dokumencie HTMLDocument, w dokumencie tekstowym itp. Mam jednak problem z wydrukowaniem ich treści tekstowej. Jakieś pomysły? Dzięki jeszcze raz. –

+0

Andrei, miałeś rację. Próbowałem bardzo skomplikować, ale ostatecznie było to bardzo proste rozwiązanie. Jeszcze raz dziękuję, przepraszam, nie mogłem ci jeszcze pomóc. –

2

Nie trzeba modyfikować wewnętrzne Boilerpipe klas.

Po prostu przeprowadź InputSource obiekt do metody ArticleExtractor.INSTANCE.getText() i wymuś kodowanie na tym obiekcie. Na przykład:

URL url = new URL("http://some-page-with-utf8-encodeing.tld"); 

InputSource is = new InputSource(); 
is.setEncoding("UTF-8"); 
is.setByteStream(url.openStream()); 

String text = ArticleExtractor.INSTANCE.getText(is); 

Pozdrawiam!

+1

Po pierwsze, przepraszam, że tak długo komentuję twoją odpowiedź i dziękuję za jej udzielenie. Niestety to nie działa dla mnie. Po prostu próbowałem, a wszystkie litery z akcentem stały się "?" kiedy drukuję wyodrębniony artykuł. Na razie pozostanę przy poprzednim rozwiązaniu. –

+0

wielkie dzięki. Naprawiłeś mój problem z wyświetlaniem arabskiego –

0

Miałem jakiś problem; rozwiązanie cnr działa świetnie. Po prostu zmień kodowanie UTF-8 na ISO-8859-1. Thank za

URL url = new URL("http://some-page-with-utf8-encodeing.tld"); 
InputSource is = new InputSource(); 
is.setEncoding("ISO-8859-1"); 
is.setByteStream(url.openStream()); 

String text = ArticleExtractor.INSTANCE.getText(is); 
1

ArticleExtractor Boilerpipe wykorzystuje pewne algorytmy, które zostały specjalnie dostosowane do języka angielskiego - liczba słów w przeciętnych zwrotów itp pomiaru w dowolnym języku, który jest mniej lub bardziej gadatliwy niż angielski (tj każdy inny język) to algorytmy będą mniej dokładne.

Dodatkowo, w bibliotece używane są angielskie zwroty, aby znaleźć koniec artykułu (komentarze, komentarz, wypowiedzieć się itp.), Który wyraźnie nie działa w innych językach.

Nie oznacza to, że biblioteka ulegnie awarii - wystarczy pamiętać, że niektóre modyfikacje są prawdopodobnie potrzebne do uzyskania dobrych wyników w językach innych niż angielski.

1

Java:

import java.net.URL; 

import org.xml.sax.InputSource; 

import de.l3s.boilerpipe.extractors.ArticleExtractor; 

public class Boilerpipe { 

    public static void main(String[] args) { 
     try{ 
      URL url = new URL("http://www.azeri.ru/az/traditions/kuraj_pehlevanov/"); 

      InputSource is = new InputSource(); 
      is.setEncoding("UTF-8"); 
      is.setByteStream(url.openStream()); 

      String text = ArticleExtractor.INSTANCE.getText(is); 
      System.out.println(text); 
     }catch(Exception e){ 
      e.printStackTrace(); 
     } 
    } 

} 

Eclipse: Run> Run Konfiguracje> Zakładka Common. Ustaw kodowanie na inne (UTF-8), a następnie kliknij Uruchom.

enter image description here

Powiązane problemy