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


102

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

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

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


3
問題は、可読性がそのページを処理しないことをSOが使用するアルゴリズムは何ですか?:)
Piotr Dobrogost 2012年

回答:


170

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

このトピックについていくつかのリサーチペーパーを作成しましたが、うまく機能するソリューションを簡単に思い付くことができ、100%の精度に近づくのが難しい場合の背景について説明したいと思います。

人間の言語の基礎となる言語法がWebページのコンテンツにも含まれているようです(ただし、これに限定されません)。これにより、2種類のテキスト(フルテキストと非フルテキストまたは大まかに、 "メインコンテンツ」対「ボイラープレート」)。

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

著者があなたが書かれたものを素早く得ることを望んでいる場合、彼/彼女は「ナビゲーション」テキスト、すなわちいくつかの単語を使用します(「STOP」、「これを読む」、「ここをクリック」など)これは、ナビゲーション要素(メニューなど)で最も目立つタイプのテキストです。

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

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

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

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

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

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

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

数字で説明するには、boilerpipe、可読性、Apple Safariなどの抽出戦略を比較するboilerpipe wiki の「Benchmarks」ページを参照してください。

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

乾杯、

キリスト教徒


3
このboilerpipeプロジェクトはまだアクティブですか?
アビー

5
オープンソース開発者が社会的に成長するように、プロジェクトをGitHubに配置する方がよいと思います。
Inanc Gumus 2014

1
Kohlschütter博士の説明の良い例は、実際にはSafariのこのWebページです。読者を使用した場合、リンク密度のおかげで、彼の回答がメインテキストとして表示されます。他のブロックと比較すると、リンクされたテキストであるため、メインテキストとして認識されます。
Abdelrahman Eid 2014

1
コピーがマイリポジトリのgithub.com/k-bx/boilerpipeに「移行」された場合、それが失われた場合に備えて:)
Konstantine Rybnikov

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


12

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

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

  • 論文
  • コンテンツ
  • ブログ
  • 物語

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

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

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

コードは1792行です。それはささいな問題のように思えるので、おそらくそこからインスピレーションを得ることができます。


2
彼らのコードがオープンソースかどうか、それが商用製品で使用できるかどうかを知っていますか?
user300981

2
ソースコードはApache License 2.0の下でリリースされていると言っています。つまり、それを使用、配布、変更、および変更されたバージョンを配布できます。詳細ははっきりしていません。
slhck

2
@bobsmith AppleはSafariの最新バージョンでそれを使用しました。彼らはリリースノートでArc90を信用した。
10

7

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

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


3
これは実際に非常に興味深いアプローチのように聞こえます-これから共有するコードはありますか?
lsh 14年

2
第二に、私たちが見ることができるコードの例やコードを取り巻く情報はありますか?
userabuser 2014
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.