Компоненты Spark NLP

В предыдущей статье мы обсудили преимущества использования Spark NLP. Сегодня рассмотрим основные компоненты Spark NLP — аннотаторы (annotators), и как они связаны с Spark ML.

Все дело в аннотаторах

Apache Spark, являясь частью экосистемы Hadoop, на данный момент является одним из самых стабильных фреймворков потоковой обработки больших данных (streaming big data). Apache Spark обеспечивает потоковую обработку данных в реальном времени, интерактивную обработку, графовую обработку, обработку в кэш-памяти, а также пакетную обработку с очень высокой скоростью, простотой использования и стандартным интерфейсом на Scala, Java и Python. Но в нем отсутствовала хорошая база для решения задач NLP.

В фреймворке присутствует модуль Spark ML, который имеет множество общих решений машинного обучения (Machine Learning). В этом модуле имеются такие компоненты, как Esimator, реализующий различные алгоритмы, и Transformer, преобразующий один DataFrame в другой на основе заданного алгоритма. Оба этих компонента могут быть часть Pipeline (конвейера), т.е. представлять последовательность шагов выполнения. О конвейерах тут.

Spark NLP добавляет в коллекцию еще объект Annotator (аннотаторы).

Зачем нужны аннотаторы в Spark NLP

В Spark NLP все аннотаторы — это либо объекты Transformer или Esimator. Поэтому их разделяют на два типа: AnnotatorApproach и AnnotatorModel. Объекты AnnotatorApproach наследуются от Estimator и переопределяют метод fit, а объекты AnnotatorModel наследуются от Transfromer и переопределяют метод transform.

Так, результатом обучения модели является AnnotatorApproach, а если происходило преобразование одного DataFrame в другой, то это AnnotatorModel.

Например, токенизатор (Tokenizer) является AnnotatorModel. Для токенизации требуется вызвать метод fit, а затем, чтобы получить результаты в виде DataFrame, вызвать transform:

tokenizer = Tokenizer() \
  .setInputCols([“document”]) \
  .setOutputCol(“token”)

tokenizer.fit(df).transform(df)

А вот стеммер является AnnotatorApproach, поэтому для стэминга (удаления окончаний) требуется вызвать метод transform:

stemmer = Stemmer() \
 .setInputCols([“token”]) \
 .setOutputCol(“stem”)

stemmer.transform(df)

Также в Spark NLP каждый из аннотаторов принимает определенные типы столбцов и производит соответствующий.

5 преобразователей для получения нужного типа

Мы упомянули, что аннотаторы принимают только определенный тип столбцов. А что если в исходном DataFrame такого нет? Тогда используйте объекты Transformer. В Spark NLP есть 5 видов этих объектов для конвертирования типов:

  • DocumentAssembler создает из сырых данных строкового типа и преобразует их в тип Document;
  • TokenAssembler преобразует столбец с Document для последующей работы (для машинного обучения, например). Хотя перед этим следует нормализовать данные, провести лемматизацию, проверить орфографию;
  • Doc2Chunk конвертирует Document в Chunk, т.е. в раздробленные данные, чтобы не хранить в памяти все данные одновременно;
  • Chunk2Doc конвертирует Chunk в Document;
  • Finisher преобразует аннотированные данные в строковый формат, поэтому их можно сохранить и выгрузить.

Готовые предобученные модели

Очень часто в задачах машинного обучения не требуется с нуля обучать собственную модель. В этом случае используется готовая модель, над которой проводят дообучение. Spark NLP предлагает огромный выбор готовых предобученнных моделей на разных языках, включая русский и украинский [1].

Моделей имеется более 1100, и они являются объектами AnnotatorModel. Все, что требуется это загрузить нужную модель и настроить под свои задачи и данные.

Пример использования модели Bert для задачи извлечения именновых сущностей (NER) в Spark NLP:

from sparknlp.annotators import NerDLModel
ner_bert = NerDLModel.pretrained('ner_dl_bert')
ner_bert.transform(df)

ML-конвейеры и Spark NLP

Аннотаторы и все объекты Spark ML могут работать вместе, образуют конвейер. В конвейре все преобразования выполняются шаг за шагом. Причем, для создания конвейера с нуля используется модуль Spark ML или предобученный конвейер из модуля sparknlp.pretrained.

Например, вот так может выглядеть реализация конвейера машинного обучения в Apache Spark:

from pyspark.ml import Pipeline

# Каждый объект - это Transformer или Estimator
nlpPipeline = Pipeline(stages=[
    document_assembler, 
    sentenceDetector,
    tokenizer,
    normalizer,
    word_embeddings,
])pipelineModel = nlpPipeline.fit(df)

 

Больше о ML-конвейерах, алгоритмов машинного обучения и обработке текстов на естественном языке (NLP) на примерах реальных задач Data Science вы узнаете на специализированном курсе по машинному обучению «Машинное обучение в Apache Spark» в лицензированном учебном центре обучения и повышения квалификации разработчиков, менеджеров, архитекторов, инженеров, администраторов, Data Scientist’ов и аналитиков Big Data в Москве.

Записаться на курс

Смотреть раcписание

Источники
  1. github.com
  2. models

Добавить комментарий

Поиск по сайту