Поиск почти-дубликатов в большой коллекции текстов

#tutorial #nlp



https://yorko.github.io/2023/practical-near-dup-detection



Добрались руки написать тьюториал по этой вроде бы простой задаче. Есть много текстов, скажем, 5 миллионов. Как бы среди них найти почти-дубликаты так, чтоб это было:

1) легко, желательно без всякого ML

2) масштабируемо

3) без false positives

4) и чтоб разметки на входе тоже не надо было?



Почему брут-форс не подходит, думаю, понятно: 5 млн. объектов – это 12.5 трлн. пар, можно конечно хадуп потопить купюрами, но можно и умнее поступить.



Помню, ходил я с этим вопросом в ODS, и что-то советы мне не очень понравились, кто-то советует ElasticSearch запрягать, кто-то советует BERT-эмбеддинги в векторную базу сложить. И так я поковырялся да пришел к LSH и ее имплементации в Python – Datasketch. Вот про как раз тьюториал, можно брать и пользоваться.



К слову, я эту технику применил к научным статьям, и там целая россыпь интересных приложений вылезла, те же paper mills, salami-slicing (когда берешь свою длинную статью, делишь на части и публикуешь несколько мелких статей), simultaneous submissions и т.д.