Анализ статей википедии об ИИ

Материал из Поле цифровой дидактики

Анализатор статей Википедии об искусственном интеллекте — это Python-скрипт для автоматизированного сбора, обработки и сравнительного анализа статей из русскоязычной Википедии по тематике искусственного интеллекта и смежных областей. Программа реализует простой, но эффективный подход к анализу текстового контента с использованием публичного API Википедии.

Обзор

Скрипт представляет собой консольное приложение, которое последовательно:

  1. Собирает статьи из указанных категорий Википедии
  2. Извлекает и анализирует текстовое содержимое статей
  3. Проводит сравнительный анализ по нескольким метрикам
  4. Выявляет общие темы и терминологические паттерны
  5. Формирует структурированный отчёт о результатах анализа

Архитектура и принцип работы

Основные компоненты

Класс SimpleWikiAnalyzer Центральный класс, содержащий всю логику анализа. Основные методы:

get_articles_in_category() — получает список статей из указанной категории через API Википедии

get_article_content() — загружает полный текст статьи с метаданными (количество слов, размер, URL)

analyze_text() — выполняет лингвистический анализ текста (частотность слов, статистика)

compare_articles() — сравнивает статьи по ключевым метрикам

find_common_themes() — выявляет общие термины и темы

API взаимодействие

