DIYの読みやすさ

Great Chinese Roskomnadzorを倒してインターネットのブロックを回避する方法をまだ学んでいないので、私の仕事について奇妙なことを伝えたいので、Node.jsとBeijing Institute of Technologyを使用したReadabilityに似たアルゴリズムの再実装についてお話します。



それは何ですか



読みやすさは、Webサイトから不要な要素を削除するというAdBlockの考え方の根本的な継続です。 AdBlockがユーザーにとって最も役に立たないもの(主に広告)のみを破棄しようとする場合、Readabilityは同時にスクリプト、スタイル、ナビゲーション、その他の不要なものをすべて削除します。 以前は、このタイプのページは「印刷バージョン」と呼ばれていましたが、実際にはテキストは読み上げを目的としています(したがって、読みやすさの名前-「読みやすさ」)。



パーサーに関する叙情的な余談



サイトパーサーまたはその他の緩やかに構造化された形式の主な特徴は、野生で形式を使用する特定のケースに関する知識の量です。



すべての知識を所有している退化したケースは 、単一のサイトのパーサーです。 つまり たとえば、夜にインクジェットプリンターで記事を印刷してサタンに犠牲にするなど、Habrahabrから記事を盗む場合、既存のレイアウトを見て、投稿のタイトルがh1.title



であることを簡単に判断できます。



このように書かれたプログラムは間違えられません。 Habrahabrとは異なるサイトごとに、新しいプログラムを作成する必要があります。



縮退した理想的なケース:パーサーは、データを受信した形式をまったく知りません。 このようなプログラムの例はstrings



(ほとんどの非ゲームオペレーティングシステムに存在します)。



読み取り不可能なファイルにstrings



を適用すると、このファイル内のテキストのように見えるすべてのリストを取得できます。 たとえば、コマンド
 strings `which ls`
      
      



ls



バイナリ内でフォーマットするための行を出力し、ヘルプします。



 %e %b %T %Y %e %b %R usage: ls [-ABCFGHLOPRSTUWabcdefghiklmnopqrstuwx1] [file ...]
      
      





知識が少ないほど、パーサーはより普遍的です。



すでにそこにあるもの



Readabilityの最初のバージョンのソースは公開されており、正規表現のすごいボールです。 これ自体は悪くありませんが、特別な場合はひどいです。 インターネット上の人気サイトに関する知識がはるかに少ないアルゴリズムが必要です(上記の「余談」を参照)。



Readabilityの現在のバージョンは閉じられており、さまざまな関連性のあるパンでいっぱいです。 APIがあります



AppleによるReadabilityの最初のバージョン(Safariのリーダー機能)のフォークがあります。 ソースコードはあまりオープンではありませんが、見ることができます。さらに正規表現や特殊なケースがあります(たとえば、そのような変数isWordPressSite



)。



元のスクリプトの問題は、修正の複雑さ、アーケードヒューリスティックです。 主に機能しますが、重要なファイルの調整が必要です。 Appleバージョンも不明確にライセンスされています。



何を書く



最小限のマークアップ知識を持つサイトパーサー。 入力データ-サイトの1ページ、またはページのフラグメント。 結果は、入力のテキスト表現です。



重要な基準は普遍性です。プログラムはクライアントとサーバーの両方で動作します。 したがって、既存のDOM実装にアタッチするのではなく、独自のデータ構造を構築します(鼻などのガルキンからのデータが必要なため、本格的なDOMよりも高速に動作します)。



同じ理由で、プログラムはインターネットから独立してページをダウンロードしたり、ディスクに結果を保存したり、ユーザーインターフェイスを使用したり、クロスを刺繍したりすることはできません。



アルゴリズムの寿命と冒険



検索エンジンは、上記のプロセスのアルゴリズム化に関するいくつかの記事を見つけました。 とりわけ、私はこれらの中国語PDFが好きでした。



私の式はわずかに異なることが判明したため、中国版アルゴリズムの私のバージョンについて簡単に説明します。



ドキュメント内の各タグについて:

  1. 評価を考慮します



    ここで、 charsはタグ内のテキスト(文字)の量、 hypercharsはリンク内のテキストの量、 tagsはネストされたタグの数です(すべてのメトリックは再帰的です)。
  2. 見積額を考慮します

    第一世代の子供の成績の合計(つまり、再帰的ではない)。
  3. 最大量のタグが見つかりました

    これは、本文テキストの高確率コンテナです。 または最長のコメント。 いずれにせよ、内部に文字があり、それは素晴らしいです。


