Анализ статей википедии об ИИ
Анализатор статей Википедии об искусственном интеллекте — это Python-скрипт для автоматизированного сбора, обработки и сравнительного анализа статей из русскоязычной Википедии по тематике искусственного интеллекта и смежных областей. Программа реализует простой, но эффективный подход к анализу текстового контента с использованием публичного API Википедии.
Обзор
Скрипт представляет собой консольное приложение, которое последовательно:
- Собирает статьи из указанных категорий Википедии
- Извлекает и анализирует текстовое содержимое статей
- Проводит сравнительный анализ по нескольким метрикам
- Выявляет общие темы и терминологические паттерны
- Формирует структурированный отчёт о результатах анализа
Архитектура и принцип работы
Основные компоненты
Класс 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 — получение текста без разметки
Аналитические функции
Статистический анализ
- Подсчёт общего количества слов в статье
- Подсчёт уникальных слов (лексическое разнообразие)
- Частотный анализ слов (топ-10 наиболее употребляемых)
- Исключение стоп-слов (служебных и малозначимых слов)
Сравнительный анализ
- Ранжирование статей по объёму
- Выявление самых больших и самых маленьких статей
- Анализ распределения терминологии между статьями
- Тематический анализ
- Поиск и подсчёт ключевых терминов ИИ в текстах
- Выявление статей с наибольшей концентрацией профильной терминологии
- Анализ пересекающихся тематик
Алгоритм работы
Этап 1: Сбор данных.
Определение целевых категорий:.
- Искусственный интеллект
- Машинное обучение
- Нейронные сети
- Обработка естественного языка
Получение списка статей:
- Для каждой категории запрашивается до 8 статей
- Извлекаются заголовки и идентификаторы статей
Загрузка контента:
- Для каждой статьи загружается текст (первые 1500 символов)
- Собираются метаданные: количество слов, размер в KB, URL
Этап 2: Обработка текста. Очистка текста:
- Удаление вики-разметки [ссылок]
- Приведение к нижнему регистру
Токенизация:
- Разбивка текста на слова с помощью регулярных выражений
- Фильтрация коротких слов (<3 символов)
Частотный анализ:
- Подсчёт встречаемости каждого слова
- Исключение предопределённого списка стоп-слов
Этап 3: Анализ и визуализация
- Сравнительная статистика:
- Общее количество проанализированных слов
- Средний размер статьи
- Рейтинг статей по объёму
Терминологический анализ:
- Поиск 18 ключевых терминов ИИ
- Анализ их распределения по статьям
- Выявление статей с наибольшей терминологической насыщенностью
Формирование отчёта:
- Консольный вывод структурированных результатов
- Сохранение полных данных в JSON-формат
Особенности реализации
- инималистичная архитектура
- Единственная внешняя зависимость — библиотека requests
- Локальное хранение промежуточных данных
- Отсутствие сложных структур данных
Устойчивость к ошибкам
Обработка исключений при сетевых запросах
- Проверка наличия запрашиваемых статей
- Задержки между запросами для соблюдения правил API
Расширяемость
- Модульная структура класса
- Возможность добавления новых категорий для анализа
- Легко модифицируемые списки ключевых терминов
Метрики анализа
- Количественные метрики
- Объём текста: количество слов, размер в килобайтах
- Лексическое разнообразие: отношение уникальных слов к общему количеству
- Терминологическая плотность: частота ключевых терминов ИИ
Качественные метрики
- Тематическая релевантность: концентрация профильной терминологии
- Информационная насыщенность: соотношение значимых и служебных слов
- Тематическое пересечение: общие термины между статьями разных категорий
Технические ограничения
Ограничения API Википедии
- Максимальное количество статей за один запрос — 500
- Ограничение на частоту запросов
- Частичное извлечение текста (первые 1500 символов)
- Лингвистические ограничения
- Простой алгоритм выделения слов (регулярные выражения)
- Фиксированный список стоп-слов
- Отсутствие морфологического анализа
Код на 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()
