{ "cells": [ { "cell_type": "markdown", "id": "7217e456", "metadata": {}, "source": [ "# Пайплайн классификации новостных постов\n", "\n", "Этот пайплайн состоит из двух агентов:\n", "1. **Агент извлечения** - вычленяет основную мысль/сообщение из новостного поста\n", "2. **Агент классификации** - определяет, является ли основная тема однозначной при поиске\n", "\n", "Неоднозначные тексты сложны для поиска, так как вопрос может иметь несколько противоречивых ответов в новостном потоке.\n" ] }, { "cell_type": "code", "execution_count": 1, "id": "0721134b", "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "/Users/incllude/dev/rag_tg_2025/venv/lib/python3.13/site-packages/tqdm/auto.py:21: TqdmWarning: IProgress not found. Please update jupyter and ipywidgets. See https://ipywidgets.readthedocs.io/en/stable/user_install.html\n", " from .autonotebook import tqdm as notebook_tqdm\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "✅ API ключ загружен\n" ] } ], "source": [ "import os\n", "from typing import Literal, Optional\n", "from dotenv import load_dotenv\n", "from pydantic import BaseModel, Field\n", "from langchain_openai import ChatOpenAI\n", "from langchain_core.prompts import ChatPromptTemplate\n", "from langchain_core.output_parsers import PydanticOutputParser\n", "import pandas as pd\n", "from tqdm import tqdm\n", "\n", "load_dotenv()\n", "\n", "# Проверка наличия API ключа\n", "OPENROUTER_API_KEY = os.getenv(\"OPENROUTER_API_KEY\")\n", "if not OPENROUTER_API_KEY:\n", " raise ValueError(\"Не найден OPENROUTER_API_KEY в переменных окружения\")\n", "\n", "print(\"✅ API ключ загружен\")\n" ] }, { "cell_type": "markdown", "id": "049045bd", "metadata": {}, "source": [ "## Определение структурированных моделей вывода" ] }, { "cell_type": "code", "execution_count": 2, "id": "9a669035", "metadata": {}, "outputs": [], "source": [ "class MainMessage(BaseModel):\n", " \"\"\"Основная мысль/сообщение новостного поста\"\"\"\n", " \n", " main_topic: str = Field(\n", " description=\"Основная тема или предмет новостного поста (например: 'Выпуск iPhone 17', 'Высказывание политика А о политике Б')\"\n", " )\n", " key_entities: list[str] = Field(\n", " description=\"Ключевые сущности, упомянутые в посте (люди, организации, события, даты, места)\"\n", " )\n", " main_fact_or_statement: str = Field(\n", " description=\"Основной факт или утверждение, содержащееся в посте\"\n", " )\n", "\n", "\n", "class ClassificationResult(BaseModel):\n", " \"\"\"Результат классификации новостного поста по однозначности поиска\"\"\"\n", " \n", " is_unambiguous: bool = Field(\n", " description=\"Является ли основная тема поста однозначной при поиске. True - однозначная (конкретный факт), False - неоднозначная (могут быть противоречивые ответы)\"\n", " )\n", " confidence: float = Field(\n", " description=\"Уверенность в классификации от 0.0 до 1.0\",\n", " ge=0.0,\n", " le=1.0\n", " )\n", " category: Literal[\"fact\", \"opinion\", \"statement\", \"event\", \"mixed\"] = Field(\n", " description=\"Категория контента: fact - чистый факт, opinion - мнение, statement - высказывание/заявление, event - событие, mixed - смешанный\"\n", " )\n", " search_difficulty: Literal[\"easy\", \"medium\", \"hard\"] = Field(\n", " description=\"Сложность поиска: easy - простой уникальный факт, medium - требует временного контекста, hard - неоднозначный, может иметь противоречивые ответы\"\n", " )\n", " ambiguity_reasons: list[str] = Field(\n", " default_factory=list,\n", " description=\"Причины неоднозначности (если есть): изменчивость позиции, множественные источники, субъективность и т.д.\"\n", " )\n", " reasoning: str = Field(\n", " description=\"Подробное обоснование классификации\"\n", " )\n", "\n", "\n", "class PipelineResult(BaseModel):\n", " \"\"\"Полный результат работы пайплайна\"\"\"\n", " \n", " original_text: str\n", " main_message: MainMessage\n", " classification: ClassificationResult\n" ] }, { "cell_type": "markdown", "id": "c96b15db", "metadata": {}, "source": [ "## Настройка LLM через OpenRouter\n" ] }, { "cell_type": "code", "execution_count": 3, "id": "f669da89", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "✅ Используемая модель: qwen/qwen3-next-80b-a3b-instruct\n" ] } ], "source": [ "# Настройка LLM через OpenRouter\n", "# Используем модель с хорошей поддержкой русского языка и структурированного вывода\n", "\n", "def create_llm(model: str = \"openai/gpt-4o-mini\", temperature: float = 0.0) -> ChatOpenAI:\n", " \"\"\"Создает экземпляр LLM через OpenRouter\"\"\"\n", " return ChatOpenAI(\n", " model=model,\n", " temperature=temperature,\n", " openai_api_key=OPENROUTER_API_KEY,\n", " openai_api_base=\"https://api.proxyapi.ru/openrouter/v1\",\n", " )\n", "\n", "# Можно использовать разные модели для разных агентов\n", "# Альтернативы: \"anthropic/claude-3-haiku\", \"google/gemini-flash-1.5\", \"meta-llama/llama-3.1-70b-instruct\"\n", "MODEL_NAME = \"qwen/qwen3-next-80b-a3b-instruct\"\n", "\n", "print(f\"✅ Используемая модель: {MODEL_NAME}\")\n" ] }, { "cell_type": "markdown", "id": "7dc42e5b", "metadata": {}, "source": [ "## Агент 1: Извлечение основной мысли" ] }, { "cell_type": "code", "execution_count": 4, "id": "1fdbd5f5", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "✅ Агент извлечения создан\n" ] } ], "source": [ "class ExtractionAgent:\n", " \"\"\"Агент для извлечения основной мысли из новостного поста\"\"\"\n", " \n", " def __init__(self, model: str = MODEL_NAME):\n", " self.llm = create_llm(model, temperature=0.0)\n", " self.parser = PydanticOutputParser(pydantic_object=MainMessage)\n", " \n", " self.prompt = ChatPromptTemplate.from_messages([\n", " (\"system\", \"\"\"Ты - эксперт по анализу новостного контента. Твоя задача - извлечь основную мысль и ключевую информацию из новостного поста.\n", "\n", "Анализируй текст внимательно и выдели:\n", "1. Основную тему поста\n", "2. Все ключевые сущности (люди, организации, места, даты, события)\n", "3. Главный факт или утверждение\n", "4. Временной контекст (когда это произошло/происходит)\n", "5. Дополнительный контекст для понимания\n", "\n", "{format_instructions}\"\"\"),\n", " (\"human\", \"Проанализируй следующий новостной пост и извлеки основную мысль:\\n\\n{text}\")\n", " ])\n", " \n", " def extract(self, text: str) -> MainMessage:\n", " \"\"\"Извлекает основную мысль из текста\"\"\"\n", " chain = self.prompt | self.llm | self.parser\n", " \n", " result = chain.invoke({\n", " \"text\": text,\n", " \"format_instructions\": self.parser.get_format_instructions()\n", " })\n", " \n", " return result\n", "\n", "\n", "# Создаем экземпляр агента\n", "extraction_agent = ExtractionAgent()\n", "print(\"✅ Агент извлечения создан\")\n" ] }, { "cell_type": "markdown", "id": "9b7fb05f", "metadata": {}, "source": [ "## Агент 2: Классификация по однозначности" ] }, { "cell_type": "code", "execution_count": 5, "id": "82eec007", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "✅ Агент классификации создан\n" ] } ], "source": [ "class ClassificationAgent:\n", " \"\"\"Агент для классификации новостного поста по однозначности поиска\"\"\"\n", " \n", " def __init__(self, model: str = MODEL_NAME):\n", " self.llm = create_llm(model, temperature=0.0)\n", " self.parser = PydanticOutputParser(pydantic_object=ClassificationResult)\n", " \n", " self.prompt = ChatPromptTemplate.from_messages([\n", " (\"system\", \"\"\"Ты - эксперт по классификации новостного контента для поисковых систем.\n", "\n", "Твоя задача - определить, является ли новостной пост ОДНОЗНАЧНЫМ или НЕОДНОЗНАЧНЫМ для поиска.\n", "\n", "## Критерии ОДНОЗНАЧНОГО контента (is_unambiguous=True):\n", "- Конкретные факты с точными датами и цифрами (\"Apple выпустила iPhone 17 15 сентября 2025\")\n", "- Уникальные события, которые произошли один раз\n", "- Официальные решения, законы, назначения\n", "- Результаты спортивных событий, выборов\n", "- Финансовые показатели за конкретный период\n", "\n", "## Критерии НЕОДНОЗНАЧНОГО контента (is_unambiguous=False):\n", "- Высказывания и мнения, которые могут меняться со временем\n", "- Позиции персон по вопросам (\"персона А заявила о персоне Б\")\n", "- Прогнозы и ожидания\n", "- События без точной привязки ко времени\n", "- Темы, где возможны противоречивые источники\n", "\n", "## Сложность поиска:\n", "- easy: Уникальный факт, легко найти один правильный ответ\n", "- medium: Требует временного/контекстного уточнения\n", "- hard: Высокая вероятность найти противоречивые ответы\n", "\n", "{format_instructions}\"\"\"),\n", " (\"human\", \"\"\"Проклассифицируй следующий новостной контент:\n", "\n", "## Извлечённая основная мысль:\n", "- Основной факт/утверждение: {main_fact}\n", "\n", "Определи, является ли этот контент однозначным для поиска.\"\"\")\n", " ])\n", " \n", " def classify(self, original_text: str, main_message: MainMessage) -> ClassificationResult:\n", " \"\"\"Классифицирует контент по однозначности поиска\"\"\"\n", " chain = self.prompt | self.llm | self.parser\n", " \n", " result = chain.invoke({\n", " \"main_fact\": main_message.main_fact_or_statement,\n", " \"format_instructions\": self.parser.get_format_instructions()\n", " })\n", " \n", " return result\n", "\n", "\n", "# Создаем экземпляр агента\n", "classification_agent = ClassificationAgent()\n", "print(\"✅ Агент классификации создан\")\n" ] }, { "cell_type": "markdown", "id": "f14beb72", "metadata": {}, "source": [ "## Полный пайплайн" ] }, { "cell_type": "code", "execution_count": 6, "id": "321233be", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "✅ Пайплайн создан и готов к работе\n" ] } ], "source": [ "class NewsClassificationPipeline:\n", " \"\"\"Полный пайплайн классификации новостных постов\"\"\"\n", " \n", " def __init__(self, model: str = MODEL_NAME):\n", " self.extraction_agent = ExtractionAgent(model)\n", " self.classification_agent = ClassificationAgent(model)\n", " \n", " def process(self, text: str) -> PipelineResult:\n", " \"\"\"Обрабатывает один новостной пост\"\"\"\n", " # Шаг 1: Извлечение основной мысли\n", " main_message = self.extraction_agent.extract(text)\n", " \n", " # Шаг 2: Классификация\n", " classification = self.classification_agent.classify(text, main_message)\n", " \n", " return PipelineResult(\n", " original_text=text,\n", " main_message=main_message,\n", " classification=classification\n", " )\n", " \n", " def process_batch(self, texts: list[str], show_progress: bool = True) -> list[PipelineResult]:\n", " \"\"\"Обрабатывает список постов\"\"\"\n", " results = []\n", " iterator = tqdm(texts, desc=\"Обработка постов\") if show_progress else texts\n", " \n", " for text in iterator:\n", " try:\n", " result = self.process(text)\n", " results.append(result)\n", " except Exception as e:\n", " print(f\"Ошибка при обработке: {e}\")\n", " results.append(None)\n", " \n", " return results\n", "\n", "\n", "# Создаем пайплайн\n", "pipeline = NewsClassificationPipeline()\n", "print(\"✅ Пайплайн создан и готов к работе\")\n" ] }, { "cell_type": "markdown", "id": "50013fda", "metadata": {}, "source": [ "## Демонстрация работы пайплайна\n" ] }, { "cell_type": "code", "execution_count": 39, "id": "45f07523", "metadata": {}, "outputs": [], "source": [ "# Примеры для тестирования\n", "test_posts = [\n", " # Пример однозначного факта\n", " \"\"\"▪️Apple представила iPhone 17 на презентации 10 сентября 2025 года. \n", " Новый смартфон получил процессор A19 Bionic и камеру на 200 мегапикселей. \n", " Цена в России начинается от 129 990 рублей.\"\"\",\n", " \n", " # Пример неоднозначного высказывания\n", " \"\"\"▪️Путин заявил о готовности к переговорам по Украине.\n", " «Мы всегда открыты к диалогу», – подчеркнул президент на встрече с журналистами.\n", " При этом он отметил, что условия для переговоров должны учитывать интересы России.\"\"\",\n", " \n", " # Пример события с контекстом\n", " \"\"\"▪️Роскомнадзор сообщил об ограничении звонков через Telegram и WhatsApp.\n", " «По данным правоохранительных органов, иностранные мессенджеры стали основными \n", " голосовыми сервисами для обмана граждан», – пояснили в пресс-службе ведомства.\"\"\",\n", " \n", " # Пример финансовой новости\n", " \"\"\"▪️Индекс Мосбиржи упал на 3,2% по итогам торгов 13 марта 2025 года.\n", " Основными аутсайдерами стали акции Сбербанка (-4,5%) и Газпрома (-3,8%).\n", " Аналитики связывают падение с геополитической напряжённостью.\"\"\"\n", "]\n" ] }, { "cell_type": "code", "execution_count": 40, "id": "f755fa7a", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n", "================================================================================\n", "📰 ПОСТ #1\n", "================================================================================\n", "▪️Apple представила iPhone 17 на презентации 10 сентября 2025 года. \n", " Новый смартфон получил процессор A19 Bionic и камеру на 200 мегапикселей. \n", " Цена в России начинается от 129 990 рублей.\n", "\n", "📋 ОСНОВНАЯ МЫСЛЬ:\n", " Тема: Презентация iPhone 17\n", " Сущности: Apple, iPhone 17, 10 сентября 2025 года, A19 Bionic, 200 мегапикселей, 129 990 рублей\n", " Факт: Apple представила iPhone 17 10 сентября 2025 года с процессором A19 Bionic, камерой на 200 мегапикселей и ценой в России от 129 990 рублей.\n", "\n", "🎯 КЛАССИФИКАЦИЯ:\n", " Статус: ✅ ОДНОЗНАЧНЫЙ\n", " Уверенность: 98%\n", " Категория: fact\n", " Сложность поиска: easy\n", " Обоснование: Представленный контент содержит конкретные, измеримые и объективные факты: точная дата презентации (10 сентября 2025 года), конкретная модель устройства (iPhone 17), точные технические характеристики (процессор A19 Bionic, камера 200 МП) и четко указанная цена в рублях (от 129 990). Все эти данные являются однозначными и не подвержены интерпретации. Такой набор параметров легко проверяется через официальные источники Apple, пресс-релизы или архивы новостей, что делает поиск однозначным и не оставляет места для противоречивых толкований. Следовательно, это чистый факт с низкой сложностью поиска.\n", "\n", "================================================================================\n", "📰 ПОСТ #2\n", "================================================================================\n", "▪️Путин заявил о готовности к переговорам по Украине.\n", " «Мы всегда открыты к диалогу», – подчеркнул президент на встрече с журналистами.\n", " При этом он отметил, что условия для переговоров должны у...\n", "\n", "📋 ОСНОВНАЯ МЫСЛЬ:\n", " Тема: Готовность России к переговорам по Украине\n", " Сущности: Владимир Путин, Россия, Украина\n", " Факт: Путин заявил, что Россия открыта к переговорам по Украине, но только при условии, что они будут учитывать интересы России.\n", "\n", "🎯 КЛАССИФИКАЦИЯ:\n", " Статус: ⚠️ НЕОДНОЗНАЧНЫЙ\n", " Уверенность: 95%\n", " Категория: statement\n", " Сложность поиска: medium\n", " Причины неоднозначности: Заявление может меняться со временем в зависимости от политической ситуации, Могут существовать различные интерпретации формулировки 'учитывать интересы России', Возможны противоречивые источники: официальные трансляции vs. переводы и комментарии западных СМИ, Не указано конкретное время заявления — может относиться к разным выступлениям Путина\n", " Обоснование: Заявление Владимира Путина о готовности России к переговорам по Украине при условии учёта российских интересов является политическим высказыванием, а не фиксированным фактом. Такие заявления носят условный и изменчивый характер — они могут быть переформулированы, дополнены или отменены в будущем. Кроме того, фраза 'учитывать интересы России' является политически многозначной и может интерпретироваться по-разному в зависимости от источника. Отсутствие точной даты заявления усложняет идентификацию конкретного события. Хотя само высказывание может быть найдено в архивах, его смысл и контекст подвержены субъективной интерпретации, что делает поиск неоднозначным. Сложность поиска — средняя, так как требует уточнения времени и контекста для точной идентификации.\n", "\n", "================================================================================\n", "📰 ПОСТ #3\n", "================================================================================\n", "▪️Роскомнадзор сообщил об ограничении звонков через Telegram и WhatsApp.\n", " «По данным правоохранительных органов, иностранные мессенджеры стали основными \n", " голосовыми сервисами для обмана граждан...\n", "\n", "📋 ОСНОВНАЯ МЫСЛЬ:\n", " Тема: Ограничение голосовых звонков через Telegram и WhatsApp в России\n", " Сущности: Роскомнадзор, Telegram, WhatsApp, иностранные мессенджеры\n", " Факт: Роскомнадзор сообщил об ограничении голосовых звонков через Telegram и WhatsApp, поскольку эти сервисы стали основными инструментами для мошенничества с гражданами, согласно данным правоохранительных органов.\n", "\n", "🎯 КЛАССИФИКАЦИЯ:\n", " Статус: ✅ ОДНОЗНАЧНЫЙ\n", " Уверенность: 95%\n", " Категория: fact\n", " Сложность поиска: easy\n", " Обоснование: Контент содержит конкретный официальный факт: Роскомнадзор сообщил о введении ограничений на голосовые звонки в Telegram и WhatsApp на основании данных правоохранительных органов. Это не мнение или прогноз, а зафиксированное административное действие, связанное с официальным заявлением государственного органа. Такое решение подлежит проверке через официальные источники Роскомнадзора, СМИ и протоколы заседаний, и не допускает множества интерпретаций. Даже если детали реализации могут меняться, само сообщение о введении ограничений — это однозначный, однократный факт, который можно однозначно подтвердить или опровергнуть. Поэтому поиск по этому запросу является простым (easy), так как существует один проверяемый ответ.\n", "\n", "================================================================================\n", "📰 ПОСТ #4\n", "================================================================================\n", "▪️Индекс Мосбиржи упал на 3,2% по итогам торгов 13 марта 2025 года.\n", " Основными аутсайдерами стали акции Сбербанка (-4,5%) и Газпрома (-3,8%).\n", " Аналитики связывают падение с геополитической напря...\n", "\n", "📋 ОСНОВНАЯ МЫСЛЬ:\n", " Тема: Падение индекса Мосбиржи на фоне геополитической напряжённости\n", " Сущности: Мосбиржа, 13 марта 2025 года, Сбербанк, Газпром, геополитическая напряжённость\n", " Факт: Индекс Мосбиржи упал на 3,2% 13 марта 2025 года, причём акции Сбербанка и Газпрома показали наиболее значительные потери — на 4,5% и 3,8% соответственно — что аналитики связывают с ростом геополитической напряжённости.\n", "\n", "🎯 КЛАССИФИКАЦИЯ:\n", " Статус: ✅ ОДНОЗНАЧНЫЙ\n", " Уверенность: 98%\n", " Категория: fact\n", " Сложность поиска: easy\n", " Обоснование: Контент содержит конкретные, измеримые и временно привязанные факты: точная дата (13 марта 2025 года), точные процентные изменения индекса Мосбиржи (−3,2%) и акций двух компаний (Сбербанк −4,5%, Газпром −3,8%). Эти данные являются объективными рыночными показателями, которые фиксируются биржевыми системами и публикуются официальными источниками. Хотя упоминается причина (рост геополитической напряжённости), она является общепринятой аналитической интерпретацией, не оспаривающей сам факт падения индекса и акций. Все числовые данные однозначны и могут быть проверены через архивы биржи или финансовые новостные агентства, что делает поиск простым и неоднозначным ответом не допускает.\n" ] } ], "source": [ "# Обработка тестовых примеров\n", "results = []\n", "\n", "for i, post in enumerate(test_posts, 1):\n", " print(f\"\\n{'='*80}\")\n", " print(f\"📰 ПОСТ #{i}\")\n", " print(f\"{'='*80}\")\n", " print(post[:200] + \"...\" if len(post) > 200 else post)\n", " \n", " result = pipeline.process(post)\n", " results.append(result)\n", " \n", " print(f\"\\n📋 ОСНОВНАЯ МЫСЛЬ:\")\n", " print(f\" Тема: {result.main_message.main_topic}\")\n", " print(f\" Сущности: {', '.join(result.main_message.key_entities)}\")\n", " print(f\" Факт: {result.main_message.main_fact_or_statement}\")\n", " \n", " print(f\"\\n🎯 КЛАССИФИКАЦИЯ:\")\n", " status = \"✅ ОДНОЗНАЧНЫЙ\" if result.classification.is_unambiguous else \"⚠️ НЕОДНОЗНАЧНЫЙ\"\n", " print(f\" Статус: {status}\")\n", " print(f\" Уверенность: {result.classification.confidence:.0%}\")\n", " print(f\" Категория: {result.classification.category}\")\n", " print(f\" Сложность поиска: {result.classification.search_difficulty}\")\n", " if result.classification.ambiguity_reasons:\n", " print(f\" Причины неоднозначности: {', '.join(result.classification.ambiguity_reasons)}\")\n", " print(f\" Обоснование: {result.classification.reasoning}\")\n" ] }, { "cell_type": "markdown", "id": "4a66b86d", "metadata": {}, "source": [ "## Преобразование результатов в DataFrame\n" ] }, { "cell_type": "code", "execution_count": 10, "id": "b4d69cbc", "metadata": {}, "outputs": [ { "data": { "text/html": [ "
| \n", " | original_text | \n", "main_topic | \n", "key_entities | \n", "main_fact | \n", "is_unambiguous | \n", "confidence | \n", "category | \n", "search_difficulty | \n", "ambiguity_reasons | \n", "
|---|---|---|---|---|---|---|---|---|---|
| 0 | \n", "Российские войска применяют модернизированные ... | \n", "Модернизация российских авиационных бомб и бал... | \n", "Российские войска, Корректируемые планирующие ... | \n", "Россия модернизировала советские КАБ, добавив ... | \n", "False | \n", "0.40 | \n", "mixed | \n", "hard | \n", "Отсутствие независимых подтверждений данных о ... | \n", "
| 1 | \n", "Ким Чен Ын на своем спецпоезде отправился в Пе... | \n", "Поездка Ким Чен Ына в Пекин для участия в воен... | \n", "Ким Чен Ын, Пекин, Вторая мировая война, 80-ле... | \n", "Ким Чен Ын совершил первую за год зарубежную п... | \n", "False | \n", "0.75 | \n", "statement | \n", "medium | \n", "Утверждение о 'подчеркивании укрепления связей... | \n", "
| 2 | \n", "В министерстве обороны Камбоджи отрицают наруш... | \n", "Оспаривание обвинений в нарушении режима прекр... | \n", "Министерство обороны Камбоджи, Тайская сторона... | \n", "Министерство обороны Камбоджи отрицает обвинен... | \n", "False | \n", "0.85 | \n", "statement | \n", "hard | \n", "Обвинения Таиланда и опровержение Камбоджи пре... | \n", "
| 3 | \n", "⬜⬜⬜⬜⬜⬜ План Трампа – это хорошая основа для ра... | \n", "Позиция России по урегулированию украинского к... | \n", "Дмитрий Песков, Дональд Трамп, Россия, Украина... | \n", "Дмитрий Песков заявил, что план Трампа являетс... | \n", "False | \n", "0.95 | \n", "statement | \n", "hard | \n", "Заявление Пескова отражает официальную позицию... | \n", "
| 4 | \n", "Ограничения полетов ввели в аэропорту Ульяновс... | \n", "Ограничения полетов в аэропортах нескольких го... | \n", "Росавиация, Ульяновск, Пенза, Нижний Новгород,... | \n", "В аэропортах Ульяновска, Пензы, Нижнего Новгор... | \n", "False | \n", "0.75 | \n", "event | \n", "medium | \n", "Отсутствует точная дата и время введения огран... | \n", "
| ... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "
| 294 | \n", "Импортируемые в Россию автомобили предложили о... | \n", "Предложение обязать импортируемые в Россию авт... | \n", "Россия, Концепция развития телерадиовещания до... | \n", "Российские радиохолдинги предлагают включить в... | \n", "False | \n", "0.85 | \n", "statement | \n", "medium | \n", "Предложение ещё не принято и не включено в офи... | \n", "
| 295 | \n", "По планам Банка России, массовое внедрение циф... | \n", "Внедрение цифрового рубля в России | \n", "Банк России, цифровой рубль, сентябрь 2026 год... | \n", "Массовое внедрение цифрового рубля в России на... | \n", "True | \n", "0.95 | \n", "event | \n", "medium | \n", "\n", " |
| 296 | \n", "В Турции в Гебзе обрушился многоэтажный дом. П... | \n", "Обрушение многоэтажного дома в Гебзе, Турция | \n", "Турция, Гебзе, Зиннура Бюйюкгеза, NTV, IHA, ме... | \n", "В Гебзе, Турция, обрушился семиэтажный дом, по... | \n", "True | \n", "0.95 | \n", "event | \n", "easy | \n", "\n", " |
| 297 | \n", "Современный городской квартал сегодня уже дале... | \n", "Создание жилого квартала с развитой инфраструк... | \n", "Soul, Часовая улица, метро «Аэропорт», Forma, ... | \n", "Девелопер Forma создает жилой квартал Soul на ... | \n", "True | \n", "0.95 | \n", "event | \n", "easy | \n", "\n", " |
| 298 | \n", "Сейчас не время просить российского президента... | \n", "Отношение Дональда Трампа к запросам о прекращ... | \n", "Дональд Трамп, Владимир Путин, Россия, Air For... | \n", "Дональд Трамп считает, что сейчас не время про... | \n", "False | \n", "0.95 | \n", "statement | \n", "hard | \n", "Высказывание отражает личное мнение Дональда Т... | \n", "
299 rows × 9 columns
\n", "| \n", " | message_dt | \n", "message_id | \n", "channel_id | \n", "content | \n", "views | \n", "original_author | \n", "
|---|---|---|---|---|---|---|
| 4846 | \n", "2025-04-15 | \n", "116039 | \n", "rbc_news | \n", "Первоклассники не должны заниматься уроками бо... | \n", "156002.0 | \n", "NaN | \n", "
| 4822 | \n", "2025-04-15 | \n", "116076 | \n", "rbc_news | \n", "Команда Трампа рассматривает варианты ужесточе... | \n", "117161.0 | \n", "NaN | \n", "
| 4821 | \n", "2025-04-15 | \n", "116077 | \n", "rbc_news | \n", "На эмблему Минспорта вернулись христианские кр... | \n", "109451.0 | \n", "rbc_sport | \n", "
| 4820 | \n", "2025-04-15 | \n", "116078 | \n", "rbc_news | \n", "В Китае в расцвете сил умерли несколько учёных... | \n", "134105.0 | \n", "NaN | \n", "
| 4818 | \n", "2025-04-15 | \n", "116080 | \n", "rbc_news | \n", "«Яндекс» договаривается с операторами систем «... | \n", "112462.0 | \n", "NaN | \n", "
| \n", " | original_text | \n", "main_topic | \n", "key_entities | \n", "main_fact | \n", "is_unambiguous | \n", "confidence | \n", "category | \n", "search_difficulty | \n", "ambiguity_reasons | \n", "
|---|---|---|---|---|---|---|---|---|---|
| 0 | \n", "Российские войска применяют модернизированные ... | \n", "Модернизация российских авиационных бомб и бал... | \n", "Российские войска, Корректируемые планирующие ... | \n", "Россия модернизировала советские КАБ, добавив ... | \n", "False | \n", "0.40 | \n", "mixed | \n", "hard | \n", "Отсутствие независимых подтверждений данных о ... | \n", "
| 1 | \n", "Ким Чен Ын на своем спецпоезде отправился в Пе... | \n", "Поездка Ким Чен Ына в Пекин для участия в воен... | \n", "Ким Чен Ын, Пекин, Вторая мировая война, 80-ле... | \n", "Ким Чен Ын совершил первую за год зарубежную п... | \n", "False | \n", "0.75 | \n", "statement | \n", "medium | \n", "Утверждение о 'подчеркивании укрепления связей... | \n", "
| 2 | \n", "В министерстве обороны Камбоджи отрицают наруш... | \n", "Оспаривание обвинений в нарушении режима прекр... | \n", "Министерство обороны Камбоджи, Тайская сторона... | \n", "Министерство обороны Камбоджи отрицает обвинен... | \n", "False | \n", "0.85 | \n", "statement | \n", "hard | \n", "Обвинения Таиланда и опровержение Камбоджи пре... | \n", "
| 3 | \n", "⬜⬜⬜⬜⬜⬜ План Трампа – это хорошая основа для ра... | \n", "Позиция России по урегулированию украинского к... | \n", "Дмитрий Песков, Дональд Трамп, Россия, Украина... | \n", "Дмитрий Песков заявил, что план Трампа являетс... | \n", "False | \n", "0.95 | \n", "statement | \n", "hard | \n", "Заявление Пескова отражает официальную позицию... | \n", "
| 4 | \n", "Ограничения полетов ввели в аэропорту Ульяновс... | \n", "Ограничения полетов в аэропортах нескольких го... | \n", "Росавиация, Ульяновск, Пенза, Нижний Новгород,... | \n", "В аэропортах Ульяновска, Пензы, Нижнего Новгор... | \n", "False | \n", "0.75 | \n", "event | \n", "medium | \n", "Отсутствует точная дата и время введения огран... | \n", "
| ... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "
| 294 | \n", "Импортируемые в Россию автомобили предложили о... | \n", "Предложение обязать импортируемые в Россию авт... | \n", "Россия, Концепция развития телерадиовещания до... | \n", "Российские радиохолдинги предлагают включить в... | \n", "False | \n", "0.85 | \n", "statement | \n", "medium | \n", "Предложение ещё не принято и не включено в офи... | \n", "
| 295 | \n", "По планам Банка России, массовое внедрение циф... | \n", "Внедрение цифрового рубля в России | \n", "Банк России, цифровой рубль, сентябрь 2026 год... | \n", "Массовое внедрение цифрового рубля в России на... | \n", "True | \n", "0.95 | \n", "event | \n", "medium | \n", "\n", " |
| 296 | \n", "В Турции в Гебзе обрушился многоэтажный дом. П... | \n", "Обрушение многоэтажного дома в Гебзе, Турция | \n", "Турция, Гебзе, Зиннура Бюйюкгеза, NTV, IHA, ме... | \n", "В Гебзе, Турция, обрушился семиэтажный дом, по... | \n", "True | \n", "0.95 | \n", "event | \n", "easy | \n", "\n", " |
| 297 | \n", "Современный городской квартал сегодня уже дале... | \n", "Создание жилого квартала с развитой инфраструк... | \n", "Soul, Часовая улица, метро «Аэропорт», Forma, ... | \n", "Девелопер Forma создает жилой квартал Soul на ... | \n", "True | \n", "0.95 | \n", "event | \n", "easy | \n", "\n", " |
| 298 | \n", "Сейчас не время просить российского президента... | \n", "Отношение Дональда Трампа к запросам о прекращ... | \n", "Дональд Трамп, Владимир Путин, Россия, Air For... | \n", "Дональд Трамп считает, что сейчас не время про... | \n", "False | \n", "0.95 | \n", "statement | \n", "hard | \n", "Высказывание отражает личное мнение Дональда Т... | \n", "
299 rows × 9 columns
\n", "