色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

語言模型、RNN、LSTM以及NLP數(shù)據(jù)預(yù)處理流程

zhKF_jqr_AI ? 來源:未知 ? 作者:李倩 ? 2018-06-30 09:54 ? 次閱讀

編者按:Shopify數(shù)據(jù)科學(xué)家Ruslan Nikolaev通過歌詞生成這一例子介紹了語言模型、RNN、LSTM以及NLP數(shù)據(jù)預(yù)處理流程。

在所有未來的AI應(yīng)用中,一個重頭戲是創(chuàng)建能夠從某個數(shù)據(jù)集中學(xué)習(xí),接著生成原創(chuàng)內(nèi)容。應(yīng)用這一想法到自然語言處理(NLP),AI社區(qū)研發(fā)了語言模型(Language Model)

語言模型的假定是學(xué)習(xí)句子是如何在文本中組織的,并使用這一知識生成新內(nèi)容

在我的案例中,我希望進行一個有趣的業(yè)余項目,嘗試生成說唱歌詞,看看我是否能夠重現(xiàn)很受歡迎的加拿大說唱歌手Drake(#6god)的歌詞。

同時我也希望分享一個通用的機器學(xué)習(xí)項目流程,因為我發(fā)現(xiàn),如果你不是很清楚從哪里開始,自己創(chuàng)建一些新東西經(jīng)常是非常困難的。

1. 獲取數(shù)據(jù)

首先我們需要構(gòu)建一個包含所有Drake歌曲的數(shù)據(jù)集。我編寫了一個python腳本,抓取歌詞網(wǎng)站metrolyrics.com的網(wǎng)頁。

import urllib.request as urllib2

from bs4 importBeautifulSoup

import pandas as pd

import re

from unidecode import unidecode

quote_page = 'http://metrolyrics.com/{}-lyrics-drake.html'

filename = 'drake-songs.csv'

songs = pd.read_csv(filename)

for index, row in songs.iterrows():

page = urllib2.urlopen(quote_page.format(row['song']))

soup = BeautifulSoup(page, 'html.parser')

verses = soup.find_all('p', attrs={'class': 'verse'})

lyrics = ''

for verse in verses:

text = verse.text.strip()

text = re.sub(r"\[.*\]\n", "", unidecode(text))

if lyrics == '':

lyrics = lyrics + text.replace('\n', '|-|')

else:

lyrics = lyrics + '|-|' + text.replace('\n', '|-|')

songs.at[index, 'lyrics'] = lyrics

print('saving {}'.format(row['song']))

songs.head()

print('writing to .csv')

songs.to_csv(filename, sep=',', encoding='utf-8')

我使用了知名的BeautifulSoup包,我花了5分鐘,看了Justin Yek寫的How to scrape websites with Python and BeautifulSoup教程,了解了BeautifulSoup的用法。你可能已經(jīng)注意到了,在上面的代碼中,我迭代了songs這一dataframe。是的,實際上,我預(yù)先定義了想要抓取的歌名。

運行我編寫的python爬蟲后,.csv文件中包含了所有的歌詞。是時候開始預(yù)處理數(shù)據(jù)并創(chuàng)建模型了。

songs = pd.read_csv('data/drake-songs.csv')

songs.head(10)

pIYBAFs25ESAP0WuAACE7QjD3RQ019.png

DataFrame中儲存了所有歌詞

關(guān)于模型

現(xiàn)在,我們將討論文本生成的模型,這是本文的重頭戲。

創(chuàng)建語言模型的兩種主要方法:(一)字符層次模型;(二)單詞層次模型

這兩種方法的主要差別在于輸入和輸出。下面我將介紹這兩種方法到底是如何工作的。

字符層次模型

字符層次模型的輸入是一系列字符seed(種子),模型負責(zé)預(yù)測下一個字符new_char。接著使用seed + new_char生成下一個字符,以此類推。注意,由于網(wǎng)絡(luò)輸入必須保持同一形狀,在每一次迭代中,實際上我們將從種子丟棄一個字符。下面是一個簡單的可視化:

pIYBAFs25ESAHX-hAAAoPbMQ9SI342.png

在每一次迭代中,基本上模型根據(jù)給定的種子字符預(yù)測最可能出現(xiàn)的下一個字符,用條件概率可以表達為,尋找P(new_char | seed)的最大值,其中new_char是字母表中的任意字符。在我們的例子中,字符表是所有英語字母,加上空格字符。(注意,你的字母表可能大不一樣,取決于模型適用的語言,字母表可以包含任何你需要的字符。)

單詞層次模型

單詞層次模型幾乎和字符層次模型一模一樣,只不過生成下一個單詞,而不是下一個字符。下面是一個簡單的例子:

pIYBAFs25ESABthNAAAbpTIl3nA013.png

在單詞層次模型中,我們預(yù)測的單位不再是字符,而是單詞。也就是,P(new_word | seed),其中new_word是詞匯表中的任何單詞。

注意,現(xiàn)在我們要搜索的空間比之前大很多。在字符層次模型中,每次迭代只需搜索幾十種可能性,而在單詞層次模型中,每次迭代的搜索項多很多。因此,單詞層次算法需要在每次迭代上花費更多的時間,好在由于每次迭代生成的是一個完整的單詞,而不是單個字符,所以其實并沒有那么糟。

另外,在單詞層次模型中,我們可能會有一個非常多樣化的詞匯表。通常,我們通過在數(shù)據(jù)集中查找所有獨特的單詞構(gòu)建詞匯表(一般在數(shù)據(jù)預(yù)處理階段完成)。由于詞匯表可能變得無限大,有很多技術(shù)用于提升算法的效率,比如詞嵌入,以后我會專門寫文章介紹詞嵌入。

就本文而言,我將使用字符層次模型,因為它更容易實現(xiàn),同時,對字符層次模型的理解可以很容易地遷移到單詞層次模型。其實在我撰寫本文的時候,我已經(jīng)創(chuàng)建了一個單詞層次的模型——以后我會另外寫一篇文章加以介紹。

2. 數(shù)據(jù)預(yù)處理

就字符層次模型而言,我們將依照如下方式預(yù)處理數(shù)據(jù):

將數(shù)據(jù)集切分為token我們不能直接將字符串傳給模型,因為模型接受字符作為輸入。所以我們需要將每行歌詞切分為字符列表。

定義字母表上一步讓我們得到了所有可能出現(xiàn)在歌詞中的字符,我們將查找所有獨特的字符。為了簡化問題,再加上整個數(shù)據(jù)集不怎么大(我只使用了140首歌),我將使用英語字母表,加上一些特殊字符(比如空格),并忽略數(shù)字和其他東西(由于數(shù)據(jù)集較小,我將選擇讓模型預(yù)測較少種字符)。

創(chuàng)建訓(xùn)練序列我們將使用滑窗(sliding window)技術(shù),通過在序列上滑動固定尺寸的窗口創(chuàng)建訓(xùn)練樣本集。

pIYBAFs25EWANxRgAAHIuaQ_BjU779.png

每次移動一個字符,我們生成20個字符長的輸入,以及單個字符輸出。此外,我們得到了一個附帶的好處,由于我們每次移動一個字符,實際上我們顯著擴展了數(shù)據(jù)集的尺寸。

標(biāo)簽編碼訓(xùn)練序列最后,由于我們不打算讓模型處理原始字符(不過理論上這是可行的,因為技術(shù)上字符即數(shù)字,你幾乎可以說ASCII為我們編碼了所有字符),我們將給字母表中的每個字符分配一個整數(shù),你也許聽說過這一做法的名稱,標(biāo)簽編碼(Label Encoding)。我們創(chuàng)建了映射character-to-index和index-to-character。有了這兩個映射,我們總是能夠?qū)⑷魏巫址幋a為獨特的整數(shù),同時解碼模型輸出的索引數(shù)字為原本的字符。

