|
Работа с текстовыми данными в Pandas
ОП.09 Обработка и анализ данных
Практическая работа №8
Тема: Работа с текстовыми данными в Pandas
Цель работы: Научиться обрабатывать текстовые данные: очистка, поиск, замена, извлечение подстрок, применение регулярных выражений.
Время выполнения: 2 академических часа
Инструменты: Python + Jupyter Notebook, библиотеки pandas, re
ЗАДАНИЕ ДЛЯ СТУДЕНТА
Этап 1. Создание данных с текстом (10 минут)
Создадим датафрейм с отзывами клиентов:
import pandas as pd
import re
# Создаём данные
data = {
'id': [1, 2, 3, 4, 5, 6, 7, 8],
'review': [
'Отличный товар!!! Доставка быстрая.',
'плохое качество, не рекомендую.',
'Хорошо, но дороговато. Доставка 3 дня.',
'Очень плохо!!! брак!!!',
'Норм. Доставка вовремя.',
'Отлично! Всё работает.',
'Не плохо, но могли бы и быстрее',
' лишние пробелы в начале и конце '
],
'rating': [5, 1, 4, 1, 3, 5, 3, 2]
}
df = pd.DataFrame(data)
print("Исходные данные:")
print(df)
Этап 2. Базовые строковые операции (15 минут)
Используйте .str для работы с текстом:
# 1. Приведение к нижнему регистру
df['review_lower'] = df['review'].str.lower()
print("Нижний регистр:")
print(df['review_lower'])
# 2. Удаление пробелов в начале и конце
df['review_strip'] = df['review'].str.strip()
print("После удаления пробелов:")
print(df['review_strip'])
# 3. Длина текста
df['review_length'] = df['review'].str.len()
print("Длина отзывов:")
print(df[['id', 'review_length']])
# 4. Проверка наличия слова
df['has_excellent'] = df['review'].str.contains('Отлично', case=False)
print("Есть слово 'Отлично':")
print(df[['id', 'review', 'has_excellent']])
Вопрос: Зачем нужно приводить текст к нижнему регистру перед поиском?
Этап 3. Замена и удаление символов (15 минут)
Удалите лишние символы и исправьте опечатки:
# 1. Удаление знаков препинания
df['review_clean'] = df['review'].str.replace('[!.,]', '', regex=True)
print("После удаления знаков препинания:")
print(df['review_clean'])
# 2. Замена слов
df['review_fixed'] = df['review'].str.replace('плохое', 'неудовлетворительное')
df['review_fixed'] = df['review_fixed'].str.replace('Норм', 'Нормально')
print("После замены слов:")
print(df['review_fixed'])
# 3. Удаление нескольких пробелов
df['review_no_spaces'] = df['review'].str.replace(r'\s+', ' ', regex=True)
print("После удаления лишних пробелов:")
print(df['review_no_spaces'])
Вопрос: В чём разница между replace с regex=True и без него?
Этап 4. Извлечение подстрок (15 минут)
Извлеките нужную информацию из текста:
# 1. Извлечение первых 3 символов
df['review_prefix'] = df['review'].str[:3]
print("Первые 3 символа:")
print(df[['id', 'review', 'review_prefix']])
# 2. Извлечение слов с помощью регулярных выражений
# Извлекаем слово после "Доставка"
df['delivery_day'] = df['review'].str.extract(r'Доставка\s+(\d+)')
print("Сроки доставки:")
print(df[['id', 'review', 'delivery_day']])
# 3. Извлечение всех чисел из текста
df['numbers_found'] = df['review'].str.findall(r'\d+')
print("Найденные числа:")
print(df[['id', 'review', 'numbers_found']])
Вопрос: Что делает метод extract? Когда его удобно использовать?
Этап 5. Классификация текстов (15 минут)
Создайте новую колонку на основе содержания текста:
# Создаём функцию для классификации
def classify_review(text):
text_lower = str(text).lower()
if 'отлично' in text_lower or 'хорошо' in text_lower:
return 'positive'
elif 'плохо' in text_lower or 'брак' in text_lower:
return 'negative'
else:
return 'neutral'
df['sentiment'] = df['review'].apply(classify_review)
print("Классификация отзывов:")
print(df[['id', 'review', 'sentiment', 'rating']])
# Анализ: как классификация соотносится с рейтингом?
print("Соответствие классификации и рейтинга:")
print(pd.crosstab(df['sentiment'], df['rating']))
Вопрос: Как можно улучшить функцию классификации?
Этап 6. Практическое задание: анализ email-адресов (20 минут)
Создадим датафрейм с email-адресами и извлечём информацию:
# Данные с email
emails_df = pd.DataFrame({
'user_id': [1, 2, 3, 4, 5],
'email': [
'ivan.ivanov@gmail.com',
'petrova@yandex.ru',
'sidorov95@mail.ru',
'olga@company.ru',
'invalid_email'
]
})
print("Исходные email-адреса:")
print(emails_df)
Выполните анализ:
# 1. Проверка валидности email (содержит @ и .)
emails_df['is_valid'] = emails_df['email'].str.contains('@.*\.', regex=True, na=False)
print("Валидные email:")
print(emails_df[['user_id', 'email', 'is_valid']])
# 2. Извлечение домена
emails_df['domain'] = emails_df['email'].str.extract(r'@(.+)$')
print("Домены:")
print(emails_df[['user_id', 'email', 'domain']])
# 3. Извлечение имени пользователя (до @)
emails_df['username'] = emails_df['email'].str.extract(r'^(.+)@')
print("Имена пользователей:")
print(emails_df[['user_id', 'email', 'username']])
# 4. Подсчёт популярности доменов
print("Популярность доменов:")
print(emails_df['domain'].value_counts())
Вопрос: Какие проблемы могут возникнуть при извлечении домена из email?
Этап 7. Выводы (10 минут)
Напишите развёрнутый вывод по работе:
1. Какие строковые методы Pandas (.str) вы использовали?
2. Как регулярные выражения помогают в обработке текста?
3. Приведите примеры реальных задач, где нужна очистка текстовых данных.
КРИТЕРИИ ОЦЕНКИ
| Критерий | Макс. балл |
|---|
| Все этапы выполнены (1-6) | 3 | | Корректное использование строковых методов | 2 | | Правильное применение регулярных выражений | 3 | | Классификация и извлечение выполнены верно | 2 | | Итого | 10 |
ОТВЕТ ДЛЯ ПРЕПОДАВАТЕЛЯ (эталонный результат)
Нажмите, чтобы увидеть ответы
Этап 2. Приведение к нижнему регистру:
• Нужно для case-insensitive поиска (чтобы «Отлично» и «отлично» находились одинаково).
Этап 3. replace:
• regex=True позволяет использовать регулярные выражения (например, \s+ для пробелов).
• Без regex=True заменяется только точное совпадение.
Этап 4. extract:
• extract извлекает первую группу из регулярного выражения.
• Удобен для парсинга структурированных данных из текста.
Этап 5. Классификация:
• Можно улучшить: добавить больше слов-маркеров, учитывать отрицания («не плохо»), использовать TF-IDF или готовые модели.
Этап 6. Email:
• Проблемы: email может не содержать '.' после '@', может быть несколько '@', могут быть символы, не прошедшие проверку.
• Лучше использовать специализированные библиотеки (email-validator).
Этап 7. Выводы (пример):
1. .lower(), .strip(), .contains(), .replace(), .extract(), .findall().
2. Регулярные выражения позволяют гибко искать и извлекать сложные паттерны.
3. Очистка логов, парсинг веб-страниц, анализ отзывов, проверка форматов (email, телефон).
Автор: УМК СПО
Лицензия: Бесплатное использование с указанием источника
|
|
|