Создание поисковой системы с помощью BERT, Elasticsearch и React.

Пандемия COVID-19 глубоко изменила нашу жизнь за последние несколько месяцев. К счастью, правительства и исследователи все еще упорно борются с этим.

В этом посте я скромно приношу свою работу в здание и предлагаю инструмент на базе искусственного интеллекта, который поможет практикующим врачам отслеживать последние исследования COVID-19.

Без лишних слов, встречайте Corona Papers 🎉

В этом посте я расскажу:

  • Ознакомьтесь с основными функциями Corona Papers и подчеркните, что отличает его от других поисковых систем
  • Поделитесь кодом конвейеров предварительной обработки данных и определения тем, чтобы его можно было применять в аналогичных проектах

Что такое Corona Papers?

Corona Papers - это поисковая система, которая индексирует последние исследования о COVID-19.

Если вы только что смотрели видео, в следующих разделах будут рассмотрены более подробные сведения. Если вы еще не смотрели его, все, что вам нужно знать, здесь.

1 - Кураторский список статей и подробные метаданные 📄
Corona Papers индексирует набор данных открытого исследования COVID-19 (CORD-19), предоставленный Kaggle. Этот набор данных представляет собой регулярно обновляемый ресурс, содержащий более 138000 научных статей, в том числе более 69000 с полными текстами, о COVID-19, SARS-CoV-2 и связанных с ними коронавирусах.

Corona Papers также интегрирует дополнительные метаданные из Altmetric и Scimgo Journal для учета онлайн-присутствия и академической популярности каждой статьи. Более конкретно, он извлекает такую ​​информацию, как количество репостов на стенах Facebook. , количество публикаций в Википедии, количество ретвитов, H-Index издательского журнала и т. д.



Цель интеграции этих метаданных - рассмотреть влияние и популярность каждой статьи в сообществе, как академическом, так и неакадемическом.

2 - Автоматическое извлечение темы с использованием языковой модели 🤖

Corona Papers автоматически помечает каждую статью соответствующей темой с помощью конвейера машинного обучения.
Это делается с помощью CovidBERT: современной языковой модели, адаптированной к медицинским данным. Благодаря огромным возможностям библиотеки Hugging Face использовать эту модель довольно просто.

Для большей ясности давайте разберем конвейер выявления тем:

  • Поскольку аннотации представляют собой основное содержание каждой статьи, они будут использоваться для изучения тем, а не полного содержания.
    Сначала они встраиваются с помощью CovidBERT. В результате получаются векторы 768 измерений.
    -
    Обратите внимание, что CovidBERT встраивает каждый аннотация в целом, так что результирующий вектор инкапсулирует семантику всего документа.
  • Для этих векторов выполняется анализ главных компонентов (PCA), чтобы уменьшить их размерность, устранить избыточность и ускорить последующие вычисления. 250 компонентов сохраняются, чтобы гарантировать 95% объясненного отклонения.
  • Кластеризация KMeans применяется поверх этих компонентов PCA для обнаружения тем. После многих итераций по количеству кластеров 8 оказалось правильным выбором.
    - Есть много способов выбрать количество кластеров. Я лично смотрел на силуэтный график каждого кластера (рисунок ниже).
    ⚠️ На этом этапе было сделано предположение: каждой статье назначается уникальная тема, то есть доминирующая. . Если вы хотите создать смесь тем для каждой статьи, правильным способом будет использование Скрытого распределения Дирихле. Обратной стороной этого подхода, однако, является то, что он не интегрирует встраивания COVIDBert.
  • После создания кластеров я изучил каждую из них, чтобы понять лежащие в основе подтемы. Сначала я попробовал подсчет слов и оценку TF-IDF, чтобы выбрать наиболее важные ключевые слова для каждого кластера. Но лучше всего здесь было извлечение этих ключевых слов путем выполнения LDA для документов каждого кластера. Это имеет смысл, потому что каждый кластер сам по себе представляет собой набор подтем.
    Были обнаружены различные когерентные скопления. Вот несколько примеров с соответствующими ключевыми словами (имена кластеров были присвоены вручную на основе ключевых слов)

  • В конце концов, я решил, в основном ради забавы, представить статьи на интерактивной двухмерной карте, чтобы обеспечить визуальную интерпретацию кластеров и их разделимость. Для этого я применил уменьшение размерности tSNE к компонентам PCA. Ничего фантастического.

Чтобы сделать поиск более интерактивным, я решил встроить визуализацию tSNE в результаты поиска (она доступна только в представлении на рабочем столе).
На каждой странице результатов точки на графике (слева) представляют те же результаты поиска (справа): это дает представление о том, как результаты соотносятся друг с другом в семантическом пространстве.

3 - Рекомендации аналогичных документов

После того, как вы нажмете на данную статью, Corona Papers покажет вам подробную информацию о ней, такую ​​как название, аннотация, полное содержание, URL-адрес исходного документа и т. Д.

