1. 概述
在情感分析的應用領域,例如判斷某一句話是positive或者是negative的案例中,咱們可以通過傳統的standard neuro network來作為解決方案,但是傳統的神經網路在應用的時候是不能獲取前後文字之間的關係的,不能獲取到整個句子的乙個整體的意思,只能通過每乙個詞的意思來最終決定一句話的情感,這顯然是不合理的,導致的結果就是訓練出來的模型質量可能不是很高。那麼這裡就需要用到lstm來解決這個問題了,lstm能夠很好的表達出句子中詞的關係,能將句子當做乙個整體來看待,而不是乙個個單獨的詞。所以這一節主要講一下如何應用lstm來做句子的情感分析的應用,這裡主要包括2部分內容,第一部分是設計整個lstm的網路結構,第二步是用**是實現這個網路。
2. 結構設計
首先咱們知道應用的目的是根據句子的內容來判斷情感的,那麼咱們就可以很明確的知道這是乙個sequence model, 其次這個sequence model還是乙個many-to-one的結構。那麼這裡我為了提高咱們應用的複雜度,我選用了乙個2層的lstm layer, 就是將第一層的每乙個lstm cell 的輸出作為第二層的每乙個相應的lstm cell的輸入。聽起來挺抽象的,實際咱們通過下面的圖可以很清楚的看出它的整體結構(注意:下面的圖,我省略了lstm的memory cell,沒有畫出來)。實際的應用中,咱們很少會有大於3層的lstm layer,因為它計算所需要的資源是非常大的。其實在這個例子中,一層的lstm layer其實是足夠的,我這裡只是為了演示2層layer,所以故意這樣處理的,下面咱們看一下結構圖吧
首先第一步還是要將所有的word經過embedding layer, 然後再將這些features帶入到lstm layer中。第一層的lstm layer每乙個time step的輸出都需要作為第二步的輸入,所以在下面的**中,第一層的lstm的return_sequences需要設定成true;而第二層中只需要最後乙個time step的輸出,所以return_sequences設定成false。因為咱們這是的a, c設定的dimension都比較大,所以每一步都經過乙個dropout layer讓它按照一定的比例丟棄一部分資訊,否則咱們的計算成本太高了。既然它的結構咱們已經設計出來了,那接下來咱們看看它的**實現過程吧。
3.神經網路結構的**實現
上面的**咱們已經設計出來咱們對於這個應用的網路結構,接下來就是**實現的過程,這裡咱們應用了keras的functional api來搭建網路結構,咱們直接看一下**吧,這裡我只展示這個神經網路的構建**:
def首先第一步上面的model要定義乙個input, 它的shape就是一句話的長度;後面的embedding layer, dropout layer和lstm layer都是按照上面的結構來實現的。具體裡面的細節,我在**中的注釋已經寫得非常清楚了。主要有幾個細節部分需要注意一下,第乙個是hidden state的dimension;第二個是return_sequence的引數,如果大家對return_sequence和return_state的引數不理解,有疑問,我推薦大家看一下這個部落格,解釋的非常到位, 第三個就是上面的input_shape是省略batch_size引數的;至於這個model的fitting, evaluation等其他過程和其他的model都是一樣的,這裡我就不展開來說了,最核心的就是上面的這個結構的構建。sentiment_model(input_shape):
"""function creating the emojify-v2 model's graph.
arguments:
input_shape -- shape of the input, usually (max_len,)
returns:
model -- a model instance in keras
"""#
define sentence_indices as the input of the graph.
#it should be of shape input_shape and dtype 'int32' (as it contains indices, which are integers).
sentence_sequences = input(input_shape, dtype='
int32')
#propagate sentence_indices through your embedding layer
#(see additional hints in the instructions).
embeddings =keras.embedding(sentence_sequences)
#propagate the embeddings through an lstm layer with 128-dimensional hidden state
#the returned output should be a batch of sequences.
x = lstm(128, return_sequences =true)(embeddings)
#add dropout with a probability of 0.5
x = dropout(0.5)(x)
#propagate x trough another lstm layer with 128-dimensional hidden state
#the returned output should be a single hidden state, not a batch of sequences.
x = lstm(128, return_sequences=false)(x)
#add dropout with a probability of 0.5
x = dropout(0.5)(x)
#propagate x through a dense layer with 5 units
x = dense(5)(x)
#add a softmax activation
x = activation('
softmax
')(x)
#create model instance which converts sentence_indices into x.
model = model(inputs=sentence_sequences, outputs=x)
return model
4. 總結
這裡主要講述了乙個many-to-one結構的lstm的一般應用,這裡主要是用乙個情感分析的例子來演示,但是它的應用非常廣泛的。這裡的重點是對lstm 的many-to-one結構的理解,其次是對於多層lstm layer的應用和理解。至於用tensorflow來實現這個神經網路的部分,主要是對lstm 中的一些引數的設定要理解就行了,其他的都很簡單。
機器學習 情感分析小案例
對發帖情感進行分析。字段說明 announce id欄位代表使用者id,user name欄位代表使用者名稱,topic欄位代表發帖主題,body欄位代表發帖內容,post type欄位代表發帖話題是否與工作相關,sentiment欄位表明發帖情感色彩,ip欄位代表使用者ip位址。關於classif...
公安大資料應用之情報分析與關聯挖掘
近年來,隨著資訊化時代大資料的廣泛運用,各類犯罪頻發,犯罪分子的作案手段多變,反偵查意識進一步提公升,社會不穩定因素加劇。將大資料應用於公安領域勢在必行,為適應新形勢的要求,全國各地公安機關正在全面實施 情報資訊主導警務 戰略,情報資訊已成為公安工作的重要平台,成為公安機關從事各種工作的資訊基礎。筆...
《少年的你》短評情感分析 機器學習之邏輯回歸
原文 import pandas as pd import jieba import re 邏輯回歸建模需要的庫 from sklearn.model selection import train test split from sklearn.feature extraction.text imp...