Основы обработки текстов в NLP

Обработка естественного языка (Natural Language Processing, NLP) — это область искусственного интеллекта, которая занимается анализом, преобразованием и генерацией текста на естественных языках. Основы NLP начинаются с обработки текстов: очистки, нормализации и преобразования текста в формат, удобный для анализа алгоритмами машинного и глубокого обучения.

Этот материал охватывает основные этапы обработки текстов, включая очистку данных, токенизацию, нормализацию, преобразование текста в числовую форму, а также современные методы представления текста, такие как контекстуальные эмбеддинги.

Очистка текстовых данных

Зачем нужна очистка данных?

Реальные тексты часто содержат «шум» — лишние символы, ссылки, HTML-разметку, стоп-слова. Очистка помогает подготовить текстовые данные для анализа, устраняя ненужную информацию.

Основные этапы очистки

  1. Приведение текста к нижнему регистру: Устраняет различия между словами, написанными с большой и маленькой буквы (например, «Пример» и «пример»).
  2. Удаление знаков препинания и специальных символов: Убираются символы, такие как !, @, #, которые редко несут смысловую нагрузку.
  3. Удаление стоп-слов: Стоп-слова (например, «и», «в», «на») часто не вносят значимого вклада в анализ текста и удаляются.
  4. Удаление ссылок и HTML-разметки: Тексты из интернета часто содержат гиперссылки и HTML-теги, которые не нужны для анализа.
  5. Удаление лишних пробелов: Устранение лишних пробелов делает текст более стандартизированным.

Пример очистки текста на 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.

Следите за обновлениями в нашем Telegram-канале!

Чтобы не пропустить новые материалы, подписывайтесь на наш Telegram-канал. Здесь вы сможете получать все статьи, курсы и эксклюзивные материалы прямо в удобный мессенджер. А также быть в курсе последних новостей и инсайтов из мира AI.

Присоединяйтесь к сообществу единомышленников, задавайте вопросы и делитесь своим мнением — будем учиться и развиваться вместе!

Подписаться можно по ссылке: https://t.me/proaionru

Отличные новости для всех моих подписчиков! 🎉 При покупке продукции JetBrains вы можете использовать специальный промокод «Asgru24» и получить скидку 25% на любой товар! Не упустите шанс сэкономить на лучших инструментах разработки.

Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *