Обработка естественного языка (Natural Language Processing, NLP) — это область искусственного интеллекта, которая занимается анализом, преобразованием и генерацией текста на естественных языках. Основы NLP начинаются с обработки текстов: очистки, нормализации и преобразования текста в формат, удобный для анализа алгоритмами машинного и глубокого обучения.
Этот материал охватывает основные этапы обработки текстов, включая очистку данных, токенизацию, нормализацию, преобразование текста в числовую форму, а также современные методы представления текста, такие как контекстуальные эмбеддинги.
Очистка текстовых данных
Зачем нужна очистка данных?
Реальные тексты часто содержат «шум» — лишние символы, ссылки, HTML-разметку, стоп-слова. Очистка помогает подготовить текстовые данные для анализа, устраняя ненужную информацию.
Основные этапы очистки
- Приведение текста к нижнему регистру: Устраняет различия между словами, написанными с большой и маленькой буквы (например, «Пример» и «пример»).
- Удаление знаков препинания и специальных символов: Убираются символы, такие как !, @, #, которые редко несут смысловую нагрузку.
- Удаление стоп-слов: Стоп-слова (например, «и», «в», «на») часто не вносят значимого вклада в анализ текста и удаляются.
- Удаление ссылок и HTML-разметки: Тексты из интернета часто содержат гиперссылки и HTML-теги, которые не нужны для анализа.
- Удаление лишних пробелов: Устранение лишних пробелов делает текст более стандартизированным.
Пример очистки текста на Python:
import re from nltk.corpus import stopwords # Пример текста text = "Это пример текста! Посетите наш сайт: https://example.com <b>Bold Text</b>." # Приведение текста к нижнему регистру text = text.lower() # Удаление ссылок и HTML-тегов text = re.sub(r'https?://\S+|www\.\S+', '', text) text = re.sub(r'<.*?>', '', text) # Удаление знаков препинания text = re.sub(r'[^\w\s]', '', text) # Удаление стоп-слов stop_words = set(stopwords.words('russian')) text = " ".join(word for word in text.split() if word not in stop_words) print(text) # "пример текста"
Токенизация текста
Токенизация — это процесс разбиения текста на меньшие элементы, называемые токенами. Это первый шаг для подготовки текста к дальнейшему анализу.
Виды токенизации
Токенизация по словам:
Текст разбивается на отдельные слова.
from nltk.tokenize import word_tokenize text = "Пример текста для токенизации." tokens = word_tokenize(text, language='russian') print(tokens) # ['Пример', 'текста', 'для', 'токенизации', '.']
Токенизация по предложениям:
Текст разбивается на предложения.
Пример:
from nltk.tokenize import sent_tokenize text = "Это первое предложение. Вот второе предложение!" sentences = sent_tokenize(text, language='russian') print(sentences) # ['Это первое предложение.', 'Вот второе предложение!']
Токенизация символов:
Разбиение текста на отдельные символы.
text = "Текст" tokens = list(text) print(tokens) # ['Т', 'е', 'к', 'с', 'т']
Нормализация текста
Стемминг
Стемминг — это процесс приведения слова к его основе (stem). Например, «говорить», «говорила» и «говорят» могут быть приведены к «говор». Однако, стемминг может быть неточным с точки зрения грамматики.
Пример стемминга:
from nltk.stem import SnowballStemmer stemmer = SnowballStemmer('russian') words = ["говорить", "говорила", "говорят"] stems = [stemmer.stem(word) for word in words] print(stems) # ['говор', 'говор', 'говор']
Лемматизация
Лемматизация — это приведение слова к его лемме (словарной форме), с учётом контекста.
Пример лемматизации:
from pymorphy2 import MorphAnalyzer morph = MorphAnalyzer() words = ["говорить", "говорила", "говорят"] lemmas = [morph.parse(word)[0].normal_form for word in words] print(lemmas) # ['говорить', 'говорить', 'говорить']
Преобразование текста в числовую форму
Bag of Words (BoW)
Bag of Words представляет текст в виде вектора, где каждый элемент отражает количество вхождений слова в документ.
from sklearn.feature_extraction.text import CountVectorizer corpus = ["Пример текста", "Ещё один пример"] vectorizer = CountVectorizer() X = vectorizer.fit_transform(corpus) print(vectorizer.get_feature_names_out()) # ['один', 'пример', 'текста', 'ещё'] print(X.toarray()) # [[0 1 1 0], [1 1 0 1]]
TF-IDF
TF-IDF (Term Frequency-Inverse Document Frequency) взвешивает частоту слов в зависимости от их важности.
from sklearn.feature_extraction.text import TfidfVectorizer corpus = ["Пример текста", "Ещё один пример"] vectorizer = TfidfVectorizer() X = vectorizer.fit_transform(corpus) print(vectorizer.get_feature_names_out()) # ['один', 'пример', 'текста', 'ещё'] print(X.toarray())
Word Embeddings
Word Embeddings представляют слова в виде векторов, учитывая их семантическую близость.
from gensim.models import Word2Vec sentences = [["пример", "текста"], ["ещё", "один", "пример"]] model = Word2Vec(sentences, vector_size=50, min_count=1) print(model.wv['пример']) # Векторное представление слова "пример"
Современные методы: контекстуальные эмбеддинги
Контекстуальные эмбеддинги, такие как BERT и GPT, учитывают значение слов в контексте предложения.
Пример использования BERT:
from transformers import pipeline nlp = pipeline("feature-extraction", model="bert-base-multilingual-cased") features = nlp("Пример текста") print(features) # Векторы для каждого слова
Метрики оценки моделей NLP
Метрики для классификации текста
- Accuracy: Доля верно классифицированных текстов.
- F1-Score: Гармоническое среднее между точностью (precision) и полнотой (recall).
Метрики для генерации текста
- BLEU: Сравнивает сгенерированный текст с эталонным.
- ROUGE: Оценивает совпадение слов между сгенерированным и эталонным текстом.
Заключение
Обработка текста — это ключевой этап в решении задач NLP. Очистка данных, токенизация, нормализация и преобразование текста в числовую форму создают основу для построения моделей машинного и глубокого обучения. Современные подходы, такие как контекстуальные эмбеддинги, значительно расширяют возможности работы с текстом.
Рекомендации для самостоятельного изучения:
- Курс «Natural Language Processing with Python» на Coursera.
- Практические задачи на Kaggle, такие как «Text Classification».
- Документация NLTK, SpaCy, Gensim и Transformers.
Добавить комментарий