one-hot編碼數(shù)據(jù)集由于我們處理的是類別數(shù)據(jù)(字符屬于某一類別),因此我們將編碼輸入列。關(guān)于one-hot編碼,可以參考Rakshith Vasudev撰寫的What is One Hot Encoding? Why And When do you have to use it?一文。

當(dāng)我們完成以上5步后,我們只需創(chuàng)建模型并加以訓(xùn)練。如果你對以上步驟的細節(jié)感興趣,可以參考下面的代碼。

加載所有歌曲,并將其合并為一個巨大的字符串。

songs = pd.read_csv('data/drake-songs.csv')

for index, row in songs['lyrics'].iteritems():

text = text + str(row).lower()

找出所有獨特的字符。

chars = sorted(list(set(text)))

創(chuàng)建character-to-index和index-to-character映射。

char_indices = dict((c, i) for i, c in enumerate(chars))

indices_char = dict((i, c) for i, c in enumerate(chars))

切分文本為序列。

maxlen = 20

step = 1

sentences = []

next_chars = []

# 迭代文本并保存序列

for i in range(0, len(text) - maxlen, step):

sentences.append(text[i: i + maxlen])

next_chars.append(text[i + maxlen])

為輸入和輸出創(chuàng)建空矩陣,然后將所有字符轉(zhuǎn)換為數(shù)字(標(biāo)簽編碼和one-hot向量化)。

