Извлечение данных из текста
Цели урока
После прохождения этого урока вы сможете:
- 1Научиться анализировать тональность текста
- 2Освоить извлечение именованных сущностей
- 3Применять inferring для бизнес-аналитики
Inferring: LLM как универсальный анализатор
Inferring (вывод/извлечение) — это использование LLM для анализа текста и извлечения структурированной информации. До появления ChatGPT для каждой задачи (анализ тональности, NER, классификация) нужна была отдельная модель. Теперь одна модель справляется со всем.
Анализ тональности (Sentiment Analysis)
Классическая задача NLP — определить, позитивный текст или негативный. С LLM это становится тривиальным.
review = """
Ужасный опыт! Ждал доставку 2 недели вместо обещанных 3 дней.
Когда товар приехал, упаковка была разорвана.
Сам товар рабочий, но осадок остался. Больше не закажу.
"""
# Простой анализ тональности
prompt_simple = f"""
Определи тональность отзыва: позитивный, негативный или нейтральный.
Ответь одним словом.
Отзыв: """{review}"""
"""
# Детальный анализ с эмоциями
prompt_detailed = f"""
Проанализируй отзыв и определи:
1. Общая тональность (позитивный/негативный/нейтральный/смешанный)
2. Эмоции автора (выбери до 3): радость, разочарование, злость,
удивление, благодарность, раздражение, удовлетворение
3. Уровень эмоциональности (1-5)
4. Вероятность повторной покупки (высокая/средняя/низкая)
Отзыв: """{review}"""
Ответь в формате JSON.
"""Извлечение именованных сущностей (NER)
Named Entity Recognition — извлечение имён, компаний, дат, адресов и других сущностей из текста.
text = """
Вчера встречался с Алексеем Смирновым из Сбербанка.
Обсудили запуск пилота в Q2 2024. Бюджет проекта — около 5 млн рублей.
Следующая встреча запланирована на 20 марта в их офисе на Вавилова, 19.
"""
prompt = f"""
Извлеки из текста следующие сущности:
1. ПЕРСОНЫ: имена людей с их должностями/компаниями
2. ОРГАНИЗАЦИИ: названия компаний
3. ДАТЫ: все упомянутые даты и сроки
4. СУММЫ: денежные суммы с валютой
5. ЛОКАЦИИ: адреса и места
Формат вывода — JSON:
{{
"persons": [{{"name": "...", "context": "..."}}],
"organizations": ["..."],
"dates": [{{"date": "...", "context": "..."}}],
"amounts": [{{"value": "...", "currency": "...", "context": "..."}}],
"locations": ["..."]
}}
Текст: """{text}"""
"""Определение темы и категоризация
LLM отлично справляется с категоризацией текстов — определением темы, типа документа, срочности.
email = """
Здравствуйте! Оформил заказ #12345 три дня назад, оплата прошла,
но статус до сих пор "в обработке". Это нормально?
Очень нужно получить товар до пятницы, это подарок на день рождения.
Можете ускорить отправку? Готов доплатить за срочную доставку.
"""
prompt = f"""
Проанализируй обращение клиента и классифицируй:
1. ТИП ОБРАЩЕНИЯ:
- вопрос
- жалоба
- запрос на изменение
- благодарность
- предложение
2. ТЕМА:
- доставка
- оплата
- качество товара
- возврат
- техническая проблема
- другое
3. СРОЧНОСТЬ (1-5):
1 = не срочно
5 = критически срочно
4. ЭМОЦИОНАЛЬНЫЙ ФОН:
- спокойный
- взволнованный
- раздражённый
- агрессивный
5. РЕКОМЕНДУЕМОЕ ДЕЙСТВИЕ:
Кратко опиши, что должен сделать оператор
Обращение: """{email}"""
Ответь в формате JSON.
"""Практический кейс: автоматическая обработка входящих заявок
Представьте, что у вас интернет-магазин с 1000+ обращений в день. Вот как автоматизировать первичную обработку:
def process_customer_request(request_text: str) -> dict:
prompt = f"""
Ты — система первичной обработки обращений клиентов.
Проанализируй обращение и верни JSON:
{{
"request_id": null, // заполнить, если упомянут номер заказа
"category": "доставка|оплата|товар|возврат|другое",
"priority": 1-5,
"sentiment": "positive|negative|neutral",
"requires_human": true/false,
"suggested_response": "шаблон ответа, если не требует человека",
"escalation_reason": "причина эскалации, если requires_human=true",
"extracted_data": {{
"order_number": null,
"product_name": null,
"issue_date": null
}}
}}
ПРАВИЛА ПРИОРИТЕТА:
- 5: угроза суда, жалоба в Роспотребнадзор, VIP-клиент
- 4: финансовые потери клиента, срочная доставка
- 3: стандартная жалоба
- 2: вопрос без негатива
- 1: благодарность, общий вопрос
Обращение: """{request_text}"""
"""
# Вызов модели и парсинг результата
response = call_llm(prompt)
return json.loads(response)Всегда добавляйте поле "requires_human" в автоматическую классификацию. Некоторые обращения должен обрабатывать живой человек — сложные случаи, VIP-клиенты, угрозы.
Множественное извлечение за один запрос
Вместо нескольких запросов (тональность, сущности, категория) — делайте один комплексный. Это быстрее и дешевле.
prompt = f"""
Проанализируй текст и извлеки ВСЮ информацию за один проход:
{{
"sentiment": {{
"overall": "positive|negative|neutral|mixed",
"confidence": 0.0-1.0,
"emotions": ["список эмоций"]
}},
"entities": {{
"persons": [],
"organizations": [],
"dates": [],
"amounts": [],
"products": []
}},
"classification": {{
"topic": "основная тема",
"subtopics": ["подтемы"],
"intent": "намерение автора"
}},
"summary": "краткое содержание в 1-2 предложениях"
}}
Текст: """{text}"""
"""Вопросы для размышления
- •Какие данные вы регулярно извлекаете из текстов вручную?
- •Как автоматическая классификация могла бы улучшить ваши рабочие процессы?
