2012-02-13 8 views
6

Sto tentando di utilizzare la libreria java boilerpipe per estrarre articoli di notizie da un insieme di siti Web. Funziona perfettamente per i testi in inglese, ma per il testo con caratteri speciali, ad esempio parole con segni di accento (história), questi caratteri speciali non vengono estratti correttamente. Penso che sia un problema di codifica.Utilizzo di boilerpipe per estrarre articoli non inglesi

Nel faq boilerpipe, dice "Se si estrae testo non inglese potrebbe essere necessario modificare alcuni parametri" e quindi fa riferimento a un paper. Non ho trovato soluzione in questo documento.

La mia domanda è, ci sono dei parametri quando si utilizza boilerpipe dove posso specificare la codifica? C'è un modo per andare in giro e ottenere il testo correttamente?

Come sto usando la libreria: (primo tentativo in base alla URL):

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

(secondo sul codice sorgente HTLM)

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

risposta

1

Ok, ha ottenuto una soluzione. Come ha detto Andrei, ho dovuto cambiare la classe HTMLFecther, che è nel pacchetto de.l3s.boilerpipe.sax Quello che ho fatto è stato convertire tutto il testo che è stato recuperato, in UTF-8. Alla fine della funzione fetch, ho dovuto aggiungere due righe, e cambiare l'ultimo:

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

Beh, da quello che vedo , quando lo si utilizza in questo modo, la libreria selezionerà automaticamente la codifica da utilizzare. Dalla fonte 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 
      } 
     } 
    } 

Prova il debug loro codice un po ', a partire da ArticleExtractor.getText(URL), e vedere se è possibile ignorare la codifica

+0

Grazie per la risposta. Mi dispiace solo per aver prestato attenzione ora ma sono stato bloccato in un altro progetto. Ho provato a stampare l'encond che era impostato sulla variabile c dopo questo pezzo di codice, e il risultato era sempre ISO-8859-1. Ho anche provato a forzare la codifica ad essere UTF-8, ma non ho ottenuto risultati migliori. Il problema deve essere in una delle conversioni, in HTMLDocument, in TextDocument, ecc. Ma ho qualche problema a stampare il loro contenuto di testo. Qualche idea? Grazie ancora. –

+0

Andrei, avevi ragione. Stavo cercando di complicare molto, ma alla fine è stata una soluzione molto semplice. Grazie ancora, mi dispiace di non poterti ancora invogliare. –

2

Non è necessario modificare interne Boilerpipe classi.

Basta passare l'oggetto InputSource al metodo ArticleExtractor.INSTANCE.getText() e forzare la codifica su quell'oggetto. Ad esempio:

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); 

Saluti!

+1

In primo luogo, mi dispiace di prendere così tanto tempo per commentare la tua risposta, e grazie per averlo dato. Purtroppo non funziona per me. L'ho appena provato e tutte le lettere con segni di accento diventano '?' quando stampo l'articolo estratto. Rimarrò con la soluzione precedente per ora. –

+0

molte grazie. hai risolto il mio problema nel mostrare l'arabo –

0

Ho avuto qualche problema; la soluzione cnr funziona alla grande. Basta cambiare la codifica UTF-8 in ISO-8859-1.

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 di Boilerpipe di ringraziamento utilizza alcuni algoritmi che sono stati studiati appositamente per Inglese - numero di parole in frasi media, ecc misura in qualsiasi lingua che è più o meno verbose diversa dall'inglese (es: ogni altra lingua) questi gli algoritmi saranno meno accurati.

Inoltre, la libreria utilizza alcune frasi in inglese per cercare la fine dell'articolo (commenti, postare un commento, dire la propria, ecc.) Che chiaramente non funzionerà in altre lingue.

Questo non vuol dire che la libreria fallirà a titolo definitivo, basti pensare che alcune modifiche sono probabilmente necessarie per ottenere buoni risultati in lingue diverse dall'inglese.

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: Esegui> Configurazioni Esegui> Scheda Common. Impostare Codifica su Altro (UTF-8), quindi fare clic su Esegui.

enter image description here

Problemi correlati