2012-02-13 10 views
6

Estoy tratando de usar boilerpipe biblioteca de Java, para extraer noticias de un conjunto de sitios web. Funciona muy bien para textos en inglés, pero para texto con caracteres especiales, por ejemplo, palabras con acentos (história), estos caracteres especiales no se extraen correctamente. Creo que es un problema de codificación.Uso de boilerpipe para extraer artículos no ingleses

En el faq boilerpipe, dice "Si extrae texto que no está en inglés, es posible que necesite cambiar algunos parámetros" y luego se refiere a paper. No encontré ninguna solución en este documento.

Mi pregunta es, ¿hay algún parámetro al usar boilerpipe donde puedo especificar la codificación? ¿Hay alguna forma de dar la vuelta y obtener el texto correctamente?

Cómo estoy usando la biblioteca: (primer intento basado en la URL):

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

(segundo en el código fuente HTLM)

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

Respuesta

1

Entendido una solución. Como dijo Andrei, tuve que cambiar la clase HTMLFecther, que está en el paquete de.l3s.boilerpipe.sax Lo que hice fue convertir todo el texto que se había obtenido, a UTF-8. Al final de la función de búsqueda, he tenido que añadir dos líneas, y cambiar la última:

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

Bueno, por lo que veo Cuando lo usa así, la biblioteca elegirá automáticamente qué codificación usar. Desde la fuente 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 
      } 
     } 
    } 

Trate depurar su código un poco, empezando por ArticleExtractor.getText(URL), y ver si se puede anular la codificación

+0

Gracias por la respuesta. Lo siento por solo prestarle atención ahora pero me he quedado atrapado en otro proyecto. Intenté imprimir el código que se configuró en la variable c después de este fragmento de código, y el resultado siempre fue ISO-8859-1. También intenté forzar la codificación para que fuera UTF-8, pero no obtuve mejores resultados. El problema debe estar en una de las conversiones, en HTMLDocument, en TextDocument, etc. Pero estoy teniendo problemas para imprimir su contenido de texto. ¿Algunas ideas? Gracias de nuevo. –

+0

Andrei, tenías razón. Estaba intentando complicar mucho, pero al final fue una solución muy simple. Gracias de nuevo, lo siento, no puedo haberte subyugado aún. –

2

Usted no tiene que modificar interiores Boilerpipe clases.

Simplemente pase el objeto InputSource al método ArticleExtractor.INSTANCE.getText() y fuerce la codificación en ese objeto. Por ejemplo:

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

¡Recuerdos!

+1

En primer lugar, siento tomar tanto tiempo para comentar su respuesta, y gracias por brindarla. Desafortunadamente no funciona para mí. Acabo de probarlo, y todas las letras con acentos se convierten en '?' cuando imprimo el artículo extraído Me quedaré con la solución anterior por ahora. –

+0

muchas gracias. corrigió mi problema al mostrar árabe –

0

Tuve un problema; la solución cnr funciona muy bien. Simplemente cambie la codificación UTF-8 a 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 de Boilerpipe de agradecimiento utiliza algunos algoritmos que han sido adaptados específicamente a Inglés - número de palabras en frases promedio de medición, etc. En cualquier idioma, que es más o menos detallado de Inglés (es decir: cada otro idioma), estos los algoritmos serán menos precisos.

Además, la biblioteca utiliza algunas frases en inglés para intentar encontrar el final del artículo (comentarios, publicar un comentario, dar su opinión, etc.) que claramente no funcionará en otros idiomas.

Esto no quiere decir que la biblioteca fallará rotundamente, solo tenga en cuenta que es probable que se necesiten algunas modificaciones para obtener buenos resultados en idiomas distintos del inglés.

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: Ejecutar> Configuraciones de carrera> Ficha Común. Establezca la codificación en Otro (UTF-8), luego haga clic en Ejecutar.

enter image description here

Cuestiones relacionadas