Загрузка данных
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)