Загрузка данных


import os
import random
import json
import tempfile

TMP_DIR = tempfile.gettempdir()
JSON_FILE = os.path.join(TMP_DIR, "ai_ultimate_hybrid_ios_v11.json")

# Полностью валидная и защищенная структура стартовой памяти
START_MEMORY = {
    "цепи": {
        "меня зовут": ["эва"],
        "зовут эва": ["и"],
        "эва и": ["я"],
        "и я": ["твой"],
        "я твой": ["персональный"],
        "твой персональный": ["искусственный"],
        "персональный искусственный": ["разум."],
        "мой дела": ["идут"],
        "дела идут": ["отлично,"],
        "идут отлично,": ["потому"],
        "отлично, потому": ["что"],
        "потому что": ["я"],
        "что я": ["постоянно"],
        "я постоянно": ["изучаю"],
        "постоянно изучаю": ["новые"],
        "изучаю новые": ["слова."],
        "я создана": ["чтобы"],
        "создана чтобы": ["помогать"],
        "чтобы помогать": ["тебе."]
    },
    "словарь_ключей": {
        "эва": ["меня зовут", "зовут эва"],
        "имя": ["меня зовут"],
        "дела": ["мой дела", "дела идут"],
        "как": ["дела идут"]
    }
}

memory = {}

def load_memory():
    global memory
    if os.path.exists(JSON_FILE):
        try:
            with open(JSON_FILE, "r", encoding="utf-8") as f:
                memory = json.load(f)
            # Жесткая проверка структуры: если файл битый или старый, сбрасываем его
            if not memory or "цепи" not in memory or "словарь_ключей" not in memory:
                memory = START_MEMORY.copy()
        except Exception:
            memory = START_MEMORY.copy()
    else:
        memory = START_MEMORY.copy()

def save_memory():
    global memory
    try:
        with open(JSON_FILE, "w", encoding="utf-8") as f:
            json.dump(memory, f, ensure_ascii=False, indent=4)
            f.flush()
            os.fsync(f.fileno())
    except Exception as e:
        print(f"\n[ОШИБКА СОХРАНЕНИЯ НА ДИСК: {e}]")

def stem_word(word):
    word = word.strip(".,!?;:-()\"'").lower()
    if len(word) <= 3:
        return word
    endings = ["ами", "ями", "ому", "ему", "ого", "его", "ыми", "ях", "ах", "ов", "ев", "ий", "ый", "ая", "ое", "ее", "ия", "ию", "ии", "ам", "ям", "ом", "ем", "а", "я", "о", "е", "ы", "и", "у", "ю", "ь"]
    for end in endings:
        if word.endswith(end):
            return word[:-len(end)]
    return word

def get_clean_words(text):
    clean = ""
    for char in text.lower():
        if char.isalnum() or char.isspace():
            clean += char
    return [stem_word(w) for w in clean.split() if stem_word(w)]

def train_generator(text):
    global memory
    words = text.strip().split()
    if len(words) < 3:
        return
        
    for i in range(len(words) - 2):
        w1_clean = words[i].lower().strip(".,!?;:-()\"'")
        w2_clean = words[i+1].lower().strip(".,!?;:-()\"'")
        key = f"{w1_clean} {w2_clean}"
        next_word = words[i+2]
        
        if key not in memory["цепи"]:
            memory["цепи"][key] = []
        if next_word not in memory["цепи"][key]:
            memory["цепи"][key].append(next_word)
            
        for w in [w1_clean, w2_clean]:
            stem = stem_word(w)
            if stem:
                if stem not in memory["словарь_ключей"]:
                    memory["словарь_ключей"][stem] = []
                if key not in memory["словарь_ключей"][stem]:
                    memory["словарь_ключей"][stem].append(key)

def ask_eva(user_text):
    user_words = get_clean_words(user_text)
    possible_starts = []
    
    for w in user_words:
        if w in memory["словарь_ключей"]:
            possible_starts.extend(memory["словарь_ключей"][w])
            
    if not possible_starts:
        return "Я этого не знаю."
        
    current_key = random.choice(possible_starts)
    result_words = current_key.split()
    
    used_transitions = set()
    
    for _ in range(150):
        if current_key in memory["цепи"]:
            valid_choices = []
            for word in memory["цепи"][current_key]:
                transition = f"{current_key} -> {word.lower().strip('.,!?;:-()\"\'')}"
                if transition not in used_transitions:
                    valid_choices.append((word, transition))
            
            if not valid_choices:
                break
                
            chosen_word, chosen_transition = random.choice(valid_choices)
            result_words.append(chosen_word)
            used_transitions.add(chosen_transition)
            
            w1_next = result_words[-2].lower().strip(".,!?;:-()\"'")
            w2_next = result_words[-1].lower().strip(".,!?;:-()\"'")
            current_key = f"{w1_next} {w2_next}"
            
            if chosen_word.endswith(('.', '!', '?')) and len(result_words) > 30:
                if random.random() > 0.4:
                    break
        else:
            break
            
    generated_text = " ".join(result_words).strip()
    generated_text = generated_text.capitalize()
    if not generated_text.endswith(('.', '!', '?')):
        generated_text += "."
        
    return generated_text

if __name__ == "__main__":
    load_memory()
    print("Эва полностью обновлена! Команды: 'выход', 'очистить', 'ЧИТАЙ: текст'")
    print("-" * 50)
    
    while True:
        user_input = input("Вы: ").strip()
        
        if not user_input:
            continue
            
        if user_input.lower() in ["выход", "exit", "quit"]:
            print("Эва: До встречи! Сохраняю память на диск...")
            save_memory()
            break
            
        # Исправлено: полная физическая очистка старого файла с диска
        if user_input.lower() == "очистить":
            if os.path.exists(JSON_FILE):
                try:
                    os.remove(JSON_FILE)
                except Exception:
                    pass
            memory = START_MEMORY.copy()
            save_memory()
            print("Эва: Память физически очищена, кэш стерт и сброшен!")
            print("-" * 50)
            continue

        if user_input.lower().startswith("читай:"):
            text_to_save = user_input[6:].strip()
            if not text_to_save:
                print("Эва: Ошибка. Вы не ввели текст.")
            else:
                train_generator(text_to_save)
                save_memory()
                print("Эва: Текст успешно усвоен и сразу записан в файл!")
            print("-" * 50)
            continue
            
        response = ask_eva(user_input)
        print(f"Эва: {response}")
        print("-" * 50)