x = np.zeros((len(sentences), maxlen, len(chars)), dtype=np.bool)

y = np.zeros((len(sentences), len(chars)), dtype=np.bool)

for i, sentence in enumerate(sentences):

for t, char in enumerate(sentence):

x[i, t, char_indices[char]] = 1

y[i, char_indices[next_chars[i]]] = 1

3. 創(chuàng)建模型

為了使用之前的一些字符預(yù)測接下來的字符,我們將使用循環(huán)神經(jīng)網(wǎng)絡(luò)(RNN),具體來說是長短時記憶網(wǎng)絡(luò)(LSTM)。如果你不熟悉這兩個概念,我建議你參考以下兩篇文章:循環(huán)神經(jīng)網(wǎng)絡(luò)入門和一文詳解LSTM網(wǎng)絡(luò)。如果你只是想溫習(xí)一下這兩個概念,或者信心十足,下面是一個快速的總結(jié)。

RNN

你通常見到的神經(jīng)網(wǎng)絡(luò)像是一張蜘蛛網(wǎng),從許多節(jié)點收斂至單個輸出。就像這樣:

pIYBAFs25EWAMyJHAAAVDyvP8_s130.png

圖片來源:neuralnetworksanddeeplearning.com/

在這里我們有單個輸入和單個輸出。這樣的網(wǎng)絡(luò)對非連續(xù)輸入效果很好,其中輸入的順序不影響輸出。但在我們的例子中,字符的順序非常重要,因為正是字符的特定順序構(gòu)建了單詞。

RNN接受連續(xù)的輸入,使用前一節(jié)點的激活作為后一節(jié)點的參數(shù)

pIYBAFs25EWACQgmAABzeWmBqlY990.png

LSTM

簡單的RNN有一個問題,它們不是非常擅長從非常早的單元將信息傳遞到之后的單元。例如,如果我們正查看句子Tryna keep it simple is a struggle for me,如果不能回頭查看之前出現(xiàn)的其他單詞,預(yù)測最后一個單詞me(可能是任何人或物,比如:Bake、cat、potato)是非常難的。

LSTM增加了一些記憶,儲存之前發(fā)生的某些信息。

pIYBAFs25EWAGEKRAABfP_LW3xE974.png

LSTM可視化;圖片來源:吳恩達的深度學(xué)習(xí)課程

除了傳遞a激活之外,同時傳遞包含之前節(jié)點發(fā)生信息的c。這正是LSTM更擅長保留上下文信息,一般而言在語言模型中能做出更好預(yù)測的原因。

代碼實現(xiàn)

我以前學(xué)過一點Keras,所以我使用這一框架構(gòu)建網(wǎng)絡(luò)。事實上,我們可以手工編寫網(wǎng)絡(luò),唯一的差別只不過是需要多花許多時間。

