Сегодня попробуем обучить свою собственную нейронную сеть, чтобы писала текст для песен. Обучающей выборкой будут тексты группы "Руки Вверх". Ничто не мешает чтобы поменять данные на тексты своих любимых групп. Для извлечения данных с веб-сайтов используем 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)


  1. ivantgam
    26.08.2019 16:42

    Если увеличить количество обработанного текста, то улучшится ли качество генерации?
    На текущем этапе оно посредственное.


    1. tvr
      26.08.2019 16:47

      Не, не улучшится — включите любую русскоязычную, и подозреваю не только русскоязычную, попсу.
      Я всегда подозревал, что тексты им пишет нечто недообученное и не совсем человекообразное. Теперь я это знаю точно.


    1. fuwiak Автор
      26.08.2019 16:50
      +1

      В целом да. Нужно тоже изменить параметры типа temperature etc, как и можно найти h5 файл с моделем конкретно под русский язык, всё-таки прийдется постараться чтобы поднять качество.


  1. Yeah
    26.08.2019 17:41

    Мне кажется, или рифмы нет?


  1. GeniusStyle
    26.08.2019 17:58

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


  1. fuwiak Автор
    26.08.2019 18:05

    Очень хорошая идея. Но работы будет гораздо больше чем на 10 минут. На качественную генерацию прийдется натрудиться.


  1. dmipin02
    27.08.2019 00:14

    Виртуальная среда для проекта(virtualenv).
    REPO

    А у Вас спина белая У Вас тут ссылка на репозиторий есть, а собственно, самого репозитория нет (404).
    Поправьте пожалуйста.


    1. fuwiak Автор
      27.08.2019 00:16

      Сделал REPО на public, уже должно работать. Если что, пишите в личку.


  1. decomeron
    27.08.2019 07:57

    Интересно, а можно это сделать со стихами, например, Пушкина? Или короткими рассказами какого-то нибудь писателя. Сколько минимум нужно песен для обучения нейросети?


    1. fuwiak Автор
      27.08.2019 12:43

      Интересно, а можно это сделать со стихами, например, Пушкина?

      Можно попробовать с любом типом текста.
      Сколько минимум нужно песен для обучения нейросети?

      Минимально больше чем ноль. В принципе, чем больше, тем лучше.


  1. borges
    27.08.2019 12:31

    Странная статья. Похоже на текст, сгенерированный нейросетью.


  1. dron88
    27.08.2019 12:44

    У меня вопрос возник или даже идея, могу ли я скармливая определенной тематики новости, начать генерить новые «fake news»?


    1. fuwiak Автор
      27.08.2019 12:52

      Генерить да, только не советую потом выкладывать результат в интернет.


  1. Arevik
    28.08.2019 13:07

    Спасибо. Интересно!
    А можно примеры «нагенерённого» текста


    1. fuwiak Автор
      28.08.2019 19:03

      Когда будет гораздо лучше чем на картинке в статье, тогда обязательно выложу)