готовые реализации метода шинглов

fStrange

Новичок
готовые реализации метода шинглов

а кто нибудь видел готовые реализация метода шинглов на php?
если есть ссылочки на куски кода или готовые решения, поделитесь пожалста
 

Wicked

Новичок
ну сами шинглы длины m считать то просто:
разбиваешь текст на слова (n шту)
в цикле от 0 до n-m берешь по m слов, конкатенируешь их через пробел и считаешь хэш (md5, например).

А дальше ты с ними что делать собираешься? небось тексты сравнивать? :)
 

fStrange

Новичок
Wicked
аге...
имеется куча текстов(анекдоты,байки) сравнительно небольших, но очень много и вносимых в разное время разными юзерами
искать вручную совпадения слишком большие затраты времени...
а вот пробежать скриптом по базе и указать, что тот, тот и тот текст совпадают с вероятностью более 60%
чтобы облегчить задачу модерации... было бы неплохо
 

Wicked

Новичок
если речь идет про базу:
можешь для каждого анекдота/байки их шинглы внести в отдельную таблицу столбиком (получится таблица высотой почти с кол-во всех слов). Дальше следует запрос а-ля
select
shingle2.anec_id, count(dinstinct shingle2.hash) as cnt
from
shingle as shingle1
inner join shingle as shingle2 on (shingle1.hash = shingle2.hash and shingle1.anec_id != shingle2.anec_id)
where shingle1.anec_id = 38949
having cnt > 0.

Осталось сюда прикрутить логику "совпадение больше стольки-то процентов". Для этого, предположительно, в отдельной таблице (length) надо хранить кол-во шинглов в каждом анекдоте/байке. Джоинить ее 2 раза (один раз к shingle1, другой раз к shingle2), и подправить условие having например на having cnt > greatest(length1.length, length2.length) * 0.5.

Вот тебе и выборка анекдотов, которые совпадают с текущим более, чем на 50%.

-~{}~ 24.11.06 11:11:

PS: моё видение шинглов может отличаться от каких-то классических :)
 

Wicked

Новичок
http://en.wikipedia.org/wiki/W-shingling

в "написанной обезьянами" статье совпадение определяется как отношение мощности пересечения множеств шинглов к мощности объединения оных. Логичней, чем мой вариант, но и более трудоёмко с точки зрения базы данных.
 
Сверху