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)