если речь идет про базу:
можешь для каждого анекдота/байки их шинглы внести в отдельную таблицу столбиком (получится таблица высотой почти с кол-во всех слов). Дальше следует запрос а-ля
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: моё видение шинглов может отличаться от каких-то классических
