15

Web ページが別のページと同じかどうかを検出するのに適した手法には、どのようなものがありますか?

同じように、char-for-char に相当するという意味ではありませんが (簡単です)、ページ上の現在の日付/時刻などを無視するのに十分なほど堅牢です。

たとえば、Yahoo! ニュース記事のページを読み込んで、10分後に別のブラウザで同じページを開く。むき出しの書き換えにより、それらのページにはいくつかの違い (タイムスタンプ、おそらく広告のようなもの、おそらく関連する記事のようなもの) がありますが、人間は 2 つを見て同じであると言うことができます。

URLの正規化を修正(または依存)しようとしているわけではないことに注意してください。つまり、foo.html と foo.html?bar=bang が同じであることがわかります。

4

13 に答える 13

13

2 つのページの類似性を測定する堅牢な方法を求めているようです。

ページの構造がそれほど変わらないことを考えると、問題をページ上のテキストがほぼ同じかどうかをテストすることに減らすことができます。もちろん、このアプローチでは、写真家のページに関してnickf によってほのめかされた問題がまだ残っていますが、主に Yahoo! に関心がある場合は、ニュースなど、これでいいはずです。

ページと比較するには、「文字列カーネル」と呼ばれる機械学習の方法を使用できます。これは初期の論文で、最近の R パッケージに関する一連のスライドとビデオ講義です。

非常に大まかに言うと、文字列カーネルは、2 つのドキュメントに共通する単語、単語のペア、単語の 3 つ組などの数を探します。A と B が 2 つのドキュメントで、k が文字列カーネルの場合、k(A,B) の値が大きいほど、2 つのドキュメントは類似しています。

しきい値 t を設定し、k(A,B) > t に対して 2 つのドキュメントが同じであるとだけ言う場合は、必要なことを行うための合理的な方法が得られるはずです。もちろん、アプリケーションで最良の結果を得るには、しきい値を調整する必要があります。

于 2009-01-19T02:05:51.877 に答える
6

この種の問題については、StackOverflow に問い合わせるよりも学術論文を検索する方がはるかに優れていると思います。詳細を扱う場合、専門家は多くの場合、群衆よりもはるかに賢いです。

すべての Web クローラーまたは検索エンジンにはこの問題があり、解決済みです。受け入れられた答えが示唆するようなカーネルベースの方法を使用する良いアプローチがおそらくありますが、うまく機能することが知られているより単純な手法から始めたいと思うでしょう。その後、カーネル メソッドに移動して、結果が改善されるかどうかをテストできます。

Henzinger の 2006 年の論文「重複に近い Web ページの検索: アルゴリズムの大規模な評価」を読むことをお勧めします。

おそらく、 「ランダム多項式によるフィンガープリンティング」Rabin 1986 の最初のステップとして、Rabin フィンガープリントの生成を検討しているでしょう。

于 2012-09-19T20:47:03.513 に答える
5

2 つのページが同じであることは、コサイン類似度などの類似度メトリックを使用して検出できます。次に、2 つの文書が同じかどうかを受け入れるために使用できる最小しきい値を定義する必要があります。たとえば、コサイン メジャーを適用する場合、1 に最も近い値を選択します。これは、完全に異なる場合は -1、同一の場合は 1 の範囲であるためです。

于 2009-01-19T02:09:23.650 に答える
2

何をしているかによっては、TemplateMakerに興味があるかもしれません。いくつかの文字列 (Web ページなど) を指定すると、変更されたビットがマークされます。

あなたのYahoo! ニュースの例では、一度ページを取得して、それを学習するように TemplateMaker に指示します。次に、それをもう一度フェッチして、それを学習するように指示します。

あなたの TemplateMaker が毎回同じものを知っていることに満足したら、別のページを取得して、他のページのテンプレートと一致するかどうかを TemplateMaker に尋ねることができます。(興味があれば、変更された部分が表示されます。

于 2009-01-19T04:36:01.777 に答える
2

私はそのようなものに vgrep を使用します。

これは、visual-grep と呼ばれるあまり知られていないツールで、ページを並べて同じかどうかを非常に迅速に判断するために、知的眼球デバイスや視覚野などの高度な技術に依存しており、非常に正確で効率的です (かなり長い間開発中です)。

ユーモア警察が今日出た場合に備えて、コミュニティ wiki にマークを付けます :-)。

于 2009-01-19T02:05:41.643 に答える
1

Webブラウザコンポーネントを使用して2つのページのスクリーンショットをレンダリングし、画像を比較することができます。最も簡単なオプションかもしれません。

于 2009-01-19T03:18:06.910 に答える
0

If-Modified-SinceなどのHTTPヘッダー、またはその他のキャッシュ関連のヘッダーを使用してみることができます。また、サイトマップファイルを調べて、検索エンジンがチェックバックする頻度を確認すると役立つ場合があります。

私の他の試み(多分一緒に使用される)は、ページ上のsで見つかったすべてidのsとclassesのリストを作成することです。divこれらのリストが一致しない場合は、かなり目立つ変更が行われている可能性があります。そうでなければ、それらはおそらく非常に似ています。

