[Python] Обработка и анализ текстов на Python и Spark NLP
Автор
Сообщение
news_bot ®
Стаж: 6 лет 9 месяцев
Сообщений: 27286
В наше время без анализа и обработки текстов, не обходится ни один проект, и так уж сложилось что 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, Программирование, Лайфхаки для гиков] Как сделать полнотекстовую поисковую машину на 150 строках кода Python (перевод)
- [Python, Data Mining, HTML, Визуализация данных] Сравнение ассортимента блюд трёх ресторанов Санкт-Петербурга
- [Python, Программирование, Проектирование и рефакторинг] Python & оптимизация времени и памяти
- [Python, Программирование, Data Mining, Big Data, R] R vs Python в продуктивном контуре
- [Python, Алгоритмы, API, 1С] Tesseract vs таблицы. Распознавание документов. Часть 2
- Перевод на русский язык документации по CPython 3.8.8
- [Python, Big Data, Hadoop] Impala для Python-разработчика на примере определения фрода при анализе трафика в маркетинговой платформе
- [Python, Машинное обучение, Искусственный интеллект, TensorFlow] Нейродайджест: главное из области машинного обучения за март 2021
- [Open source, Программирование, Геоинформационные сервисы, Визуализация данных, Научно-популярное] Google Earth Engine (GEE): ищем золото по всему миру с помощью больших данных и машинного обучения
- [Python, Развитие стартапа, Искусственный интеллект, Презентации, Телемедицина] Как мы не сделали стартап в сфере телемедицины
Теги для поиска: #_python, #_spark, #_nlp, #_python, #_nlu, #_python
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах
Вы не можете прикреплять файлы к сообщениям
Вы не можете скачивать файлы
Текущее время: 22-Ноя 16:22
Часовой пояс: UTC + 5
Автор | Сообщение |
---|---|
news_bot ®
Стаж: 6 лет 9 месяцев |
|
В наше время без анализа и обработки текстов, не обходится ни один проект, и так уж сложилось что 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 ])
import nlu
pipeline = nlu.load('ner') result = pipeline.predict( text, output_level='document' ).to_dict(orient='records') # паттерн Реестр
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() =========== Источник: habr.com =========== Похожие новости:
|
|
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах
Вы не можете прикреплять файлы к сообщениям
Вы не можете скачивать файлы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах
Вы не можете прикреплять файлы к сообщениям
Вы не можете скачивать файлы
Текущее время: 22-Ноя 16:22
Часовой пояс: UTC + 5