104

しばらくの間、広告やその他の雑然としたテキストを排除することで、URLから「関連する」テキストをインテリジェントに抽出する方法を模索してきました。数か月の調査の後、問題としてあきらめました。正確に判断することはできません。(私はさまざまな方法を試しましたが、どれも信頼できませんでした)

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

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

4

4 に答える 4

175

読みやすさは主に、多くの場合「どういうわけかうまく機能する」ヒューリスティックで構成されています。

私はこのトピックについていくつかの研究論文を書きましたが、うまく機能するソリューションを思い付くのが簡単である理由と、100%の精度に近づくのが難しい場合の背景を説明したいと思います。

人間の言語の根底にある言語法則があり、それはWebページのコンテンツにも(ただし排他的にではなく)明示されており、2つのタイプのテキスト(フルテキストと非フルテキスト、または大まかに言って「メインコンテンツ」と「ボイラープレート」)。

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

作者があなたに書かれたものをすぐに手に入れたい場合、彼/彼女は「ナビゲーション」テキスト、すなわちいくつかの単語(「STOP」、「Read this」、「Clickhere」など)を使用します。これは、ナビゲーション要素(メニューなど)で最も目立つタイプのテキストです。

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

この分離は多くの場合に機能するように見えますが、見出し、短い文、免責事項、著作権フッターなどで注意が必要になります。

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

私の最新の記事「浅いテキスト機能を使用したボイラープレート検出」を読んで、理論的な観点から洞察を得ることができます。VideoLectures.netで私の論文発表のビデオを見ることができます。

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

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

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

数字を話せるようにするには、ボイラーパイプwikiの「ベンチマーク」ページを参照してください。ボイラーパイプ、読みやすさ、AppleSafariなどのいくつかの抽出戦略を比較しています。

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

乾杯、

キリスト教徒

于 2010-11-21T20:03:37.753 に答える
16

読みやすさは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

于 2010-09-06T15:42:24.660 に答える
12

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

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

  • 記事
  • コンテンツ
  • ブログ
  • 物語

負の識別子は次のようになります。

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

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

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

于 2010-09-06T15:53:01.220 に答える
7

面白い。私は同様のPHPスクリプトを開発しました。基本的に冠詞をスキャンし、品詞をすべてのテキストに添付します(BrillTagger)。その後、文法的に無効な文は即座に排除されます。次に、代名詞または過去形の突然の変化は、記事が終わったか、まだ始まっていないことを示します。「YahoonewssportsFinance」がページに10回表示されるように、繰り返されるフレーズが検索されて削除されます。また、さまざまな感情に関連する多数の単語バンクを使用して、トーンに関する統計を取得することもできます。アクティブ/ネガティブ/ファイナンシャルからパッシブ/ポジティブ/政治への突然のトーンの変化は、境界を示します。それは本当に無限です、しかしあなたが深くしたい掘ります。

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

于 2011-05-03T11:59:22.793 に答える