простой бот из набора ключевых слов

import re
import random

# Список слов, которые ввел пользователь
user_words = set()

# Функция для получения случайной фразы из файла "фразы.txt"
def get_random_phrase():
    with open("фразы.txt", "r", encoding="utf-8") as file:
        phrases = [line.strip() for line in file]
        return random.choice(phrases)

# Функция для получения ответа бота на введенную пользователем фразу
def get_bot_response(user_phrase):
    global user_words

    # Добавляем слова из введенной фразы в список пользовательских слов
    user_words.update(user_phrase.split())

    # Сохраняем новую фразу в файл
    with open("фразы.txt", "a", encoding="utf-8") as file:
        file.write(user_phrase + "\n")

    # Ищем фразы в файле "фразы.txt", которые содержат хотя бы два из слов пользователя
    matching_phrases = []
    with open("фразы.txt", "r", encoding="utf-8") as file:
        for line in file:
            phrase = line.strip()
            if any(word in user_words for word in phrase.split()) and len(set(phrase.split()) & user_words) >= 2:
                matching_phrases.append(phrase)

    # Если найдено хотя бы одно совпадение с двумя словами, выбираем случайную фразу из них
    if matching_phrases:
        return random.choice(matching_phrases)

    # Ищем фразы в файле "фразы.txt", которые содержат хотя бы одно из слов пользователя
    matching_phrases = []
    with open("фразы.txt", "r", encoding="utf-8") as file:
        for line in file:
            phrase = line.strip()
            if any(word in user_words for word in phrase.split()):
                matching_phrases.append(phrase)

    # Если найдено хотя бы одно совпадение с одним словом, выбираем случайную фразу из них
    if matching_phrases:
        return random.choice(matching_phrases)

    # Если не найдено ни одного совпадения, возвращаем стандартную фразу
    return " я не нашел подходящей фразы для ответа "

# цикл для общения с пользователем
while True:
    user_phrase = input("Вы: ")
    bot_response = get_bot_response(user_phrase)
    print("> ", bot_response)





    Этот алгоритм реализует простой чат-бот, который общается с пользователем, используя базу фраз, хранящихся в файле "фразы.txt". Работа алгоритма следующая:

Создается пустой множество user_words для хранения слов, которые ввел пользователь.
Функция get_random_phrase() считывает все фразы из файла "фразы.txt" и возвращает случайную фразу.
Функция get_bot_response(user_phrase) обрабатывает введенную пользователем фразу и возвращает ответ бота.
Слова из введенной фразы добавляются в множество user_words.
Новая фраза добавляется в конец файла "фразы.txt".
Алгоритм пытается найти фразы в файле, которые содержат хотя бы два слова из user_words. Если такие фразы найдены, то выбирается случайная фраза из них и возвращается как ответ бота.
Если фраз с двумя словами не найдено, то алгоритм пытается найти фразы, содержащие хотя бы одно слово из user_words. Если такие фразы найдены, то выбирается случайная фраза из них и возвращается как ответ бота.
Если не найдено ни одной фразы, содержащей слова из user_words, то возвращается стандартная фраза "я не нашел подходящей фразы для ответа".
В бесконечном цикле пользователь вводит фразы, а бот возвращает ответ на основе функции get_bot_response().
Теперь, что касается логичности и связности алгоритма:

Логика добавления слов из введенной фразы в user_words и сохранения новой фразы в файле "фразы.txt" обоснована, так как это позволяет расширять базу фраз по мере общения с пользователем.
Логика поиска фраз в файле "фразы.txt", содержащих хотя бы два слова из user_words, также обоснована, так как это позволяет боту отвечать более релевантными фразами.
Логика возвращения стандартной фразы, когда не найдено ни одной подходящей фразы, также обоснована, так как это предотвращает зацикливание бота и обеспечивает минимальную реакцию на ввод пользователя.
Однако, есть несколько моментов, которые можно улучшить или изменить для повышения качества ответа бота:
Текущий алгоритм не учитывает грамматические особенности фраз и может возвращать некорректные ответы, если слова в фразе находятся в неправильном порядке или имеют разную грамматическую форму.
Алгоритм не учитывает контекст предыдущих фраз пользователя и может возвращать нерелевантные ответы, если пользователь меняет тему разговора.
Алгоритм не учитывает частотность слов в фразе и может возвращать ответы, основанные на менее значимых словах.

Файл "фразы.txt" не обновляется, если пользователь вводит фразу, содержащую слова, уже присутствующие в файле.

Это может привести к дублированию фраз в файле и снижению качества ответов бота.
Алгоритм не проверяет, содержит ли введенная пользователем фраза хотя бы одно слово. Если пользователь вводит пустую фразу или фразу, не содержащую слов, бот все равно будет пытаться найти подходящую фразу в файле "фразы.txt", что может привести к задержке ответа.
В целом, алгоритм является простым и может служить базовой основой для более сложных и продвинутых чат-ботов. Однако, для повышения качества ответов бота необходимо учитывать дополнительные факторы, такие как грамматические особенности фраз, контекст предыдущих фраз пользователя и частотность слов в фразе.




  сортировка  фраз в файле  ->


with open('фразы.txt', 'r', encoding='utf-8') as file:
    lines = file.readlines()

# Удаление дубликатов
unique_lines = set(lines)

# Сортировка уникальных строк по длине
sorted_unique_lines = sorted(unique_lines, key=len)

with open('фраз-нов.txt', 'w', encoding='utf-8') as new_file:
    for line in sorted_unique_lines:
        new_file.write(line)






*   статистика строк фраз  ->



