web-dev-qa-db-ja.com

可読性は、URLからテキストを抽出するためにどのアルゴリズムを使用しますか?

しばらくの間、広告に関連するテキストやその他のすべての雑然としたものを排除することで、URLから「関連する」テキストをインテリジェントに抽出する方法を見つけようとしていました。正確に判断することはできません。 (私はさまざまな方法を試しましたが、信頼できるものはありませんでした)

1週間前、私は Readability -URLを読み取り可能なテキストに変換するプラグインに出くわしました。私にはかなり正確に見えます。私の推測では、彼らはどういうわけか、関連するテキストを抽出するのに十分スマートなアルゴリズムを持っていると思います。

誰もがそれをどのように行うか知っていますか?または、どうすれば確実にできるのでしょうか?

102
user300981

可読性は主に、多くの場合「何らかの形でうまく機能する」ヒューリスティックで構成されています。

このトピックに関するいくつかの研究論文を執筆しましたが、なぜうまく機能するソリューションが簡単に思い付くのか、そして100%の精度に近づくのが困難になった背景について説明したいと思います。

Webページのコンテンツにもマニフェストである(しかし排他的ではない)人間の言語の基礎となる言語法があるようです。メインコンテンツ」と「定型文」)。

HTMLからメインコンテンツを取得するには、多くの場合、約10単語以上のHTMLテキスト要素(つまり、マークアップによって中断されないテキストのブロック)のみを保持すれば十分です。人間は、テキストを書く2つの異なる動機のために、2種類のテキスト(「短い」と「長い」、発する単語の数で測定)から選択するようです。私はそれらを「ナビゲーション」および「情報」動機と呼びます。

作者があなたにすばやく書かれたものを取得したい場合、彼/彼女は「ナビゲーション」テキスト、すなわちいくつかの単語(「STOP」、「Readこれ」、「ここをクリック」)。これは、ナビゲーション要素(メニューなど)で最も顕著なタイプのテキストです。

著者があなたに彼/彼女が何を意味するかを深く理解して欲しいなら、彼/彼女は多くの言葉を使います。このように、あいまいさは冗長性の増加を犠牲にして取り除かれます。記事のようなコンテンツは、ほんの数語以上あるため、通常このクラスに分類されます。

この分離は多くのケースで機能するように見えますが、見出し、短い文章、免責事項、著作権フッターなどでは扱いにくいものになっています。

メインコンテンツを定型文から分離するのに役立つ、より洗練された戦略と機能があります。たとえば、リンク密度(ブロック内の単語の総数に対するリンクされたブロック内の単語の数)、前/次のブロックの機能、「全体」Web内の特定のブロックテキストの頻度、 HTMLドキュメントのDOM構造、ページの視覚画像など。

最新の記事「 浅いテキスト機能を使用した定型文検出 」を読んで、理論的な観点から洞察を得ることができます。 VideoLectures.netでの私の論文プレゼンテーションのビデオもご覧ください。

「読みやすさ」はこれらの機能の一部を使用します。 SVNの変更ログを注意深く見ると、戦略の数が時間とともに変化し、Readabilityの抽出品質も変化したことがわかります。たとえば、2009年12月にリンク密度が導入されたことは、改善に非常に役立ちました。

したがって、私の意見では、正確なバージョン番号は言及せずに、「読みやすさはそのようにしています」と言っても意味がありません。

boilerpipe という名前のオープンソースHTMLコンテンツ抽出ライブラリを公開しました。これは、いくつかの異なる抽出戦略を提供します。ユースケースに応じて、どちらか一方のエクストラクターがより適切に機能します。 Google AppEngineの関連するボイラーパイプWebアプリを使用して、選択したページでこれらの抽出プログラムを試すことができます。

数字を話すには、ボイラーパイプWikiの「 Benchmarks 」ページをご覧ください。ボイラーパイプ、可読性、Apple Safari.

これらのアルゴリズムは、メインコンテンツが実際には全文であることを前提としていることに言及する必要があります。 「メインコンテンツ」が他のものである場合があります。画像、表、ビデオなど。このような場合、アルゴリズムはうまく機能しません。

乾杯、

キリスト教の

可読性はjavascriptブックマークレットです。 DOMを操作するクライアント側コードを意味します。 javascriptを見ると、何が起こっているのかがわかるはずです。

可読性のワークフローとコード:

/*
     *  1. Prep the document by removing script tags, css, etc.
     *  2. Build readability's DOM tree.
     *  3. Grab the article content from the current dom tree.
     *  4. Replace the current DOM tree with the new one.
     *  5. Read peacefully.
*/

javascript: (function () {
    readConvertLinksToFootnotes = false;
    readStyle = 'style-newspaper';
    readSize = 'size-medium';
    readMargin = 'margin-wide';
    _readability_script = document.createElement('script');
    _readability_script.type = 'text/javascript';
    _readability_script.src = 'http://lab.arc90.com/experiments/readability/js/readability.js?x=' + (Math.random());
    document.documentElement.appendChild(_readability_script);
    _readability_css = document.createElement('link');
    _readability_css.rel = 'stylesheet';
    _readability_css.href = 'http://lab.arc90.com/experiments/readability/css/readability.css';
    _readability_css.type = 'text/css';
    _readability_css.media = 'all';
    document.documentElement.appendChild(_readability_css);
    _readability_print_css = document.createElement('link');
    _readability_print_css.rel = 'stylesheet';
    _readability_print_css.href = 'http://lab.arc90.com/experiments/readability/css/readability-print.css';
    _readability_print_css.media = 'print';
    _readability_print_css.type = 'text/css';
    document.getElementsByTagName('head')[0].appendChild(_readability_print_css);
})();

そして、上記のコードが取り込むJSファイルとCSSファイルをたどると、全体像が得られます。

http://lab.arc90.com/experiments/readability/js/readability.js (これはかなりよくコメントされており、興味深い読み物です)

http://lab.arc90.com/experiments/readability/css/readability.css

17
Moin Zaman

もちろん、これを行うための100%信頼できる方法はありません。可読性のソースコードを見ることができます here

基本的に、彼らがしていることは、positivenegativeを識別しようとすることですテキストのブロック。正の識別子(つまりdiv ID)は次のようになります。

  • 記事
  • コンテンツ
  • ブログ
  • ストーリー

負の識別子は次のとおりです。

  • コメント
  • 話し合います

そして、unlikelymaybe候補があります。彼らがすることは、サイトのメインコンテンツである可能性が最も高いものを決定することです。678読みやすさのソース。これは、主に段落の長さ、その識別子(上記を参照)、DOMツリー(つまり、段落が最後の子ノードである場合)を分析し、不要なものをすべて取り除き、フォーマットを削除するなどして行われます。

コードには1792行があります。それは些細な問題ではないように思われるので、そこからインスピレーションを得られるかもしれません。

12
slhck

面白い。同様のPHPスクリプト。基本的に記事をスキャンし、すべてのテキストに品詞を添付します(Brill Tagger)。その後、文法的に無効な文が即座に削除されます。その後、代名詞または過去の時制は、記事が終了したか、まだ始まっていないことを示します。「Yahooニューススポーツファイナンス」がページに10回表示されるなど、繰り返されるフレーズが検索されて削除されます。アクティブ/ネガティブ/金融から、パッシブ/ポジティブ/政治への突然のトーンの変化は境界を示します。

主な問題は、リンク、埋め込まれた異常、スクリプトスタイル、および更新です。

7
user734063