Как определить, являются ли две веб-страницы тем же?

Вы можете использовать векторы в пространстве имен System.Numerics. Предостережение заключается в том, что он будет работать только с float, а не с double. Это не должно быть проблемой для вычитания:

float[] array1 = new float[] { 1.1F, 2.0F, 3.0F, 4.0F, 5.0F };
float[] array2 = new float[] { 6.1F, 7.0F, 8.0F };    
float[,] final_array = new float[array1.Length, array2.Length];

int vectorCount = array2.Length / 4;
Vector4[] array2Vectors = new Vector4[vectorCount];
Parallel.For(0, vectorCount, i =>
{
    int offset = i * 4;
    array2Vectors[i] = new Vector4(array2[offset], array2[offset + 1],
        array2[offset + 2], array2[offset + 3]);
});

Parallel.For(0, array1.Length, i =>
{
    Vector4 v1 = new Vector4(array1[i], array1[i], array1[i], array1[i]);
    for (int j = 0; j < array2Vectors.Length; j++)
    {
        Vector4 result = Vector4.Abs(Vector4.Subtract(v1, array2Vectors[j]));
        int offset = j * 4;
        final_array[i, offset] = result.X;
        final_array[i, offset + 1] = result.Y;
        final_array[i, offset + 2] = result.Z;
        final_array[i, offset + 3] = result.W;
    }

    for (int j = vectorCount * 4; j < array2.Length; j++)
    {
        final_array[i,j] = Math.Abs(array1[i] - array2[j]);
    }
});

Поскольку вы сейчас используете векторы, вы будете использовать SIMD-инструкции ЦПУ, которые должны ускорить вашу задачу.

Дополнительный прирост производительности достигается за счет параллельного выполнения с Parallel.For, в котором используются все доступные ядра ЦП.

Вы можете попробовать это здесь.

13
задан Bill 20 September 2012 в 01:13
поделиться

11 ответов

Это кажется, что Вы после устойчивого способа измерить подобие двух страниц.

Учитывая, что структура страницы не изменится так очень, мы можем уменьшить проблему до тестирования, является ли текст на странице примерно тем же. Конечно, с этим подходом проблемы, которые ссылаются на nickf относительно страницы фотографов, все еще там, но если Вы главным образом обеспокоены Yahoo! News и т.п., это должно быть хорошо.

Для сравнения со страницами можно использовать метод от машинного обучения, названного "строковые ядра". Вот является ранняя статья недавним набором слайдов на пакете R и видео лекции.

Очень примерно, строковое ядро ищет, сколько слов, пар слов, утраивается слов, и т.д. два документа имеют общего. Если A и B являются двумя документами, и k является строковым ядром затем чем выше значение k (A, B), тем более подобный эти два документа.

Если Вы устанавливаете порог t и только говорите, что два документа являются тем же для k (A, B)> t Вы должен иметь довольно хороший способ сделать то, что Вы хотите. Конечно, необходимо будет настроить порог для получения лучших результатов для приложения.

13
ответ дан 1 December 2019 в 20:58
поделиться

Можно обнаружить, что две страницы являются тем же при помощи своего рода метрики подобия, такой как подобие косинуса. Затем необходимо было бы определить минимальный порог, который можно использовать, чтобы принять, являются ли эти два документа тем же. Например, я выбрал бы значение, самое близкое к 1 при применении меры по косинусу, так как она колеблется от-1 для полностью различного и 1 для идентичного.

5
ответ дан 1 December 2019 в 20:58
поделиться

Я использую vgrep для такого материала.

Это - немного известного инструмента, названного визуальным-grep, который полагается на передовую технологию как мудрое окулярное устройство и зрительная зона коры головного мозга для того, чтобы очень быстро определить сходство страниц бок о бок, и это удивительно точно и эффективно (это должно быть, так как это разрабатывалось в течение довольно долгого времени).

Отмечание общественной Wiki в случае, если полиция юмора отсутствует сегодня :-).

2
ответ дан 1 December 2019 в 20:58
поделиться

В зависимости от того, что Вы делаете, Вы могли бы интересоваться TemplateMaker. Вы даете ему некоторые строки (такие как веб-страницы), и это размечает биты то изменение.

В Вашем примере Yahoo! News Вы выбрали бы страницу однажды и сказали бы TemplateMaker изучать это. Затем Вы выбрали бы его снова и сказали бы ему узнавать что один.

Когда Вы были рады, что Ваш TemplateMaker знал то, что было тем же каждым разом, когда Вы могли выбрать другую страницу и спросить TemplateMaker, соответствовал ли он шаблону от других. (Это дало бы Вам части, которые изменились, если Вы интересовались этим.)

2
ответ дан 1 December 2019 в 20:58
поделиться

Вы могли использовать компонент веб-браузера, чтобы представить снимок экрана двух страниц и затем сравнить изображения. Могла бы быть самая простая опция.

1
ответ дан 1 December 2019 в 20:58
поделиться

Способ сделать это не должно сравнивать целую страницу, потому что, поскольку Вы говорите, что Человек не был бы обманут этим также. Скажите, что Вы интересуетесь новостными статьями страницы Yahoo!, таким образом необходимо просто посмотреть на раздел новостей. Затем можно сделать что, хеш или литеральное сравнение между новой и старой версией.

