Существует много работы, связанной с механизмами обучения и так далее. Не могли бы вы описать механику, по которой вы бы проводили обучение? Какие именно модели вы бы рекомендовали использовать?
Инструменты, которые в настоящее время использует моя команда, взяты из gensim. У него есть стандартный интерфейс модуля Python. Он хорошо протестирован на протяжении многих лет.
Схема, которая приходит мне на ум, выглядит так:
- Сначала: выберите набор документов: это могут быть все корневые темы или все сообщения.
Периодически (например, раз в неделю? раз в месяц? в зависимости от трафика форума) создавайте модель doc2vec:
- извлеките темы Discourse в файл (или файлы) в формате md-текста, заголовок + тело темы. Теперь рассматривайте каждую тему как документ, или «документ» для алгоритмов gensim.
- запустите стандартные инструменты NLP для обработки документов: стемминг слов и т. д.
- используйте
doc2vec (из реализации gensim) для создания модели, которая отображает каждый документ в вектор в d-мерном пространстве. Вам нужно выбрать мета-параметр d методом экспериментов; Google использует d=40 для своих патентных моделей; не уверен, какое значение d используется Google Scholar. Я обычно использую d=200. Каждое измерение пространства можно рассматривать как «признак», связанный с семантическим содержанием.
- (FYI: алгоритм doc2vec строит пространство признаков, обучая нейронную сеть, ориентированную на изучение последовательностей слов; у нейросети есть d-мерный скрытый слой; выходы скрытого слоя формируют латентное пространство признаков)
- Построение модели — это ресурсоёмкая задача, зависящая от количества документов. 38 лет патентов = 5 миллионов документов; модель doc2vec строится за ночь на старом компьютере с 8 ядрами.
- Опциональная интересная дополнительная задача: кластеризация облака документов в d-мерном пространстве признаков.
- для кластеризации можно использовать готовые инструменты, например, из библиотеки Python sklearn.
- кластеризация даёт эмерджентную классификацию; интересные исследовательские вопросы включают то, как эти классификации пересекаются с категориями ключевых слов (или тегов Discourse).
Это будет происходить в офлайн-режиме. Затем онлайн:
- Модель будет загружена.
- После загрузки модели относительно лёгкая задача — разобрать новый документ и запросить у модели его положение в d-мерном пространстве признаков.
- обратите внимание, что этот новый документ не вызовет перестройку модели. Модель будет статичной для онлайн-запросов. Новый документ будет включён в следующую (например, еженедельную) сборку модели.
- Затем последняя лёгкая задача — спросить, какие документы находятся рядом в пространстве признаков. В gensim есть инструменты для получения списка близких документов, но вы также можете напрямую использовать numpy, чтобы загрузить все векторы документов в структуру типа kd-дерева, что позволяет быстро запрашивать близкие точки.
Что происходит, когда у темы 100 сообщений? 1000 сообщений?
Офлайн-часть масштабируется примерно линейно с количеством документов, но должна быть вполне управляемой для 10–100 тысяч документов. Даже 1 миллион документов приемлем для еженедельной пакетной обработки.
Что вы будете использовать в качестве сигнала и какую силу придадите каждому фактору (просмотры/категория/тег и так далее)?
В данном контексте «сила сигнала» для новой темы напрямую интерпретируется как (обратное) расстояние от векторного представления новой темы до векторов существующих документов. Можно дополнить этот сигнал другими факторами (лайки, просмотры и т. д.), но это дополнительные опции к базовому алгоритму, который я описываю.
Как только я (или кто-то другой) настрою извлечение данных, офлайн-часть, описанная выше, будет довольно простой и механической.
Сложная часть (для меня) — это онлайн-часть, которая потребует интеграции Rails-приложения Discourse с несколькими вызовами Python (например, к инструментам gensim). Любые примеры подобного интерфейса были бы полезны для моего изучения.