Программа использует официальное API Википедии (https://ru.wikipedia.org/w/api.php) с параметрами:

action=query — основной метод запроса

list=categorymembers — получение списка статей категории

prop=extracts|info — получение содержимого и метаданных статей

explaintext=True — получение текста без разметки

Аналитические функции

Статистический анализ

  1. Подсчёт общего количества слов в статье
  2. Подсчёт уникальных слов (лексическое разнообразие)
  3. Частотный анализ слов (топ-10 наиболее употребляемых)
  4. Исключение стоп-слов (служебных и малозначимых слов)

Сравнительный анализ

  1. Ранжирование статей по объёму
  2. Выявление самых больших и самых маленьких статей
  3. Анализ распределения терминологии между статьями
  4. Тематический анализ
  5. Поиск и подсчёт ключевых терминов ИИ в текстах
  6. Выявление статей с наибольшей концентрацией профильной терминологии
  7. Анализ пересекающихся тематик

Алгоритм работы

Этап 1: Сбор данных.

Определение целевых категорий:.

  1. Искусственный интеллект
  2. Машинное обучение
  3. Нейронные сети
  4. Обработка естественного языка

Получение списка статей:

  1. Для каждой категории запрашивается до 8 статей
  2. Извлекаются заголовки и идентификаторы статей

Загрузка контента:

  1. Для каждой статьи загружается текст (первые 1500 символов)
  2. Собираются метаданные: количество слов, размер в KB, URL

Этап 2: Обработка текста. Очистка текста:

  1. Удаление вики-разметки [ссылок]
  2. Приведение к нижнему регистру

Токенизация:

  1. Разбивка текста на слова с помощью регулярных выражений
  2. Фильтрация коротких слов (<3 символов)

Частотный анализ:

  1. Подсчёт встречаемости каждого слова
  2. Исключение предопределённого списка стоп-слов

Этап 3: Анализ и визуализация

  1. Сравнительная статистика:
  2. Общее количество проанализированных слов
  3. Средний размер статьи
  4. Рейтинг статей по объёму

Терминологический анализ:

  1. Поиск 18 ключевых терминов ИИ
  2. Анализ их распределения по статьям
  3. Выявление статей с наибольшей терминологической насыщенностью

Формирование отчёта:

  1. Консольный вывод структурированных результатов
  2. Сохранение полных данных в JSON-формат

Особенности реализации

  1. инималистичная архитектура
  2. Единственная внешняя зависимость — библиотека requests
  3. Локальное хранение промежуточных данных
  4. Отсутствие сложных структур данных

Устойчивость к ошибкам

Обработка исключений при сетевых запросах

  1. Проверка наличия запрашиваемых статей
  2. Задержки между запросами для соблюдения правил API

Расширяемость

  1. Модульная структура класса
  2. Возможность добавления новых категорий для анализа
  3. Легко модифицируемые списки ключевых терминов

Метрики анализа

  1. Количественные метрики
  2. Объём текста: количество слов, размер в килобайтах
  3. Лексическое разнообразие: отношение уникальных слов к общему количеству
  4. Терминологическая плотность: частота ключевых терминов ИИ

Качественные метрики

  1. Тематическая релевантность: концентрация профильной терминологии
  1. Информационная насыщенность: соотношение значимых и служебных слов
  1. Тематическое пересечение: общие термины между статьями разных категорий

Технические ограничения

Ограничения API Википедии

  1. Максимальное количество статей за один запрос — 500
  2. Ограничение на частоту запросов
  3. Частичное извлечение текста (первые 1500 символов)
  4. Лингвистические ограничения
  5. Простой алгоритм выделения слов (регулярные выражения)
  6. Фиксированный список стоп-слов
  7. Отсутствие морфологического анализа

Код на Python

"""
Минималистичный анализ статей Википедии об искусственном интеллекте
Зависимости: только requests (установить: pip install requests)
"""

import requests
import time
from datetime import datetime
import re
from collections import Counter
import json

class SimpleWikiAnalyzer:
    def __init__(self):
        self.base_url = "https://ru.wikipedia.org/w/api.php"
        self.session = requests.Session()
        self.session.headers.update({
            "User-Agent": "SimpleWikiAnalyzer/1.0"
        })
        
    def get_articles_in_category(self, category, limit=20):
        """Получить статьи из категории"""
        print(f"\n📚 Собираю статьи из категории: {category}")
        
        articles = []
        params = {
            "action": "query",
            "format": "json",
            "list": "categorymembers",
            "cmtitle": f"Категория:{category}",
            "cmlimit": limit,
            "cmtype": "page"
        }
        
        try:
            response = self.session.get(self.base_url, params=params)
            data = response.json()
            
            for item in data.get("query", {}).get("categorymembers", []):
                articles.append({
                    "title": item["title"],
                    "pageid": item["pageid"]
                })
                
            print(f"✅ Найдено статей: {len(articles)}")
            return articles[:limit]
            
        except Exception as e:
            print(f"❌ Ошибка при сборе статей: {e}")
            return []
    
    def get_article_content(self, title):
        """Получить содержание статьи"""
        params = {
            "action": "query",
            "format": "json",
            "titles": title,
            "prop": "extracts|info",
            "explaintext": True,
            "inprop": "url|size|wordcount"
        }
        
        try:
            response = self.session.get(self.base_url, params=params)
            data = response.json()
            pages = data.get("query", {}).get("pages", {})
            
            for page_id, page_data in pages.items():
                if 'missing' in page_data:
                    return None
                    
                return {
                    "title": page_data.get("title", ""),
                    "word_count": page_data.get("wordcount", 0),
                    "url": page_data.get("fullurl", ""),
                    "content": page_data.get("extract", "")[:1500],  # Первые 1500 символов
                    "size_kb": page_data.get("length", 0) / 1024
                }
                
        except Exception as e:
            print(f"❌ Ошибка при получении статьи '{title}': {e}")
            return None
    
    def analyze_text(self, text):
        """Простой анализ текста"""
        # Убираем технические символы
        text_clean = re.sub(r'\[.*?\]', '', text)  # Убираем ссылки в квадратных скобках
        
        # Считаем слова
        words = re.findall(r'\b[а-яА-Яa-zA-Z]{3,}\b', text_clean.lower())
        
        # Популярные слова для исключения (стоп-слова)
        stop_words = {'это', 'что', 'который', 'также', 'очень', 'может', 'более', 'очень',
                     'the', 'and', 'for', 'with', 'that', 'this', 'from', 'have'}
        
        # Считаем частоту слов (исключая стоп-слова)
        word_freq = Counter([w for w in words if w not in stop_words])
        
        return {
            "total_words": len(words),
            "unique_words": len(set(words)),
            "top_words": word_freq.most_common(10)
        }
    
    def compare_articles(self, articles_data):
        """Сравнить статьи по ключевым метрикам"""
        print("\n" + "="*60)
        print("📊 СРАВНИТЕЛЬНЫЙ АНАЛИЗ СТАТЕЙ")
        print("="*60)
        
        # Основная статистика
        total_words = sum([a.get("analysis", {}).get("total_words", 0) for a in articles_data])
        avg_words = total_words / len(articles_data) if articles_data else 0
        
        print(f"\n📈 Общая статистика:")
        print(f"   • Всего статей проанализировано: {len(articles_data)}")
        print(f"   • Общее количество слов: {total_words:,}")
        print(f"   • Средний размер статьи: {avg_words:.0f} слов")
        
        # Самые большие/маленькие статьи
        sorted_by_size = sorted(articles_data, 
                              key=lambda x: x.get("analysis", {}).get("total_words", 0), 
                              reverse=True)
        
        print(f"\n📏 Размер статей:")
        print(f"   • Самая большая: '{sorted_by_size[0]['title']}' - {sorted_by_size[0]['analysis']['total_words']:,} слов")
        print(f"   • Самая маленькая: '{sorted_by_size[-1]['title']}' - {sorted_by_size[-1]['analysis']['total_words']:,} слов")
        
        # Самые популярные слова во всех статьях
        all_top_words = Counter()
        for article in articles_data:
            for word, count in article.get("analysis", {}).get("top_words", []):
                all_top_words[word] += count
        
        print(f"\n🔠 Топ-15 самых частых слов во всех статьях:")
        for i, (word, count) in enumerate(all_top_words.most_common(15), 1):
            print(f"   {i:2d}. {word:<15}{count} раз")
    
    def find_common_themes(self, articles_data):
        """Найти общие темы/термины"""
        print("\n" + "="*60)
        print("🎯 ОБЩИЕ ТЕМЫ И ТЕРМИНЫ")
        print("="*60)
        
        # Термины ИИ для поиска
        ai_terms = [
            'искусственный', 'интеллект', 'нейрон', 'сеть', 'машинный', 'обучение',
            'алгоритм', 'данные', 'анализ', 'глубокий', 'ai', 'ml', 'нейросеть',
            'прогноз', 'модель', 'робот', 'автоматизация', 'компьютерный'
        ]
        
        term_frequency = {}
        
        for term in ai_terms:
            count = 0
            for article in articles_data:
                content = article.get("content", "").lower()
                count += content.count(term)
            if count > 0:
                term_frequency[term] = count
        
        print("\n📋 Частота ключевых терминов ИИ:")
        for term, freq in sorted(term_frequency.items(), key=lambda x: x[1], reverse=True):
            print(f"   • {term:<15} — упоминается {freq} раз")
        
        # Найти статьи с наибольшим количеством терминов
        print("\n🏆 Статьи с наибольшим количеством терминов ИИ:")
        article_term_counts = []
        
        for article in articles_data:
            count = 0
            content_lower = article.get("content", "").lower()
            for term in ai_terms:
                count += content_lower.count(term)
            article_term_counts.append((article["title"], count))
        
        for title, count in sorted(article_term_counts, key=lambda x: x[1], reverse=True)[:5]:
            print(f"   • {title:<40}{count} терминов")
    
    def run_analysis(self):
        """Запустить полный анализ"""
        print("="*60)
        print("🤖 АНАЛИЗ СТАТЕЙ ВИКИПЕДИИ ОБ ИСКУССТВЕННОМ ИНТЕЛЛЕКТЕ")
        print("="*60)
        
        # Категории для анализа
        categories = [
            "Искусственный интеллект",
            "Машинное обучение",
            "Нейронные сети",
            "Обработка естественного языка"
        ]
        
        all_articles_data = []
        
        for category in categories:
            print(f"\n{'━'*40}")
            print(f"Категория: {category}")
            print(f"{'━'*40}")
            
            # Получить статьи из категории
            articles = self.get_articles_in_category(category, limit=8)
            
            if not articles:
                print("   Пропускаем...")
                continue
            
            # Собрать данные по каждой статье
            for i, article in enumerate(articles, 1):
                print(f"   {i}. Анализирую: {article['title']}")
                
                data = self.get_article_content(article["title"])
                if data and data.get("content"):
                    # Анализ текста
                    analysis = self.analyze_text(data["content"])
                    data["analysis"] = analysis
                    all_articles_data.append(data)
                    
                    # Краткая информация о статье
                    print(f"     ✓ {data['word_count']:,} слов | {data['size_kb']:.1f} KB")
                    
                time.sleep(0.2)  # Вежливая задержка
        
        if not all_articles_data:
            print("\n❌ Не удалось собрать данные для анализа")
            return
        
        # Провести сравнительный анализ
        self.compare_articles(all_articles_data)
        
        # Найти общие темы
        self.find_common_themes(all_articles_data)
        
        # Вывести краткую информацию по каждой статье
        print("\n" + "="*60)
        print("📄 КРАТКАЯ ИНФОРМАЦИЯ ПО СТАТЬЯМ")
        print("="*60)
        
        for i, article in enumerate(all_articles_data, 1):
            print(f"\n{i}. {article['title']}")
            print(f"   📝 Слов: {article['analysis']['total_words']:,}")
            print(f"   🔤 Уникальных слов: {article['analysis']['unique_words']}")
            print(f"   🔗 Ссылка: {article['url'][:80]}...")
            
            # Топ-3 слова из статьи
            top_words = article['analysis']['top_words'][:3]
            words_str = ", ".join([f"{word}({count})" for word, count in top_words])
            print(f"   🏷️  Ключевые слова: {words_str}")
        
        # Итоговая статистика
        print("\n" + "="*60)
        print("✅ АНАЛИЗ ЗАВЕРШЕН")
        print("="*60)
        print(f"📅 Время анализа: {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}")
        print(f"📚 Всего проанализировано статей: {len(all_articles_data)}")
        
        # Сохранить результаты в JSON (опционально)
        try:
            with open("wiki_ai_analysis.json", "w", encoding="utf-8") as f:
                json.dump(all_articles_data, f, ensure_ascii=False, indent=2)
            print(f"💾 Результаты сохранены в wiki_ai_analysis.json")
        except:
            print("💡 Результаты не сохранены в файл")


def main():
    """Основная функция"""
    print("Запуск анализа Википедии...")
    
    analyzer = SimpleWikiAnalyzer()
    
    try:
        analyzer.run_analysis()
    except KeyboardInterrupt:
        print("\n\n⏹️  Анализ прерван пользователем")
    except Exception as e:
        print(f"\n❌ Произошла ошибка: {e}")
    finally:
        print("\nСпасибо за использование анализатора!")


if __name__ == "__main__":
    main()