0
ответ дан 1 December 2019 в 20:58
поделиться

Без глубоких знаний структуры страниц Вы пытаетесь выдержать сравнение, затем это могло быть очень хитро. Таким образом, как машина, как предполагается, говорит, что страница с несколькими различными изображениями является тем же - если это - новостной сайт с рекламой затем, это должно быть то же, но если это - портфель фотографа, затем это определенно отличается.

Если бы Вы действительно знаете структуру страницы, то то, что я сделал бы, вручную выбрать части страницы (использующий идентификаторы, селекторы CSS, XPath, и т.д.) для сравнения. Например, только сравните #content отделения между обновлениями страницы. Оттуда, Вы, возможно, должны были бы добавить уровень терпимости к сравнению символа символом.

Существует сервис, который делает подобную вещь на самом деле. Это назвало Rsspect (записанный Ryan North известности Qwantz), который обнаружит изменения в любом веб-сайте и создаст канал RSS из него, даже если Вы не будете управлять страницей.

0
ответ дан 1 December 2019 в 20:58
поделиться

Вы могли генерировать хеш MD5 каждого из них, затем сравнить это. Как Вы сказал, достаточно легкий.

То, что Вы ищете, является техникой для сравнения двух страниц, которые имеют произвольные элементы, которые могут измениться. Это - тяжелая проблема.

  1. Определите области на странице, которая может измениться, и Вы не заботитесь о.Осторожно! Они будут всегда перемещаться.
  2. Хешируйте или сделайте некоторую контрольную сумму DOM просто частей страницы, о которой Вы ДЕЙСТВИТЕЛЬНО заботитесь.Осторожно! Они также будут всегда изменяться.

Вы противостоите первому правилу анализа экранных данных: страница по сути энергозависима. Таким образом, это - жесткая проблема. Ваше решение никогда не будет достаточно надежно для составления бесконечного множества тонких изменений, которым исходные данные подвергнутся, если Вы также не будете иметь прямое управление исходными страницами и можете разработать Ваше решение против этого.

Удачи! У меня был опыт с системами, которые пытались решить эту проблему, и это - действительно трудная задача.

0
ответ дан 1 December 2019 в 20:58
поделиться

Первая мысль, которая пришла в мою голову, состояла в том, чтобы обработать страницы в XML-документы с BeautifulSoup (Python), выполнять разность на них и считать количество строк отличающимся. Если количество> X %, они отличаются. Не очень устойчивый и вероятно подверженный ошибке, но это было бы быстрым взломом, который я сделаю для тестирования.

Вы могли бы хотеть взглянуть на эту страницу, которая обсуждает сравнение двух XML-документов:
http://www.ibm.com/developerworks/xml/library/x-diff/index.html

Документ HTML может быть принужден в XML-документ с красивым супом, затем сравнил использование методов, перечисленных там.

0
ответ дан 1 December 2019 в 20:58
поделиться

Вы могли попытаться использовать HTTP-заголовки как If-Modified-Since или некоторые другие связанные с кэшем заголовки. Кроме того, может быть полезно посмотреть на файл карты сайта для наблюдения, как часто поисковые системы, как ожидают, перепроверят.

Моя другая попытка (возможно, чтобы использоваться в соединении) состояла бы в том, чтобы войти в список всех ids и classes, найденный в divs на странице. Если эти списки не совпадают, вероятно, что было довольно значимое изменение. Иначе они, вероятно, очень похожи.

Править: Вы могли бы также выдержать сравнение srcs img элементы.

0
ответ дан 1 December 2019 в 20:58
поделиться

У меня была подобная проблема. Я пытался создать безопасную систему соединения для каталога отправленных ссылок пользователя. Пользователь опубликовал бы страницу на блог-сайте или новостном сайте и отправил бы ссылку на индекс. Человек проверил бы, что ссылка, чтобы быть соответствующей затем добавляет страницу в индекс.

Проблема состояла в том, чтобы придумать способ автоматизировать проверки, которые гарантировали, что ссылка была все еще соответствующей со временем. Например, кто-то изменил страницу несколько недель спустя и вставил оскорбления на расовой почве? Новостной сайт начинал говорить людям, что 'необходимо подписаться для чтения этой истории'?

Я закончил тем, что извлек элементы абзаца <p> и сравнил кэшируемую копию с током дословно. В самых простых терминах:

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

После этого серия сортировщиков работала бы над ним при игнорировании общих слов, 'если, но может или и' при обработке других слов (профанация, и т.д.) с более тяжелым весом.

Это привело к системе выигрыша, которая почти проигнорирует незначительные редактирования и изменения (опечатки, структура предложения, и т.д.), но быстро покажет, должно ли содержание было быть исследовано снова. Счет был затем возвращен, очки выше порога будут помещены в очередь для человека, чтобы повторно проверить.

Это также помогло составлять главные косметические изменения в сайте. Я не доверил бы его для выполнения полностью самостоятельно, но это действительно делало свое задание очевидно хорошо с небольшой справкой от людей. По общему признанию система не была так эффективна, как это, возможно, было насколько методология идет.

0
ответ дан 1 December 2019 в 20:58
поделиться
Другие вопросы по тегам:

Похожие вопросы: