диалог программа ии -
есть набор фраз в файле текст2.txt
мы вводим новую фразу input
программа ищет фразы в которых в последних словах есть повторы пар букв
например я ввожу
так хорошо как дела
ответ
я не давно поела
повтор -ла в последних словах - пое-ла - де-ла - зна-ла - чита-ла и т.д
если повтора нет то выводится случайная фраза
import random
def has_repeating_letter_pairs(word):
"""
Проверяет, есть ли повторяющиеся пары букв в последних 4 буквах слова.
Возвращает True, если есть повтор, иначе False.
"""
if len(word) < 4:
return False
# Берём последние 4 буквы
last_four = word[-4:]
# Разбиваем на пары: [0:2] и [2:4]
pair1 = last_four[:2]
pair2 = last_four[2:]
return pair1 == pair2
def find_matching_phrase(input_phrase, phrases, last_two_responses):
"""
Ищет фразу из списка, где в последнем слове есть повторяющиеся пары букв.
Учитывает два последних ответа, чтобы избежать повторов.
"""
# Получаем два последних слова из введённой фразы
input_words = input_phrase.strip().split()
if not input_words:
# Если фраза пустая, возвращаем случайную, учитывая историю
return get_non_repeating_response(phrases, last_two_responses)
target_words = input_words[-2:] if len(input_words) >= 2 else input_words[-1:]
# Ищем подходящие фразы
matching_phrases = []
for phrase in phrases:
phrase_words = phrase.strip().split()
if phrase_words:
last_phrase_word = phrase_words[-1]
if has_repeating_letter_pairs(last_phrase_word):
# Проверяем совпадение последней пары букв
for target_word in target_words:
if len(target_word) >= 4:
target_pair = target_word[-4:][-2:] # последняя пара букв целевого слова
phrase_pair = last_phrase_word[-4:][-2:] # последняя пара букв слова из фразы базы
if target_pair == phrase_pair:
matching_phrases.append(phrase)
break
# Если нашли подходящие фразы, выбираем без повтора
if matching_phrases:
available_responses = [p for p in matching_phrases if p not in last_two_responses]
if available_responses:
return random.choice(available_responses)
else:
# Если все подходящие были в последних двух ответах, берём любую не из последних двух
all_available = [p for p in phrases if p not in last_two_responses]
if all_available:
return random.choice(all_available)
# Если подходящих фраз нет, возвращаем любую не из последних двух ответов
return get_non_repeating_response(phrases, last_two_responses)
def get_non_repeating_response(phrases, last_two_responses):
"""
Возвращает случайную фразу, которой не было в последних двух ответах.
Если все фразы были, возвращает любую.
"""
available = [p for p in phrases if p not in last_two_responses]
if available:
return random.choice(available)
else:
return random.choice(phrases) # если все фразы были — возвращаем любую
def add_phrase_to_file(phrase, filename):
"""
Добавляет фразу в файл без вывода сообщений.
"""
with open(filename, 'a', encoding='utf-8') as file:
file.write(phrase.strip() + '\n')
def main():
filename = 'текст2.txt'
last_two_responses = [] # храним два последних ответа (самый свежий — в конце)
# Читаем фразы из файла
try:
with open(filename, 'r', encoding='utf-8') as file:
phrases = [line.strip() for line in file if line.strip()]
except FileNotFoundError:
phrases = [] # Если файла нет, начинаем с пустого списка
# Бесконечный цикл ввода
while True:
user_input = input()
# Добавляем введённую фразу в файл
add_phrase_to_file(user_input, filename)
# Обновляем список фраз, добавляя новую
phrases.append(user_input.strip())
# Находим и выводим ответ, учитывая два предыдущих ответа
response = find_matching_phrase(user_input, phrases, last_two_responses)
print(response)
# Обновляем историю последних двух ответов: убираем самый старый, добавляем новый
if len(last_two_responses) >= 2:
last_two_responses.pop(0)
last_two_responses.append(response)
if __name__ == '__main__':
main()
=-->
import random
def has_repeating_letter_pairs(word):
"""
Проверяет, есть ли повторяющиеся пары букв в последних 4 буквах слова.
Возвращает True, если есть повтор, иначе False.
"""
if len(word) < 4:
return False
# Берём последние 4 буквы
last_four = word[-4:]
# Разбиваем на пары: [0:2] и [2:4]
pair1 = last_four[:2]
pair2 = last_four[2:]
return pair1 == pair2
def find_matching_phrase(input_phrase, phrases):
"""
Ищет фразу из списка, где в последнем слове есть повторяющиеся пары букв.
Если не находит, возвращает случайную фразу.
"""
# Получаем последнее слово из введённой фразы
input_words = input_phrase.strip().split()
if not input_words:
return random.choice(phrases)
last_word = input_words[-1]
# Ищем подходящие фразы
matching_phrases = []
for phrase in phrases:
phrase_words = phrase.strip().split()
if phrase_words: # если фраза не пустая
last_phrase_word = phrase_words[-1]
if has_repeating_letter_pairs(last_phrase_word):
matching_phrases.append(phrase)
# Если нашли подходящие фразы, возвращаем одну из них (случайную)
if matching_phrases:
return random.choice(matching_phrases)
else:
# Иначе возвращаем случайную фразу из всего списка
return random.choice(phrases)
def add_phrase_to_file(phrase, filename):
"""
Добавляет фразу в файл без вывода сообщений.
"""
with open(filename, 'a', encoding='utf-8') as file:
file.write(phrase.strip() + '\n')
def main():
filename = 'текст2.txt'
# Читаем фразы из файла
try:
with open(filename, 'r', encoding='utf-8') as file:
phrases = [line.strip() for line in file if line.strip()]
except FileNotFoundError:
phrases = [] # Если файла нет, начинаем с пустого списка
# Бесконечный цикл ввода
while True:
user_input = input()
# Добавляем введённую фразу в файл
add_phrase_to_file(user_input, filename)
# Обновляем список фраз, добавляя новую
phrases.append(user_input.strip())
# Находим и выводим ответ
response = find_matching_phrase(user_input, phrases)
print(response)
if __name__ == '__main__':
main()
** =-->
import random
def has_repeating_letter_pairs(word):
"""
Проверяет, есть ли повторяющиеся пары букв в последних 4 буквах слова.
Возвращает True, если есть повтор, иначе False.
"""
if len(word) < 4:
return False
# Берём последние 4 буквы
last_four = word[-4:]
# Разбиваем на пары: [0:2] и [2:4]
pair1 = last_four[:2]
pair2 = last_four[2:]
return pair1 == pair2
def find_matching_phrase(input_phrase, phrases):
"""
Ищет фразу из списка, где в последнем слове есть повторяющиеся пары букв.
Если не находит, возвращает случайную фразу.
"""
# Получаем последнее слово из введённой фразы
input_words = input_phrase.strip().split()
if not input_words:
return random.choice(phrases)
last_word = input_words[-1]
# Ищем подходящие фразы
matching_phrases = []
for phrase in phrases:
phrase_words = phrase.strip().split()
if phrase_words: # если фраза не пустая
last_phrase_word = phrase_words[-1]
if has_repeating_letter_pairs(last_phrase_word):
matching_phrases.append(phrase)
# Если нашли подходящие фразы, возвращаем одну из них (случайную)
if matching_phrases:
return random.choice(matching_phrases)
else:
# Иначе возвращаем случайную фразу из всего списка
return random.choice(phrases)
def main():
# Читаем фразы из файла
try:
with open('текст2.txt', 'r', encoding='utf-8') as file:
phrases = [line.strip() for line in file if line.strip()]
except FileNotFoundError:
print("Файл текст2.txt не найден!")
return
# Бесконечный цикл ввода
while True:
user_input = input()
response = find_matching_phrase(user_input, phrases)
print(response)
if __name__ == '__main__':
main()
Алиса
Разберу задачу и предложу готовое решение на Python.
Логика работы программы
Пользователь вводит фразу.
Программа извлекает последнее слово из введённой фразы.
Из последнего слова выделяются все возможные пары соседних букв (биграммы) из последних 4–5 букв.
Программа читает файл текст2.txt с набором фраз.
Для каждой фразы из файла:
извлекается последнее слово;
проверяются совпадения биграмм из последнего слова введённой фразы и последнего слова фразы из файла;
если совпадение найдено — фраза добавляется в список подходящих.
Если подходящие фразы найдены — выводится случайная из них.
Если совпадений нет — выводится любая случайная фраза из файла.
Код программы - python
import random
import re
def extract_last_word(phrase):
words = re.findall(r'\b[а-яёА-ЯЁ]+\b', phrase)
return words[-1].lower() if words else ''
def get_last_bigrams(word, n=4):
if len(word) < 2:
return set()
end_part = word[-n:]
bigrams = set()
for i in range(len(end_part) - 1):
bigrams.add(end_part[i:i+2])
return bigrams
def find_matching_phrases(input_phrase, phrases):
last_word = extract_last_word(input_phrase)
if not last_word:
return None
target_bigrams = get_last_bigrams(last_word)
matching = []
for phrase in phrases:
phrase_last_word = extract_last_word(phrase)
if not phrase_last_word:
continue
phrase_bigrams = get_last_bigrams(phrase_last_word)
if target_bigrams & phrase_bigrams:
matching.append(phrase)
return matching
def save_phrases_to_file(phrases, filename='текст2.txt'):
with open(filename, 'w', encoding='utf-8') as f:
for phrase in phrases:
f.write(phrase + '\n')
phrases = []
try:
with open('текст2.txt', 'r', encoding='utf-8') as f:
phrases = [line.strip() for line in f if line.strip()]
except FileNotFoundError:
pass
print("Вводите фразы — программа будет отвечать подходящей или случайной фразой.\n")
while True:
try:
user_input = input("Введите фразу: ").strip()
if user_input and user_input not in phrases:
phrases.append(user_input)
print(f"Фраза добавлена в базу: '{user_input}'")
if len(phrases) == 1:
print(f"Ответ: {phrases[0]}")
continue
search_phrases = [p for p in phrases if p != user_input]
matching_phrases = find_matching_phrases(user_input, search_phrases)
if matching_phrases:
result = random.choice(matching_phrases)
print(f"Ответ: {result}")
else:
available_phrases = [p for p in phrases if p != user_input]
if available_phrases:
result = random.choice(available_phrases)
print(f"Ответ (случайная фраза): {result}")
else:
print(f"Ответ: {phrases[0]}")
except KeyboardInterrupt:
print("\n\nСохраняю изменения...")
save_phrases_to_file(phrases)
break
except Exception:
continue
** =-->
import random
import re
def extract_last_word(phrase):
"""Извлекает последнее слово из фразы, убирая знаки препинания."""
words = re.findall(r'\b[а-яёА-ЯЁ]+\b', phrase)
return words[-1].lower() if words else ''
def get_last_bigrams(word, n=4):
"""Получает пары букв (биграммы) из последних n букв слова."""
if len(word) < 2:
return set()
end_part = word[-n:]
bigrams = set()
for i in range(len(end_part) - 1):
bigrams.add(end_part[i:i+2])
return bigrams
def find_matching_phrases(input_phrase, phrases):
"""Находит фразы с совпадающими биграммами в последних словах."""
last_word = extract_last_word(input_phrase)
if not last_word:
return None
target_bigrams = get_last_bigrams(last_word)
matching = []
for phrase in phrases:
phrase_last_word = extract_last_word(phrase)
if not phrase_last_word:
continue
phrase_bigrams = get_last_bigrams(phrase_last_word)
# Проверяем, есть ли общие биграммы
if target_bigrams & phrase_bigrams:
matching.append(phrase)
return matching
def main():
# Читаем фразы из файла
try:
with open('текст2.txt', 'r', encoding='utf-8') as f:
phrases = [line.strip() for line in f if line.strip()]
except FileNotFoundError:
print("Файл 'текст2.txt' не найден!")
return
if not phrases:
print("Файл пуст!")
return
# Ввод пользователя
user_input = input("Введите фразу: ")
# Ищем подходящие фразы
matching_phrases = find_matching_phrases(user_input, phrases)
if matching_phrases:
# Выводим случайную подходящую фразу
result = random.choice(matching_phrases)
print(f"Ответ: {result}")
else:
# Если совпадений нет, выводим любую случайную фразу
result = random.choice(phrases)
print(f"Ответ (случайная фраза): {result}")
if __name__ == "__main__":
main()
Как подготовить файл текст2.txt
Создайте файл текст2.txt в той же папке, где будет скрипт,
и добавьте туда фразы — по одной на строку:
Я недавно поела
Как твои дела?
Всё хорошо, спасибо!
Я читала книгу вчера
Она сказала правду
Мы гуляли в парке
Я устала немного
Мама приготовила ужин
Она знала ответ
Мы играли весь день
Примеры работы программы
Пример 1:
Ввод: так хорошо как дела
Последнее слово: дела
Биграммы: де, ла
Находит фразы с ла в конце: Я недавно поела, Я устала немного, Она знала ответ
Вывод: Я недавно поела (случайный выбор из подходящих)
Пример 2:
Ввод: привет как настроение
Последнее слово: настроение
Биграммы из конца: ие, ен, ни, тр
Если нет фраз с такими биграммами — выводится любая случайная фраза из файла
Пояснения к коду
extract_last_word: убирает знаки препинания и возвращает последнее слово в нижнем регистре.
get_last_bigrams: создаёт набор пар букв из последних символов слова (например, для дела ; {'де', 'ла'}).
find_matching_phrases: сравнивает биграммы и собирает список фраз с совпадениями.
Обработка ошибок: программа проверяет наличие файла и его содержимое.
Случайный выбор: random.choice() гарантирует непредсказуемость ответа.
Хотите, я уточню какой;то момент или помогу адаптировать код под дополнительные требования?
Вот код без каких;либо ключевых слов — можно вводить абсолютно любые фразы, программа будет работать бесконечно, пока вы её не закроёте (например, через Ctrl+C):
import random
import re
def extract_last_word(phrase):
"""Извлекает последнее слово из фразы, убирая знаки препинания."""
words = re.findall(r'\b[а-яёА-ЯЁ]+\b', phrase)
return words[-1].lower() if words else ''
def get_last_bigrams(word, n=4):
"""Получает пары букв (биграммы) из последних n букв слова."""
if len(word) < 2:
return set()
end_part = word[-n:]
bigrams = set()
for i in range(len(end_part) - 1):
bigrams.add(end_part[i:i+2])
return bigrams
def find_matching_phrases(input_phrase, phrases):
"""Находит фразы с совпадающими биграммами в последних словах."""
last_word = extract_last_word(input_phrase)
if not last_word:
return None
target_bigrams = get_last_bigrams(last_word)
matching = []
for phrase in phrases:
phrase_last_word = extract_last_word(phrase)
if not phrase_last_word:
continue
phrase_bigrams = get_last_bigrams(phrase_last_word)
# Проверяем, есть ли общие биграммы
if target_bigrams & phrase_bigrams:
matching.append(phrase)
return matching
def save_phrases_to_file(phrases, filename='текст2.txt'):
"""Сохраняет все фразы в файл."""
with open(filename, 'w', encoding='utf-8') as f:
for phrase in phrases:
f.write(phrase + '\n')
def main():
# Читаем фразы из файла
try:
with open('текст2.txt', 'r', encoding='utf-8') as f:
phrases = [line.strip() for line in f if line.strip()]
except FileNotFoundError:
print("Файл 'текст2.txt' не найден! Создам новый.")
phrases = []
print("Программа запущена. Вводите любые фразы — они автоматически сохраняются и используются для ответов.\n")
while True:
try:
user_input = input("Введите фразу: ").strip()
# Автоматически добавляем введённую фразу в список (если её там ещё нет)
if user_input and user_input not in phrases:
phrases.append(user_input)
print(f"Фраза добавлена в базу: '{user_input}'")
# Если фраз пока нет (кроме только что добавленной)
if len(phrases) == 1:
print("Это первая фраза в базе. Ответ будет случайным (пока только эта фраза).")
print(f"Ответ: {phrases[0]}")
continue
# Ищем подходящие фразы (исключаем саму введённую фразу из поиска совпадений)
search_phrases = [p for p in phrases if p != user_input]
matching_phrases = find_matching_phrases(user_input, search_phrases)
if matching_phrases:
# Выводим случайную подходящую фразу
result = random.choice(matching_phrases)
print(f"Ответ: {result}")
else:
# Если совпадений нет, выводим любую случайную фразу (кроме введённой)
available_phrases = [p for p in phrases if p != user_input]
if available_phrases:
result = random.choice(available_phrases)
print(f"Ответ (случайная фраза): {result}")
else:
print("В базе только одна фраза — она же и выводится.")
print(f"Ответ: {phrases[0]}")
except KeyboardInterrupt:
# Обработка прерывания программы через Ctrl+C
print("\n\nПрограмма прервана пользователем. Сохраняю изменения...")
save_phrases_to_file(phrases)
break
except Exception as e:
print(f"\nПроизошла ошибка: {e}")
print("Продолжаю ..")
if __name__ == "__main__":
main()
Как работает программа
Бесконечный цикл — программа работает до тех пор, пока вы не прервёте её (например, с помощью Ctrl+C).
Любой ввод — вы можете вводить абсолютно любые фразы без каких;либо ограничений или специальных команд.
Автоматическое добавление — каждая введённая фраза автоматически сохраняется в списке фраз (если её ещё нет).
Поиск совпадений — программа ищет фразы с совпадающими парами букв (биграммами) в последних словах.
Случайный ответ — если совпадений не найдено, выводится случайная фраза из базы (кроме самой введённой).
Сохранение при прерывании — все добавленные фразы сохраняются в файл текст2.txt при прерывании программы через Ctrl+C.
Пример сессии работы
Программа запущена. Вводите любые фразы — они автоматически сохраняются и используются для ответов.
Введите фразу: привет как дела
Фраза добавлена в базу: 'привет как дела'
Это первая фраза в базе. Ответ будет случайным (пока только эта фраза).
Ответ: привет как дела
Введите фразу: я недавно поела
Фраза добавлена в базу: 'я недавно поела'
Ответ: привет как дела
Введите фразу: что нового
Фраза добавлена в базу: 'что нового'
Ответ: я недавно поела
Введите фразу: всё хорошо, спасибо!
Фраза добавлена в базу: 'всё хорошо, спасибо!'
Ответ: я недавно поела
^C
Программа прервана пользователем. Сохраняю изменения...
Ключевые особенности
Нет ключевых слов — никаких выход, добавить: и т.;д.
Автодобавление — любая введённая фраза (кроме пустой) автоматически добавляется в базу.
Исключение введённой фразы — при поиске совпадений и выборе случайного ответа сама введённая фраза не участвует.
Обработка первого ввода — специальный случай, когда в базе всего одна фраза.
Устойчивость к прерыванию — сохранение данных при остановке через Ctrl+C.
Обработка ошибок — программа продолжит работу при возникновении непредвиденных ошибок.
Хотите,
я уточню какой;то момент или помогу доработать код под дополнительные требования?
есть текст txt как нам понять на основе векторов пар слов и кусков слов например окончаний и корней что некоторые фразы в тексте связаны и вывести эти фразы группами как они связаны
Алиса
Разберу задачу пошагово — как на основе векторов слов и их частей выявить связанные фразы в тексте и сгруппировать их.
Шаг 1. Предобработка текста
Подготовьте текст:
Разбейте на предложения или смысловые блоки.
Приведите слова к нижнему регистру.
Удалите пунктуацию и лишние символы.
Разделите на токены (слова).
Шаг 2. Извлечение морфем (корней, окончаний)
Используйте стемминг или лемматизацию:
Стемминг (например, алгоритм Портера) отсекает окончания: «бегу», «бежишь» ; «бег».
Лемматизация приводит к начальной форме: «бегу» ; «бежать».
Для русского языка подойдут:
библиотека pymorphy2 (лемматизация);
nltk.stem.SnowballStemmer (стемминг).
Шаг 3. Векторизация
Выберите метод представления слов/морфем в виде векторов:
TF;IDF — учитывает частоту терминов в документе и их редкость во всём корпусе:
Подходит для коротких текстов.
Не учитывает семантику.
Word2Vec — создаёт векторы на основе контекстной близости:
Слова в похожих контекстах имеют близкие векторы.
Требует большого корпуса для обучения.
FastText — работает на уровне n;грамм (подстрок):
Учитывает морфологию: векторы для «бег», «-ущ», «-ий» и т.;д.
Эффективен для языков с богатой морфологией (русский).
BERT — контекстные эмбеддинги:
Вектор слова зависит от предложения, в котором оно встречается.
Высокая точность, но ресурсоёмкость.
Рекомендация: для анализа корней/окончаний оптимален FastText.
Шаг 4. Вычисление сходства
Для каждой пары фраз вычислите близость их векторных представлений. Популярные метрики:
Косинусное сходство (Cosine Similarity):
sim(A,B)=
;A;;;B;
A;B
;
Евклидово расстояние (Euclidean Distance):
d(A,B)=
i=1
;
n
;
(Ai ;Bi ) 2
;
Манхэттенское расстояние (Manhattan Distance):
d(A,B)=
i=1
;
n
;
;A
i
;
;B
i
;
;
Косинусное сходство чаще используют для векторов слов — оно устойчиво к длине вектора.
Шаг 5. Кластеризация фраз
Сгруппируйте фразы с высоким сходством. Методы:
K;means — задаёт фиксированное число групп.
DBSCAN — находит кластеры произвольной формы, устойчив к шуму.
Hierarchical Clustering — строит дерево объединения фраз.
Параметры:
порог сходства (например, косинусное > 0,7);
минимальное число фраз в группе (например, ; 2).
Шаг 6. Визуализация и вывод групп
Представьте результат в удобном формате:
Группа 1 (сходство > 0.8):
- "Бегу быстро"
- "Быстро бегу"
- "Я бегу быстро"
Группа 2 (сходство > 0.75):
- "Она бежит медленно"
- "Медленно бежит девочка"
Пример кода на Python
python
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.metrics.pairwise import cosine_similarity
from sklearn.cluster import DBSCAN
import pymorphy2
# Шаг 1–2: предобработка и лемматизация
morph = pymorphy2.MorphAnalyzer()
def preprocess(texts):
processed = []
for text in texts:
words = text.lower().split()
lemmas = [morph.parse(word)[0].normal_form for word in words]
processed.append(' '.join(lemmas))
return processed
# Исходные фразы
phrases = [
"Бегу быстро по парку",
"Быстро бегу домой",
"Кошка спит на диване",
"Спит маленький кот"
]
# Лемматизация
processed_phrases = preprocess(phrases)
# Шаг 3: векторизация TF-IDF
vectorizer = TfidfVectorizer()
X = vectorizer.fit_transform(processed_phrases)
# Шаг 4: косинусное сходство
similarity_matrix = cosine_similarity(X)
# Шаг 5: кластеризация DBSCAN
clustering = DBSCAN(eps=0.5, min_samples=2, metric='precomputed')
labels = clustering.fit_predict(1 - similarity_matrix) # 1 - сходство = расстояние
# Шаг 6: вывод групп
groups = {}
for idx, label in enumerate(labels):
if label != -1: # -1 — шум
groups.setdefault(label, []).append(phrases[idx])
for group_id, group in groups.items():
print(f"Группа {group_id + 1}:")
for phrase in group:
print(f" - {phrase}")
Важные нюансы
Размер окна контекста при обучении векторов (например, 5 слов вокруг целевого) влияет на семантику векторов.
Пороги сходства нужно подбирать экспериментально: слишком высокий — мало групп, слишком низкий — много шума.
Для FastText/BERT замените TfidfVectorizer на загрузку предобученной модели (библиотеки gensim, transformers).
Если важны именно морфемы, векторизуйте не целые слова, а их части (например, через FastText.get_subwords()).
Краткий итог
Предобработайте текст и выделите морфемы.
Преобразуйте фразы в векторы (TF;IDF, FastText и т.;д.).
Вычислите сходство между фразами (косинусное и др.).
Сгруппируйте похожие фразы (K;means, DBSCAN).
Выведите группы с указанием порога сходства.
Хотите, я уточню какой;то шаг подробнее или помогу адаптировать код под ваш конкретный случай?
Свидетельство о публикации №126032709244