4. Предварительная обработка данных

Во-первых, я импортировал соответствующие библиотеки. Я использовал эти коды в Google Colab. Потому что у меня не мощный GPU. Colab обеспечивает больше оперативной памяти и большую производительность. Я использовал Keras для глубокого обучения. Я установил Pydrive в Colab, чтобы получить доступ к папке моего проекта глубокого обучения.

# Import the dependencies
import numpy as np
import pandas as pd
import sys 
import json
import matplotlib.pyplot as plt
from keras.models import Sequential
from keras.layers import LSTM, Activation, Flatten, Dropout, Dense, Embedding, TimeDistributed, CuDNNLSTM
from keras.callbacks import ModelCheckpoint
from keras.utils import np_utils
# Code to read csv file into Colaboratory:
!pip install -U -q PyDrive
from pydrive.auth import GoogleAuth
from pydrive.drive import GoogleDrive
from google.colab import auth
from oauth2client.client import GoogleCredentials
# Authenticate and create the PyDrive client.
auth.authenticate_user()
gauth = GoogleAuth()
gauth.credentials = GoogleCredentials.get_application_default()
drive = GoogleDrive(gauth)

Я загрузил набор данных. Если вы загружаете CSV-файл в первый раз, вы загружаете CSV-файл на Google Диск и получаете идентификатор файла. На этом этапе можно использовать функции CreateFile и GetContentFile.

#https://drive.google.com/open?id=1OSIr7TKodCg3bvDU4pUN0A5dBgrybM2f
#downloaded = drive.CreateFile({'id':"1OSIr7TKodCg3bvDU4pUN0A5dBgrybM2f"}) 
#downloaded.GetContentFile('songAll.csv')
#Load the dataset
dataset = pd.read_csv('songAll.csv', encoding = "utf-8")

Вы можете увидеть описание набора данных.

Я создал столбец track_n в наборе данных. Это необходимо для кодирования этикетки.

dataset["track_n"]=dataset["title"]
from sklearn import preprocessing
le = preprocessing.LabelEncoder()
dataset["track_n"]=le.fit_transform(dataset["track_n"])
dataset.track_n += 1
dataset.to_csv('song-1.csv', index=False)

Из того, что мы видим, нам нужно соединить строки каждой песни, чтобы получить каждую песню отдельно в одной строке. Я создал метод и использовал его.

def processFirstLine(lyrics, songName, row):
    lyrics.append(row['lyrics'] + '\n')
    songName.append(row['title'])
    return lyrics,songName
# define empty lists for the lyrics , songName 
lyrics = []
songName = []
# songNumber indicates the song number in the dataset
songNumber = 1
# i indicates the song number
i = 0
isFirstLine = True
# Iterate through every lyrics line and join them together for each song independently 
for index,row in dataset.iterrows():
    if(songNumber == row['track_n']):
        if (isFirstLine):
            lyrics,songName = processFirstLine(lyrics,songName,row)
            isFirstLine = False
        else :
            #if we still in the same song , keep joining the lyrics lines    
            lyrics[i] +=  row['lyrics'] + '\n'
    #When it's done joining a song's lyrics lines , go to the next song :    
    else :
        lyrics,songName = processFirstLine(lyrics,songName,row)
        songNumber = row['track_n']
        i+=1
# Define a new pandas DataFrame to save songID , songName , Lyrics in it to use them later
lyrics_data_all = pd.DataFrame({'songName':songName, 'lyrics':lyrics })
lyrics_data = lyrics_data_all
#lyrics_data --> we have 220 songs

Теперь сохраните текст в текстовом файле, чтобы использовать его в LSTM RNN.

# Save Lyrics in .txt file
with open('lyricsText.txt', 'w',encoding="utf-8") as filehandle:  
    for listitem in lyrics:
        filehandle.write('%s\n' % listitem)

5. Предварительная обработка текста

5.1. Преобразовать текст в нижний регистр

# Load the dataset and convert it to lowercase :
textFileName = 'lyricsText.txt'
raw_text = open(textFileName, encoding = 'UTF-8').read()
raw_text = raw_text.lower()
# raw_text --> 'denesin bakalım, beni zorlamayı\ndenesin bakalım\nnasıl vazgeçecek, bu masal....'

5.2. Сопоставление символов

# Mapping chars to ints :
chars = sorted(list(set(raw_text)))
int_chars = dict((i, c) for i, c in enumerate(chars))
chars_int = dict((i, c) for c, i in enumerate(chars))
# int_chars --> {0: '\n',
 1: ' ',
 2: '!',
 3: '"',
 4: "'",
 5: '(',
 6: ')',
 7: ',',
 8: '-',
 9: '1',
 10: '2',...}
# Get number of chars and vocab in our text :
n_chars = len(raw_text)
n_vocab = len(chars)

Вы можете увидеть общее количество и символы. У меня 107142 символа и 47 словарных запасов.

print('Total Characters : ' , n_chars) # number of all the characters in lyricsText.txt
print('Total Vocab : ', n_vocab) # number of unique characters
#Total Characters :  107142
#Total Vocab :  47

5.3. Сделать образцы и этикетки

Сделайте образцы и этикетки для подачи LSTM RNN

# process the dataset:
seq_len = 100
data_X = []
data_y = []
for i in range(0, n_chars - seq_len, 1):
    # Input Sequeance(will be used as samples)
    seq_in  = raw_text[i:i+seq_len]
    # Output sequence (will be used as target)
    seq_out = raw_text[i + seq_len]
    # Store samples in data_X
    data_X.append([chars_int[char] for char in seq_in])
    # Store targets in data_y
    data_y.append(chars_int[seq_out])
n_patterns = len(data_X)
print( 'Total Patterns : ', n_patterns)

5.4. Подготовьте образцы и этикетки:

подготовьте образцы и этикетки, чтобы они были готовы войти в нашу модель.

  • Изменить форму образцов
  • Нормализуйте их
  • Одно горячее кодирование выходных целей
# Reshape X to be suitable to go into LSTM RNN :
X = np.reshape(data_X , (n_patterns, seq_len, 1))
# Normalizing input data :
X = X/ float(n_vocab)
# One hot encode the output targets :
y = np_utils.to_categorical(data_y)