LINUX.ORG.RU

Есть ли какая-то консольная утилита, способная сравнить два HTML-файла по степени похожести?

 , , ,


1

2

Есть два HTML-кода. В одном - статья на одном сайте, в другом - копия этой статьи на другом сайте, прошедшая некие html/xml преобразования. То есть, до и после текста статьи - все в коде разное (header/bottom), да и сам текст статьи на разных сайтах отформатирован разными тегами. И еще текст статьи тоже может немного отличаться.

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

Чтобы в утилите была какая-то реализация string kernels или там косинусного подобия или чего-то такого.

★★★★★

#!/usr/bin/env python3
import difflib
import re
import sys

import requests


def unhtml(s: str) -> str:
    return re.sub(r'<[^<>]+>', '', s)


if __name__ == '__main__':
    if len(sys.argv) < 3:
        print('Usage:', sys.argv[0], 'URL1', 'URL2')
        sys.exit(1)

    article1 = requests.get(sys.argv[1]).text
    article2 = requests.get(sys.argv[2]).text

    d = difflib.Differ()
    diff = d.compare(unhtml(article1).split(), unhtml(article2).split())
    print ('\n'.join(diff))
rtxtxtrx
()
Последнее исправление: rtxtxtrx (всего исправлений: 2)
Ответ на: комментарий от anonymous

Они по идее в <head>, который, очевидно, надо удалять полностью (тупо брать только содержимое <body>, а то и <article>). Технически, конечно, в <body> тоже могут быть скрипты воткнуты, но обычно так не делают.

CrX ★★★★★
()
Последнее исправление: CrX (всего исправлений: 1)
Ответ на: комментарий от anonymous

То есть ты даже не гуглил. Наверно когнитивная нагрузка не позволяет.

String kernels и косинусное подобие в топике тебе о чем-нибудь говорят?

Xintrea ★★★★★
() автор топика
Ответ на: комментарий от rtxtxtrx

d = difflib.Differ()
diff = d.compare(unhtml(article1).split(), unhtml(article2).split())
print ('\n'.join(diff))

Решение, видимо, имеет право на жизнь... Но в оценку надо включать объем обеих текстов и объем изменений... Кроме того, решение это работает с отдельными строками, но не с подстроками... Поэтому идентичный текст, написанный одной строкой и разбитый на строки, она будет считать сильно разным. Возможно, ситуацию исправит разбитие текста по принципу «одно слово - одна строка».

Xintrea ★★★★★
() автор топика
Ответ на: комментарий от Ygor

Можно попробовать реализовать алгоритм на расстояние Левенштейна или взять готовый.

Ага, благодарю.

Нашел вот такую универсальную штуку:

https://pypi.org/project/strsimpy/#levenshtein

Levenshtein
Normalized Levenshtein
Weighted Levenshtein
Damerau-Levenshtein
Optimal String Alignment
Jaro-Winkler
Longest Common Subsequence
Metric Longest Common Subsequence
N-Gram
Shingle (n-gram) based algorithms
    Q-Gram
    Cosine similarity
    Jaccard index
    Sorensen-Dice coefficient
    Overlap coefficient (i.e., Szymkiewicz-Simpson)

Xintrea ★★★★★
() автор топика

Текст из урла можно вытащить командой trafilatura а вот сравнивать, чатомгпт только если

trafilatura -u "https://www.linux.org.ru/forum/development/17670430?lastmod=17672002"
Есть два HTML-кода. В одном - статья на одном сайте, в другом - копия этой статьи на другом сайте, прошедшая некие html/xml преобразования. То есть, до и после текста статьи - все в коде разное (header/bottom), да и сам текст статьи на разных сайтах отформатирован разными тегами. И еще текст статьи тоже может немного отличаться.
Так вот, есть ли какая-то консольная утилита, которая покажет некую метрику, через которую можно (хотя бы с некоторой долей вероятности) понять, что эти два HTML-кода содержат одинаковую статью? Или что один HTML-код содержит часть статьи (достаточно крупную) с другой страницы?
Чтобы в утилите была какая-то реализация string kernels или там косинусного подобия или чего-то такого.
Есть ли какая-то консольная утилита, способная сравнить два HTML-файла по степени похожести?
Есть два HTML-кода. В одном - статья на одном сайте, в другом - копия этой статьи на другом сайте, прошедшая некие html/xml преобразования. То есть, до и после текста статьи - все в коде разное (header/bottom), да и сам текст статьи на разных сайтах отформатирован разными тегами. И еще текст статьи тоже может немного отличаться.

theurs ★★
()
Ответ на: комментарий от Shushundr

«Это» - местоимение

Осилил прочитать про местоимения? Теперь почитай про указательные частицы! И почитай чем отличается язык разметки, неважно – HTML или XML, от API для обработки документов с такой разметкой.

anonymous
()
Ответ на: комментарий от Xintrea

Вообще, лучше ещё взять NLP либу «natasha» и привести все слова к начальной форме в нижнем регисте, а потом натравить дамерау-левенштайна. У меня на коротких записках не очень работало, на статьях должно получаться отлично.

Shadow ★★★★★
()
Ответ на: комментарий от Shadow

Я думал, он догадается прочитать документацию и сделать что-то типа этого:

seq = difflib.SequenceMatcher(None, answer1, answer2)
print(seq.ratio() * 100)

А заменять ничего не нужно. str.split по аналогу регулярки \s+ разбивает

rtxtxtrx
()

Такое ощущение, что каждое поколение клоунов - быдлокодеров каждый раз наступает на один и те же грабли на одной и той же задаче.

Зы. Брось это дело

TurboPascal79
()