"""Проверка окружения перед серией экспериментов.""" from __future__ import annotations import json import sys from pathlib import Path PROJECT_ROOT = Path(__file__).resolve().parents[1] sys.path.insert(0, str(PROJECT_ROOT)) from stylometry.io import DEFAULT_DATA_PATH, corpus_fingerprint, read_corpus, validate_corpus # noqa: E402 from stylometry.tokenization import Tokenizer # noqa: E402 def package_versions() -> dict[str, str]: versions: dict[str, str] = {} for name in ("numpy", "pandas", "scipy", "sklearn", "nltk", "matplotlib"): try: module = __import__(name) versions[name] = getattr(module, "__version__", "unknown") except Exception: versions[name] = "missing" return versions def main() -> int: print("=== Проверка окружения ===") print(f"Python: {sys.version.split()[0]} ({sys.executable})") print(f"Каталог проекта: {PROJECT_ROOT}") versions = package_versions() print("Версии библиотек:") for name, version in versions.items(): print(f" {name}: {version}") missing = [name for name, version in versions.items() if version == "missing"] if missing: print(f"ОШИБКА: не установлены библиотеки: {missing}") print("Выполните: pip install -r requirements.txt") return 1 if not DEFAULT_DATA_PATH.exists(): print(f"ОШИБКА: нет файла корпуса {DEFAULT_DATA_PATH}") return 1 frame = read_corpus(DEFAULT_DATA_PATH) stats = validate_corpus(frame) print("Корпус:") print(f" файл: {DEFAULT_DATA_PATH}") print(f" SHA-256: {corpus_fingerprint(DEFAULT_DATA_PATH)}") print(f" реплик: {stats['n_lines']}") print(f" персонажей: {stats['n_characters']}") print(f" словоупотреблений: {stats['n_words']}") try: tokenizer = Tokenizer(use_nltk=True, strict=True) except Exception as error: print(f"ОШИБКА NLTK: {error}") print("Выполните: python scripts/download_nltk_data.py") return 1 analyzed = tokenizer.analyze(frame.iloc[0]["text"]) print("NLTK:") print(f" токенизатор: {'NLTK' if tokenizer.use_nltk else 'резервный'}") print(f" POS-теггер: {'доступен' if tokenizer.pos_available else 'недоступен'}") print(f" пример токенов: {analyzed.tokens[:8]}") print(f" пример POS: {analyzed.upos[:8]}") if not tokenizer.pos_available: print("ОШИБКА: POS-теггер недоступен; эксперименты с POS будут неполными.") return 1 print("\nОкружение готово.") print(json.dumps({"versions": versions, "n_lines": stats["n_lines"]}, ensure_ascii=False)) return 0 if __name__ == "__main__": raise SystemExit(main())