Привет всем! Как-то нежданно дошли руки написать сегодняшний пост, посвященный тематике: 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 🙂 И да — клик на баннеры увеличиваем оптимизм 🙂