如何用50行代碼構(gòu)建情感分類器
本文介紹了如何構(gòu)建情感分類器,從介紹自然語(yǔ)言處理開始,一步一步講述構(gòu)建過程。
自然語(yǔ)言處理簡(jiǎn)介
語(yǔ)言把人類聯(lián)系在一起。語(yǔ)言是一種工具,它既可以讓我們把想法和感受傳達(dá)給另一個(gè)人,也能讓我們理解別人的想法和感受。我們大多數(shù)人從 1 歲半到 2 歲開始說話。人腦是如何在如此年幼的時(shí)候掌握如此大量知識(shí)的,這仍是未解之謎。但是,人們已經(jīng)發(fā)現(xiàn)大部分語(yǔ)言處理功能發(fā)生在大腦皮層內(nèi)。
情感分析背后的動(dòng)機(jī)
人類自己無法理解語(yǔ)言是如何被大腦處理的。那么,我們能教一臺(tái)機(jī)器學(xué)習(xí)我們的語(yǔ)言嗎?通過廣泛研究,人們已經(jīng)開發(fā)了許多方法來幫助機(jī)器理解語(yǔ)言。自然語(yǔ)言處理(NLP)是研究人類語(yǔ)言與計(jì)算機(jī)交互的領(lǐng)域。自然語(yǔ)言處理的一個(gè)子問題是情感分析,即把一個(gè)語(yǔ)句分類為積極或消極。把語(yǔ)句分類為積極或消極有什么用呢?以亞馬遜網(wǎng)站為例。在亞馬遜上,用戶可以對(duì)一個(gè)產(chǎn)品發(fā)表評(píng)論,說明它是好是壞,甚至可以是中性的。然而,使用人工閱讀所有評(píng)論并獲得客戶對(duì)產(chǎn)品的總體反饋既昂貴又耗時(shí)。再說說我們的機(jī)器學(xué)習(xí)模型。機(jī)器學(xué)習(xí)模型可以通過大量數(shù)據(jù)進(jìn)行推斷,對(duì)評(píng)論進(jìn)行分類。利用這種機(jī)器學(xué)習(xí)模型,亞馬遜可以通過客戶評(píng)論改進(jìn)其產(chǎn)品,從而為公司帶來更多收入。
情感分析并不像看起來那么簡(jiǎn)單。如果你認(rèn)為含有「好的」、「很棒」等詞的評(píng)論可歸為積極評(píng)論,而含有「壞的」、「苦惱的」等詞的評(píng)論可歸為消極評(píng)論,那你需要三思。例如,「完全沒有好味道」和「一份好的快餐,但沒有什么特別的」分別代表消極和中立的反饋,即使都有「好」字。因此,這項(xiàng)任務(wù)可能沒有看起來那么簡(jiǎn)單。接下來讓我們看看即將使用的數(shù)據(jù)。
數(shù)據(jù)集
我們將使用亞馬遜產(chǎn)品評(píng)論、IMDB 電影評(píng)論和 Yelp 評(píng)論來構(gòu)建情感分析模型。
數(shù)據(jù)下載鏈接:https://www.kaggle.com/marklvl/sentiment-labelled-sentences-data-set/data
所有數(shù)據(jù)都已經(jīng)過注釋,0 表示消極反饋,1 表示積極反饋。亞馬遜的數(shù)據(jù)與下圖相似。

代碼
我們可以寫一些代碼:

數(shù)據(jù)存儲(chǔ)于不同的文本文件中。我們打開每個(gè)文件并閱讀所有的文本行,文本行還包括每個(gè)文本的標(biāo)簽。然后我們將其存儲(chǔ)在一個(gè)名為「lines」的列表中。

數(shù)據(jù)集的每一行都包含文本,文本后是四個(gè)字符空間,還有該文本的標(biāo)簽(0 或 1)。因此,我們先將包含文本的***部分添加到 features(x) 中,然后獲取標(biāo)簽,標(biāo)簽的末尾有「\n」。所以標(biāo)簽被移除,然后添加到我們的標(biāo)簽列表 labels(y)。

Keras 有一個(gè)內(nèi)置的 API,使得準(zhǔn)備計(jì)算文本變得更容易。tokenizer 類共有 4 個(gè)屬性,可用于特征準(zhǔn)備。請(qǐng)看下面的示例,了解 tokenizer 的實(shí)際功能。

tokenizer 為句子中的每個(gè)單詞分配索引值,并且可以使用該索引值表示新句子。由于我們使用的文本語(yǔ)料庫(kù)包含大量不同的單詞,因此我們?cè)O(shè)置了一個(gè)上限,只使用最經(jīng)常出現(xiàn)的 2500 個(gè)單詞。

現(xiàn)在,我們將文本轉(zhuǎn)換為如上所示的數(shù)字序列,并填充數(shù)字序列。因?yàn)榫渥涌梢杂胁煌拈L(zhǎng)度,它們的序列長(zhǎng)度也會(huì)不同。因此,pad_sequences 會(huì)找出最長(zhǎng)的句子,并用 0 填充其他較短語(yǔ)句以匹配該長(zhǎng)度。

我們將標(biāo)簽轉(zhuǎn)換為 one hot 編碼,這有助于 LSTM 網(wǎng)絡(luò)預(yù)測(cè)文本的標(biāo)簽?,F(xiàn)在,我們已經(jīng)準(zhǔn)備好了文本數(shù)據(jù),可以把它分為訓(xùn)練樣本和測(cè)試樣本。將 80% 的數(shù)據(jù)用于訓(xùn)練,20% 的數(shù)據(jù)用于測(cè)試模型。

我們現(xiàn)在建立了模型,并對(duì)其進(jìn)行編譯、訓(xùn)練和測(cè)試。該模型具有嵌入層。輸入序列是文本的稀疏表征,因?yàn)樵~匯表巨大,并且給定單詞將由大向量表示。如果我們能夠構(gòu)建序列的某種密集表征,那么網(wǎng)絡(luò)將更容易進(jìn)行預(yù)測(cè)。2500 個(gè)單詞的詞嵌入/密集表征是通過嵌入層對(duì)模型進(jìn)行訓(xùn)練獲得的。然后,我們將 LSTM 和密集層添加到模型中。LSTM 單元負(fù)責(zé)進(jìn)行上下文推斷,并幫助預(yù)測(cè)句子是否積極。密集層輸出每個(gè)類的概率。本文不詳細(xì)介紹 LSTM,若想了解其更多信息,請(qǐng)參閱此博客:http://colah.github.io/posts/2015-08-Understanding-LSTMs/。
輸出

訓(xùn)練

測(cè)試
完成!你剛剛用 50 行代碼構(gòu)建了一個(gè)情感分類器~