Полное руководство по обработке текстов с помощью Python

Раздел: Искусственный интеллект -> NLP

Обработка естественного языка (NLP) открывает возможности анализа текстов, автоматизации общения и извлечения знаний. Python предлагает множество библиотек для решения задач NLP. В этом материале рассматриваются наиболее эффективные подходы и варианты реализации с примерами кода.

Основное решение: spaCy для промышленного NLP

Как выполнить токенизацию, лемматизацию и извлечение именованных сущностей на русском языке с помощью spaCy?

import spacy
nlp = spacy.load("ru_core_news_sm")
text = "Москва - столица России. Путин подписал указ."
doc = nlp(text)
for token in doc:
    print(f"{token.text}: {token.lemma_}, {token.pos_}")
for ent in doc.ents:
    print(f"{ent.text}: {ent.label_}")

Bag of words python (мешок слов (bag of words) в python)

Пояснение: spaCy загружает предобученную русскую модель. Объект Doc содержит токены с леммами и частеречными метками (POS). Атрибут .ents возвращает именованные сущности (например, Москва как GPE, Россия как LOC).

Типичная ошибка: модель ru_core_news_sm требует установки через python -m spacy download ru_core_news_sm. Если Python окружение не настроено, загрузка завершится ошибкой. Решение - проверить версии spaCy (рекомендуется 3.x) и наличие сети. Альтернатива - использовать русскую модель от Navec (navec_nlp).

Варианты решений

Вариант с NLTK: как провести частеречную разметку и стемминг для английского текста?

import nltk
nltk.download('punkt')
nltk.download('averaged_perceptron_tagger')
from nltk import word_tokenize, pos_tag
from nltk.stem import SnowballStemmer
text = "Natural language processing enables computers to understand text."
tokens = word_tokenize(text)
pos_tags = pos_tag(tokens)
stemmer = SnowballStemmer('english')
stems = [stemmer.stem(token) for token in tokens]
print(pos_tags)
print(stems)

обработка естественного языка python (обработка естественного языка на python (nlp))

Пояснение: NLTK использует токенизатор Punkt и перцептронный теггер. pos_tag возвращает кортежи (слово, метка). SnowballStemmer усекает слова до основы. Проблема: для русского языка требуется отдельный стеммер (SnowballStemmer('russian')), но качество POS-теггера для русского уступает spaCy.

Ошибка: теггер может вернуть неправильную разметку на нестандартных текстах. Рекомендуется использовать NLTK в учебных целях или для прототипов.

Вариант с Hugging Face Transformers: как определить тональность текста на русском языке с помощью предобученной модели?

from transformers import pipeline
classifier = pipeline("sentiment-analysis", model="blanchefort/rubert-base-cased-sentiment")
result = classifier("Фильм был отличный, всем советую!")
print(result)

Пояснение: библиотека Transformers предоставляет простой интерфейс pipeline. Модель blanchefort/rubert-base-cased-sentiment обучена на русских отзывах. Результат - список словарей с меткой (POSITIVE/NEGATIVE) и вероятностью. Проблема: загрузка модели может занимать несколько минут и требовать много оперативной памяти.

Типичная ошибка: torch или tensorflow не установлены. Установите pip install transformers torch. При использовании GPU под Windows иногда возникают проблемы с CUDA.

Вариант с TextBlob: как сделать простой анализ тональности для английского текста без сложной настройки?

from textblob import TextBlob
text = "Python is an amazing programming language."
blob = TextBlob(text)
print(blob.sentiment.polarity)
print(blob.noun_phrases)

Пояснение: TextBlob строится поверх NLTK. Метод sentiment.polarity возвращает число от -1 (негатив) до +1 (позитив). noun_phrases извлекает именные группы. Подходит для быстрых экспериментов, но не для русского языка без дополнительных адаптеров.

Проблема: тексты с сарказмом или сложной грамматикой обрабатываются неточно. Для русского языка требуется предварительный перевод или использование модели ruTextBlob.

Общие ошибки при работе с NLP: неправильная кодировка файлов (используйте UTF-8), забывание загрузить ресурсы (nltk.download, spacy download), импорт конфликтующих версий библиотек. Решение: создавайте виртуальное окружение и фиксируйте версии в requirements.txt.

Расширенные примеры программного кода

Пример 1: Визуализация зависимостей с displacy (spaCy)

