Машинное обучение (ML) — это область, в которой постоянно происходят инновации. Практикам машинного обучения приходится постоянно просматривать документы, чтобы ссылаться на новые новые архитектуры, которые могут быть использованы в их проектах. Вот ссылка, чтобы показать, как эффективно читать статьи.

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

В этом проекте я использую API результатов поиска из ArXiv (репозиторий научных статей с открытым доступом) для создания оптимизированного веб-приложения для объединения документов с похожими резюме. Подробности можно найти в этом репозитории здесь.

Оглавление
1. Цель применения
2. Модель-трансформер
3. Персональный вынос

(1) Цель применения

Целью проекта было придумать новый способ взаимодействия пользователей с результатами поиска. Вместо того, чтобы возвращать «список», пользователи смогут собирать больше информации о своем поисковом запросе. (например, количество опубликованных статей и годовая динамика статей).

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

(2) Сводный текст кластеризации

Подход, принятый к кластеризации, заключался в том, чтобы создать предложение, встраивающее резюме. Вложение предложения — это представление сводки в векторном пространстве. Затем мы оценили сводку на основе сходства и вернули таблицу с весами каждой пары сводок.

import pandas as pd
import numpy as np
from sentence_transformers import SentenceTransformer, util


class SentenceEncoder:
    """Sentence Encoder class"""

    def __init__(self) -> None:
        """Instantiates Sentence Encoder"""
        self.model = SentenceTransformer("all-MiniLM-L6-v2")

    def encode_sentences(self, df: pd.DataFrame, col="summary") -> np.ndarray:
        """Encodes sentences with embeddings
        Args:
            df (pd.DataFrame): Dataframe from API
            col (str, optional): Identifies the summary column. Defaults to "summary".
        Returns:
            np.ndarray: Encoding
        """
        sentences = df[col].to_list()
        embeddings = self.model.encode(sentences, batch_size=32)

        return embeddings

    def pairwise_cosine_similarity(
        self, embeddings: np.ndarray, titles: pd.Series
    ) -> pd.DataFrame:
        """Cosine Similarity matrix calculation
        Args:
            embeddings (np.ndarray): encoding
            titles (pd.Series): titles
        Returns:
            pd.DataFrame: pairwise summary of cosine data matrix
        """
        cosine_scores = util.cos_sim(embeddings, embeddings)
        title_mapping = dict(zip(range(len(titles)), titles))

        cosine_dataframe = pd.DataFrame(cosine_scores)
        cosine_dataframe = cosine_dataframe.reset_index(drop=True)
        cosine_dataframe = cosine_dataframe.where(
            ~np.tril(np.ones(cosine_dataframe.shape)).astype(np.bool)
        )

        cosine_dataframe = cosine_dataframe.stack().reset_index()
        cosine_dataframe.columns = ["From", "To", "Weights"]
        cosine_dataframe = cosine_dataframe.replace(title_mapping)

        return cosine_dataframe

Затем возвращенный кадр данных был загружен в визуализацию сетевого графика Networkx, отображающую необходимое пользователю количество пар.

(3) Личные выводы

  • В то время как были некоторые накладные расходы на задержку из-за конвейера данных (вызов сетевого API → XML → кадр данных → визуализация). Большая часть задержки была связана с вычислением встраивания предложений с помощью модели преобразования.
  • Несмотря на то, что для кодирования предложения и расчета сходства была выбрана очищенная модель SBERT, для запуска модели на моем ноутбуке потребовалось некоторое время. Увеличение количества результатов поиска привело бы к еще большей задержке.
  • Неожиданным моментом обучения UI/UX для меня было установить базовый используемый параметр поиска, который также позволял настраивать пользователя. Затем пользователь может сбалансировать требуемую область поиска с затраченным на поиск временем.

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