十分な労働力



さらなる最適化。 いくつかのケースについて説明しますが、一般的にこれは最も興味深いトピックです。コメントでチャットできます。



本文のゴミ。 不幸なブロガーは、ソーシャルコンタクト、ツイッターなどのボタンを投稿の本文に直接配置することを好みます。 不要なもの。 このようなボタンの場合、スコア(スコア、上記を参照)はゼロになる傾向がありますが、この原則に従って取り消すことができます。



念のため、ゴミを削除した後、親のスコアが増加しているかどうかを確認します。増加していない場合(またはわずかに増加した場合)、削除しません。



HTML アルゴリズムはドキュメントの構造に関する知識を使用しませんが、プログラムを改善(または高速化)するために追加できるようになりました。 つまり、事前にpessimize <footer>



<nav>



を実行するか、非表示要素(ブラウザー内)に注釈を追加して、それらを完全にスキップするとしましょう。実際に活動の余地があるため、まだ何も実装していません。



テキスト信号。 テキストにカンマ、ピリオド、およびその他の句読点が含まれている場合、おそらく、ナビゲーションとは対照的に、接続されているテキストです。 このようなヒューリスティックは可読性にありました。



ここでは、異なる言語の句読点がまだ異なっており、中国語のコンマ( "、" Unicode U + FF0C)が文字 "、"(ASCII 44)と異なることに注意する必要があります。



何が起こったのか、使い方



その結果、npmレイアウトされた読みやすさ2を気取らずに呼び出しました



テストについて簡単に



このようなことをテストすることは、リグレッションを回避するために必要です(そして、一般的にプログラムを自動的にテストするのはクールです)。



ここで特定の問題が発生します:可読性テストは、完全に無関係なサイトの保存されたページに加えて、手で引き裂かれた「参照」テキストです。 法的トレーダーがサイトやテキストの違法コピーのために私を破壊しようとしないような方法でこれを配布する方法を本当に理解していません。



誰かが正しい答えを知っているなら、コメントを書いてください。 現在、テストは閉じたリポジトリに存在しますが、本当に無料になりたいと思っています。



テストなしのソース: GitHib



使用例



説明のために、すべてのナビゲーションの間に2行のテキストがあるdemo.htmlページを書きました。



テキストは「タイトル」と呼ばれます。 コンテンツ部分:

近所全体が神の奇跡を静かに観察していました。

ポップイグナティウスティリボンカリは彼の教会を傷つけました。
(パブリックドメイン)
ちなみに、私はこの著作物の著作権を放棄し、パブリックドメイン(パブリックドメイン)に譲渡しています。 すべての人が制限なしに全文を配布および使用できます


これは、プログラムを実行した結果です。 結果がそうでない場合、すべてが壊れています。



そして、コメント付きのdemo.jsプログラムのソースコードを次に示します。 Isaac Z. Schlueterが使用したサックスパーサー。



ドキュメント、別名API



コンストラクター:



 var reader = new Readability
      
      





何も受け入れません



SAXインターフェース:



 reader.onopentag(tagName) // <> reader.onattribute(name, value) // = reader.ontext(text) //  reader.onclosetag(tagName) // </>
      
      





ここで、すべての引数は文字列です。



結果を取得するには:

 var res = reader.compute(), text = reader.clean(res)
      
      





出力: res.heading



記事とtext



タイトル-フォーマットなしのメインテキスト。



reader.clean



代わりにreader.clean



別のフォーマッタを書くことができます。 reader.clean



テキストは取得されませんが、たとえば単純なマークアップが取得されます。



おわりに



プログラムは動作します。 彼女はまだ使用するのが少し怖いです、なぜなら 約20のテストしかないが、私はそれに取り組んでいる。 更新されます。 愚かなパッチを除き、パッチを歓迎します。 Github MITライセンス、それをリポジトリにアップロードするのを忘れました。



重要な注意:左の写真は投稿とは関係ありません。 したがって、ロードされず、左側に画像が表示されない場合は、落胆しないでください。



あなたはこのすべてについてあなたが思うことをコメントに書いてください。



All Articles