def count_lines_and_words(file_path):
    # Инициализируем счетчики
    line_count = 0
    word_count = 0
   
    # Читаем текст из файла
    with open(file_path, 'r', encoding='utf-8') as file:
        for line in file:
            line_count += 1  # Увеличиваем счетчик строк
            word_count += len(line.split())  # Увеличиваем счетчик слов по количеству слов в строке
   
    return line_count, word_count

# Указываем путь к файлу
file_path = 'фразы1.txt'

# Подсчитываем строки и слова
lines, words = count_lines_and_words(file_path)

# Выводим результаты
print(f"Количество строк в файле: {lines}")
print(f"Количество слов в файле: {words}")








   **



import re
import random

# Список слов, которые ввел пользователь
user_words = set()

# Функция для получения случайной фразы из файла "фразы.txt"
def get_random_phrase():
    with open("фразы.txt", "r", encoding="utf-8") as file:
        phrases = [line.strip() for line in file]
        return random.choice(phrases)

# Функция для получения ответа бота на введенную пользователем фразу
def get_bot_response(user_phrase):
    # Добавляем слова из введенной фразы в список пользовательских слов
    user_words.update(user_phrase.split())

    # Сохраняем новую фразу в файл
    with open("фразы.txt", "a", encoding="utf-8") as file:
        file.write(user_phrase + "\n")

    # Ищем фразы в файле "фразы.txt", которые содержат хотя бы одно из слов пользователя
    matching_phrases = []
    with open("фразы.txt", "r", encoding="utf-8") as file:
        for line in file:
            phrase = line.strip()
            if any(word in user_words for word in phrase.split()):
                matching_phrases.append(phrase)

    # Если найдено хотя бы одно совпадение, выбираем случайную фразу из них
    if matching_phrases:
        return random.choice(matching_phrases)

    # Если не найдено ни одного совпадения, возвращаем стандартную фразу
    return " извините - я не нашел подходящего ответа на это "

# цикл для общения с пользователем
while True:
    user_phrase = input("вы: ")
    bot_response = get_bot_response(user_phrase)
    print("> ", bot_response)







  ** =->







Вот новый вариант кода, который учитывает некоторые из упомянутых недостатков и улучшает качество ответов бота:

import re
import random
import nltk
from nltk.corpus import stopwords
from nltk.stem import WordNetLemmatizer

nltk.download("punkt")
nltk.download("wordnet")
nltk.download("stopwords")

# Список слов, которые ввел пользователь
user_words = set()

# Список всех фраз в файле "фразы.txt"
phrases = []

# Инициализация лемматизатора
lemmatizer = WordNetLemmatizer()

# Функция для получения случайной фразы из файла "фразы.txt"
def get_random_phrase():
    global phrases
    if not phrases:
        with open("фразы.txt", "r", encoding="utf-8") as file:
            phrases = [line.strip() for line in file]
    return random.choice(phrases)

# Функция для получения ответа бота на введенную пользователем фразу
def get_bot_response(user_phrase):
    global user_words, phrases

    # Преобразование фразы в нижний регистр и удаление стоп-слов
    user_phrase = " ".join([lemmatizer.lemmatize(word) for word in nltk.word_tokenize(user_phrase.lower()) if word not in stopwords.words("russian")])

    # Добавляем слова из введенной фразы в список пользовательских слов
    user_words.update(user_phrase.split())

    # Сохраняем новую фразу в файл и добавляем ее в список фраз
    with open("фразы.txt", "a", encoding="utf-8") as file:
        file.write(user_phrase + "\n")
    phrases.append(user_phrase)

    # Ищем фразы в списке фраз, которые содержат хотя бы два из слов пользователя
    matching_phrases = []
    for phrase in phrases:
        if len(set(phrase.split()) & user_words) >= 2:
            matching_phrases.append(phrase)

    # Если найдено хотя бы одно совпадение с двумя словами, выбираем случайную фразу из них
    if matching_phrases:
        return random.choice(matching_phrases)

    # Ищем фразы в списке фраз, которые содержат хотя бы одно из слов пользователя
    matching_phrases = []
    for phrase in phrases:
        if any(word in user_words for word in phrase.split()):
            matching_phrases.append(phrase)

    # Если найдено хотя бы одно совпадение с одним словом, выбираем случайную фразу из них
    if matching_phrases:
        return random.choice(matching_phrases)

    # Если не найдено ни одного совпадения, возвращаем стандартную фразу
    return " я не нашел подходящей фразы для ответа "

# цикл для общения с пользователем
while True:
    user_phrase = input("Вы: ")
    if not user_phrase.strip():
        print("> Пожалуйста, введите какую-нибудь фразу.")
        continue
    bot_response = get_bot_response(user_phrase)
    print("> ", bot_response)




*  В этом новом варианте кода были внесены следующие изменения:

Добавлена поддержка лемматизации и удаления стоп-слов из введенной пользователем фразы. Это позволяет учитывать грамматические особенности фраз и игнорировать менее значимые слова.
Список фраз из файла "фразы.txt" загружается один раз при запуске бота и обновляется при добавлении новой фразы. Это позволяет ускорить поиск подходящих фраз и предотвратить дублирование фраз в файле.
Добавлена проверка на пустую фразу, введенную пользователем. Если пользователь вводит пустую фразу, бот возвращает сообщение, просящего ввести какую-нибудь фразу.
Логика поиска подходящих фраз была изменена, чтобы учитывать частотность слов в фразе. Теперь бот ищет фразы, содержащие хотя бы два слова из user_words, а если таких фраз не найдено, то ищет фразы, содержащие хотя бы одно слово из user_words.
Эти изменения должны улучшить качество ответов бота и сделать общение с пользователем более плавным и естественным.


Рецензии