Пример
import spacy
from spacy import displacy
nlp = spacy.load("ru_core_news_sm")
text = "Автомобиль, который я купил, был красным."
doc = nlp(text)
displacy.render(doc, style="dep", jupyter=True, options={"compact": True})
(графическое изображение зависимостей в виде стрелок от глагола к объектам)

Пояснение: displacy создаёт SVG или HTML с деревом зависимостей. Параметр style="dep" отображает синтаксические связи. Проблемы: в Jupyter может не отображаться без настройки. Решение - использовать displacy.serve(doc, port=5000) для просмотра в браузере.

Пример 2: Извлечение ключевых фраз методом RAKE (NLTK+RAKE)

Пример
import nltk
nltk.download('stopwords')
from rake_nltk import Rake
text = "Машинное обучение - это подмножество искусственного интеллекта. Оно использует алгоритмы для анализа данных."
r = Rake(language='russian')
r.extract_keywords_from_text(text)
print(r.get_ranked_phrases_with_scores())
[(10.0, 'машинное обучение'), (8.0, 'анализ данных'), (5.0, 'искусственный интеллект')]

Пояснение: RAKE (Rapid Automatic Keyword Extraction) выделяет фразы на основе частотности и стоп-слов. Библиотека rake_nltk требует предварительной установки pip install rake_nltk. Результат - список пар (вес, фраза). Проблема: для русского языка стоп-слова могут быть неполными, рекомендуется кастомный список.

Пример 3: Суммаризация текста с помощью Transformers (T5)

Пример
from transformers import pipeline
summarizer = pipeline("summarization", model="IlyaGusev/mbart_ru_sum_gazeta")
text = "Сбербанк объявил о запуске новой платформы для малого бизнеса. Платформа позволит предпринимателям быстро оформлять кредиты и получать консультации. Запуск запланирован на первый квартал следующего года."
result = summarizer(text, max_length=50, min_length=20)
print(result[0]['summary_text'])
Сбербанк запустит платформу для малого бизнеса с кредитами и консультациями.

Пояснение: модель IlyaGusev/mbart_ru_sum_gazeta обучена на новостях. Параметры max_length и min_length контролируют длину суммаризации. Проблемы: модель большая (около 1 ГБ), первая загрузка длится долго. Альтернатива - sumy с LSA (более легкая, но менее качественная).

Пример 4: Классификация текстов (spaCy + scikit-learn)

Пример
import spacy
from sklearn.feature_extraction.text import CountVectorizer
from sklearn.naive_bayes import MultinomialNB
nlp = spacy.load("ru_core_news_sm")
texts = ["Я люблю программирование.", "Погода сегодня ужасная.", "Купил новый ноутбук."]
labels = [1, 0, 1]  # 1 - позитив, 0 - негатив
def vectorize(texts):
    vec = CountVectorizer(tokenizer=lambda t: [token.lemma_ for token in nlp(t) if not token.is_stop])
    X = vec.fit_transform(texts)
    return X, vec
X, vec = vectorize(texts)
model = MultinomialNB()
model.fit(X, labels)
new_text = ["Программирование приносит радость."]
X_new = vec.transform(new_text)
pred = model.predict(X_new)
print(pred)  # [1]
[1]

Пояснение: используется лемматизация через spaCy и мешок слов. Наивный байесовский классификатор обучается на маленьком наборе. Для реальных задач требуется больше данных и предобработка (удаление знаков препинания, регуляризация). Проблемы: переобучение при малом количестве примеров, необходимость балансировки классов.

Пример 5: Генерация вопросов по тексту (Transformers)

Пример
from transformers import pipeline
qg = pipeline("text2text-generation", model="t5-base")
context = "Солнечная система состоит из Солнца и планет, вращающихся вокруг него. Земля является третьей планетой от Солнца."
prompt = f"generate question: {context}"
result = qg(prompt, max_length=50, num_beams=5, early_stopping=True)
print(result[0]['generated_text'])
Как называется третья планета от Солнца?

Пояснение: T5 обучен на задаче генерации вопросов. Промпт generate question: задаёт тип задачи. Параметр num_beams улучшает качество за счёт beam search. Проблемы: модель английская, для русского нужно найти аналогичную (например, ruT5). Результат может быть грамматически неточным.

Обработка естественного языка на Python (NLP) - comments

En
обработка естественного языка python (python)