編集:要素のsrcsを比較することもできます。img

于 2009-01-19T15:07:35.933 に答える
0

私の頭に浮かんだ最初の考えは、BeautifulSoup(Python)を使用してページをXMLドキュメントに処理し、それらに対して差分を実行し、異なる行数を数えることでした。カウントがX%を超える場合、それらは異なります。それほど堅牢ではなく、おそらくエラーが発生しやすいですが、それは私がテストのために行う簡単なハックです。

2つのXML文書の比較について説明しているこのページをご覧になることをお勧めします:
http ://www.ibm.com/developerworks/xml/library/x-diff/index.html

htmlドキュメントは、美しいスープを使用してXMLドキュメントに強制変換し、そこにリストされている手法を使用して比較できます。

于 2009-01-19T03:11:09.873 に答える
0

私も同様の問題を抱えていました。私は、ユーザーが送信したリンクのディレクトリ用の安全なリンクシステムを考案しようとしていました。ユーザーはブログやニュースサイトにページを公開し、インデックスへのリンクを送信します。人間はリンクが適切であることを確認してから、ページをインデックスに追加します。

問題は、リンクが時間の経過とともに適切であることを確認するチェックを自動化する方法を考え出すことでした。たとえば、誰かが数週間後にページを変更し、人種的なスラーを挿入しましたか?ニュースサイトは人々に「この物語を読むには購読しなければならない」と伝え始めましたか?

最終的に段落<p>要素を抽出し、キャッシュされたコピーを現在の単語ごとに比較しました。簡単に言えば:

cached[] = { "Lorem", "Ipsum", "..." };
scanned[] = { "Lorem, "foo", ... };

その後、一連のソーターは、一般的な単語を無視して作業します。「if but can or and」は、他の単語(冒とく的な表現など)をより重い重みで処理します。

これにより、マイナーな編集や改訂(タイプミス、文型など)をほとんど無視するスコアリングシステムが作成されましたが、コンテンツを再度調べる必要があるかどうかがすぐにわかります。次にスコアが返され、しきい値を超えるスコアは人間が再検証するためにキューに入れられます。

これは、サイトの主要な外観上の変更を説明するのにも役立ちました。私はそれが完全に単独で動作することを信頼しませんが、それは人間の少しの助けを借りて予想通りにうまく機能しました。確かに、このシステムは、方法論が進む限り、効率的ではありませんでした。

于 2009-01-19T03:40:23.403 に答える
0

私は最近この問題に遭遇し、ここで JavaScript ソリューションに取り組みました: https://github.com/kennychua/pdiffy/

ページの画像 (ロスレス PNG 形式が望ましい) を比較することができ、画像が異なるかどうかがわかり、異なる場合は違いが強調表示されます。

また、説明したタイムスタンプの問題などの領域を無視する機能もあります

于 2013-09-02T08:36:55.713 に答える
0

比較しようとしているページの構造についての詳細な知識がなければ、これは非常にトリッキーになる可能性があります. つまり、2 枚の異なる写真が掲載されたページが同じであると機械が判断するにはどうすればよいのでしょうか。広告のあるニュース サイトの場合は同じはずですが、写真家のポートフォリオの場合は明らかに異なります。

ページの構造がわかっている場合は、ページの一部を (ID、CSS セレクター、XPath などを使用して) 手動で選択して比較します。たとえば、#contentページの更新間でのみ div を比較します。そこから、文字ごとの比較に許容レベルを追加する必要がある場合があります。

実は、似たようなことをするサービスがあります。これはRsspect (Qwantz で有名な Ryan North によって書かれた) と呼ばれ、ユーザーがページを制御していなくても、任意の Web サイトの変更を検出し、そこから RSS フィードを作成します。

于 2009-01-19T01:51:50.500 に答える
0

それぞれの MD5 ハッシュを生成し、それを比較できます。あなたが言ったように、十分に簡単です。

あなたが探しているのは、変更可能な任意の要素を持つ 2 つのページを比較する手法です。難しい問題です。

  1. 変化する可能性があり、気にしないページ内の領域を特定します。気をつけろ!彼らは常に動き回ります。
  2. あなたが気にするページの部分だけのDOMのハッシュまたはチェックサムを行います。気をつけろ!これらも常に変化します。

あなたはスクリーン スクレイピングの最初のルールに反しています: ページは本質的に不安定です。だから難しい問題です。ソースページを直接制御し、それに対してソリューションを設計できない限り、ソースデータが受ける微妙な変更の無限の多様性を説明できるほどソリューションが堅牢になることは決してありません.

幸運を!私は、この問題を解決しようとするシステムを経験したことがありますが、実際に解決するのは非常に困難です。

于 2009-01-19T01:53:08.407 に答える
0

これを行う方法は、ページ全体を比較しないことです。なぜなら、あなたが言うように、人間もそれによってだまされないからです。Yahoo! のニュース記事に興味があるとします。ページなので、ニュースセクションだけを見る必要があります。次に、新しいバージョンと古いバージョンの間のハッシュまたはリテラル比較など、何でも行うことができます。

于 2009-01-19T01:53:23.760 に答える