2012-02-13 5 views
6

boilerpipeのJavaライブラリを使用して、一連のウェブサイトからニュース記事を抽出しようとしています。 英語のテキストでは効果的ですが、アクセント記号(ヒストリア)のような特殊文字を含むテキストの場合、この特殊文字は正しく抽出されません。私はそれがエンコーディングの問題だと思う。ボイラーパイプを使用して英語以外の記事を抽出する

ボイラーパイプfaqでは、「英語以外のテキストを抽出した場合、一部のパラメータを変更する必要があります」と表示され、paperを参照しています。この論文では解決策が見つかりませんでした。

私の質問は、私がエンコーディングを指定できるボイラーパイプを使用しているときに何らかのパラメータがありますか?テキストを正しく取得する方法はありますか?私が見るものから

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

(第2 HTLMのソースコード上)

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

答えて

1

をオーバーライドすることができるかどうか、解決策を得ました。 Andreiが言ったように、私は、パッケージde.l3s.boilerpipe.saxにあるクラスHTMLFectherを変更する必要がありました。 私が行ったことは、フェッチされたすべてのテキストをUTF-8に変換することでした。 はフェッチ機能の終わりに、私は2つの行を追加する必要がありましたし、最後の1を変更します。

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

まあ、: (最初のURLに基​​づいしよう):私は、ライブラリを使用していますどのように

そのように使用すると、ライブラリは使用するエンコーディングを自動的に選択します。 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)で始まる、自分のコードをデバッグするビットを試してみてください、あなたは[OK]をエンコーディング

+0

ありがとうございました。私は今それに注意を払うだけで申し訳ありませんが、私は別のプロジェクトで立ち往生しています。私はコードのこの塊の後に変数csに設定されたエンコンディングを印刷しようとしましたが、結果は常にISO-8859-1でした。私はエンコーディングを強制的にUTF-8にしようとしましたが、良い結果は得られませんでした。 問題は変換の1つ、HTMLDocument、TextDocumentなどにある必要があります。しかし、テキストコンテンツを印刷する際に問題があります。何か案は?再度、感謝します。 –

+0

Andrei、あなたは正しいです。私は多くを複雑にしようとしていましたが、結局それは非常に単純な解決策でした。もう一度お礼します。申し訳ありませんが、私はまだあなたをアップアップすることはできません。 –

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

まず、あなたの答えをコメントしてくれて申し訳ありません。それを与えてくれてありがとう。 残念ながら、それは私のために働いていません。私はちょうどそれを試して、アクセント記号付きのすべての手紙は '?'私は抽出された記事を印刷します。私はこれまでの解決策にとどまります。 –

+0

多くのありがとう。アラビア語の表示に問題を修正しました –

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: 実行]> [実行構成]> [共通]タブ。 EncodingをOther(UTF-8)に設定して、Runをクリックします。

enter image description here

関連する問題