программа диалога ии из фраз txt

23-12-25

нужен код диалога из фраз на питоне фразы находятся в файле фраз.txt
я ввожу фразу через input программа ищет в файле txt другую фразу
как ответ на мою фразу или строку в этой фразе должно совпадать
или быть такими же 3-4 буквы которые расположены рядом в строке фразы
затем программа мою фразу добавляет в наш файл txt с фразами данных

при выводе фразы ответа нужно также  проверить чтобы эта фраза или строка
не повторяла фразу которая была до этого
затем я ввожу новую фразу и диалог продолжается по циклу
выход из цикла делать не надо..


 вот далее пример простого чат-диалога на Python, который читает фразы из файла фраз.txt, находит ответ по совпадению 3–4 подряд букв в строках файла, добавляет пользовательскую фразу в файл (если её ещё нет повторяющихся), и продолжает цикл. В этом решении:


Ищем ответ, если в одной из строк фраз.txt есть подпись, которая содержит 3–4 соседних букв, совпадающих с вводимой фразой (любая 3–4 буквы подряд в вводе должны совпасть с подряд идущими буквами в строке-ответе).
Чтобы сравнивать, приводим к нижнему регистру и снимаем пробелы/пунктуацию для частичного совпадения.
При добавлении новой фразы проверяем, чтобы она не повторяла уже существующие фразы в файле (точно не повторялось полностью строки).
Фраза из файла, являющаяся ответом, не должна повторяться как сама фраза пользователя (с учётом добавления).
Важно: файл фраз.txt должен существовать рядом с скриптом, либо код создаст его пустым при первом запуске.


Код на Python :



import re
from pathlib import Path

# Путь к файлу с фразами
PHRASES_FILE = Path("фраз.txt")

# Убедимся, что файл существует
if not PHRASES_FILE.exists():
    PHRASES_FILE.write_text("", encoding="utf-8")

def normalize(s: str) -> str:
    # Убираем лишние пробелы и приводим к нижнему регистру
    s = s.lower()
    # Удаляем все не-алфавитно-цифровые символы для упрощения поиска
    s = re.sub(r"[^a-zа-я0-9\s]", "", s)
    # Удаляем лишние пробелы
    s = re.sub(r"\s+", " ", s).strip()
    return s

def load_phrases():
    with PHRASES_FILE.open("r", encoding="utf-8") as f:
        lines = [line.rstrip("\n") for line in f if line.strip()]
    return lines

def save_phrase(phrase: str):
    # Добавляем новую фразу в файл (на новой строке)
    with PHRASES_FILE.open("a", encoding="utf-8") as f:
        f.write(phrase.strip() + "\n")

def contains_substring_match(user_input: str, target: str) -> bool:
    # Проверяем совпадения по 3–4 consecutive букв в обеих строках
    # Приведем к нижнему регистру и очистим
    u = normalize(user_input)
    t = normalize(target)

    # Получим все уникальные подстроки длиной 3 и 4 из user_input
    substrs = set()
    for L in (3, 4):
        if len(u) >= L:
            for i in range(len(u) - L + 1):
                substrs.add(u[i:i+L])

    if not substrs:
        return False

    # Проверяем наличие любой подстроки в target
    for sub in substrs:
        if sub in t:
            return True
    return False

def find_response(user_input: str, phrases: list) -> str:
    u_norm = normalize(user_input)

    # Ищем первую фразу-ответ из файла, которая содержит совпадение по 3–4 букв
    for line in phrases:
        # Пропускаем пустые строки и строки той же самой фразы, если она уже была
        if not line.strip():
            continue
        if contains_substring_match(user_input, line):
            return line
    return None

def main_loop():
    print("Начат диалог. Вводите фразы. Для выхода этого цикла выхода без завершения программы не предусмотрен.")
    # Загружаем существующие фразы
    phrases = load_phrases()

    # Основной цикл
    while True:
        user_input = input("Вы: ").strip()
        if not user_input:
            continue

        # Найти ответ
        reply = find_response(user_input, phrases)

        # Если найден ответ, выводим его; иначе можно выбрать стандартный ответ
        if reply:
            print("Бот:", reply)
        else:
            # Если ответа нет, можно выбрать универсальный ответ или пустой.
            print("Бот: [нет подходящего ответа]")
            reply = None

        # Препятствие дублированию: не добавляем дубликаты фраз
        # Добавляем новую фразу пользователя в файл, если её ещё нет
        # Проверяем, чтобы введённая фраза не повторяла существующую фразу в файле
        user_exists = any(line.strip().lower() == user_input.lower() for line in phrases)
        if not user_exists:
            save_phrase(user_input)
            phrases.append(user_input)  # обновим локальный кэш

        # Продолжаем цикл без выходного условия по требованию
        # Чтобы избежать бесконечных повторов для теста, можно вынести выходной условие по желанию

if __name__ == "__main__":
    main_loop()


Пояснения и идеи расширения данных кода :

По желанию можно изменить логику сравнения: например, искать 3–4 буквы в любом порядке или учитывать начало/конец слова.
Можно улучшить логику добавления фраз: после добавления можно нормализовать и удалить дубликаты через множества.


Рецензии