1. 程式人生 > >RNN,LSTM用於情感分類問題

RNN,LSTM用於情感分類問題

1、詞袋定義和keras自帶分詞和編碼工具

詞袋定義

n-gram: 是從一個句子中提取的 N 個(或更少)連續單詞的集合
        “The cat sat on the mat.”分解為2-gram:
        {"The", "The cat", "cat", "cat sat", "sat",
        "sat on", "on", "on the", "the", "the mat", "mat"}
        這樣的集合叫做二元語法袋(bag-of-2-grams)
note: 詞袋是一種不儲存順序的分詞方法(生成的標記組成一個集合,而不是一個序列,舍
      棄了句子的總體結構),因此它往往被用於淺層的語言處理模型,而不是深度學習模型。
      但在使用輕量級的淺層文字處理模型時(比如 logistic 迴歸和隨機森林),
      n-gram 是一種功能強大、不可或缺的特徵工程工具。

資料介紹

在這裡插入圖片描述
在這個檔案裡面一共有1600 000條文字句子,前800000條表示消極情感(後面用0作為標籤),後800000條表示積極情感(後面用1作為標籤)
讀取檔案:

def getData(fileName):
    data = []
    with open(fileName, 'r', encoding='utf-8') as f:
        for line in f.readlines():
            data.append(line[:-2])  #  最後兩個字元是換行符'\n'
    return data

data = getData('train_textToWords.txt')

因為資料集較大,在調引數時我們只取部分資料用於訓練和測試:

numer = 50000  # 設定正例和反例數
data = data[:numer]+data[-numer:]

利用keras自帶工具分詞並編碼

from keras.preprocessing.text import Tokenizer
maxlen = 60  # 每個句子截斷長度為60,長度不夠60的補零
tokenizer = Tokenizer(num_words=20000)  # 只取前20000個常用單詞
tokenizer.fit_on_texts(data)
sequences = tokenizer.texts_to_sequences(data)  # 每個句子轉化為一個行向量
data = preprocessing.sequence.pad_sequences(sequences, maxlen=maxlen)

# 也可以直接得到one-hot表示,每個句子是一個num_words大小的行向量
# one_hot_results = tokenizer.texts_to_matrix(data, mode='binary')  
# word_index = tokenizer.word_index   # 單詞索引
# print(word_index)

標籤

#  設定標籤,劃分訓練集和測試集
from sklearn.model_selection import train_test_split
label = [0 if i<numer else 1 for i in range(2*numer)]
x_train, x_test, y_train, y_test = train_test_split(data, label, train_size=0.9)

#  將標籤向量化
y_train = np.asarray(y_train).astype('float32')
y_test = np.asarray(y_test).astype('float32')

未完待續。。。