創(chuàng)建網(wǎng)絡(luò),并加上LSTM層:

model = Sequential()

model.add(LSTM(128, input_shape=(maxlen, len(chars))))

增加softmax層,以輸出單個字符:

model.add(Dense(len(chars)))

model.add(Activation('softmax'))

選擇損失函數(shù)(交叉熵)和優(yōu)化器(RMSprop),然后編譯模型:

model.compile(loss='categorical_crossentropy', optimizer=RMSprop(lr=0.01))

訓(xùn)練模型(我們使用了batch進行分批訓(xùn)練,略微加速了訓(xùn)練過程):

model.fit(x, y, batch_size=128, epochs=30)

4. 生成歌詞

訓(xùn)練網(wǎng)絡(luò)之后,我們將使用某個隨機種子(用戶輸入的字符串)作為輸入,讓網(wǎng)絡(luò)預(yù)測下一個字符。我們將重復(fù)這一過程,直到創(chuàng)建了足夠多的新行。

下面是一些生成歌詞的樣本(歌詞未經(jīng)審查)。

pIYBAFs25EaAdfheAABSUJzLOMs144.png

pIYBAFs25EaAVs5nAACO8xnd8LU546.png

pIYBAFs25EaAZVBRAACTyEokBwY580.png

pIYBAFs25EaAYZqTAABeS1kooQ0599.png

pIYBAFs25EaAI99kAACDaNedfIo681.png

你也許注意到了,有些單詞沒有意義,這是字符層次模型的一個十分常見的問題,輸入數(shù)據(jù)經(jīng)常在單詞中間切開,使得網(wǎng)絡(luò)學(xué)習(xí)并生成奇怪的新單詞,并通過某種方式賦予其“意義”。

單詞層面的模型能夠克服這一問題,不過對于一個不到200行代碼的項目而言,字符層次模型仍然十分令人印象深刻。

其他應(yīng)用

字符層次網(wǎng)絡(luò)的想法可以擴展到其他許多比歌詞生成更實際的應(yīng)用中。

例如,預(yù)測手機輸入:

pIYBAFs25EeAXA8UAABI_AlOT_Y420.png

想象一下,如果你創(chuàng)建了一個足夠精確的Python語言模型,它不僅可以自動補全關(guān)鍵字或變量名,還能自動補全大量代碼,大大節(jié)省程序員的時間。

你也許注意到了,這里的代碼并不是完整的,有些部分缺失了,完整代碼見我的GitHub倉庫nikolaevra/drake-lyric-generator。在那里你可以深入所有細節(jié),希望這有助于你自己創(chuàng)建類似項目。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 機器學(xué)習(xí)
    +關(guān)注

    關(guān)注

    66

    文章

    8438

    瀏覽量

    133024
  • python
    +關(guān)注

    關(guān)注

    56

    文章

    4807

    瀏覽量

    85010
  • 自然語言
    +關(guān)注

    關(guān)注

    1

    文章

    291

    瀏覽量

    13396

原文標(biāo)題:使用Keras和LSTM生成說唱歌詞

