В качестве корпуса использовался набор текстов песен, спарсеных с сайта Genius.com. Для удовлетворения ограничений по объему он был дополнен этим датасетом.
Текст разбит на токены по пробелам. В качестве стеммера используется PorterStemmer
из Gensim
.
Для построения индекся запустить скрипт build_index_spimi.py
. Пример:
python build_index_spimi.py --memory 10
Для построения индекся используется алгоритм SPIMI. Для хранения индекса используется модуль shelve
.
Для поиска запустить скрипт query.py
. Пример:
python query.py --q 'nothing AND else AND matters'
Булев поиск по индексу допускает оперции AND
, OR
и NOT
, без скобок. Результаты поиска ранжируются по tf-idf.
Данные:
- Корпус (необходим)
- Индекс (необходим)
- Предвычисленные эмбеддинги для всех текстов (если не хочется тратить время на построение)
- Предвычесленный словарь дубликатов (если не хочется тратить время на построение)
Для поиска запустить скрипт query_ml.py
. Пример:
python query_ml.py --q 'nothing else matters'
Сначала проводится широкий булев поиск, потом top-N кандидатов переранжируюся по косинусову расстоянию их DistilBERT эмбеддингов и эмбеддинга запроса.
Синтаксис запроса:
'word1 word2 word3'
'word1 word2 NOT word3'
'word1 word2 NOT(word3 word4)'
что в булевом поиске бы соответствовало:
word1 OR word2 OR word3
(word1 OR word2) AND NOT word3
(word1 OR word2) AND NOT(word3 OR word4)
Для поиска дубликатов запустить скрипт duplicates.py
. Пример:
python duplicates.py
Поиск дупликатов проводится с помощью kNN по эмбеддингам всех текстов. Используется имплементация kNN из библиотеки faiss.
Опции:
python duplicates.py
вычислит словарь дубликатов если он еще не вычислен и сохранит его в формате.pkl
.python duplicates.py --save
выведет названия дубликатов для всех песен в текстовый файл.python duplicates.py --band BAND_NAME
выведет названия дубликатов песен группы BAND_NAME.python duplicates.py --find FIND_FILE
выведет названия дубликатов песни из файла FIND_FILE (если он явсяется частью корпуса).