Кроме того, он предлагает подборку похожих статей, которые пользователь может читать и добавлять в закладки.

Эти статьи основаны на измерении сходства, вычисленном на вложениях CovidBert.
Вот два примера:

4 - Стек современных веб-технологий 📲

Corona Papers построена с использованием современных веб-технологий.

Серверная часть

По сути, он использует Elasticsearch для выполнения полнотекстовых запросов, сложной агрегации и сортировки. Например, когда вы вводите список ключевых слов, Elasticsearch сначала сопоставляет их с заголовками, аннотацией и, наконец, с именами авторов.

Вот пример запроса:

А вот второй, соответствующий имени автора:

Следующим важным компонентом серверной части является Flask API: он создает интерфейс между ElasticSearch и клиентской частью.

Интерфейс

Внешний интерфейс построен с использованием Material-UI, отличной библиотеки React UI с множеством хорошо продуманных и надежных компонентов.

Он использовался для разработки различных страниц, в частности страницы поиска с ее сворачиваемой панелью поисковых фильтров:

  • Дата публикации
  • издательская компания (то есть источник)
  • название журнала
  • рецензируемые статьи
  • h-индекс журнала
  • темы

Поскольку доступность имеет значение, я стремился сделать Corona Papers гибким инструментом, который исследователи могут использовать на разных устройствах. Использование Material-UI помогло нам разработать чистый и простой интерфейс.

Облако и DevOps

Я развернул Corona Papers на AWS с помощью docker-compose.

Как использовать CovidBERT на практике

Эти несколько строк так же просто использовать пакет offer_transformers для загрузки и генерации встраивания из CovidBERT.

Если вас интересуют конвейеры обработки данных и извлечения тем, вы можете посмотреть код в моем репозитории на Github.

Вы найдете две записные книжки:

1-data-Consolidation.ipynb:

  • объединяет базу данных CORD с внешними метаданными из Altmetric, Scimago Journal и CrossRef
  • генерирует вложения CovidBERT из заголовков и отрывков

2-topic-mining.ipynb:

  • генерирует темы с использованием вложений CovidBERT
  • выберите релевантные ключевые слова для каждого кластера

Какие ключевые уроки можно извлечь из этого проекта?

Создание Corona Papers было увлекательным путешествием. Это была возможность смешать НЛП, поисковые технологии и веб-дизайн. Это также была площадка для множества экспериментов.

Вот некоторые технические и нетехнические примечания, которые я сначала оставил при себе, но теперь делюсь с вами:

  • Не стоит недооценивать мощь Elasticsearch. Этот инструмент предлагает отличные настраиваемые возможности поиска. Его освоение требует больших усилий, но это очень ценный навык.
    Посетите официальный сайт, чтобы узнать больше.
  • Использование языковых моделей, таких как CovidBERT, обеспечивает эффективное представление задач схожести текста.
    Если вы работаете над задачей сопоставления текста, поищите языковую модель, которая предварительно обучена на корпусе, похожем на вашу. В противном случае тренируйте свою языковую модель.
    Здесь есть много доступных моделей.
  • Docker - это идеальное решение для развертывания. Довольно аккуратно, чисто и эффективно, чтобы управлять несколькими службами вашего приложения.
    Подробнее о Docker можно узнать здесь.
  • Создание пользовательского интерфейса в React действительно весело и не особенно сложно, особенно когда вы играете с такими библиотеками, как Material-UI.
    Ключ в том, чтобы сначала набросать свое приложение, а затем разрабатывать отдельные компоненты по отдельности и, наконец, собрать все это целиком.
    Мне потребовалось время, чтобы понять, потому что я был новичком в React, но вот несколько руководств, которые я использовал:
    - Официальный сайт React
    - Официальный сайт Material UI, где вы можете найти кучу компонентов
    - тоже рекомендую канал этого парня. Это потрясающе, весело и быстро поможет вам начать изучение основ React.
  • Кластеризация текста - это не полностью автоматический процесс. Вам придется настроить количество кластеров почти вручную, чтобы найти правильное значение. Это требует мониторинга некоторых показателей и качественной оценки результатов.

Конечно, есть вещи, которые я хотел бы попробовать, например, настроить рабочий процесс CI-CD с помощью действий Github и построить модульные тесты. Если у вас есть опыт работы с этими инструментами, я буду очень признателен за ваш отзыв.

Распространить слово! Делитесь документами Corona со своим сообществом

Если вы зашли так далеко, я действительно хочу поблагодарить вас за чтение!

Если вы найдете Corona Papers полезными, поделитесь этой ссылкой



с вашим сообществом.

Если у вас есть запрос на улучшение функции или вы хотите сообщить об ошибке, не стесняйтесь обращаться ко мне.

В ожидании ответа от вас!

Лучший,

Получите доступ к экспертному обзору - Подпишитесь на DDI Intel