Модуль org_name_similarity - это текстовый парсер, распознающий названия компаний в англоязычном тексте и определяющий их схожесть. Программа принимает на вход текст и возвращает json-file cо словарем, в котором названия компаний - ключи, а значения - списки, состоящие из кортежей с индексами.
- Скачайте проект
git clone https://github.com/dpkaranov/org_name_similarity.git
- Перейдите в директорию проекта
cd ./org_name_similarity
-
Скачайте модель и распакуйте её в папке ./org_name_similarity/models
-
Положите текстовый файл в папку ./org_name_similarity/texts
-
Запустите скрипт
python name_sim.py <путь/до/файла>
или
python3 name_sim.py <путь/до/файла>
Если есть необходимость определить схожесть каких-либо названий через терминал, можно использовать следующую команду:
python3 name_sim.py --check <первое название> <второе название>
В этом случае программа возвратит булево значение True / False
Убедитесь, что папка с модулем находится в директории Вашего проекта. В скрипте импортируйте класс.
from org_name_similarity.name_sim import NameSim
namesim = NameSim()
print(namesim.check_similarity('Saudi Aramco', 'Rosneft'))
org_name_similarity
data
images
metrics
models
notebooks
1 Создание мультиязычной базы данных.ipynb
2 Загрузка моделей трансформеров.ipynb
3 Обучение трансформеров на собственном датасете.ipynb
4 Сравнение обученного трансформера с необученными моделями.ipynb
5 Подготовка нового датасета.ipynb
6 Обучение новой модели трансформера на новом датасете.ipynb
7 Создание модели с аутпутом 128 и сравнение моделей на тестовых данных.ipynb
Для решения задачи определения схожести названий проведено дообучение (fine-tuning) модели-трансформер с помощью фреймворка sentence-transformes. Трансформеры буквально "захватили" NLP, демонстрируя высокие показатели по сравнению с RNN, LSTM и др. технологиями машинного обучения. Их привлекательность для обработки естественного языка заключается в применении механизма внутреннего внимания, устанавливающего свзязи между отдельными словами.
В качестве альтернативы рассматривались tensorflow, torch, spacy, но в итоге выбор был сделан в пользу sentence-transformes. Преимущества ST: высокопроизводительные модели, автоматизированная настройка гиперпараметров и простота использования. Технология достаточно проста: списки строк (сначала первые названия компаний, потом вторые) отправляются в модель, которая возвращает эмбеддинги. Полученные эмбеддинги сравниваются с помощью измерения косинусного расстояния между ними. Если косинусное расстояние близко к 1, то названия организаций схожи, если к 0, то нет. Помимо этого для поиска имен в тексте (задача NER) используется Spacy.
Для обучения модели использовался датасет, состоящий из 497814 строк и 4 столбцов - номер пары (pair_id), первое название (name_1), второе название (name_2) и отметка схожести (is_duplicated). При этом 99 % пары были отмечены как непохожие (0), и менее 1 % - похожие (1). К тому же, названия компаний включали в себя разный шум (символы, лишние буквы из других алфавитов и т.д.). Соответственно, необходимо было тщательно подготовить датасет перед обучением.
-
Подготовка данных к обучению модели;
-
Обучение моделей и сравнение их показателей;
-
Тестирование модели и выбор лучшей;
-
Создание скрипта;
Гипотеза: перевод всех схожих пар названий организаций и такого же количества непохожих пар на разные языки позволит увеличить датасет в несколько раз, а классы будут представлены в нем в одинаковых пропорциях.
Перевод названий организаций осуществлен с помощью библиотеки transliterate. В качестве модели выбрана MiniLM-L12-v2.
Реализация этого эксперимента представлена в папке notebooks, в файлах 1 - 4.
В 4 ноутбуке проведено сравнение обученной модели с необученными.
Сравнение по метрикам обученной модели MiniLM-L12-v2 с её необученным аналогом и остальными трансформерами
Таблица №1 Сводная таблица
Вывод: несмотря на перевод слов на разные языки и мультиязычную базу самой модели, модель переобучилась. Это не столько очевидно по результатам тестов на тестовом наборе данных, выделенном из общего датасета, сколько по "ручной проверке". Так, например, модель не смогла отличить Газпром от Роснефти, а с этим примером может справиться даже расстояние Левенштейна. Тем не менее, этот эксперимент позволил отбросить одну из гипотез, а сравнение разных моделей показало, что гораздо больше смысла в обучении distiluse-base-multilingual-cased-v2 (на базе BERT), которая даже без обучения показала очень высокие показатели.
В этом эксперименте использовался иной принцип подготовки данных:
-
Найдены все уникальные значения (порядка 17 тыс. на оба столбца);
-
Удалены лишние символы (т.е. все буквы не относящиеся к латинскому алфавиту), пустые и короткие строки;
-
Все длинные названия разделены по пробелу, вторые слова перемешаны и добавленны к первым. Также обозначены часто встречающиеся слова, заканчивающие названия англоязычных организаций, которые также перемешаны и добавлены к основным названиям.
Часто встречающиеся слова
Подробнее с ходом эксперимента можно ознакомиться в блокнотах №6 и №7.
В блокноте №7 представлен эксперимент по созданию модели с уменьшенной размерностью последнего слоя (с 512 до 128). Может возникнуть вопрос почему сразу, еще до обучения модели не внести коррективы? В таком случае мы могли потерять важные фичи, кроме того, этот эксперимент предполагает изучение возможности снижения размера исходящего эмбеддинга для уже обученных моделей. Как видно из представленных данных, модель не отстает по точности от своего аналога.
На тестовых данных distiluse-base-multilingual-cased-v2 показала невероятные 1.0 по всем метрикам. Проверка модели на сложных примерах может показать её реальное качество. Почему сложные? Потому что часть примеров модель никогда не видела (например, на кириллице или российских наименований с сокращенным указанием формы собственности в начале строки "ООО", "ОАО" и т.д. ). Примеров немного, но даже на них модель distiluse-base-multilingual-cased-v2 продемонстрировала хорошие результаты, отличив Bridge от Бриджит Бардо, Зенит от Спартака и т.д. Модель не справилась с Роскачеством и Россетями, что показаывает о необходимости подготовки русскоязычной модели отдельно.
Проверка модели на сложных примерах
В папке metrics хранятся сводные таблицы.