| ... | ... | @@ -237,38 +237,51 @@ |
|
|
|
|
|
|
|
## 5.1 Описание работы тематической модели обработки данных Zulip и Wiki МИЭМ
|
|
|
|
|
|
|
|
Далее будут описаны основные методы и составляющие части библиотеки в том порядке, в котором они используются при инициализации модели и обработке данных.
|
|
|
|
Далее будут описаны основные методы и составляющие части библиотеки в том порядке, в котором они используются при инициализации модели и обработке данных (файл [`lib/sbertop2vec.py`](https://git.miem.hse.ru/240/competence-search/-/blob/master/lib/sbertop2vec.py)).
|
|
|
|
|
|
|
|
Первым по порядку идет метод инициализации, выполняемый при создании модели. На этом этапе задаются основные параметры модели, её свойства и создаются важные внутренние переменные.
|
|
|
|
После того, как модель инициализировалась, она способна выполнить разбиение передаваемых ей документов и соответствующих им авторов по темам. Данный этап может быть разделён на несколько основных частей:
|
|
|
|
**Первым** по порядку идет метод инициализации ([код](https://git.miem.hse.ru/240/competence-search/-/blob/c911531e19c93a1f7a0dc6b70b70c419284db23d/lib/sbertop2vec.py#L44)), выполняемый при создании модели. На этом этапе задаются основные параметры модели, её свойства и создаются важные внутренние переменные.
|
|
|
|
|
|
|
|
1) Преобразование полученных текстовых данных в числовые векторные представления. Стоит отметить, что это происходит при помощи выбранной заранее обученной нейросети-трансформера BERT из библиотеки TensorFlow. Также реализована возможность передачи методу уже готовых векторов.
|
|
|
|
После того, как модель инициализировалась, ее следует обучить методом [`fit`](https://git.miem.hse.ru/240/competence-search/-/blob/c911531e19c93a1f7a0dc6b70b70c419284db23d/lib/sbertop2vec.py#L88) или загрузить методом [`load_model`](https://git.miem.hse.ru/240/competence-search/-/blob/c911531e19c93a1f7a0dc6b70b70c419284db23d/lib/sbertop2vec.py#L438).
|
|
|
|
|
|
|
|
2) Уменьшение размерности полученных на предыдущем шаге векторов при помощи алгоритма UMAP. Нейросеть возвращает вектора размерности 512, что является слишком большим числом для обработки на следующем этапе. В данном месте явно используются параметры (n_neighbors и n_components), которые были заданы при инициализации модели. Здесь они отвечают за размерность выходных векторов.
|
|
|
|
В случае выполнения метода [`fit`](https://git.miem.hse.ru/240/competence-search/-/blob/c911531e19c93a1f7a0dc6b70b70c419284db23d/lib/sbertop2vec.py#L88), модель выполняет разбиение передаваемых ей документов и соответствующих им авторов по темам. Данный этап может быть разделён на несколько основных частей:
|
|
|
|
|
|
|
|
3) Разбиение преобразованных в вектора документов на группы и сопоставление текста его группе при помощи алгоритма HDBSCAN. На данном этапе явно используется параметр (min_topic_size), который был задан при инициализации модели. Здесь он отвечает за минимальное количество документов в группе.
|
|
|
|
1. **Преобразование полученных текстовых данных в числовые векторные представления** ([код](https://git.miem.hse.ru/240/competence-search/-/blob/c911531e19c93a1f7a0dc6b70b70c419284db23d/lib/sbertop2vec.py#L106)). Стоит отметить, что это происходит при помощи выбранной заранее обученной нейросети-трансформера **BERT** из набора готовых моделей в `TensorFlow Hub`. Также реализована возможность передачи методу уже готовых векторов.
|
|
|
|
2. **Уменьшение размерности** полученных на предыдущем шаге векторов при помощи алгоритма `UMAP` ([код](https://git.miem.hse.ru/240/competence-search/-/blob/c911531e19c93a1f7a0dc6b70b70c419284db23d/lib/sbertop2vec.py#L109)). Нейросеть возвращает вектора размерности `512`, что является слишком большим числом для обработки на следующем этапе. В данном месте явно используются параметры (`n_neighbors` и `n_components`), которые были заданы при инициализации модели. Здесь они отвечают за размерность выходных векторов.
|
|
|
|
3. **Разбиение преобразованных в вектора документов на группы** и сопоставление текста его группе при помощи алгоритма `HDBSCAN` ([код](https://git.miem.hse.ru/240/competence-search/-/blob/c911531e19c93a1f7a0dc6b70b70c419284db23d/lib/sbertop2vec.py#L113)). На данном этапе явно используется параметр (`min_topic_size`), который был задан при инициализации модели. Здесь он отвечает за минимальное количество документов в группе.
|
|
|
|
4. Создание **векторных представлений для каждой группы документов** ([код](https://git.miem.hse.ru/240/competence-search/-/blob/c911531e19c93a1f7a0dc6b70b70c419284db23d/lib/sbertop2vec.py#L124)). На данном этапе происходит получение векторов, которые характеризуют информацию, хранящуюся в каждой из групп.
|
|
|
|
|
|
|
|
4) Создание векторных представлений для каждой группы документов. На данном этапе происходит получение векторов, которые характеризуют информацию, хранящуюся в каждой из групп.
|
|
|
|
После завершения всех описанных выше этапов становится возможно получение полезной информации. Для этого в библиотеке реализован ряд методов. Например, метод get_topics_by_query позволяет найти заданное количество групп документов, которые наиболее точно передают суть указанного запроса.
|
|
|
|
После завершения всех описанных выше этапов становится возможно получение **полезной информации**. Для этого в библиотеке реализован ряд методов. Например, метод [`get_topics_by_query`](https://git.miem.hse.ru/240/competence-search/-/blob/c911531e19c93a1f7a0dc6b70b70c419284db23d/lib/sbertop2vec.py#L231) позволяет найти заданное количество групп документов, которые наиболее точно передают суть указанного запроса.
|
|
|
|
|
|
|
|
Метод get_documents_by_topic просто возвращает документы, которые принадлежат указанной группе. Отметим, что документы отранжированы по тому, насколько хорошо они относятся к своей группе. Также существует возможность вывода указанного количества документов.
|
|
|
|
Метод get_documents_by_query возвращает максимально близкие (в векторном пространстве) к запросу документы, причем такие документы берутся только из заданного количества ближайших к запросу групп.
|
|
|
|
Метод [`get_documents_by_topic`](https://git.miem.hse.ru/240/competence-search/-/blob/c911531e19c93a1f7a0dc6b70b70c419284db23d/lib/sbertop2vec.py#L244) просто возвращает документы, которые принадлежат указанной группе. Отметим, что документы **отранжированы** по тому, насколько хорошо они относятся к своей группе. Также существует возможность вывода указанного количества документов.
|
|
|
|
|
|
|
|
Метод get_users_by_query позволяет находить заданное количество пользователей по заданному запросу. Каждому сообщению присваивается определенное значение смысловой близости к указанному запросу, и пользователь является релевантным, если по сумме всех его сообщений метрика больше, чем у остальных. Именно этот метод является основным в контексте всей работы, поскольку с его помощью выполняется поиск людей по заданным компетенциям.
|
|
|
|
Метод [`get_documents_by_query`](https://git.miem.hse.ru/240/competence-search/-/blob/c911531e19c93a1f7a0dc6b70b70c419284db23d/lib/sbertop2vec.py#L253) возвращает максимально близкие (в векторном пространстве) к запросу документы, причем такие документы берутся только из заданного количества ближайших к запросу групп.
|
|
|
|
|
|
|
|
Также модель имеет внутренние методы, необходимые для работы описанных ранее основных методов. Одним из них является метод _c_tf_idf, помогающий найти слова, которые максимально ясно описывают каждый из топиков, за счёт использования информации о других группах. То есть выделяются слова, которые имеются в документах одной группы, но редко или никогда не встречаются в документах других групп.
|
|
|
|
Метод [`get_users_by_query`](https://git.miem.hse.ru/240/competence-search/-/blob/c911531e19c93a1f7a0dc6b70b70c419284db23d/lib/sbertop2vec.py#L269) позволяет находить заданное количество пользователей по заданному запросу. Каждому сообщению присваивается определенное значение смысловой близости к указанному запросу, и пользователь является релевантным, если по сумме всех его сообщений метрика больше, чем у остальных. Именно этот метод является **основным** в контексте всей работы, поскольку с его помощью выполняется поиск людей по заданным компетенциям.
|
|
|
|
|
|
|
|
Также модель имеет внутренние методы, необходимые для работы описанных ранее основных методов. Одним из них является метод [`_c_tf_idf`](https://git.miem.hse.ru/240/competence-search/-/blob/c911531e19c93a1f7a0dc6b70b70c419284db23d/lib/sbertop2vec.py#L538), помогающий найти слова, которые максимально ясно описывают каждый из топиков, за счёт использования информации о других группах. То есть выделяются слова, которые имеются в документах одной группы, но редко или никогда не встречаются в документах других групп.
|
|
|
|
|
|
|
|
# 5.2 Описание тематической модели обработки данных Личнного Кабинета МИЭМ
|
|
|
|
Для составления оценок релевантности пользователей по данным сервиса «Личный кабинет МИЭМ» был разработан программный модуль, осуществляющий поиск по ключевым словам в проектных «вакансиях» студентов.
|
|
|
|
Работа модели основана на векторизации документов с использованием TF-IDF меры. Для этого данные в «вакансиях» проходят через несколько этапов обработки:
|
|
|
|
1) Токенизация (с учетом специальных символов);
|
|
|
|
2) Лемматизация (если она возможна);
|
|
|
|
3) Удаление «стоп-слов» (в том числе, таких общих слов как «навык», «опыт», «знание» и др.)
|
|
|
|
Пример обработки документа:
|
|
|
|
|
|
|
|
Для составления оценок релевантности пользователей по данным сервиса **Личный кабинет МИЭМ** был разработан программный модуль, осуществляющий поиск по ключевым словам в проектных «вакансиях» студентов (файл [`lib/smartsearch.py`](https://git.miem.hse.ru/240/competence-search/-/blob/master/lib/smartsearch.py)).
|
|
|
|
|
|
|
|
Работа модели основана на **векторизации** документов с использованием `TF-IDF` меры. Для этого данные в «вакансиях» проходят через несколько этапов обработки:
|
|
|
|
|
|
|
|
1. Токенизация (с учетом специальных символов) ([код](https://git.miem.hse.ru/240/competence-search/-/blob/c911531e19c93a1f7a0dc6b70b70c419284db23d/lib/smartsearch.py#L135));
|
|
|
|
2. Лемматизация (если она возможна) ([код](https://git.miem.hse.ru/240/competence-search/-/blob/c911531e19c93a1f7a0dc6b70b70c419284db23d/lib/smartsearch.py#L137));
|
|
|
|
3. Удаление «стоп-слов» (в том числе, таких общих слов как «навык», «опыт», «знание» и др.) ([код](https://git.miem.hse.ru/240/competence-search/-/blob/c911531e19c93a1f7a0dc6b70b70c419284db23d/lib/smartsearch.py#L25), удаление происходит во время преобразования в `TF-IDF` вектора).
|
|
|
|
|
|
|
|
Пример обработки документа:
|
|
|
|
|
|
|
|

|
|
|
|
|
|
|
|
После этого составляется матрица документ-слово, в ячейках которой содержатся значения TF-IDF меры.
|
|
|
|
Те же методы применяются к входному запросу, состоящему из набора слов — желаемых компетенций. Компетенции каждого пользователя сервиса «Личный кабинет МИЭМ» представляются единым документом. Из этого следует, что по токену из запроса можно обратиться ко всему столбцу TF-IDF матрицы и посчитать релевантность каждого пользователя по запрашиваемому токену. Просуммировав оценки для каждого токена из запроса, можно вычислить итоговую релевантность пользователя по всему запросу. На выходе модели итоговая оценка для каждого пользователя проходит через min-max нормализацию, чтобы иметь одинаковый вес с оценками других моделей.
|
|
|
|
После этого составляется матрица документ-слово, в ячейках которой содержатся значения `TF-IDF` меры ([код](https://git.miem.hse.ru/240/competence-search/-/blob/c911531e19c93a1f7a0dc6b70b70c419284db23d/lib/smartsearch.py#L66)).
|
|
|
|
|
|
|
|
> Те же методы применяются к **входному** запросу, состоящему из набора слов — желаемых компетенций.
|
|
|
|
|
|
|
|
Компетенции каждого пользователя сервиса **Личный кабинет МИЭМ** представляются единым документом. Из этого следует, что по токену из запроса можно обратиться ко всему столбцу `TF-IDF` матрицы и посчитать релевантность каждого пользователя по запрашиваемому токену. Просуммировав оценки для каждого токена из запроса, можно вычислить итоговую релевантность пользователя по всему запросу. На выходе модели итоговая оценка для каждого пользователя проходит через `min-max` нормализацию, чтобы иметь одинаковый вес с оценками других моделей.
|
|
|
|
|
|
|
|
Модель возвращает словарь, в котором ключи — это идентификаторы пользователей, а в значениях записаны финальные оценки релевантности пользователей вместе со списками всех проектов, в которых они участвовали.
|
|
|
|
В модели реализован метод fit, создающий и сохраняющий в памяти векторные представления всех документов в корпусе и другие необходимые для работы модели данные. Это позволяет экономить время и вычислительные мощности при запросе, так как основные вычисления и преобразования данных должны быть произведены всего один раз (до следующей подгрузки данных из сервиса).
|
|
|
|
На случай, если работа сервера будет неожиданно приостановлена, были реализованы методы save и load, позволяющие хранить все необходимые данные и параметры модели в постоянной памяти или, наоборот, загружать их. |
|
|
\ No newline at end of file |
|
|
|
|
|
|
|
В модели реализован метод [`fit`](https://git.miem.hse.ru/240/competence-search/-/blob/c911531e19c93a1f7a0dc6b70b70c419284db23d/lib/smartsearch.py#L64), создающий и сохраняющий в памяти векторные представления всех документов в корпусе и другие необходимые для работы модели данные. Это позволяет экономить время и вычислительные мощности при запросе, так как основные вычисления и преобразования данных должны быть произведены всего один раз (до следующей подгрузки данных из сервиса).
|
|
|
|
|
|
|
|
Также были реализованы методы [`save`](https://git.miem.hse.ru/240/competence-search/-/blob/c911531e19c93a1f7a0dc6b70b70c419284db23d/lib/smartsearch.py#L86) и [`load`](https://git.miem.hse.ru/240/competence-search/-/blob/c911531e19c93a1f7a0dc6b70b70c419284db23d/lib/smartsearch.py#L70), позволяющие хранить все необходимые данные и параметры модели в постоянной памяти или, наоборот, загружать их. |