翟高粵
摘 要:情感分類應(yīng)用是對(duì)帶有情感色彩的主觀性文本進(jìn)行分析、處理、歸納和推理的過程。本文先介紹情感分析的本質(zhì)和任務(wù),然后引入RNN循環(huán)神經(jīng)網(wǎng)絡(luò)并進(jìn)行相關(guān)理論和知識(shí)介紹;最后對(duì)整個(gè)項(xiàng)目結(jié)構(gòu)關(guān)鍵部分進(jìn)行模塊分析和功能說明。
關(guān)鍵詞:機(jī)器學(xué)習(xí);循環(huán)神經(jīng)網(wǎng)絡(luò);情感分類;自然語言處理
自然語言處理NLP的一項(xiàng)重要處理就是情感分析Sentiment Analysis,它在社交內(nèi)容的分析以及電商評(píng)論反饋分析中,都占有很高的分析價(jià)值。文本情感分析任務(wù)本質(zhì)是自然語言序列的特征提取和基于特征的分類問題。相比于生成類NLP任務(wù),文本情感分析任務(wù)的核心是自然語言特征的提取。
情感分析是從自然語言中識(shí)別人的態(tài)度的一種人工智能方法,現(xiàn)在有很多人通過社交網(wǎng)絡(luò)服務(wù)、博客、在線評(píng)論和社區(qū)網(wǎng)站上面發(fā)表他們的觀點(diǎn)或看法。由于很多用戶在網(wǎng)絡(luò)上表達(dá)自己的情感,因此研究人員可以通過分析現(xiàn)實(shí)世界中的情感來了解社會(huì)輿論。為了使模型能夠明確地學(xué)習(xí)中文文本的情感知識(shí),本文提出了一種基于RNN的情感信息的分類網(wǎng)絡(luò)模型。實(shí)驗(yàn)證明,該分類模型能較好的對(duì)中小規(guī)模的數(shù)據(jù)集進(jìn)行較好的分類。
本章探討深度學(xué)習(xí)中基于RNN的循環(huán)神經(jīng)網(wǎng)絡(luò)在情感分析中的應(yīng)用。深度學(xué)習(xí)適合做文字處理和語義理解,是因?yàn)樯疃葘W(xué)習(xí)結(jié)構(gòu)靈活,其底層利用詞嵌入技術(shù)可以避免文字長(zhǎng)短不均帶來的處理困難。使用深度學(xué)習(xí)抽象特征,可以避免大量人工提取特征的工作。深度學(xué)習(xí)可以模擬詞與詞之間的聯(lián)系,有局部特征抽象化和記憶功能。正是這幾個(gè)優(yōu)勢(shì),使得深度學(xué)習(xí)在情感分析,乃至文本分析理解中發(fā)揮著舉足輕重的作用。
一、相關(guān)理論
(一)RNN循環(huán)神經(jīng)網(wǎng)絡(luò)
循環(huán)神經(jīng)網(wǎng)絡(luò)(Recurrent Neural Network, RNN)是一類以序列(sequence)數(shù)據(jù)為輸入,在序列的演進(jìn)方向進(jìn)行遞歸(recursion)且所有節(jié)點(diǎn)(循環(huán)單元)按鏈?zhǔn)竭B接的遞歸神經(jīng)網(wǎng)絡(luò)(recursive neural network)。對(duì)循環(huán)神經(jīng)網(wǎng)絡(luò)的研究始于二十世紀(jì)80-90年代,并在二十一世紀(jì)初發(fā)展為深度學(xué)習(xí)(deep learning)算法之一,其中循環(huán)神經(jīng)網(wǎng)絡(luò)(Recurrent Neural Network, RNN)是常見基本的循環(huán)神經(jīng)網(wǎng)絡(luò)。
循環(huán)神經(jīng)網(wǎng)絡(luò)具有記憶性、參數(shù)共享的特點(diǎn),因此在對(duì)序列的非線性特征進(jìn)行學(xué)習(xí)時(shí)具有一定優(yōu)勢(shì)。循環(huán)神經(jīng)網(wǎng)絡(luò)在自然語言處理(Natural Language Processing, NLP),例如語音識(shí)別、語言建模、機(jī)器翻譯等領(lǐng)域有應(yīng)用,也被用于各類時(shí)間序列預(yù)報(bào)。引入了卷積神經(jīng)網(wǎng)絡(luò)(Convolutional Neural Network,CNN)構(gòu)筑的循環(huán)神經(jīng)網(wǎng)絡(luò)可以處理包含序列輸入的計(jì)算機(jī)視覺問題。
(二)詞嵌入技術(shù)(Word-Embedding)
為了數(shù)字化輸入的單詞,我們可以使用k個(gè)編碼向量(由若干個(gè)0和一個(gè)1組成)中的1(one-hot)來表示一個(gè)單詞,這種方法非常簡(jiǎn)單,但無法表達(dá)單詞之間的關(guān)系。為了能表達(dá)單詞之間的關(guān)系,我們通常使用詞嵌入方法,這是一種降維技術(shù)。詞嵌入方法就是把每個(gè)單詞矢量化表示。它由密集且維數(shù)較低的k維向量表示。研究表明,語義相近的詞向量在向量空間中距離很近,反之語義差距大的詞向量在向量空間距離較遠(yuǎn)。目前,許多關(guān)于自然語言處理(NLP)的研究都使用預(yù)訓(xùn)練詞向量。
使用預(yù)訓(xùn)練的詞嵌入,在數(shù)據(jù)集較小的情況下,難以學(xué)習(xí)到足夠好的embedding層,選擇一些權(quán)威的官方詞嵌入數(shù)據(jù)庫(kù)(比如GloVe)能夠有效解決數(shù)據(jù)集的問題。GloVe的全稱叫Global Vectors for Word Representation,它是一個(gè)基于全局詞頻統(tǒng)計(jì)(count-based & overall statistics)的詞表征(word representation)工具,它可以把一個(gè)單詞表達(dá)成一個(gè)由實(shí)數(shù)組成的向量,這些向量捕捉到了單詞之間一些語義特性,比如相似性(similarity)、類比性(analogy)等。我們通過對(duì)向量的運(yùn)算,比如歐幾里得距離或者cosine相似度,可以計(jì)算出兩個(gè)單詞之間的語義相似性。
(三)情感分類
文本情感分析:又稱意見挖掘、傾向性分析等。簡(jiǎn)單而言,是對(duì)帶有情感色彩的主觀性文本進(jìn)行分析、處理、歸納和推理的過程?;ヂ?lián)網(wǎng)(如博客和論壇以及社會(huì)服務(wù)網(wǎng)絡(luò)如大眾點(diǎn)評(píng))上產(chǎn)生了大量的用戶參與的、對(duì)于諸如人物、事件、產(chǎn)品等有價(jià)值的評(píng)論信息。這些評(píng)論信息表達(dá)了人們的各種情感色彩和情感傾向性,如喜、怒、哀、樂和批評(píng)、贊揚(yáng)等。基于此,潛在的用戶就可以通過瀏覽這些主觀色彩的評(píng)論來了解大眾輿論對(duì)于某一事件或產(chǎn)品的看法。
情緒分類的目的是識(shí)別給定句子(或文檔)的情緒極性(積極或消極)。傳統(tǒng)分類方法大致可以分為基于詞典的分類方法和基于深度學(xué)習(xí)的分類方法?;谠~典的方法通過人工的方法來提取語言特征。例如,通過在詞典中標(biāo)注每個(gè)單詞的情感極性就被當(dāng)作語言特征。另一方面,深度學(xué)習(xí)方法具有自動(dòng)地從原始數(shù)據(jù)中學(xué)習(xí)表示的能力?;谏疃葘W(xué)習(xí)的方法自動(dòng)從原始文本輸入中提取特征,并使用它們對(duì)情緒極性進(jìn)行分類。因此,基于深度學(xué)習(xí)的方法在情緒分類任務(wù)中越來越受到研究人員的歡迎。
二、RNN情感分類問題實(shí)戰(zhàn)
(一)網(wǎng)絡(luò)結(jié)構(gòu)
下面本文利用基礎(chǔ)的RNN來解決情感分類的問題,網(wǎng)絡(luò)結(jié)構(gòu)如圖1所示。
RNN 網(wǎng)絡(luò)共兩層,循環(huán)提取序列信號(hào)的語義特征,利用第 2 層 RNN 層的最后時(shí)間戳的狀態(tài)向量 hS(2)作為句子的全局語義特征表示,送入全連接層構(gòu)成的分類網(wǎng)絡(luò)3,得到樣本x為積極情感的概率P(x為積極情感|x) ∈ [0,1]。本文使用經(jīng)典的 IMDB 影評(píng)數(shù)據(jù)集來完成情感分類任務(wù)。
(二)數(shù)據(jù)集分析
IMDB影評(píng)數(shù)據(jù)集包含了50000條用戶評(píng)價(jià),評(píng)價(jià)的標(biāo)簽分為消極和積極,其中 IMDB評(píng)級(jí)<5 的用戶評(píng)價(jià)標(biāo)注為0,即消極;IMDB評(píng)價(jià)>=7 的用戶評(píng)價(jià)標(biāo)注為1,即積極。25000條影評(píng)用于訓(xùn)練集,25,000條用于測(cè)試集。通過Keras提供的數(shù)據(jù)集datasets工具即可加載IMDB數(shù)據(jù)集,部分關(guān)鍵代碼如下:
batchsz = 128 # 批量大小
total_words = 10000 # 詞匯表大小 N_vocab
max_review_len = 80 # 句子最大長(zhǎng)度 s,大于的句子部分將截?cái)啵∮诘膶⑻畛?/p>
embedding_len = 100 # 詞向量特征長(zhǎng)度 n
# 加載 IMDB 數(shù)據(jù)集,此處的數(shù)據(jù)采用數(shù)字編碼,一個(gè)數(shù)字代表一個(gè)單詞
(x_train, y_train), (x_test, y_test) =
keras.datasets.imdb.load_data(num_words=total_words)
# 打印輸入的形狀,標(biāo)簽的形狀
print(x_train.shape, len(x_train[0]), y_train.shape)
print(x_test.shape, len(x_test[0]), y_test.shape)
可以看到,x_train 和 x_test 是長(zhǎng)度為 25,000 的一維數(shù)組,數(shù)組的每個(gè)元素是不定長(zhǎng) List,保存了數(shù)字編碼的每個(gè)句子,例如訓(xùn)練集的第一個(gè)句子共有 218 個(gè)單詞,測(cè)試集的第一個(gè)句子共有 68 個(gè)單詞,每個(gè)句子都包含了句子起始標(biāo)志 ID。
(三)編碼方案及處理
通過訪問編碼表獲得每個(gè)單詞的編碼,具體代碼如下:
# 數(shù)字編碼表
word_index = keras.datasets.imdb.get_word_index()
# 打印出編碼表的單詞和對(duì)應(yīng)的數(shù)字
for k,v in word_index.items():
print(k,v)
由于編碼表的鍵為單詞,值為 ID,這里翻轉(zhuǎn)編碼表,并添加標(biāo)志位的編碼 ID,代碼如下:
# 前面 4 個(gè) ID 是特殊位
word_index = {k:(v+3) for k,v in word_index.items()}
word_index["
word_index["
word_index["
word_index["
# 翻轉(zhuǎn)編碼表
reverse_word_index = dict([(value, key) for (key, value) in
word_index.items()])
對(duì)于一個(gè)數(shù)字編碼的句子,通過如下函數(shù)轉(zhuǎn)換為字符串?dāng)?shù)據(jù):
def decode_review(text):
return ' '.join([reverse_word_index.get(i, '?') for i in text]
(四)模型設(shè)計(jì)
創(chuàng)建自定義的模型類MyRNN,繼承自Model基類,需要新建Embedding層,兩個(gè) RNN 層,分類網(wǎng)絡(luò)層,關(guān)鍵代碼如下:
class MyRNN(keras.Model):
# Cell 方式構(gòu)建多層網(wǎng)絡(luò)
def __init__(self, units):
super(MyRNN, self).__init__()
# [b, 64],構(gòu)建 Cell 初始化狀態(tài)向量,重復(fù)使用
self.state0 = [tf.zeros([batchsz, units])]
self.state1 = [tf.zeros([batchsz, units])]
# 詞向量編碼 [b, 80] => [b, 80, 100]
self.embedding = layers.Embedding(total_words, embedding_len,
input_length=max_review_len)
# 構(gòu)建 2 個(gè) Cell,使用 dropout 技術(shù)防止過擬合
self.rnn_cell0 = layers.SimpleRNNCell(units, dropout=0.5)
self.rnn_cell1 = layers.SimpleRNNCell(units, dropout=0.5)
# 構(gòu)建分類網(wǎng)絡(luò),用于將 CELL 的輸出特征進(jìn)行分類,2 分類
# [b, 80, 100] => [b, 64] => [b, 1]
self.outlayer = layers.Dense(1)
三、結(jié)論
情感分析無處不在,它是一種基于自然語言處理的分類技術(shù)。其主要解決的問題是給定一段話,判斷這段話是正面的還是負(fù)面的。當(dāng)需要大規(guī)模的情感分析時(shí),肉眼的處理能力就變得十分有限了。情感分析的本質(zhì)就是根據(jù)已知的文字和情感符號(hào),推測(cè)文字是正面的還是負(fù)面的。處理好了情感分析,可以大大提升人們對(duì)于事物的理解效率,也可以利用情感分析的結(jié)論為其他人或事物服務(wù),比如不少基金公司利用人們對(duì)于某家公司、某個(gè)行業(yè)、某件事情的看法態(tài)度來預(yù)測(cè)未來股票的漲跌。
本文先介紹RNN循環(huán)神經(jīng)網(wǎng)絡(luò)及情感分類的相關(guān)概念和理論,然后通過一個(gè)真實(shí)案例介紹基于RNN循環(huán)神經(jīng)網(wǎng)絡(luò)進(jìn)行情感分類的關(guān)鍵技術(shù)和關(guān)鍵代碼,通過運(yùn)行測(cè)試達(dá)到90%以上分類正確率,說明本文采用的情感分類的思想和方法是有效的,具有一定參考價(jià)值。
參考文獻(xiàn):
[1] 閆濤. 深度學(xué)習(xí)算法實(shí)踐 [M]. 電子工業(yè)出版社出版社,2020.
[2] 李建明等.基于深度學(xué)習(xí)的工業(yè)自動(dòng)化包裝缺陷檢測(cè)方法[J],包裝工程,2021(4).
[3] 王曉華. TensorFlow 2.0卷積神經(jīng)網(wǎng)絡(luò)實(shí)戰(zhàn) [M]. 清華大學(xué)出版社出版社,2020.