2012-02-13 88 views
6

我想使用boilerpipe java庫來從一組網站中提取新聞文章。 它適用於英文文本,但對於帶有特殊字符的文本(例如帶有重音符號的文字(歷史記錄)),此特殊字符不能正確提取。我認爲這是一個編碼問題。使用boilerpipe提取非英文文章

在boilerpipe常見問題中,它說「如果提取非英文文本,您可能需要更改一些參數」,然後參考paper。我在本文中找不到解決方案。

我的問題是,有沒有任何參數,當使用boilerpipe我可以指定編碼?有什麼方法可以解決問題並正確地獲取文本嗎?

如何我使用的庫: (第一次嘗試基於URL):

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

(第二次在HTLM源代碼)​​

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

回答

1

好,得到了一個解決方案。 正如Andrei所說,我必須更改包中的類HTMLFecther de.l3s.boilerpipe.sax 我所做的就是將所有已提取的文本轉換爲UTF-8。 在讀取功能結束後,我不得不添加兩行,更改最後一個:

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

那麼從我所看到的,當你這樣使用它時,庫會自動選擇使用哪種編碼。從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 
      } 
     } 
    } 

嘗試調試他們的代碼了一下,開始ArticleExtractor.getText(URL),看看你是否可以覆蓋編碼

+0

謝謝你的回答。我很抱歉現在只關注它,但我一直被困在另一個項目中。我試過在這段代碼之後打印設置在變量cs上的代碼,結果始終是ISO-8859-1。我也試圖強制編碼爲UTF-8,但沒有得到更好的結果。 該問題必須在其中一個轉換,HTMLDocument,TextDocument等,但我有一些麻煩打印他們的文字內容。有任何想法嗎?再次感謝。 – 2012-02-24 20:06:59

+0

安德烈,你是對的。我試圖讓很多事情變得複雜,但最終它是一個非常簡單的解決方案。再次感謝,我很抱歉,我還無法讚揚你。 – 2012-03-06 15:33:41

2

您不必修改內部Boilerpipe類。

只需將InputSource對象傳遞給​​方法並強制編碼該對象。例如:

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

問候!

+1

首先,抱歉花了這麼長時間來評論你的答案,並感謝你給予它。 不幸的是,它不適合我。我只是試了一下,所有帶有重音符號的字母變成'?'當我打印提取的文章。現在我將繼續使用以前的解決方案。 – 2012-07-05 13:37:53

+0

非常感謝。你在解決我的問題時顯示阿拉伯語 – 2016-02-22 19:13:23

0

我有一些問題; cnr解決方案效果很好。只需將UTF-8編碼更改爲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

Boilerpipe的ArticleExtractor使用已經專門爲英語的一些算法 - 測量平均短語等詞的數量在比英語或多或少詳細的任何語言(即:所有其他語言),這些算法將不太準確。

此外,圖書館使用一些英語短語來嘗試和找到文章的結尾(評論,發表評論,有你的發言等),這顯然不適用於其他語言。

這並不是說圖書館會徹底失敗 - 只是要意識到一些修改可能需要非英語語言的良好結果。

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: 運行>運行配置>通用標籤。將編碼設置爲其他(UTF-8),然後單擊運行。

enter image description here