Первичная версия: стилометрия реплик, LSA и протокол экспериментов

This commit is contained in:
2026-10-24 01:17:36 +03:00
commit c390224500
52 changed files with 10099 additions and 0 deletions

View File

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