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

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

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

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

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

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

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

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

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

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

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

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

  1. import re #Подключаем библиотеку, отвечающую за парсинг по регулярному выражению
  2. import random #Подключаем библиотеку, отвечающую за работу со случайными числами
  3. final_massive = [] #Создаем список, в который будем складывать итоговые предложения
  4. max_text = int(input('Сколько предложений генерировать: ')) #Создали переменную, которая отвечает за количество генерируемых предложений
  5. min_text = 0 #Указали минимальное количество
  6.  
  7. while min_text <= max_text: #Создали цикл, который будет работать пока - минимальное количество нужных для генерации предложений не станет больше либо равным заданному
  8.     with open('text_for_work.txt', 'r', encoding='utf-8') as text_from_file: #Открываем файл с исходным текстом
  9.         text_massive = str(text_from_file.read()) #Читаем содержимое файла, конвертируем в строчную переменную
  10.         ok = [] #Создаем переменную, в которую будем помещать обработанное предложение
  11.         for text in re.split('\. |! |\? ', text_massive): #Определяем границы предложения по знакам: точка, восклицательный, вопросительный. Как только определили - берем его в работу.
  12.             if text[0].isupper(): #Если первый символ предложения - большой, работаем:
  13.                 text = text.split(' ') #Определяем состав предложения по словам
  14.                 for slovo in text: #Делаем цикл, который будет обрабатывать каждое слово
  15.                     regxp = '\|([^|]+)\|' #Вводим в программу регулярное выражение, которое будет искать все, что находится в вертикальном слеше
  16.                     result = re.findall(regxp, slovo) #Парсим 
  17.                     result = str(result) #Нашли - помещаем найденное в строчную переменную
  18.                     result = result.replace('[', '').replace(']', '').replace('\'', '|') #Удаляем лишнее
  19.                     if slovo != result: #Если найденное НЕ соответствует результатам работы парсера - 
  20.                         ok.append(slovo) #Добавляем это слово в переменную, которая отвечает за работу с конкретным предложением
  21.                     elif slovo == result: #Если найденное СООТВЕТСТВУЕТ
  22.                         slovo = slovo.split(',') #Разбиваем найденное через запятую, определяя таким образом возможные варианты замены
  23.                         random_number = random.randrange(0, len(slovo)) #Выбираем случайное число из заданного диапазона
  24.                         slovo = slovo[random_number] #Берем слово, которое соответствует заданной позиции из списка возможных вариантов для замены
  25.                         slovo = slovo.replace('|', '') #Удаляем лишнее
  26.                         ok.append(slovo) #Добавляем результат работы в список с готовым предложением
  27.                 final_massive.append(ok) #Добавили готовое предложение в список с окончательным готовым текстом
  28.         with open('text_for_mail.txt', 'a', encoding='utf-8') as f: #Сохраняем в файл с результатами готовое предложение - для начала его откроем
  29.             ok = str(ok).replace('[', '').replace('\'', '').replace(']', '').replace(',', '') #Удалим лишнее
  30.             f.write(ok + '\n \n') #Сохраним в файл результат работы
  31.     min_text = min_text + 1 #Увеличим переменную на единицу

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

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