Python - генерация оригинального текста

Python — генерация оригинального текста

Привет всем! Как-то нежданно дошли руки написать сегодняшний пост, посвященный тематике: Python — генерация оригинального текста. В основе лежит этот текст, сегодняшний — лишь продолжение идеи. Поехали!

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

Для начала создадим текстовый файл, в котором будет лежать текст рассылки. Назовем его: text_for_mail.txt

Внутри я положил фрагмент текста произведения Виктора Суворова «Аквариум» 🙂 Первое, что пришло в голову. В оригинале текст выглядит следующим образом:
«Для начала неплохо. Я уже перед своим танком. Резко прыгаю и по наклонному лобовому броневому листу взбегаю к башне. Мой люк открыт, и радист протягивает мой шлем, уже подключенный к внутренней связи. Шлем из мира грохота и рева переносит меня в мир тишины и спокойствия. Но наушники оживают мгновенно, разрушая зыбкую иллюзию тишины. »

Попробуем представить, какие слова можно заменить. Подумалось, что этими словами могут быть:
1. неплохо
2. танком
3. прыгаю
4. шлем
5. грохота и рева
6. иллюзию

Можно, конечно, и больше — но для тестового примера вполне сойдет 🙂 После должной обработки текст, над которым мы будем работать — будет выглядеть следующим образом:

Для начала |неплохо.,хорошо.,отлично.,великолепно.| Я уже перед своим |танком.,зверем.| Резко |прыгаю,взмываю,поднимаюсь| и по наклонному лобовому броневому листу взбегаю к башне.. Мой люк открыт, и радист протягивает |шлем,шлемофон| уже подключенный к внутренней связи.. Шлем из |адского,громкого,шумного| мира переносит меня в мир |тишины.,спокойствия.,порядка.,готовности.| Но |связь,наушники,гарнитура| оживают мгновенно, разрушая зыбкую |иллюзию,грань,границу,порог| тишины..

В основе лежит принцип выбора вариантов из списка, ограниченных предложением и вертикальной чертой. Т.е. программа должна определять предложение в тексте, брать предложение, находить в нем сегмент с вариантами текста, выбирать случайный, и выдавать итоговый вариант предложения, после чего — переходить к следующему предложению.

Самой сложной как по мне частью — оказалось определить предложение в целом. После некоторого количества времени и экспериментов на свет появилась конструкция в виде:
for text in re.split(‘\. |! |\? ‘, text_massive) — где у нас имеется цикл, работающий по разделению через точку, восклицательный и вопросительный знаки. Остальное — уже проще 🙂

Сам код выглядит следующим образом:

import re #Подключаем библиотеку, отвечающую за парсинг по регулярному выражению
import random #Подключаем библиотеку, отвечающую за работу со случайными числами
final_massive = [] #Создаем список, в который будем складывать итоговые предложения
max_text = int(input('Сколько предложений генерировать: ')) #Создали переменную, которая отвечает за количество генерируемых предложений
min_text = 0 #Указали минимальное количество
while min_text <= max_text: #Создали цикл, который будет работать пока - минимальное количество нужных для генерации предложений не станет больше либо равным заданному
with open('text_for_work.txt', 'r', encoding='utf-8') as text_from_file: #Открываем файл с исходным текстом
text_massive = str(text_from_file.read()) #Читаем содержимое файла, конвертируем в строчную переменную
ok = [] #Создаем переменную, в которую будем помещать обработанное предложение
for text in re.split('\. |! |\? ', text_massive): #Определяем границы предложения по знакам: точка, восклицательный, вопросительный. Как только определили - берем его в работу.
if text[0].isupper(): #Если первый символ предложения - большой, работаем:
text = text.split(' ') #Определяем состав предложения по словам
for slovo in text: #Делаем цикл, который будет обрабатывать каждое слово
regxp = '\|([^|]+)\|' #Вводим в программу регулярное выражение, которое будет искать все, что находится в вертикальном слеше
result = re.findall(regxp, slovo) #Парсим 
result = str(result) #Нашли - помещаем найденное в строчную переменную
result = result.replace('[', '').replace(']', '').replace('\'', '|') #Удаляем лишнее
if slovo != result: #Если найденное НЕ соответствует результатам работы парсера - 
ok.append(slovo) #Добавляем это слово в переменную, которая отвечает за работу с конкретным предложением
elif slovo == result: #Если найденное СООТВЕТСТВУЕТ
slovo = slovo.split(',') #Разбиваем найденное через запятую, определяя таким образом возможные варианты замены
random_number = random.randrange(0, len(slovo)) #Выбираем случайное число из заданного диапазона
slovo = slovo[random_number] #Берем слово, которое соответствует заданной позиции из списка возможных вариантов для замены
slovo = slovo.replace('|', '') #Удаляем лишнее
ok.append(slovo) #Добавляем результат работы в список с готовым предложением
final_massive.append(ok) #Добавили готовое предложение в список с окончательным готовым текстом
with open('text_for_mail.txt', 'a', encoding='utf-8') as f: #Сохраняем в файл с результатами готовое предложение - для начала его откроем
ok = str(ok).replace('[', '').replace('\'', '').replace(']', '').replace(',', '') #Удалим лишнее
f.write(ok + '\n \n') #Сохраним в файл результат работы
min_text = min_text + 1 #Увеличим переменную на единицу

Собственно, на этом пока все 🙂 Да - код (доступен на Git) сыроват, но работает, и в ближайшее время постараюсь допилить его - что бы он был не так громоздок 🙂

Не забывайте задавать вопросы в почту или Telegram 🙂 И да - клик на баннеры увеличиваем оптимизм 🙂

Support the Blog!

Running a blog takes a lot of effort, time, and passion. Your donations help improve the content, inspire new ideas, and keep the project going.
If you’ve enjoyed the blog’s materials, any support would mean the world to me. Thank you for being here! ❤️

PayPal Logo Donate via PayPal

Revolut Logo Donate via Revolut