- Разгадываем Язык Цифрового Мира: Наш Путеводитель по Магии NLP на Python
- Первые Шаги в Мир Текста: Токенизация и Стемминг
- Токенизация: Разделяй и Властвуй!
- Стемминг и Лемматизация: Приводим Слова к Общему Знаменателю
- Превращаем Текст в Числа: Векторизация
- Классические Методы Векторизации: CountVectorizer и TF-IDF
- Word Embeddings: От Слов к Смыслам
- Векторизация Предложений и Контекстные Встраивания
- Ключевые Задачи NLP: От Распознавания до Генерации
- Распознавание Именованных Сущностей (NER)
- Анализ Тональности (Sentiment Analysis)
- Тематическое Моделирование (Topic Modeling)
- Классификация Текстов
- Суммаризация Текста
- Генерация Текста и Чат-боты
- Инструменты и Методы для Предварительной Обработки и Анализа
- Регулярные Выражения и Очистка Данных
- Извлечение Ключевых Фраз и Сущностей
- Работа с Различными Форматами и Языками
- Анализ Частотности и N-грамм
- Продвинутые Темы и Приложения NLP
- Трансформеры и Глубокое Обучение
- Специализированные Приложения
- Визуализация и Оценка Моделей
- Проблемы и Вызовы
- Наши Любимые Библиотеки в NLP
Разгадываем Язык Цифрового Мира: Наш Путеводитель по Магии NLP на Python
Приветствуем, дорогие читатели и коллеги-энтузиасты! Сегодня мы хотим погрузиться в одну из самых захватывающих и быстроразвивающихся областей современного программирования – Обработку Естественного Языка, или NLP (Natural Language Processing). Мы, как опытные блогеры, работающие с текстом каждый день, давно поняли: чтобы по-настоящему "понять" аудиторию и контент, нужно научить этому компьютер. И Python, с его богатейшей экосистемой библиотек, стал для нас незаменимым инструментом в этом увлекательном путешествии.
Мир вокруг нас переполнен текстом: электронные письма, сообщения в социальных сетях, новостные статьи, научные доклады, отзывы клиентов. Человеческий мозг справляется с этим потоком информации относительно легко, но для машины это просто набор символов. Наша задача, как специалистов, — дать компьютеру возможность не просто читать, но и понимать, анализировать, генерировать и даже переводить человеческий язык. Это открывает двери к созданию интеллектуальных систем, которые могут автоматизировать рутинные задачи, помогать принимать решения и даже творить. В этой статье мы поделимся нашим опытом и глубоким пониманием того, как мы используем Python для раскрытия всей мощи NLP, шаг за шагом проходя от самых основ до продвинутых методов.
Первые Шаги в Мир Текста: Токенизация и Стемминг
Прежде чем компьютер сможет что-либо "понять" в тексте, нам нужно его подготовить. Представьте, что вы даете ребенку сложный текст. Сначала он учится распознавать отдельные слова, затем упрощает их до основной формы. В NLP мы делаем нечто очень похожее, и здесь на помощь приходят два фундаментальных процесса: токенизация и стемминг.
Токенизация: Разделяй и Властвуй!
Токенизация — это процесс разбиения текста на более мелкие, осмысленные единицы, называемые токенами. Чаще всего токенами являются слова, но это могут быть и предложения, символы или даже части слов. Зачем это нужно? Потому что для машины цельный текст — это просто длинная строка. Разбив ее на токены, мы получаем строительные блоки для дальнейшего анализа. Мы используем библиотеку NLTK (Natural Language Toolkit) для выполнения этой задачи, и она предлагает мощные инструменты для токенизации как слов, так и предложений.
Например, предложение "Мы любим NLP!" после токенизации слов может выглядеть как `[‘Мы’, ‘любим’, ‘NLP’, ‘!’]`. А токенизация предложений поможет нам разделить большой абзац на отдельные смысловые единицы, что критически важно для анализа структуры текста. Без токенизации весь последующий анализ был бы невозможен, ведь мы не могли бы посчитать частотность слов или построить их вектора. Это действительно отправная точка для любого проекта в области NLP, и мы всегда начинаем именно с нее.
Стемминг и Лемматизация: Приводим Слова к Общему Знаменателю
После токенизации мы часто сталкиваемся с проблемой: одно и то же слово может иметь разные формы (например, "бегать", "бегает", "бегал"). Для компьютера это разные слова, хотя по сути они несут одно и то же значение. Здесь на помощь приходят стемминг и лемматизация – методы приведения слов к их базовой форме.
- Стемминг – это более грубый процесс, который отсекает суффиксы и префиксы, чтобы получить "корень" слова. Например, "бегать", "бегает", "бегал" могут быть сведены к "бег". Это быстро, но иногда приводит к не совсем корректным или несуществующим словам. NLTK предлагает различные стеммеры, такие как PorterStemmer и SnowballStemmer, которые мы активно применяем для языков с простой морфологией.
- Лемматизация – это более сложный и точный процесс. Она использует словарь и морфологический анализ для приведения слова к его словарной (канонической) форме, называемой леммой. Например, "были", "есть", "будет" будут сведены к "быть". Это требует больше вычислительных ресурсов, но дает гораздо более качественные результаты.
Мы часто обращаемся к библиотеке spaCy для лемматизации, особенно для английского языка, так как она предоставляет высокопроизводительные и точные модели. Для языков с богатой морфологией, таких как русский, мы обнаружили, что Stanza (от Stanford NLP Group) показывает себя превосходно, предоставляя продвинутую лемматизацию и морфологический анализ.
Превращаем Текст в Числа: Векторизация
Как мы уже упоминали, компьютеры не "понимают" текст в человеческом смысле. Для них это просто последовательность символов. Чтобы машина могла работать с текстом, нам нужно преобразовать его в числовой формат – векторы. Этот процесс называется векторизацией, и он является одним из краеугольных камней современного NLP.
Классические Методы Векторизации: CountVectorizer и TF-IDF
Мы начинали свой путь с самых простых, но очень эффективных методов.
- CountVectorizer: Этот метод строит словарь всех уникальных слов в корпусе текста и затем для каждого документа создает вектор, где каждая позиция соответствует слову из словаря, а значение — количеству вхождений этого слова в документ. Это простая, но мощная техника, которая позволяет нам быстро получить числовое представление текста.
- TfidfVectorizer (Term Frequency-Inverse Document Frequency): TF-IDF идет дальше. Он не просто считает вхождения, но и взвешивает их. Слова, которые часто встречаются в данном документе, но редко во всем корпусе, получают больший вес. Это позволяет нам выделить слова, которые наиболее характерны для конкретного документа, и уменьшить значимость общеупотребительных "шумовых" слов (таких как "и", "в", "на"), которые ничего не говорят о содержании.
Обе эти техники мы активно используем для классификации текстов и тематического моделирования, особенно когда требуется быстрая и интерпретируемая модель. Они являются частью библиотеки Scikit-learn, нашего верного помощника в мире машинного обучения.
Word Embeddings: От Слов к Смыслам
Классические методы векторизации не учитывают семантическую близость слов. То есть, "король" и "королева" для них так же далеки, как "король" и "банан". Word Embeddings — это прорыв в этой области. Они представляют слова в виде плотных векторов в многомерном пространстве, где семантически близкие слова находятся ближе друг к другу.
Мы активно работаем с:
- Word2Vec и GloVe: Эти модели обучаются на огромных текстовых корпусах и улавливают контекст, в котором появляются слова. Word2Vec, разработанный Google, предлагает две архитектуры: Skip-gram (предсказывает контекст по слову) и CBOW (предсказывает слово по контексту). GloVe, от Stanford, использует глобальную статистику со-встречаемости слов. Мы используем библиотеку Gensim для работы с этими моделями, что позволяет нам загружать предварительно обученные эмбеддинги или обучать свои на специфических данных.
- FastText: Разработанный Facebook AI Research, FastText является расширением Word2Vec. Его ключевое преимущество в том, что он учитывает подсловные единицы (n-граммы символов). Это делает его особенно эффективным для работы с редкими словами (OOV ⏤ Out-Of-Vocabulary) и языками с богатой морфологией, поскольку он может формировать векторы для слов, которые не видел во время обучения, на основе их частей.
- Doc2Vec: Это расширение Word2Vec, которое позволяет векторизовать не только слова, но и целые документы или предложения. Мы используем Doc2Vec (также из Gensim) для представления больших текстовых блоков в виде фиксированных векторов, что очень полезно для задач поиска похожих документов или кластеризации.
Векторизация Предложений и Контекстные Встраивания
Современные задачи NLP часто требуют понимания не только отдельных слов, но и всего контекста предложения или документа. Здесь на сцену выходят более продвинутые методы:
- Sentence Transformers: Эти модели, как следует из названия, специализируются на создании векторов для целых предложений, сохраняя их семантическое значение. Они идеально подходят для задач, где нужно сравнивать схожесть предложений или находить дубликаты. Мы находим их невероятно полезными для анализа отзывов и вопросов, где краткие фразы несут много смысла.
- Контекстные Встраивания (Contextual Embeddings): Это вершина эволюции векторизации. В отличие от Word2Vec или GloVe, где у каждого слова один вектор, контекстные встраивания генерируют вектор для слова на основе его окружающего контекста. Это позволяет модели различать значения омонимов ("коса" как прическа и "коса" как инструмент). Пионерами здесь стали такие модели, как BERT.
"Язык – это дорожная карта культуры. Он говорит вам, откуда пришли его люди и куда они направляются."
– Рита Мэй Браун
Ключевые Задачи NLP: От Распознавания до Генерации
После того как мы подготовили и векторизовали текст, мы можем приступить к решению конкретных задач. Мир NLP огромен, и мы постоянно открываем для себя новые возможности. Вот некоторые из наиболее важных задач, с которыми мы регулярно работаем.
Распознавание Именованных Сущностей (NER)
NER — это задача идентификации и классификации именованных сущностей в тексте, таких как имена людей, организаций, географические названия, даты, время и т.д.. Это невероятно полезно для извлечения структурированной информации из неструктурированного текста.
Мы используем spaCy для быстрого и эффективного NER, так как оно поставляется с предварительно обученными моделями, которые работают очень хорошо "из коробки". Для более сложных случаев или специфических доменов мы обращаемся к Flair, который позволяет нам использовать современные архитектуры глубокого обучения для NER, а также к моделям, основанным на BERT, которые демонстрируют выдающуюся точность. Иногда, для более контролируемого и интерпретируемого подхода, мы даже применяем Conditional Random Fields (CRF) для распознавания сущностей, что дает нам больше гибкости в определении правил.
Анализ Тональности (Sentiment Analysis)
Понимание эмоциональной окраски текста — одна из самых востребованных задач. Мы хотим знать, что люди думают о нашем продукте, услуге или бренде, позитивно ли их отношение, негативно или нейтрально.
Мы начинаем с простых инструментов, таких как VADER (Valence Aware Dictionary and sEntiment Reasoner), который отлично подходит для анализа тональности в социальных сетях, так как он чувствителен к эмодзи, сленгу и пунктуации. Для более общего анализа мы используем TextBlob, который предоставляет простой API для определения тональности и субъективности текста. Однако, когда дело доходит до анализа финансовых новостей, политических постов или отзывов с сарказмом, мы переходим к более продвинутым моделям, часто тонко настраивая (Fine-tuning) предварительно обученные Transformer-модели. Это позволяет нам учитывать нюансы, которые упускают простые подходы.
Тематическое Моделирование (Topic Modeling)
Тематическое моделирование позволяет нам автоматически обнаруживать скрытые темы в больших коллекциях документов. Это похоже на то, как если бы вы попросили машину прочитать тысячи статей и выделить, о чем они.
Для этого мы часто используем библиотеку Gensim, которая предоставляет реализации таких популярных алгоритмов, как LDA (Latent Dirichlet Allocation) и LSI (Latent Semantic Indexing). LDA, например, предполагает, что каждый документ представляет собой смесь нескольких тем, а каждая тема — это смесь слов. Это позволяет нам понять основные смысловые блоки в нашем контенте. Мы также сравниваем LDA с NMF (Non-negative Matrix Factorization), который часто дает более четкие и интерпретируемые темы в определенных случаях. Применение этих методов для анализа отзывов о продуктах или статей в блогах помогает нам выявить ключевые интересы аудитории и популярные темы.
Классификация Текстов
Классификация текста — это задача присвоения тексту одной или нескольких предопределенных категорий или меток. Будь то спам-фильтрация, категоризация новостных статей или определение жанра книги, классификация является одной из наиболее распространенных задач NLP.
Мы активно используем Scikit-learn для построения моделей классификации текстов. Наш арсенал включает в себя различные алгоритмы машинного обучения:
| Алгоритм | Описание | Когда мы его используем |
|---|---|---|
| Наивный Байесовский Классификатор | Простой, но эффективный вероятностный классификатор, основанный на теореме Байеса. | Для спам-фильтрации, анализа тональности, когда важна скорость и простота. |
| Метод Опорных Векторов (SVM) | Мощный алгоритм, который ищет гиперплоскость, оптимально разделяющую классы. | Для категоризации статей, более сложных задач классификации, где требуется высокая точность. |
| Логистическая Регрессия | Линейная модель для бинарной и мультиклассовой классификации, предсказывающая вероятность класса. | Хороший баланс между простотой и производительностью, часто наш первый выбор для базовой классификации. |
Когда задачи становятся более сложными, требующими понимания контекста и семантики, мы переходим к глубокому обучению. Мы используем фреймворки, такие как PyTorch и TensorFlow, для создания нейросетей NLP, включая рекуррентные нейронные сети (LSTM) и, конечно же, BERT для задач классификации, тонко настраивая его под наши специфические данные.
Суммаризация Текста
В условиях информационного перегруза способность быстро извлекать суть из длинного текста становится бесценной. Мы работаем над системами суммаризации текста, которые бывают двух основных типов:
- Экстрактивная суммаризация: Выбирает наиболее важные предложения или фразы из оригинального текста и объединяет их. Это как выделение ключевых моментов. Мы часто используем TextRank для извлечения ключевых предложений и построения экстрактивных резюме.
- Абстрактивная суммаризация: Генерирует новые предложения, которые передают смысл оригинала, но не обязательно присутствуют в нем. Это более сложная задача, требующая глубокого понимания текста и способности к генерации. Для этого мы применяем Transformer-модели, такие как T5 или BART, из библиотеки Hugging Face Transformers.
Генерация Текста и Чат-боты
Создание текста машиной — это, пожалуй, одна из самых захватывающих областей. От простых шаблонов до создания связных и креативных историй, генерация текста находит применение во многих сферах. Мы используем Transformer-модели, такие как GPT (из серии Hugging Face), для генерации статей, ответов на вопросы и даже кода. Возможности этих моделей поражают воображение, и мы постоянно экспериментируем с их тонкой настройкой для специфических задач.
Разработка чат-ботов на Python также является частью нашей работы. Мы используем фреймворк Rasa, который позволяет создавать контекстно-зависимых, многофункциональных ассистентов. Rasa объединяет в себе компоненты NLP для понимания намерений пользователя и извлечения сущностей, а также диалоговое управление для ведения осмысленного разговора.
Инструменты и Методы для Предварительной Обработки и Анализа
Качество данных определяет качество модели. В NLP это правило особенно актуально. Прежде чем приступить к основной работе, нам часто приходится проводить тщательную предварительную обработку текста, а также использовать специализированные инструменты для извлечения конкретной информации.
Регулярные Выражения и Очистка Данных
Наш путь в NLP часто начинается с "грязных" данных. Текст может содержать HTML-теги, специальные символы, лишние пробелы, URL-адреса и другие артефакты, которые мешают анализу. Модуль re (regular expressions) в Python — наш незаменимый инструмент для очистки текста. Мы используем регулярные выражения для:
- Удаления HTML-тегов и CSS-стилей;
- Извлечения URL-адресов или их удаления.
- Нормализации пунктуации и приведения ее к единому виду.
- Удаления лишних пробелов и символов табуляции.
- Извлечения дат и чисел из текста.
Кроме того, мы разрабатываем инструменты для маркировки и удаления стоп-слов (общеупотребительных слов, таких как "и", "или", "бы", которые не несут смысловой нагрузки для большинства NLP-задач), а также для нормализации сленга и работы с эмодзи в современных текстах, что особенно актуально для анализа социальных сетей.
Извлечение Ключевых Фраз и Сущностей
Помимо NER, нам часто требуется извлекать ключевые слова и фразы, которые наиболее точно описывают содержание текста.
- RAKE (Rapid Automatic Keyword Extraction): Это алгоритм, который мы используем для извлечения ключевых слов из текста на основе их частотности и взаимосвязи с другими словами. Он прост в использовании и часто дает хорошие результаты для быстрого анализа.
- TextRank: Помимо суммаризации, TextRank (алгоритм, основанный на PageRank) отлично подходит для извлечения ключевых слов и фраз. Он строит граф слов и ранжирует их по важности. Мы применяем его для анализа текста для извлечения ключевых фраз, а также для выделения тем в больших коллекциях документов.
Для более сложных задач извлечения информации, таких как выявление связей между сущностями (например, "кто что сделал"), мы разрабатываем собственные модели, часто используя графовые встраивания (Graph Embeddings) для анализа взаимосвязей в тексте;
Работа с Различными Форматами и Языками
Мы не ограничиваемся простым текстом. Нам приходится работать с данными из самых разных источников:
- Веб-скрейпинг: Для сбора текстовых данных с веб-сайтов мы используем библиотеку Beautiful Soup. Она позволяет нам парсить HTML и XML документы, извлекая нужный контент, например, статьи, новости или отзывы.
- Извлечение текста из PDF: Библиотека PyMuPDF (или `fitz`) является нашим надежным инструментом для извлечения текста, изображений и метаданных из PDF-файлов. Это особенно полезно при работе с юридическими документами, научными статьями или отчетами.
- Многоязычный NLP: Мир не ограничивается английским. Мы активно работаем с многоязычными текстовыми корпусами. Polyglot — это библиотека, которая предоставляет множество функций NLP (определение языка, токенизация, NER, морфологический анализ) для большого количества языков. Для языков с богатой морфологией, как уже упоминалось, Stanza является нашим выбором, включая отличную поддержку русского языка. Мы также используем TextBlob для простого определения языка.
Анализ Частотности и N-грамм
Простой анализ частотности слов и n-грамм (последовательностей из n слов) может дать ценные инсайты о тексте. Мы используем NLTK для этих задач, что позволяет нам:
- Выявлять наиболее часто встречающиеся слова.
- Анализировать частотность редких слов и их значение.
- Строить языковые модели на основе N-грамм, что полезно для автодополнения или проверки грамматики.
- Анализировать частотность имен собственных, чтобы понять, какие сущности упоминаются чаще всего.
Это помогает нам понять лексическое богатство и сложность текстов, а также выявить паттерны в пользовательских запросах или отзывах.
Продвинутые Темы и Приложения NLP
Мир NLP постоянно развивается, и мы всегда стремимся быть на передовой, осваивая новые технологии и применяя их для решения самых сложных задач.
Трансформеры и Глубокое Обучение
Архитектура Трансформеров (Transformer) полностью изменила ландшафт NLP. Благодаря механизму внимания (attention mechanism) они способны обрабатывать длинные последовательности текста, улавливая сложные зависимости и контекст. Библиотека Hugging Face Transformers стала нашим основным инструментом для работы с этими моделями. Мы используем их для:
- Сложных задач NLP, таких как машинный перевод, вопросно-ответные системы (QA), суммаризация и генерация текста.
- Тонкой настройки (Fine-tuning) предварительно обученных моделей под наши специфические данные, что позволяет достигать state-of-the-art результатов даже с ограниченным объемом размеченных данных.
- Разработки систем для выявления связей между сущностями и распознавания эмоций.
Мы также применяем фреймворки PyTorch и TensorFlow для создания собственных нейросетей NLP, особенно когда требуется глубокая кастомизация архитектуры. Работа с GPU-ускорением становится необходимостью для эффективного обучения и инференса этих моделей.
Специализированные Приложения
Наш опыт простирается на широкий круг специализированных приложений:
- Анализ юридических документов: Мы используем Python для извлечения ключевых фактов, дат, имен и связей из юридических контрактов и других документов, что помогает автоматизировать их анализ.
- Разработка систем обнаружения плагиата: Сравнение документов и измерение их сходства (с использованием Textdistance) позволяет нам создавать инструменты для выявления плагиата.
- Анализ лог-файлов: NLP методы помогают нам извлекать структурированную информацию из неструктурированных лог-файлов, выявлять аномалии и паттерны, что критично для мониторинга систем.
- Разработка инструментов для проверки грамматики и орфографии: Используя комбинацию языковых моделей, словарей и морфологического анализа, мы создаем системы, способные находить и предлагать исправления в тексте.
- Анализ стилистики текстов и определение авторства: Мы исследуем уникальные лексические и синтаксические особенности, чтобы определить авторский почерк или стилистику текста.
- Работа с большими текстовыми массивами (Big Data NLP): Когда объемы данных достигают гигабайтов и терабайтов, мы используем специализированные подходы и библиотеки, такие как Gensim, оптимизированные для работы с большими данными.
Визуализация и Оценка Моделей
"Лучше один раз увидеть, чем сто раз услышать", этот принцип актуален и в NLP. Для понимания результатов наших анализов и оценки качества моделей мы используем различные инструменты визуализации:
- Word Clouds: Визуализация наиболее часто встречающихся слов в виде "облака" помогает быстро понять основные темы текста.
- Heatmaps: Для визуализации корреляций между словами или темами.
- Sweetviz: Эта библиотека, хотя и не является строго NLP-инструментом, очень полезна для быстрого и наглядного анализа текстовых данных, выявления пропущенных значений и распределений.
Оценка качества NER-моделей (Precision, Recall, F1-score) и сравнение различных методов векторизации (TF-IDF vs Word2Vec), лемматизации (SpaCy vs NLTK) или кластеризации (K-Means vs DBSCAN) является неотъемлемой частью нашей работы, позволяя нам постоянно улучшать наши системы.
Проблемы и Вызовы
Конечно, путь в NLP не лишен трудностей. Мы постоянно сталкиваемся с проблемами обработки неполных и ошибочных данных, двусмысленности языка, сарказма, иронии, а также необходимости тонкой настройки моделей для специфических доменов. Разработка инструментов для автоматической разметки данных является одной из ключевых задач, поскольку качественные размеченные данные — это основа для обучения мощных моделей глубокого обучения.
Наши Любимые Библиотеки в NLP
За годы работы мы собрали свой арсенал незаменимых Python-библиотек. Вот некоторые из них, которые мы упоминали в статье, и которые составляют основу нашей повседневной работы:
- NLTK: Основа основ для многих задач, от токенизации до морфологического анализа.
- spaCy: Высокопроизводительная библиотека для промышленного NLP, особенно хороша для NER и синтаксического парсинга.
- Gensim: Наш выбор для тематического моделирования (LDA, LSI) и работы с Word Embeddings (Word2Vec, Doc2Vec).
- Scikit-learn: Универсальный фреймворк для машинного обучения, используемый нами для классификации и кластеризации текстов.
- Hugging Face Transformers: Абсолютный лидер для работы с современными Transformer-моделями (BERT, GPT, T5).
- TextBlob: Простой и удобный инструмент для быстрого анализа тональности и определения языка.
- re (Regular Expressions): Встроенный модуль Python для мощной предобработки текста.
- Beautiful Soup: Для эффективного веб-скрейпинга текстовых данных.
- PyTorch/TensorFlow: Фреймворки для глубокого обучения, позволяющие создавать кастомные нейронные сети.
- Flair: Современная библиотека для NER и других задач, использующая глубокое обучение.
- Polyglot: Для работы с многоязычными текстами.
- Stanza: Для продвинутого лингвистического анализа, особенно для языков с богатой морфологией.
- TextRank: Для извлечения ключевых предложений и слов, а также суммаризации.
- VADER: Специализированный инструмент для анализа тональности в социальных сетях.
Мы надеемся, что этот обширный путеводитель по миру NLP на Python вдохновил вас на собственные эксперименты и проекты. От самых простых задач, таких как токенизация, до сложных систем генерации текста на основе трансформеров — Python предоставляет нам все необходимые инструменты. Мы, как команда блогеров, видим огромный потенциал в применении этих технологий для улучшения взаимодействия с контентом, автоматизации рутинных задач и создания по-настоящему интеллектуальных решений.
Мир естественного языка огромен и полон нюансов, но благодаря мощным библиотекам и фреймворкам, доступным в Python, мы можем не только "читать" его, но и "понимать", "анализировать" и даже "творить". Присоединяйтесь к нам в этом увлекательном путешествии, ведь будущее за теми, кто умеет разгадывать язык цифрового мира. Точка.
Подробнее
| Основы NLTK Python | Распознавание именованных сущностей spaCy | Тематическое моделирование Gensim | Анализ тональности VADER | Word Embeddings Word2Vec |
| Трансформеры Hugging Face | Классификация текстов Scikit-learn | Лемматизация и стемминг | Векторизация текста TF-IDF | Разработка чат-ботов Python |






