Files
NLP/lab1/scripts/check_environment.py

78 lines
3.0 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

"""Проверка окружения перед серией экспериментов."""
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())