бот из набора фраз файла txt
def load_phrases():
try:
with open(filename, 'r', encoding='utf-8') as f:
return [line.strip() for line in f if line.strip()]
except FileNotFoundError:
return []
def save_phrase(phrase):
with open(filename, 'a', encoding='utf-8') as f:
f.write(phrase + '\n')
def similarity(a, b):
set_a = set(a.lower().split())
set_b = set(b.lower().split())
return len(set_a & set_b)
phrases = load_phrases()
while True:
user_input = input("Ввод: ").strip()
if not user_input:
print("Выход.")
break
best_phrase = None
best_score = -1
for p in phrases:
if p.lower() == user_input.lower():
continue
score = similarity(user_input, p)
if score > best_score:
best_score = score
best_phrase = p
if best_phrase:
print("Ответ:", best_phrase)
else:
print("Похожих фраз нет.")
save_phrase(user_input)
phrases.append(user_input)
Понял вашу задачу — у вас есть файл с фразами, вы вводите новую фразу, и программа должна выбрать из файла наиболее подходящую по смыслу фразу (по теме, по набору слов), а затем добавить вашу введённую фразу в файл.
Для этого можно сделать так:
Считать все фразы из файла.
Для каждой фразы посчитать степень похожести с введённой фразой.
Выбрать наиболее похожую.
Вывести её.
Добавить введённую фразу в файл.
Для оценки похожести можно использовать, например, косинусное сходство по TF-IDF вектору (через sklearn), или более простой подход — пересечение множества слов.
Ниже пример программы на Python с использованием sklearn (TF-IDF + косинусное сходство), которая делает то, что вы хотите.
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.metrics.pairwise import cosine_similarity
def load_phrases(filename):
with open(filename, 'r', encoding='utf-8') as f:
phrases = [line.strip() for line in f if line.strip()]
return phrases
def save_phrase(filename, phrase):
with open(filename, 'a', encoding='utf-8') as f:
f.write(phrase + '\n')
def find_most_similar(phrases, input_phrase):
vectorizer = TfidfVectorizer()
# Векторизуем все фразы + введённую
tfidf_matrix = vectorizer.fit_transform(phrases + [input_phrase])
# Косинусное сходство между введённой фразой (последний вектор) и всеми остальными
cosine_similarities = cosine_similarity(tfidf_matrix[-1], tfidf_matrix[:-1]).flatten()
# Индекс наиболее похожей фразы
most_similar_idx = cosine_similarities.argmax()
return phrases[most_similar_idx], cosine_similarities[most_similar_idx]
def main():
filename = 'фразы.txt'
phrases = load_phrases(filename)
input_phrase = input("Введите вашу фразу: ").strip()
if not input_phrase:
print("Пустая фраза. Завершение.")
return
if not phrases:
print("Файл пустой, добавляем вашу фразу.")
save_phrase(filename, input_phrase)
print("Фраза добавлена.")
return
best_match, similarity = find_most_similar(phrases, input_phrase)
print(f"Наиболее подходящая фраза из файла (сходство {similarity:.2f}):")
print(best_match)
save_phrase(filename, input_phrase)
print("Ваша фраза добавлена в файл.")
if __name__ == '__main__':
main()
Что нужно:
Установить sklearn, если не установлен:
pip install scikit-learn
Создать файл фразы.txt с фразами (по одной фразе на строку).
Как работает:
Программа читает все фразы из файла.
При вводе новой фразы вычисляет TF-IDF векторы для всех фраз и вашей.
Сравнивает вашу с каждой из существующих и находит максимально похожую.
Выводит её.
Добавляет вашу фразу в файл.
Если хотите более простой вариант без сторонних библиотек, могу помочь сделать через пересечение слов. Сообщите, если нужно.
мне нужен просто диалог
фраза
ответ
..
и так далее
не нужно писать :
пустая фраза
добавлена фраза
подходящая фраза
какое сходство
Понял, вот упрощённый вариант программы, которая просто читает фразы из файла, по введённой фразе выводит наиболее похожую из файла (без лишних сообщений), затем добавляет введённую фразу в файл и ждёт следующую:
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.metrics.pairwise import cosine_similarity
def load_phrases(filename):
with open(filename, 'r', encoding='utf-8') as f:
return [line.strip() for line in f if line.strip()]
def save_phrase(filename, phrase):
with open(filename, 'a', encoding='utf-8') as f:
f.write(phrase + '\n')
filename = 'фразы.txt'
phrases = load_phrases(filename)
while True:
user_input = input().strip()
if not user_input:
break
if phrases:
vectorizer = TfidfVectorizer()
tfidf = vectorizer.fit_transform(phrases + [user_input])
similarities = cosine_similarity(tfidf[-1], tfidf[:-1]).flatten()
best_idx = similarities.argmax()
print(phrases[best_idx])
else:
# Если файл пустой, ответить нечем, можно просто пропустить
print()
save_phrase(filename, user_input)
phrases.append(user_input)
Найти еще
Как использовать:
Запускаете скрипт.
Вводите фразу — программа выводит ответ (фразу из файла, максимально похожую по смыслу).
Вводите следующую фразу — программа снова отвечает, и так далее.
Чтобы выйти — просто нажмите Enter на пустой строке.
Если хотите, могу помочь сделать без sklearn, только на пересечении слов.
а как лучше для диалога ?
Для простого диалога на основе похожести фраз из файла лучше использовать TF-IDF + косинусное сходство (как в примере с sklearn):
Это учитывает важность слов (TF-IDF) и позволяет сравнивать фразы по смыслу, а не просто по совпадению отдельных слов.
Работает хорошо даже если слова переставлены или есть небольшие различия.
Быстро и достаточно точно для небольших наборов фраз.
Если же у вас очень простой или ограниченный набор фраз, или нет возможности ставить внешние библиотеки, можно сделать проще — сравнивать пересечение множества слов (например, считать сколько слов совпадает между вводом и каждой фразой). Но это менее гибко и точность хуже.
Если хотите более продвинутый диалог — тогда уже нужны модели с обучением на больших данных, NLP, семантические эмбеддинги (например, с помощью моделей sentence-transformers). Но для базового варианта ваш подход с TF-IDF — оптимальный баланс простоты и качества.
Итог:
Если нужна простота и качество — используйте TF-IDF + косинусное сходство (скрипт с sklearn).
Если нет возможности ставить библиотеки — простой подсчёт общих слов.
Для сложного, «умного» диалога — NLP модели (но это уже сложнее).
Если хотите, могу помочь с любым из вариантов.
мне главное чтобы программа работала и отвечала на мои фразы
Понял, тогда рекомендую использовать самый простой рабочий вариант с TF-IDF и sklearn, который я дал выше — он быстро запускается, не требует сложной настройки, и сразу отвечает на ваши фразы.
Вот ещё раз минимальный рабочий код, который просто читает фразы из файла, отвечает максимально похожей фразой и добавляет ваш ввод для обучения:
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.metrics.pairwise import cosine_similarity
filename = 'фразы.txt'
def load_phrases():
try:
with open(filename, 'r', encoding='utf-8') as f:
return [line.strip() for line in f if line.strip()]
except FileNotFoundError:
return []
def save_phrase(phrase):
with open(filename, 'a', encoding='utf-8') as f:
f.write(phrase + '\n')
phrases = load_phrases()
while True:
user_input = input().strip()
if not user_input:
break
if phrases:
vectorizer = TfidfVectorizer()
tfidf = vectorizer.fit_transform(phrases + [user_input])
similarities = cosine_similarity(tfidf[-1], tfidf[:-1]).flatten()
best_idx = similarities.argmax()
print(phrases[best_idx])
else:
print() # если файл пустой - пустой ответ
save_phrase(user_input)
phrases.append(user_input)
Как запустить:
Установите библиотеку sklearn, если ещё нет:
pip install scikit-learn
Создайте файл фразы.txt (можно пустой или с какими-то фразами).
Запустите скрипт.
Вводите свои фразы — программа будет отвечать похожими из файла.
Чтобы выйти — нажмите Enter на пустой строке.
Если нужна помощь — пишите!
программа зависла
Если программа "зависла", скорее всего, она просто ждёт ввода с клавиатуры — так и задумано, она работает в цикле и ожидает, что вы введёте фразу.
Поясню, как она работает:
После запуска курсор ждёт, когда вы напишете фразу и нажмёте Enter.
Пока вы не введёте что-то, программа "заморожена", потому что ждёт ввода.
Если хотите выйти, просто нажмите Enter на пустой строке — программа завершится.
Если же программа зависает или тормозит после ввода, возможны такие причины:
Очень большой файл с фразами — обработка TF-IDF и косинусного сходства может занять время. Для больших баз лучше оптимизировать или использовать более продвинутые методы.
Проблемы с кодировкой файла — убедитесь, что файл фразы.txt в кодировке UTF-8.
Проблемы с установкой sklearn — убедитесь, что библиотека установлена корректно.
Что сделать:
Запустите программу из консоли (терминала).
Введите простую фразу, например: Привет.
Нажмите Enter.
Программа должна вывести ответ (если в файле есть фразы).
Введите следующую фразу или нажмите Enter без текста, чтобы выйти.
Если вы хотите, я могу предложить ещё более простой вариант без sklearn — с подсчётом совпадающих слов, чтобы программа работала быстрее и без внешних библиотек. Напишите, если интересно.
да она должна работать быстро
Понял, давайте сделаем максимально простой и быстрый вариант без внешних библиотек, который будет искать похожую фразу по количеству совпадающих слов.
Вот пример кода:
filename = 'фразы.txt'
def load_phrases():
try:
with open(filename, 'r', encoding='utf-8') as f:
return [line.strip() for line in f if line.strip()]
except FileNotFoundError:
return []
def save_phrase(phrase):
with open(filename, 'a', encoding='utf-8') as f:
f.write(phrase + '\n')
def similarity(a, b):
# Кол-во общих слов
set_a = set(a.lower().split())
set_b = set(b.lower().split())
return len(set_a & set_b)
phrases = load_phrases()
while True:
user_input = input().strip()
if not user_input:
break
if phrases:
best_phrase = ''
best_score = -1
for p in phrases:
score = similarity(user_input, p)
if score > best_score:
best_score = score
best_phrase = p
print(best_phrase)
else:
print() # если файл пуст
save_phrase(user_input)
phrases.append(user_input)
Найти еще
Как это работает:
Загружает фразы из файла.
При вводе вашей фразы ищет в файлах ту, у которой максимальное число совпадающих слов.
Выводит её.
Добавляет вашу фразу в файл для обучения.
Если файл пуст — просто выводит пустую строку.
Такой код очень простой и быстрый, не требует установки ничего. Но учтите, что он ищет только по количеству общих слов — не учитывает порядок, форму слов и синонимы.
Если вам этого достаточно — этот вариант отлично подойдёт. Если захотите позже улучшить — можно добавить более сложные методы.
Если нужна помощь с запуском — пишите!
если она будет искать максимальное число похожих слов
то ответы буду повторять мой запрос - и это плохо
Понимаю вашу проблему: если искать по максимальному числу совпадающих слов, то часто лучшая "похожая" фраза будет просто повторять ваш запрос или очень близка к нему, что не очень интересно.
Чтобы избежать этого, можно:
Исключать из поиска точное совпадение с вашим запросом.
Искать фразу с максимальным числом совпадающих слов, но не равную вашему вводу.
Добавить небольшой штраф за совпадение с самим запросом.
Или искать фразу с максимальным пересечением слов, но при этом минимальной длиной совпадающих слов (например, исключать совпадения, если совпадает почти всё).
Вот простой вариант с исключением точного совпадения и выбором наиболее похожей, но отличающейся фразы:
filename = 'фразы.txt'
def load_phrases():
try:
with open(filename, 'r', encoding='utf-8') as f:
return [line.strip() for line in f if line.strip()]
except FileNotFoundError:
return []
def save_phrase(phrase):
with open(filename, 'a', encoding='utf-8') as f:
f.write(phrase + '\n')
def similarity(a, b):
set_a = set(a.lower().split())
set_b = set(b.lower().split())
return len(set_a & set_b)
phrases = load_phrases()
while True:
user_input = input().strip()
if not user_input:
break
if phrases:
best_phrase = None
best_score = -1
for p in phrases:
if p.lower() == user_input.lower():
continue # пропускаем точное совпадение
score = similarity(user_input, p)
if score > best_score:
best_score = score
best_phrase = p
if best_phrase is None:
print() # если нет похожих, выводим пусто
else:
print(best_phrase)
else:
print()
save_phrase(user_input)
phrases.append(user_input)
Если хотите, можно добавить более тонкие фильтры — например, минимальное число совпадающих слов (не менее 1), или учитывать длины фраз, чтобы не выдавать слишком короткие ответы.
Если хотите — могу помочь с такими улучшениями. Но этот вариант уже не будет просто повторять ваш запрос.
программа зависла
Если программа "зависла", скорее всего, она просто ждёт вашего ввода — так и задумано, она работает в бесконечном цикле while True и ждёт, пока вы введёте фразу и нажмёте Enter.
Что делать:
Введите фразу и нажмите Enter — программа найдёт похожую фразу и выведет её.
Если хотите выйти из программы, просто нажмите Enter на пустой строке (то есть не вводите ничего, а сразу Enter).
Если после ввода фразы программа не отвечает и не выводит ничего — это может быть из-за того, что в файле фразы.txt очень много строк и поиск занимает много времени. В таком случае:
Попробуйте сначала очистить файл фразы.txt (удалить все строки или создать пустой файл).
Запустите программу заново и попробуйте вводить короткие фразы.
Если программа вообще не запускается или сразу "зависает" — пришлите, пожалуйста, полный текст ошибки или опишите подробнее, как именно вы запускаете программу (из консоли, из IDE и т.п.).
Вот ещё раз самый простой способ проверить, что программа работает (можно скопировать и запустить в отдельном файле):
filename = 'фразы.txt'
def load_phrases():
try:
with open(filename, 'r', encoding='utf-8') as f:
return [line.strip() for line in f if line.strip()]
except FileNotFoundError:
return []
def save_phrase(phrase):
with open(filename, 'a', encoding='utf-8') as f:
f.write(phrase + '\n')
def similarity(a, b):
set_a = set(a.lower().split())
set_b = set(b.lower().split())
return len(set_a & set_b)
phrases = load_phrases()
while True:
user_input = input("Введите фразу (Enter для выхода): ").strip()
if not user_input:
print("Выход.")
break
best_phrase = None
best_score = -1
for p in phrases:
if p.lower() == user_input.lower():
continue
score = similarity(user_input, p)
if score > best_score:
best_score = score
best_phrase = p
if best_phrase:
print("Похожая фраза:", best_phrase)
else:
print("Похожих фраз нет.")
save_phrase(user_input)
phrases.append(user_input)
Запустите этот код, введите фразу, посмотрите ответ. Если программа не реагирует — значит она ждёт ввода.
Если что-то не понятно или нужна помощь с запуском — напишите
Свидетельство о публикации №125061901591