[Python] Обработка и анализ текстов на Python и Spark NLP

Автор Сообщение
news_bot ®

Стаж: 6 лет 7 месяцев
Сообщений: 27286

Создавать темы news_bot ® написал(а)
08-Апр-2021 23:31

В наше время без анализа и обработки текстов, не обходится ни один проект, и так уж сложилось что Python обладает широким спектром библиотек и фреймворков для задач NLP. Задачи могут быть как тривиальные: анализ тональности(sentiment) текста, настроение, распознавание сущностей(NER) так и более интересные как боты, сравнение диалогов в саппорт-чатах - мониторить следует ли ваша тех.поддержка или сейлз текстовым скриптам, или постобработка текста после SpeechToText.Для решения задач NLP имеется огромное количество инструментов. Вот короткий список таковых:
Речь как вы понимаете пойдет о последнем, так как он включает в себя практически все что умеют выше перечисленные библиотеки. Существуют как бесплатные pre-trained модели так и платные, узкоспециализированные например для healthcare.Для работы Spark NLP понадобится Java 8 - она нужна для фреймворка Apache Spark с помощью которого и работает Spark NLP. Для экспериментов на сервере или на локальной машине потребуется минимум 16Гб ОЗУ. Устанавливать лучше на каком нибудь дистрибутиве Linux (На macOS могут возникнуть трудности), лично я выбрал Ubuntu инстанс на AWS.apt-get -qy install openjdk-8Также нужно установить Python3 и сопутствующие библиотекиapt-get -qy install build-essential python3 python3-pip python3-dev gnupg2pip install nlu==1.1.3 pip install pyspark==2.4.7pip install spark-nlp==2.7.4Экспериментировать можно так же на colab. Работает Spark NLP по принципу конвейеров (pipeline), ваш текст проходит некоторое количество стадий которые вы описали в pipe-лайне, и каждая стадия производит описанные манипуляции, к примеру: пайплайн для получения именованных сущностей. Ниже на картинке схема наиболее часто встречающихся стадий которые будет проходить ваш входной текст, каждая стадия конвейера добавляет свою колонку с данными после ее выполнения.
Пример конвейера в Spark NLPПример создания стадий для пайплайна. (весь код примера по ссылке на colab)
documentAssembler = DocumentAssembler() \
    .setInputCol('text') \
    .setOutputCol('document')
tokenizer = Tokenizer() \
    .setInputCols(['document']) \
    .setOutputCol('token')
embeddings = BertEmbeddings.pretrained(name='bert_base_cased', lang='en') \
        .setInputCols(['document', 'token']) \
        .setOutputCol('embeddings')
ner_model = NerDLModel.pretrained('ner_dl_bert', 'en') \
    .setInputCols(['document', 'token', 'embeddings']) \
    .setOutputCol('ner')
ner_converter = NerConverter() \
    .setInputCols(['document', 'token', 'ner']) \
    .setOutputCol('ner_chunk')
nlp_pipeline = Pipeline(stages=[
    documentAssembler,
    tokenizer,
    embeddings,
    ner_model,
    ner_converter
])
  • documentAssembler - создает аннотацию типа Document, которая может использоваться аннотаторами в будущем
  • tokenizer - разбивает текст и пунктуацию на массив строк
  • embeddings - создает векторные представления для слов
  • ner_model - распознаватель именованных сущностей. к примеру: October 28, 1955 = DATE
  • ner_converter - добавляет колонку с отдельными распознанными сущностями October 28, 1955
И все конечно хорошо, но приходится как-то много кода писать - описывая стадии пайплайна и сам пайплайн, не говоря про подключение библиотек и инициализацию Spark NLP, поэтому разработчики SparkNLP (johnsnowlabs) сделали более высокоуровневую библиотеку или синтаксический сахар над SparkNLP - называйте как хотите, но когда мы попробуем повторить вышеприведенный пример:
import nlu
pipeline = nlu.load('ner')
result = pipeline.predict(
  text, output_level='document'
).to_dict(orient='records')
мы получим все те же самые NER, но написав на порядок меньше кода. Хотелось бы еще отметить что оба варианта получения именованных сущностей, требуют некоторое время на инициализацию Apache Spark, предзагрузку моделей и установку связи интерпретатора Python c Spark через pyspark. Потому вам не особо захочется по 10-100 раз перезапускать скрипт с кодом выше, нужно предусмотреть предзагрузку и просто обрабатывать текст посредством вызова predict, в моем случае я сделал инициализацию нужных мне конвейеров во время инициализации Сelery воркеров.
# паттерн Реестр
pipeline_registry = PipelineRegistry()
def get_pipeline_registry():
    pipeline_registry.register('sentiment', nlu.load('en.sentiment'))
    pipeline_registry.register('ner', nlu.load('ner'))
    pipeline_registry.register('stopwords', nlu.load('stopwords'))
    pipeline_registry.register('stemmer', nlu.load('stemm'))
    pipeline_registry.register('emotion', nlu.load('emotion'))
    return pipeline_registry
@worker_process_init.connect
def init_worker(**kwargs):
    logging.info("Initializing pipeline_factory...")
    get_pipeline_registry()
Таким образом можно выполнять NLP задачи без боли в мозгу и минимумом усилий.
===========
Источник:
habr.com
===========

Похожие новости: Теги для поиска: #_python, #_spark, #_nlp, #_python, #_nlu, #_python
Профиль  ЛС 
Показать сообщения:     

Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах
Вы не можете прикреплять файлы к сообщениям
Вы не можете скачивать файлы

Текущее время: 22-Сен 07:01
Часовой пояс: UTC + 5