Поясню: у нас в базе хранятся урлы документов documents, пришел новый документ new. Надо перебрать все документы из базы так, что бы подобрать близкие к новому: close = [] documents.each do |document| close << document if document.fetch.distance(new) < threshold end

Почему? Да потому что нам пол-интернета надо здесь вытащить и каждый документ на словоформы разобрать. Вообщем, нереально это. Уж очень хочется ввести норму. Очень, но я не знал как.

Идея такая: хранить еще Document#norma, т.е.

close = [] documents.each do |document| close << document if (document.norma – new.norma).abs < threshold end

И никакого fetch. Ну и норма, конечно же, константа. Какую же функцию принять за норму? Всякие md5 конечно же никак не подходят, потому что они очень точные. А нам нужна какая-то функция, которая будет очень простительно относиться к слабым изменениям документа.

Вообщем, ребята молодцы из Риолита придумали такую функцию (может и не они, но нашел я ее у них). Антиспамовая тулза DCC так и делает. Берет письмо, строит его норму и спрашивает у соседей: “есть у кого-нибудь что-нибудь похожее?” А ему в ответ: “Аглафира Семенна уже 500 тысячам людей рассказала, как она хорошо отдохнула с Клавдией Иванной, так что грохай эту херню”

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

pre_close = [] close = [] documents.each do |document| pre_close << document if (document.norma – new.norma).abs < threshold end pre_close.each do |document| close << document if document.fetch.distance(new) < threshold end

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

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

Sidebar