Что такое метрика? Каждой паре документов сопоставляется какое-то число, характеризующее их близость по нужному нам критерию. Критерий у нас достаточно общий: близость содержательного текста.
Это означает, что из сравнения двух документов желательно выбросить такие несущественные (и очень характерные) элементы, как шапку, подвал, меню с навигацией, счетчики, элементы оформления, а после этого уже можно придумывать какую-то метрику. Т.е. нам надо вычистить текст от мусора и привести его к логической структуре
Поскольку такой задачей будет заниматься робот, то его логика тоже подлежит обсуждению
Мне кажется, что достаточно удачной метрикой будет подсчитать количество каждой словоформы на странице. Т.е. введем над документом функцию, которая для каждой словоформы возвращает количество вхождений этого слова, или производных от него. Впрочем, возможно, что для вычисления близости документов, заморачиваться морфологией и не нужно.
class Document def forms … calculate documents forms … end def frequency(word) return 0 unless forms.include?(word) count_inclusions(word) end endА в качестве метрики можно взять среднеквадратичное расхождение этой функции над двумя документами. Надо отметить, что сильное различие по набору словоформ двух документов уже является поводом признать, что документы не являются клонами. Однако, это опять же, зависит от характера.
class Document def divergence(document) # Объединяем массивы словоформ двух документов # Суммируем разницу расхожений количества включений слова # в каждый документ (forms + document.forms).inject do |sum, form| sum + (frequency(form) – document.frequency(form)).abs end end def distance(document) divergence(document)/word_count end endЗачем делить на количество слов? Да потому что в большом документе и расхождений может быть больше. Может его не один человек обрабатывал, а несколько.
Возникает еще один вопрос: а как подсчитывать количество словоформ. Наверное, имеет смысл сразу с весами. Скажем, слово, встретившееся в <h1> имеет смысл считать за два или даже три слова. Таким образом функция count_inclusions будет уже учитывать логическую структуру документа.