文章出處:【微信號:jqr_AI,微信公眾號:論智】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評論

    相關(guān)推薦

    【大語言模型:原理與工程實踐】大語言模型的預(yù)訓(xùn)練

    對話以及內(nèi)容豐富的網(wǎng)頁數(shù)據(jù)等。來自不同領(lǐng)域的數(shù)據(jù)則蘊含豐富的語義知識,如編程、科學(xué)、金融等,這有助于模型培養(yǎng)更全面的通用能力。常見來源如下: 大
    發(fā)表于 05-07 17:10

    FPGA也能做RNN

    ,GPU只能提供有限的并行性。針對這個問題,普渡大學(xué)的研究人員提出了一種LSTM在Zynq 7020 FPGA的硬件實現(xiàn)方案,該方案在FPGA中實現(xiàn)了2層128個隱藏單元的RNN,并且使用字符級語言
    發(fā)表于 07-31 10:11

    數(shù)據(jù)探索與數(shù)據(jù)預(yù)處理

    目錄1數(shù)據(jù)探索與數(shù)據(jù)預(yù)處理21.1 賽題回顧21.2 數(shù)據(jù)探索性分析與異常值處理21.3 相關(guān)性分析52特征工程82.1 光伏發(fā)電領(lǐng)域特征8
    發(fā)表于 07-12 08:37

    深度分析RNN模型結(jié)構(gòu),優(yōu)缺點以及RNN模型的幾種應(yīng)用

    強大的Bert模型家族,都是站在RNN的肩上,不斷演化、變強的。 這篇文章,闡述了RNN的方方面面,包括模型結(jié)構(gòu),優(yōu)缺點,RNN
    的頭像 發(fā)表于 05-13 10:47 ?2.4w次閱讀
    深度分析<b class='flag-5'>RNN</b>的<b class='flag-5'>模型</b>結(jié)構(gòu),優(yōu)缺點<b class='flag-5'>以及</b><b class='flag-5'>RNN</b><b class='flag-5'>模型</b>的幾種應(yīng)用

    RNN以及LSTM

    循環(huán)神經(jīng)網(wǎng)絡(luò)(Recurrent Neural Network,RNN)是一種用于處理序列數(shù)據(jù)的神經(jīng)網(wǎng)絡(luò)。相比一般的神經(jīng)網(wǎng)絡(luò)來說,他能夠處理序列變化的
    的頭像 發(fā)表于 03-15 10:44 ?1919次閱讀

    NLP模型RNN與CNN的選擇

    在自然語言處理NLP)領(lǐng)域,循環(huán)神經(jīng)網(wǎng)絡(luò)(RNN)與卷積神經(jīng)網(wǎng)絡(luò)(CNN)是兩種極為重要且廣泛應(yīng)用的網(wǎng)絡(luò)結(jié)構(gòu)。它們各自具有獨特的優(yōu)勢,適用于處理
    的頭像 發(fā)表于 07-03 15:59 ?638次閱讀

    用于自然語言處理的神經(jīng)網(wǎng)絡(luò)有哪些

    取得了顯著進展,成為處理自然語言任務(wù)的主要工具。本文將詳細介紹幾種常用于NLP的神經(jīng)網(wǎng)絡(luò)模型,包括遞歸神經(jīng)網(wǎng)絡(luò)(RNN)、長短時記憶網(wǎng)絡(luò)(
    的頭像 發(fā)表于 07-03 16:17 ?1392次閱讀

    nlp自然語言處理模型怎么做

    的進展。本文將詳細介紹NLP模型的構(gòu)建過程,包括數(shù)據(jù)預(yù)處理模型選擇、訓(xùn)練與優(yōu)化等方面。 數(shù)據(jù)
    的頭像 發(fā)表于 07-05 09:59 ?706次閱讀

    如何理解RNNLSTM神經(jīng)網(wǎng)絡(luò)

    的基本概念和應(yīng)用背景。這兩種網(wǎng)絡(luò)結(jié)構(gòu)都是深度學(xué)習(xí)領(lǐng)域中處理序列數(shù)據(jù)的重要工具,尤其在自然語言處理NLP)、時間序列分析等領(lǐng)域展現(xiàn)出強大的能
    的頭像 發(fā)表于 07-09 11:12 ?706次閱讀

    LSTM模型的基本組成

    長短期記憶網(wǎng)絡(luò)(Long Short-Term Memory, LSTM)是一種特殊的循環(huán)神經(jīng)網(wǎng)絡(luò)(RNN)架構(gòu),它在處理序列數(shù)據(jù)時能夠捕捉長期依賴關(guān)系,有效解決了傳統(tǒng)
    的頭像 發(fā)表于 07-10 17:01 ?1567次閱讀

    使用LSTM神經(jīng)網(wǎng)絡(luò)處理自然語言處理任務(wù)

    自然語言處理NLP)是人工智能領(lǐng)域的一個重要分支,它旨在使計算機能夠理解、解釋和生成人類語言。隨著深度學(xué)習(xí)技術(shù)的發(fā)展,特別是循環(huán)神經(jīng)網(wǎng)絡(luò)(RNN
    的頭像 發(fā)表于 11-13 09:56 ?481次閱讀

    LSTM神經(jīng)網(wǎng)絡(luò)的優(yōu)缺點分析

    序列數(shù)據(jù)時的優(yōu)越性能而受到廣泛關(guān)注,特別是在自然語言處理NLP)、語音識別和時間序列預(yù)測等領(lǐng)域。 LSTM的優(yōu)點 1. 記憶能力
    的頭像 發(fā)表于 11-13 09:57 ?2070次閱讀

    LSTM神經(jīng)網(wǎng)絡(luò)與傳統(tǒng)RNN的區(qū)別

    在深度學(xué)習(xí)領(lǐng)域,循環(huán)神經(jīng)網(wǎng)絡(luò)(RNN)因其能夠處理序列數(shù)據(jù)而受到廣泛關(guān)注。然而,傳統(tǒng)RNN處理長序列時存在梯度消失或梯度爆炸的問題。為了解
    的頭像 發(fā)表于 11-13 09:58 ?443次閱讀

    RNNLSTM模型的比較分析

    RNN(循環(huán)神經(jīng)網(wǎng)絡(luò))與LSTM(長短期記憶網(wǎng)絡(luò))模型在深度學(xué)習(xí)領(lǐng)域都具有處理序列數(shù)據(jù)的能力,但它們在結(jié)構(gòu)、功能和應(yīng)用上存在顯著的差異。以下
    的頭像 發(fā)表于 11-15 10:05 ?808次閱讀

    RNN的應(yīng)用領(lǐng)域及未來發(fā)展趨勢

    循環(huán)神經(jīng)網(wǎng)絡(luò)(Recurrent Neural Network, RNN)是一種適合于處理序列數(shù)據(jù)的深度學(xué)習(xí)模型。由于其獨特的循環(huán)結(jié)構(gòu),RNN
    的頭像 發(fā)表于 11-15 10:10 ?651次閱讀
    主站蜘蛛池模板: 亚洲国产韩国欧美在线不卡 | 久久99精国产一区二区三区四区 | 怡春院院日本一区二区久久 | 星空无限传媒视频在线观看视频 | 美女张开腿露尿口给男人亲 | 野花视频在线观看免费 | 色窝窝亚洲AV在线观看 | 亚洲伊人色综合久久天天伊人 | 吉吉影音先锋av资源 | 亚洲国产成人爱AV在线播放丿 | 老色69久久九九精品高潮 | 日韩人妻无码精品久久中文字幕 | 亚洲精品不卡视频 | 奶头从情趣内衣下露了出来AV | 9277在线观看资源 | 后入式狂顶免费视频 | 蜜桃视频无码区在线观看 | 纯肉高H种马艳遇风流多 | bl肉yin荡受np各种play | 欧美日韩一二区旡码高清在线 | 麻豆传煤网站网址入口在线下载 | 公粗挺进了我的密道在线播放贝壳 | 国产精品亚洲专区在线播放 | 国产午夜小视频 | 好男人在线视频 | 一级做a爰片久久毛片免费 一级做a爰片久久毛片潮喷动漫 | 亚洲免费无码av线观看 | 亚洲高清有码中文字 | 欧美亚洲高清国产 | AV无码国产精品午夜A片麻豆 | 少妇无码太爽了视频在线播放 | 日韩精品一区二区亚洲AV观看 | 亚洲国产系列一区二区三区 | 激情办公室| 香蕉久久夜色精品国产小优 | 99久久久无码国产精品免费人妻 | 亚洲精品m在线观看 | 日日夜夜影院在线播放 | c了瑜伽老师嗷嗷叫一节课视频 | 免费视频久久只有精品 | 亚洲福利天堂网福利在线观看 |