100行深度學習文本分類

有一段時間沒更新了知乎了,說出來你們可能不信,我最近在研究比特幣和自動化交易,可是最近國內交易所都被關了,以後也許會再開一個專欄,專門跟大家說說。當然,這篇文章的主題還是文本分類。

在工作和學習中經常需要處理文本分類的問題,常見的比如輿情極性分析和用戶評論挖掘,Kaggle也有很多相關的題目,比如結束不久的Quora Question Pairs等等。通過學習這些項目,都可以學到很好的方法。

文本分類的問題說難也難,說簡單也簡單。難在哪裡呢,很多問題都沒有一個完美的解決方法,在文本分類中,我們也許需要做很多所謂的dirty word工作才能達到好的效果。我這人比較崇尚2:8法則和邊際效益,喜歡花20%的精力達到80%的效果, 深度學習就是這樣一個強大的工具,來幫助我們達到想要的效果,藉此文拋磚引玉。

深度學習常用的文本分類網路有LSTM和GRU,同時在不少的文章中,我們也看到CNN在文本分類中有一定的效果。 本文將簡單的實現一個LSTM文本分類框架,原理上的知識還請讀者自己掌握了。

預處理

在數據預處理的過程中,我們需要藉助切詞工具把文本處理成單字或者詞的形式,python的切詞工具推薦jieba。如何準備訓練數據很簡單,代碼如下:

def cutword(query):n return .join(jieba.cut(query)).encode(utf-8)nndf_train = preprocess(input_path)ndf_train[seg_word] = df_train.summary.map(cutword)nX_train = df_train[seg_word].values.tolist()nY_train = df_train[label].valuesn

當然了,完整的數據預處理還應該包括大小寫轉換,單位變換, stem和lemmatization等。

模型構建

模型部分採用的框架是keras, keras是基於tensorflow和theano之上的一個深度學習框架,其api很簡單,上手很方便。示例代碼中定義了一個LSTM網路,其輸入層採用了Embedding層,同時定義LSTM層、全連接層和輸出層。

Embedding層可以理解為將文本這樣稀疏的編碼轉換為稠密的Embedding形式,其權重也是通過神經網路優化得到。

def build_model(self, nb_classes):nn maxlen = 50 # 定義文本最大長度n word_dim = 100 # 詞向量維度n rnn_dim = 100n hidden_dims = 100 # 隱藏層神經元個數nn model = Sequential()n model.add(Embedding(self.maxfeatures, word_dim, input_length=maxlen))nn model.add(LSTM(rnn_dim, dropout_W=0.2, dropout_U=0.2))n # 全連接層n # model.add(Flatten())n model.add(Dense(hidden_dims))n model.add(Activation(relu))n model.add(Dense(nb_classes))n model.add(Activation(softmax))n return modeln

模型訓練

在模型訓練階段,需要用pad_sequences對輸入做補齊處理,保證輸入的文本長度一致。

X_train = train_set[seg_word].values.tolist()nY_train = train_set[label].valuesnntoken = Tokenizer(nb_words=self.maxfeatures)ntoken.fit_on_texts(X_train) nX_train = token.texts_to_sequences(X_train)nnX, X_test, y, y_test = train_test_split(X_train, Y_train, test_size=0.2, random_state=2017)nnle = preprocessing.LabelEncoder()ny = le.fit_transform(y)ny_test = le.transform(y_test)n# 訓練數據的文本長度不一,需要做補齊處理nX = sequence.pad_sequences(X, maxlen=maxlen, padding=post, truncating=post)nX_test = sequence.pad_sequences(X_test, maxlen=maxlen, padding=post, truncating=post)nnmodel = self.build_model(nb_classes)nmodel.compile(loss=categorical_crossentropy, optimizer=rmsprop, metrics=[accuracy])nresult = model.fit(X, Y_train, batch_size=batch_size, nb_epoch=nb_epoch,n validation_split=0.1, callbacks=[checkpointer])n

本文從項目中抽取了幾十行代碼,實現了一個深度學習應用於文本分類的簡單框架,剩下的工作就交給讀者了。

一般來說文章最精華的部分都在最後,希望大家好好學習哈。

  1. CNN中文文本分類
  2. DNN文本分類實踐
  3. 用8千萬評論訓練的char-rnn做情感分析
  4. 詞向量/CNN電影評論情感分類
  5. 淺層詞級CNN vs. 深層字元級CNN 文本分類對比研究

推薦閱讀:

UserDict、UserString、UserList存在的意義
文件里寫的是unicode,用python怎麼讀取成文本?
如何用Python和機器學習炒股賺錢?
Python爬蟲聯想詞視頻和代碼

TAG:深度学习DeepLearning | 自然语言处理 | Python |