Boilerpipeは非常にうまく機能しているように見えますが、多くのページに記事がないため、メインコンテンツだけが必要ではなく、テキスト全体への短い説明のリンクのみが必要であることに気付きました(これはニュースポータルで一般的です)。これらのショートテキストを破棄したくありません。
したがって、APIがこれを行う場合は、単一のテキストとは異なる方法でそれぞれを分割するさまざまなテキスト部分/ブロックを取得してください(すべて1つのテキストだけでは役に立ちません)。報告してください。
ランダムなサイトからいくつかのページをダウンロードしましたが、ページのテキストコンテンツを分析したいと思います。
問題は、Webページにメニュー、宣伝、バナーなどのコンテンツがたくさんあることです。
ページの内容に関係のないものはすべて除外したいと思います。
このページを例にとると、フッターのリンクの上にあるメニューは必要ありません。
重要:すべてのページはHTMLであり、さまざまなサイトのページです。これらのコンテンツを除外する方法の提案が必要です。
現時点では、「menu」クラスと「banner」クラス内のコンテンツをHTMLから除外し、固有名詞(最初の大文字)のように見える連続した単語を除外すると思います。
ソリューションは、テキストコンテンツ(HTMLタグなし)またはHTMLコンテンツ(HTMLタグ付き)に基づくことができます。
編集:これを外部アプリケーションではなくJavaコード内で実行したい(可能な場合) 。
この質問で説明されているHTMLコンテンツを解析する方法を試しました: https://stackoverflow.com/questions/7035150/how-to-traverse-the-dom-tree-using-jsoup-doing-some-content -フィルタリング
Boilerpipe を見てください。それはあなたが探していることを正確に行うように設計されており、ウェブページのメインテキストコンテンツの周りの余分な「クラッター」(ボイラープレート、テンプレート)を取り除きます。
HTMLをBoilerpipeにフィードしてHTMLを抽出する方法はいくつかあります。
次のことができます RLを使用 :
ArticleExtractor.INSTANCE.getText(url);
次のことができます 文字列を使用 :
ArticleExtractor.INSTANCE.getText(myHtml);
リーダーを使用 のオプションもあり、多数のオプションが開きます。
boilerpipe tosegmentを使用して、テキストをフルテキスト/非フルテキストのブロックにすることもできます。それらの1つを返します(基本的に、最初にボイラーパイプセグメントを返し、次に文字列を返します)。
Java.io.ReaderからHTMLにアクセスできると仮定して、ボイラーパイプでHTMLをセグメント化し、セグメントを分類します。
Reader reader = ...
InputSource is = new InputSource(reader);
// parse the document into boilerpipe's internal data structure
TextDocument doc = new BoilerpipeSAXInput(is).getTextDocument();
// perform the extraction/classification process on "doc"
ArticleExtractor.INSTANCE.process(doc);
// iterate over all blocks (= segments as "ArticleExtractor" sees them)
for (TextBlock block : getTextBlocks()) {
// block.isContent() tells you if it's likely to be content or not
// block.getText() gives you the block's text
}
TextBlock
にはもっとエキサイティングな方法がいくつかありますので、お気軽に遊んでください!
Boilerpipeに問題がある可能性があります。どうして?そうですね、単一のコンテンツを含むWebページなど、特定の種類のWebページに適しているようです。
したがって、Boilerpipeに関してWebページを大まかに3種類に分類できます。
Boilerpipeはケース#1で動作します。しかし、多くの自動テキスト処理を行っている場合、ソフトウェアはどのような種類のWebページを扱っているかをどのように「認識」しているのでしょうか。 Webページ自体をこれら3つのバケットのいずれかに分類できる場合は、ケース#1にBoilerpipeを適用できます。ケース#2は問題であり、ケース#3も問題です。何が雑然としていて何がそうでないかを判断するために、関連するWebページの集約が必要になる場合があります。
私の最初の本能は、Jsoupを使用する最初の方法を採用することでした。少なくともそれで、セレクターを使用して、必要な要素のみを取得できます(つまり、Elements posts = doc.select("p");
であり、ランダムなコンテンツを持つ他の要素について心配する必要はありません。
あなたの他の投稿の問題で、誤検知の問題は、Jsoupから離れる唯一の理由でしたか?もしそうなら、MIN_WORDS_SEQUENCEの数を微調整したり、セレクターでより選択的にしたりすることはできません(つまり、div要素を取得しないでください)
http://kapowsoftware.com/products/kapow-katalyst-platform/robo-server.php
プロプライエタリソフトウェアですが、Webページからの抽出が非常に簡単で、Javaとうまく統合できます。
提供されているアプリケーションを使用して、roboserverapiによって読み取られるxmlファイルを設計してWebページを解析します。 xmlファイルは、提供されたアプリケーション内で解析するページを分析し(かなり簡単)、データを収集するためのルールを適用することによって作成されます(通常、Webサイトは同じパターンに従います)。提供されているJava APIを使用して、スケジューリング、実行、およびデータベース統合をセットアップできます。
ソフトウェアを使用して自分でそれを行うことに反対している場合は、すべてのサイトに1つのルールを適用しようとしないことをお勧めします。タグを分離してからサイトごとに構築する方法を見つける
goose のようないくつかのライブラリを使用できます。それは記事/ニュースで最もよく働きます。 読みやすさのブックマークレット を使用して、ガチョウと同様の抽出を行うJavaScriptコードを確認することもできます。
HTMLジャンクをフィルタリングしてから、必要な詳細を解析するか、既存のサイトのAPIを使用できます。以下のリンクを参照してHTMLをフィルタリングしてください。お役に立てば幸いです。 http://thewiredguy.com/wordpress/index.php/2011/07/dont-have-an-apirip-dat-off-the-page/
textracto apiを使用できます。これにより、メインの「記事」テキストが抽出され、その他すべてを抽出する機会もありますテキストコンテンツ。これらのテキストを「差し引く」ことにより、ナビゲーションテキスト、プレビューテキストなどをメインのテキストコンテンツから分割できます。