В предыдущей статье мы обсудили преимущества использования 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 в Москве.