- Погружение в бездну текста: Как мы осваиваем мир NLP с Python
- Начало пути: От сырого текста к осмысленным единицам
- Основы предобработки: Токенизация‚ стемминг и лемматизация с NLTK и spaCy
- Очистка данных: от мусора к чистоте
- Представление текста: Как машины "видят" слова и предложения
- Классические подходы: CountVectorizer и TF-IDF
- Word Embeddings: Word2Vec‚ GloVe и FastText
- Сравнение методов векторизации
- Извлечение смысла: От сущностей до тем
- Распознавание именованных сущностей (NER)
- Тематическое моделирование: Открытие скрытых тем
- Анализ тональности (Sentiment Analysis)
- Глубокое погружение: Нейронные сети и Трансформеры
- Применение PyTorch/TensorFlow для NLP
- Эра Трансформеров: Hugging Face и BERT
- Специализированные задачи и практические инструменты
- Работа с многоязычными текстами и редкими языками
- Извлечение ключевых фраз и суммаризация
- Конкретные кейсы: От чат-ботов до анализа юридических документов
- Вызовы и перспективы
Погружение в бездну текста: Как мы осваиваем мир NLP с Python
Привет‚ дорогие читатели и коллеги-энтузиасты больших данных! Сегодня мы приглашаем вас в увлекательное путешествие по миру обработки естественного языка (NLP) с помощью нашего любимого Python. Это не просто рассказ о технологиях‚ это история нашего собственного пути‚ наших открытий‚ проб и ошибок‚ которые привели нас к глубокому пониманию того‚ как заставить машины понимать и взаимодействовать с человеческим языком. За последние годы мы накопили колоссальный опыт‚ работая с текстами самых разных форматов и объемов‚ и хотим поделиться с вами самыми ценными инсайтами.
Мир вокруг нас пронизан текстом: социальные сети‚ электронные письма‚ статьи‚ книги‚ юридические документы‚ отзывы клиентов. Этот бесконечный поток информации является одновременно и сокровищницей знаний‚ и вызовом. Как извлечь из него смысл? Как автоматизировать рутинные задачи‚ которые раньше требовали часов кропотливого человеческого труда? Именно здесь на сцену выходит NLP – мощный инструмент‚ позволяющий анализировать‚ понимать и даже генерировать человеческий язык. Мы убедились в этом на собственном опыте‚ реализуя проекты от простых систем анализа тональности до сложных вопросно-ответных систем. Приготовьтесь‚ будет интересно!
Начало пути: От сырого текста к осмысленным единицам
Любое взаимодействие с текстом начинается с его подготовки. Мы всегда говорим‚ что "грязные данные – грязные результаты". И в NLP это правило работает на все сто процентов. Прежде чем мы сможем что-либо анализировать‚ текст нужно очистить и разбить на более мелкие‚ осмысленные единицы. Это фундамент‚ на котором строится вся дальнейшая работа.
Основы предобработки: Токенизация‚ стемминг и лемматизация с NLTK и spaCy
Наши первые шаги в предобработке текста были неразрывно связаны с библиотекой NLTK (Natural Language Toolkit). Это настоящий швейцарский нож для начинающего NLP-специалиста. Мы начинали с токенизации – процесса разбиения текста на слова или предложения. Это кажется простым‚ но даже здесь есть свои нюансы‚ особенно когда речь идет о пунктуации‚ сокращениях или специализированных терминах.
После токенизации мы переходили к нормализации слов. Здесь нам на помощь приходили стемминг и лемматизация. Стемминг (удаление суффиксов и окончаний‚ чтобы привести слова к их основе) – это быстрый‚ но иногда грубый метод. Например‚ слова "бежать"‚ "бежит"‚ "бежал" могут быть сведены к "беж". Для быстрых прототипов и когда важна скорость‚ мы его активно использовали.
Когда же требовалась большая точность‚ мы обращались к лемматизации. В отличие от стемминга‚ лемматизация приводит слово к его базовой словарной форме (лемме)‚ учитывая морфологию языка. Так‚ "бежать"‚ "бежит"‚ "бежал" станут единой леммой "бежать". Мы обнаружили‚ что для большинства языков‚ особенно русского‚ spaCy предоставляет гораздо более качественную лемматизацию по сравнению с NLTK. Это связано с тем‚ что spaCy использует статистические модели и предобученные векторы‚ что позволяет ему лучше понимать контекст и морфологические особенности.
Пример кода для сравнения стемминга и лемматизации:
import nltk
from nltk.stem import PorterStemmer‚ WordNetLemmatizer
import spacy
# Загружаем необходимые ресурсы NLTK
nltk.download('punkt')
nltk.download('wordnet')
nltk.download('omw-1.4')
# Загружаем модель spaCy для английского языка
# Если вы работаете с русским‚ замените на 'ru_core_news_sm'
try:
nlp = spacy.load('en_core_web_sm')
except OSError:
print("Скачиваем модель spaCy 'en_core_web_sm'...")
spacy.cli.download('en_core_web_sm')
nlp = spacy.load('en_core_web_sm')
text = "Мы бежали‚ бежим и будем бежать‚ чтобы бежать быстрее!"
# NLTK Токенизация
tokens_nltk = nltk.word_tokenize(text)
print(f"NLTK Токены: {tokens_nltk}")
# NLTK Стемминг (PorterStemmer)
stemmer = PorterStemmer
stemmed_tokens = [stemmer.stem(word) for word in tokens_nltk]
print(f"NLTK Стемминг: {stemmed_tokens}")
# NLTK Лемматизация (WordNetLemmatizer)
lemmatizer_nltk = WordNetLemmatizer
lemmatized_nltk_tokens = [lemmatizer_nltk.lemmatize(word) for word in tokens_nltk]
print(f"NLTK Лемматизация (английский): {lemmatized_nltk_tokens}")
# Примечание: WordNetLemmatizer в NLTK не очень хорошо работает без указания POS-тега‚
# и плохо адаптирован для русского языка без дополнительных словарей.
# spaCy Токенизация и Лемматизация
doc = nlp(text)
spacy_tokens = [token.text for token in doc]
spacy_lemmas = [token.lemma_ for token in doc]
print(f"spaCy Токены: {spacy_tokens}")
print(f"spaCy Лемматизация: {spacy_lemmas}")
# Для русского языка:
# try:
# nlp_ru = spacy.load('ru_core_news_sm')
# except OSError:
# print("Скачиваем модель spaCy 'ru_core_news_sm'...")
# spacy.cli.download('ru_core_news_sm')
# nlp_ru = spacy.load('ru_core_news_sm')
#
# doc_ru = nlp_ru("Мы бежали‚ бежим и будем бежать‚ чтобы бежать быстрее!")
# spacy_ru_lemmas = [token.lemma_ for token in doc_ru]
# print(f"spaCy Лемматизация (русский): {spacy_ru_lemmas}")
Очистка данных: от мусора к чистоте
Помимо нормализации слов‚ нам часто приходится сталкиваться с более фундаментальными проблемами "грязных" данных. Веб-скрейпинг‚ например‚ всегда приносит с собой много шума: HTML-теги‚ скрипты‚ лишние пробелы‚ пунктуация‚ которая не несет смысловой нагрузки. Мы разработали целую систему для очистки текста‚ которая включает в себя:
- Удаление HTML-тегов: Используем Beautiful Soup для парсинга и извлечения чистого текста. Это незаменимый инструмент‚ когда нужно работать с данными‚ полученными с веб-страниц.
- Регулярные выражения (библиотека
re): Наш верный друг для удаления специфических паттернов‚ таких как URL-адреса‚ email-адреса‚ числа‚ или множественные пробелы. Мы часто используем их для удаления пунктуации‚ которая не нужна для анализа тональности или тематического моделирования. - Обработка стоп-слов: Слова вроде "и"‚ "в"‚ "на"‚ "он" встречаются очень часто‚ но редко несут семантическую ценность для большинства задач. Мы используем списки стоп-слов (доступные в NLTK или spaCy) и удаляем их‚ чтобы сократить размер данных и улучшить качество анализа.
- Нормализация сленга и эмодзи: В текстах из социальных сетей мы сталкиваемся с уникальными вызовами. Разработка инструментов для нормализации сленга или учета эмодзи – это отдельная большая задача‚ требующая создания собственных словарей или использования специализированных библиотек.
Наш опыт показывает‚ что инвестиции в качественную предобработку всегда окупаются сторицей‚ значительно улучшая результаты любых последующих этапов NLP. Мы даже создавали собственные инструменты для автоматической разметки данных‚ чтобы сделать процесс более эффективным.
Представление текста: Как машины "видят" слова и предложения
После того как текст очищен и нормализован‚ возникает следующий вопрос: как представить его в числовом формате‚ понятном для алгоритмов машинного обучения? Ведь компьютеры работают с числами‚ а не с буквами. Здесь мы погружаемся в мир векторизации и встраиваний (embeddings).
Классические подходы: CountVectorizer и TF-IDF
Наши первые шаги в векторизации текста были связаны с классическими методами‚ такими как CountVectorizer и TfidfVectorizer из библиотеки Scikit-learn. Эти подходы просты в понимании и реализации‚ но при этом удивительно эффективны для многих задач.
- CountVectorizer: Создает вектор‚ где каждое измерение соответствует слову из всего корпуса документов‚ а значение – частоте его появления в конкретном документе. Это как создать "сумку слов" (Bag-of-Words) для каждого текста.
- TfidfVectorizer (Term Frequency-Inverse Document Frequency): Более продвинутый вариант. Он не просто считает частоту‚ но и взвешивает ее обратной частотой документа. Это означает‚ что слова‚ которые часто встречаються во многих документах (например‚ "и"‚ "в")‚ получают меньший вес‚ а слова‚ уникальные для данного документа‚ – больший. Это помогает выделить наиболее релевантные слова.
Мы активно использовали эти векторизаторы для задач классификации текстов‚ например‚ для определения категории статьи или спама. Они до сих пор остаются отличным выбором для базовых задач и когда вычислительные ресурсы ограничены.
Word Embeddings: Word2Vec‚ GloVe и FastText
С развитием нейронных сетей появились более сложные и эффективные методы представления слов – Word Embeddings. Мы были в восторге‚ когда впервые начали работать с Word2Vec и GloVe с помощью библиотеки Gensim. Эти модели учаться представлять слова в виде плотных векторов чисел (обычно 50-300 измерений) таким образом‚ что слова со схожим значением располагаются близко друг к другу в векторном пространстве. Это позволяет улавливать семантические отношения между словами.
- Word2Vec (Skip-gram и CBOW): Мы экспериментировали с обоими алгоритмами. Skip-gram предсказывает контекстные слова по данному слову‚ а CBOW (Continuous Bag of Words) предсказывает текущее слово по его контексту.
- GloVe (Global Vectors for Word Representation): Этот метод сочетает идеи Word2Vec с глобальной статистикой ко-определенности слов в корпусе.
- FastText: Особенно ценный для нас инструмент‚ когда мы сталкивались с редкими словами или языками с богатой морфологией. FastText представляет слова как сумму их символьных n-грамм‚ что позволяет ему генерировать векторы для слов‚ которые он никогда не видел во время обучения‚ и лучше справляться с опечатками.
Мы использовали эти встраивания для улучшения качества моделей классификации‚ для поиска синонимов‚ а также для создания систем рекомендаций на основе текстового контента. Кроме того‚ мы успешно применяли Doc2Vec (расширение Word2Vec) для представления целых документов в виде векторов‚ что оказалось невероятно полезным для поиска похожих документов или кластеризации.
Сравнение методов векторизации
Чтобы наглядно показать различия и области применения‚ мы часто используем следующую таблицу:
| Метод векторизации | Основные преимущества | Основные недостатки | Типичные сценарии использования |
|---|---|---|---|
| CountVectorizer / TF-IDF | Простота‚ скорость‚ хорошая интерпретируемость. Эффективны для небольших корпусов. | Не улавливают семантику слов‚ векторы могут быть очень разреженными (много нулей). | Классификация спама‚ категоризация документов‚ базовый поиск по ключевым словам. |
| Word2Vec / GloVe | Улавливают семантические отношения между словами‚ плотные векторы‚ уменьшение размерности. | Не могут обрабатывать слова вне словаря (Out-of-Vocabulary)‚ требуют большого корпуса для обучения. | Поиск синонимов‚ рекомендации‚ улучшение моделей машинного обучения. |
| FastText | Хорошо работает с редкими и неизвестными словами‚ устойчив к опечаткам‚ учитывает морфологию. | Требует больше вычислительных ресурсов‚ векторы могут быть менее "чистыми" для очень частых слов. | Языки с богатой морфологией‚ анализ пользовательского контента с ошибками‚ многоязычные задачи. |
| Doc2Vec | Представляет целые документы в виде векторов‚ сохраняя семантику документа. | Может быть медленным для очень больших корпусов‚ сложность настройки гиперпараметров. | Поиск похожих документов‚ кластеризация документов‚ рекомендательные системы для статей. |
Извлечение смысла: От сущностей до тем
После того как текст подготовлен и представлен в числовом виде‚ начинается самое интересное – извлечение из него полезной информации. Это может быть что угодно: имена людей‚ названия организаций‚ места‚ даты‚ ключевые фразы‚ общие темы или даже эмоциональная окраска.
Распознавание именованных сущностей (NER)
Одной из наших любимых и наиболее востребованных задач является Распознавание именованных сущностей (NER). Это процесс идентификации и классификации именованных сущностей в тексте по предопределенным категориям‚ таким как "человек"‚ "организация"‚ "место"‚ "дата".
Для быстрого и эффективного NER мы чаще всего используем библиотеку spaCy. Она предоставляет предобученные модели для множества языков‚ которые отлично справляются с этой задачей "из коробки". Мы применяли NER в самых разных проектах: от автоматического заполнения форм и извлечения информации из юридических документов до анализа новостных статей для выявления ключевых действующих лиц и событий.
Пример NER с spaCy:
import spacy
try:
nlp = spacy.load('en_core_web_sm')
except OSError:
spacy.cli.download('en_core_web_sm')
nlp = spacy.load('en_core_web_sm')
text = "Apple купила стартап Zeno в Сан-Франциско за 1 миллиард долларов в 2023 году."
doc = nlp(text)
print("Найденные сущности:")
for ent in doc.ents:
print(f" {ent.text} ⎻ {ent.label_}")
Когда стандартных категорий не хватало‚ мы прибегали к более продвинутым методам‚ таким как CRF (Conditional Random Fields) или даже к тонкой настройке моделей на основе трансформеров для распознавания специфических для предметной области сущностей. Библиотека Flair также показала себя как мощный инструмент для современного NER‚ особенно когда требовалась высокая точность и возможность работать с кастомными моделями.
Тематическое моделирование: Открытие скрытых тем
Представьте‚ что у вас есть огромный корпус документов‚ и вы хотите понять‚ о чем они; Прочитать их все невозможно. Здесь на помощь приходит тематическое моделирование – набор алгоритмов‚ которые позволяют автоматически обнаруживать абстрактные "темы"‚ которые присутствуют в коллекции документов‚ и определять‚ к каким темам относится каждый документ. Мы активно используем библиотеку Gensim для реализации таких моделей‚ как LDA (Latent Dirichlet Allocation) и LSI (Latent Semantic Indexing).
- LDA: Предполагает‚ что каждый документ представляет собой смесь нескольких тем‚ а каждая тема – это смесь слов. Он пытается обнаружить эти скрытые структуры.
- LSI: Использует сингулярное разложение (SVD) для выявления скрытых семантических связей между словами и документами.
Мы применяли тематическое моделирование для анализа отзывов клиентов‚ чтобы выявить основные проблемы или предпочтения‚ для категоризации новостных статей и даже для исследования научных публикаций‚ чтобы понять доминирующие направления исследований. Сравнение моделей тематического моделирования‚ таких как LDA и NMF (Non-negative Matrix Factorization)‚ позволило нам выбирать наиболее подходящий подход для конкретной задачи‚ учитывая особенности данных и требуемую интерпретируемость результатов.
Анализ тональности (Sentiment Analysis)
Понять‚ что люди думают или чувствуют по отношению к продукту‚ услуге или событию‚ – бесценно для бизнеса. Анализ тональности позволяет нам классифицировать текст как положительный‚ отрицательный или нейтральный. Наши первые шаги были сделаны с библиотекой TextBlob‚ которая предоставляет простой и быстрый способ определения тональности‚ хотя и с некоторыми ограничениями‚ особенно для русского языка или текстов со сложным контекстом.
Позже мы перешли к более продвинутым методам. Для английского языка мы активно использовали VADER (Valence Aware Dictionary and sEntiment Reasoner)‚ который отлично справляется с анализом тональности в социальных сетях‚ учитывая даже эмодзи и сленг. Для русского и других языков мы обучали собственные модели классификации тональности с использованием Scikit-learn (SVM‚ наивный байесовский классификатор) или даже нейронных сетей на базе PyTorch/TensorFlow.
"Язык – это дорожная карта культуры. Он говорит вам‚ откуда пришли его люди и куда они идут." – Рита Мэй Браун
Мы столкнулись с интересными вызовами при анализе тональности в социальных медиа‚ особенно с учетом сарказма. Для таких сложных случаев требовались более тонкие подходы‚ часто с применением трансформерных моделей‚ способных улавливать контекст. Анализ тональности финансовых новостей или отзывов о фильмах и ресторанах стал нашей рутиной‚ помогая нашим клиентам принимать более обоснованные решения.
Глубокое погружение: Нейронные сети и Трансформеры
С появлением глубокого обучения мир NLP изменился до неузнаваемости. Мы‚ конечно же‚ не могли остаться в стороне и активно исследовали возможности нейронных сетей и‚ в частности‚ архитектуры трансформеров.
Применение PyTorch/TensorFlow для NLP
Разработка собственных нейронных сетей для NLP с использованием фреймворков PyTorch и TensorFlow/Keras стала для нас следующим этапом эволюции. Мы строили LSTM-сети для анализа последовательностей‚ что было особенно полезно для задач‚ где важен порядок слов‚ например‚ для генерации текста или машинного перевода. Хотя это требовало больших усилий и вычислительных ресурсов‚ результаты часто превосходили классические подходы.
Эра Трансформеров: Hugging Face и BERT
Переход к Трансформерам стал настоящей революцией. Библиотека Hugging Face Transformers открыла для нас двери в мир предварительно обученных моделей‚ таких как BERT‚ GPT‚ RoBERTa и многих других. Это позволило нам решать сложные задачи NLP с беспрецедентной точностью‚ не начиная каждый раз с нуля. Мы использовали трансформеры для:
- Классификации текстов: Тонкая настройка (Fine-tuning) BERT на наших данных показала феноменальные результаты в задачах категоризации и анализа тональности.
- Распознавания именованных сущностей (NER): Модели на основе трансформеров‚ такие как BERT‚ значительно превосходят предыдущие подходы в извлечении сущностей‚ учитывая глубокий контекст.
- Суммаризации текста: Мы экспериментировали с экстрактивной (выбор наиболее важных предложений из текста) и абстрактивной (генерация нового текста‚ передающего суть) суммаризацией‚ используя такие модели‚ как BART или T5.
- Генерации текста: С помощью GPT-подобных моделей мы создавали прототипы для автоматического написания статей‚ ответов на вопросы и даже генерации кода.
- Машинного перевода: Трансформерные архитектуры лежат в основе самых современных систем машинного перевода.
- Вопросно-ответных систем (QA): Мы разрабатывали системы‚ которые могут отвечать на вопросы по заданному тексту‚ что имеет огромное значение для поддержки клиентов и поиска информации.
Особое внимание мы уделяли контекстному встраиванию‚ которое позволяет получать векторное представление слова‚ учитывающее его окружение в предложении. Это фундаментальное отличие от классических Word Embeddings и ключ к успеху трансформеров.
Специализированные задачи и практические инструменты
Помимо основных задач‚ в нашей практике встречались и очень специфические‚ но не менее интересные проекты‚ требующие применения широкого спектра инструментов и подходов.
Работа с многоязычными текстами и редкими языками
Мир не ограничивается английским. Мы работали с многоязычными текстовыми корпусами‚ включая русский‚ украинский‚ казахский и другие. Для таких задач незаменимыми оказались:
- Stanza: Разработанная Стэнфордским университетом‚ эта библиотека обеспечивает продвинутую лемматизацию‚ POS-теггинг и синтаксический парсинг для множества языков‚ включая русский‚ с богатой морфологией.
- Polyglot: Ещё одна мощная библиотека для мультиязычности‚ которая позволяет работать с токенизацией‚ NER‚ определением языка и многим другим для редких языков‚ для которых может не быть готовых моделей в других библиотеках.
- FastText: Как уже упоминалось‚ его способность работать с символьными n-граммами делает его отличным выбором для векторизации слов в языках с сложной морфологией и для обработки редких слов.
Разработка систем машинного перевода на Python‚ особенно для узкоспециализированных текстов‚ стала одним из наших самых амбициозных проектов‚ где мы сочетали трансформерные модели с кастомными словарями и глоссариями.
Извлечение ключевых фраз и суммаризация
Когда нужно быстро получить представление о содержании документа‚ мы обращаемся к извлечению ключевых фраз и суммаризации. Мы используем:
- RAKE (Rapid Automatic Keyword Extraction): Простой‚ но эффективный алгоритм для извлечения ключевых слов.
- TextRank: Алгоритм‚ основанный на PageRank‚ который мы применяем для извлечения ключевых предложений (для экстрактивной суммаризации) и для выделения тем в тексте.
- Трансформерные модели: Для более продвинутой‚ абстрактивной суммаризации‚ где модель генерирует новый‚ сокращенный текст.
Эти инструменты невероятно полезны для анализа больших массивов информации‚ таких как отчеты‚ научные статьи или новостные ленты‚ позволяя быстро извлекать самую суть.
Конкретные кейсы: От чат-ботов до анализа юридических документов
Наш опыт охватывает широкий спектр практических применений NLP:
- Разработка чат-ботов: Мы использовали фреймворк Rasa для создания интеллектуальных чат-ботов‚ способных понимать естественный язык и вести диалог.
- Анализ юридических документов: Извлечение дат‚ имен‚ сумм‚ условий из контрактов с помощью NER и кастомных моделей. Это значительно ускоряет обработку и снижает риск человеческих ошибок.
- Анализ отзывов клиентов: Комбинируя анализ тональности‚ тематическое моделирование и NER‚ мы строили системы для глубокого понимания обратной связи от клиентов‚ выявляя болевые точки и области для улучшения продуктов.
- Системы обнаружения плагиата: Сравнение строк и документов с помощью библиотек‚ таких как Jellyfish или Textdistance‚ а также векторизация документов для поиска похожих фрагментов.
- Анализ стилистики текстов: Определение авторского почерка‚ лексического богатства и сложности текстов. Это особенно интересно для маркетинга и контент-анализа.
- Обработка лог-файлов: Извлечение полезной информации и паттернов из неструктурированных логов для мониторинга систем и выявления аномалий.
Все эти задачи требовали не только глубоких знаний в NLP‚ но и умения адаптировать стандартные подходы к специфическим требованиям предметной области‚ часто с использованием инструментов для визуализации текстовых данных‚ таких как облака слов (Word Clouds) и тепловые карты‚ чтобы сделать результаты более наглядными.
Вызовы и перспективы
Наш путь в NLP не был усыпан розами. Мы сталкивались с множеством вызовов:
- Неполные и ошибочные данные: Реальные данные редко бывают идеальными. Мы разрабатывали специальные инструменты для очистки и нормализации.
- Обработка больших текстовых массивов (Big Data NLP): Работа с терабайтами текста требовала оптимизации алгоритмов‚ использования GPU-ускорения и распределенных вычислений.
- Тонкая настройка моделей: Выбор правильных гиперпараметров и архитектур для достижения максимальной производительности – это целое искусство.
- Интерпретируемость: Особенно в случае с глубокими нейронными сетями‚ понимание‚ почему модель приняла то или иное решение‚ остается важной и сложной задачей.
Несмотря на эти трудности‚ мы всегда находили решения‚ а постоянное развитие библиотек и фреймворков‚ таких как Hugging Face‚ делает NLP доступнее и мощнее с каждым днем. Мы видим огромные перспективы в дальнейшей интеграции NLP с другими областями ИИ‚ такими как компьютерное зрение и распознавание речи (Speech-to-Text с библиотекой Gentle)‚ а также в разработке инструментов для автоматической разметки данных‚ что значительно ускорит создание новых моделей.
Надеемся‚ что наш опыт вдохновит вас на собственные исследования и проекты в мире обработки естественного языка. Это действительно увлекательная область‚ где каждый день приносит новые открытия и возможности для создания интеллектуальных систем‚ способных понимать и взаимодействовать с миром так же‚ как это делаем мы‚ люди.
На этом статья заканчивается.
Подробнее
| Python NLP библиотеки | Обработка естественного языка NLTK | Распознавание именованных сущностей spaCy | Тематическое моделирование Gensim | Анализ тональности текста Python |
| Векторизация слов Word2Vec | Трансформеры Hugging Face | Машинное обучение для NLP | Применение BERT в NLP | Очистка текста Python |






