В качестве корпуса использовался набор текстов песен, спарсеных с сайта 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 (если он явсяется частью корпуса).