Сегодня попробуем обучить свою собственную нейронную сеть, чтобы писала текст для песен. Обучающей выборкой будут тексты группы "Руки Вверх". Ничто не мешает чтобы поменять данные на тексты своих любимых групп. Для извлечения данных с веб-сайтов используем Python3 (модуль BeautifulSoup).
Задача будет состоять в том, чтобы выгрузить данные(тексты) c веб-сайтов а потом на их основе обучить нейронную сеть.
На самом деле, можно разбить работу на 2 этапа:
Этап 1: выгрузить и сохранить тексты песни в удобном формате.
Этап 2: обучить свою собственную нейронную сеть.
Троллям и любителям искать тайный смысл сразу скажу:
- Я не являюсь сотрудником группы "Руки Вверх".
- Эта статья не является рекламой никакой группы.
- Я не получил за неё ни копейки.
- Не буду одобрять комментарии, в которых есть суть только причинить досаду автору, примерно про опечатки. Конечно стараюсь делать все без ошибок, к сожалению, не являюсь носителем русского языка и иногда чего-то не замечу, будьте добры и пишите об этом в личку. Другим со своими несмешными стебами предлагаю прогулку лесом.
Этап 1
Виртуальная среда для проекта(virtualenv).
REPO
#start
virtualenv -p python3 my_song #
#run
source my_song/bin/activate
#install modules
pip install -r requirements.txt
Выгрузка и сохранение текстов песни c веб-сайта в сохраняем в формате *.csv.
#-*- coding: utf-8 -*-
import urllib.request
from bs4 import BeautifulSoup
import pandas as pd
URL = 'http://txtmusic.ru/index.php?s=%D0%F3%EA%E8+%C2%E2%E5%F0%F5%21' #источник текстов
page = urllib.request.urlopen(URL)
soup = BeautifulSoup(page)
li = soup.body.findAll('li') # в теге <li> находиться информация про URL
URLS = ['http://txtmusic.ru/'+l.a.get('href') for l in li]
df = pd.DataFrame(columns=['name', 'text'])
list_of_names = []
list_of_text = []
ind=0
BIG = ""
for URL in URLS:
page = urllib.request.urlopen(URL)
soup = BeautifulSoup(page)
article = soup.body.findAll('article') # здесь находиться текст песни(тег аrticle)
text = str(article[0]).split('\n')[8]
text = text.split('<br/>')
text = [t for t in text if t!='']
text = " ".join(text)
name= str(article[0].h1).split(" - ")[1].rstrip("</h1>")
list_of_text.append(text)
list_of_names.append(name)
df.name = list_of_names
df.text = list_of_text
df.to_csv('songs.csv') # сохраняем песни в 'songs.csv'
Cледущий шаг — транслитерировать текст в латинский вариант(модель работает лучше на латиницу чем на кириллицу).
import pandas as pd
df = pd.read_csv('songs.csv')
df = df[['name','text']]
df.text = df.text.apply(lambda x: cyrtranslit.to_latin(x, 'ru'))
df.text.to_csv('trans.csv')
''' примерно
cyrtranslit.to_latin('Моё судно на воздушной подушке полно угрей', 'ru')
'Moyo sudno na vozdushnoj podushke polno ugrej'
cyrtranslit.to_cyrillic('Moyo sudno na vozdushnoj podushke polno ugrej')
'Моё судно на воздушной подушке полно угрей'
'''
Этап 2
from textgenrnn import textgenrnn
textgen = textgenrnn()
textgen.train_from_file('trans.csv', num_epochs=1) # created file textgenrnn_weights.hdf5
И все! Легко и удобно было использовать (textgenrnn)[https://github.com/minimaxir/textgenrnn], тексты все-таки еще не реалистичны, но придется изменить параметров модели самому.
Премущество textgenrnn заключается в том, что вам не нужно иметь дело с какой-либо обработкой данных, просто загрузите текстовый набор данных и присядьте с чашкой кофе, наблюдая за вашим обучением модели.
#Загрузите обученную модель и используйте ее
textgen_2 = textgenrnn('textgenrnn_weights.hdf5')
textgen_2.generate(3, temperature=1.0)
textgen_2.generate_to_file('lyrics.txt')
Что дальше?
Теперь, после того, как вы узнали, как сделать textgenrnn для создания текстов, вы можете многое сделать, используя эти знания :
- Cоздать статью на Википедии.
- Посты на соцсетях.
- Новости.
Список используемых источников:
https://github.com/minimaxir/textgenrnn
https://towardsdatascience.com/ai-generates-taylor-swifts-song-lyrics-6fd92a03ef7e
Комментарии (15)
GeniusStyle
26.08.2019 17:58Необходимо сделать корреляцию с источником звука, если темп быстрый — слова короткие, если замедляется — длинные. Ещё хорошо бы поработать с тональностью предлагаемых вариантов.
fuwiak Автор
26.08.2019 18:05Очень хорошая идея. Но работы будет гораздо больше чем на 10 минут. На качественную генерацию прийдется натрудиться.
decomeron
27.08.2019 07:57Интересно, а можно это сделать со стихами, например, Пушкина? Или короткими рассказами какого-то нибудь писателя. Сколько минимум нужно песен для обучения нейросети?
fuwiak Автор
27.08.2019 12:43Интересно, а можно это сделать со стихами, например, Пушкина?
Можно попробовать с любом типом текста.
Сколько минимум нужно песен для обучения нейросети?
Минимально больше чем ноль. В принципе, чем больше, тем лучше.
ivantgam
Если увеличить количество обработанного текста, то улучшится ли качество генерации?
На текущем этапе оно посредственное.
tvr
Не, не улучшится — включите любую русскоязычную, и подозреваю не только русскоязычную, попсу.
Я всегда подозревал, что тексты им пишет нечто недообученное и не совсем человекообразное. Теперь я это знаю точно.
fuwiak Автор
В целом да. Нужно тоже изменить параметры типа temperature etc, как и можно найти h5 файл с моделем конкретно под русский язык, всё-таки прийдется постараться чтобы поднять качество.