NLP領(lǐng)域中面向文本的情感分析研究
情感分析可以將用戶的情感信號(hào)轉(zhuǎn)化為有價(jià)值的知識(shí)信息,用于做用戶畫(huà)像,市場(chǎng)營(yíng)銷(xiāo),個(gè)性化推薦,商業(yè)決策,輿情監(jiān)控,或是做電影票房預(yù)測(cè),股票及加密數(shù)字貨幣投資者情緒分析等等。本文從演進(jìn)的角度來(lái)講講如何從文本中挖掘情感信息。
本文主要內(nèi)容包括:
-
基于情感詞典和規(guī)則的情感分析 基于機(jī)器學(xué)習(xí)的情感分析
基于深度神經(jīng)網(wǎng)絡(luò)的情感分析
基于語(yǔ)言模型的情感分析
總結(jié)與展望
提示:全文內(nèi)容較長(zhǎng),包含大量理論和代碼實(shí)踐,建議點(diǎn)贊收藏后慢慢看~
01
基于情感詞典和規(guī)則的情感分析
這是一種基于預(yù)先定義的規(guī)則,利用情感詞對(duì)文本進(jìn)行情感分析的方法。
這家餐廳的服務(wù)太差了!
如果我們有一個(gè)情感詞典包含了大量的情感詞及其對(duì)應(yīng)的情感極性,定義 “好”、“贊” 等詞為積極情感詞,其情感極性為正數(shù);而 “差”、“壞” 等詞則為消極情感詞,其情感極性為負(fù)數(shù)。
在這個(gè)例子中, “太差了” 包含"差"這個(gè)消極情感詞,并且 “太” 字表示程度很大。對(duì)句子中所有詞的情感極性進(jìn)行加權(quán)匯總,得到整個(gè)句子的情感極性為負(fù)數(shù),表示消極情感。
我們針對(duì)文本中所有情感詞語(yǔ)計(jì)算文本的情感得分,這個(gè)得分可以表示情感的極性。如果文本中的積極情感得分高于閾值,那么我們可以將其標(biāo)注為積極評(píng)論,反之則為消極評(píng)論。
▌代碼實(shí)踐
我們可以借助 VADER (Valence Aware Dictionary and Entity Reasoner)實(shí)現(xiàn)基于情感詞典的情感分析任務(wù),它使用一個(gè)預(yù)先定義的詞匯表,為每個(gè)詞都分配了固定的情感權(quán)值,這些權(quán)值是根據(jù)人類(lèi)對(duì)一系列單詞的情感評(píng)分而生成的。
# 安裝 nltk 包,并下載情感詞典
pip install nltk==3.7
import nltk
nltk.download('vader_lexicon')
# 情感分析器
from nltk.sentiment.vader import SentimentIntensityAnalyzer
sid = SentimentIntensityAnalyzer()
# 進(jìn)行情感打分
texts = ["This is a great day! I'm so happy!",
"I'm feeling sad and upset today.",
"I don't know how to feel about this situation."]
for text in texts:
scores = sid.polarity_scores(text)
print(scores)
(三句話的打分結(jié)果)
執(zhí)行結(jié)果中:neg 表示文本中否定情緒詞的占比(0~1),neu 表示文本中中性情緒詞的占比(0~1),pos 表示文本中肯定情緒詞的占比(0~1),compound 表示整體情感傾向,也就是最終結(jié)論值(-1~1),負(fù)值代表消極傾向,正值代表積極傾向,0 為中性。
那么這個(gè)結(jié)果怎么得來(lái)的呢 ? 打開(kāi)下載的情感詞典 vader_lexicon.txt 可以看到它將絕大多數(shù)英文單詞都進(jìn)行了情感打分,love,loved,lovely,lovable… 為正向情感詞,權(quán)值為正數(shù);lost,louse,lousy,low… 為負(fù)向情感詞,權(quán)值為負(fù)數(shù)。
(vader_lexicon.txt 詞典部分截圖)
基于規(guī)則的情感分析方法實(shí)現(xiàn)簡(jiǎn)單,具有可解釋性,但情感詞典收錄的情感詞匯數(shù)量有限,且無(wú)法對(duì)具有多重含義的情感詞進(jìn)行準(zhǔn)確分類(lèi),只能對(duì)單個(gè)詞匯進(jìn)行情感分類(lèi),而無(wú)法考慮詞匯之間的語(yǔ)義關(guān)系,例如同義詞、反義詞等。
02
基于機(jī)器學(xué)習(xí)的情感分析
使用機(jī)器學(xué)習(xí)的第一步就是進(jìn)行文本的特征工程,由于文本是字符串(字符序列)結(jié)構(gòu),在計(jì)算機(jī)中不可計(jì)算,因此需將其轉(zhuǎn)為可計(jì)算向量。將文本中的詞語(yǔ)轉(zhuǎn)化成向量的過(guò)程叫詞向量法,稱(chēng)之為空間向量模型。
常用的空間向量模型包括:One-Hot 編碼,詞袋法,TF-IDF,Word2Vec,GloVe,F(xiàn)astText 等。
▌2.1 One-Hot 編碼
One-Hot 編碼是一種將不同的詞匯表示成數(shù)字形式的方法。首先將文本中的不同詞匯都分配一個(gè)唯一的整數(shù)作為它的編號(hào),然后將該詞匯表示成一個(gè)維度等于詞匯總數(shù)的向量,其中該詞匯的編號(hào)所在位置為 1,其余位置都為 0。
比如這句話:
I like to eat apple.
我們先建立一個(gè)詞匯表,將所有不同的詞在詞匯表中編號(hào):
| 詞匯 | 編號(hào) |
|---|---|
| I | 0 |
| like | 1 |
| to | 2 |
| eat | 3 |
| apple | 4 |
詞匯表目前只有 5 個(gè)詞,我們可以使用一個(gè)五維向量表示(向量的維度等于詞匯表的大?。?,對(duì)應(yīng)每個(gè)單詞向量表示如下:
I - [1, 0, 0, 0, 0]like - [0, 1, 0, 0, 0]to - [0, 0, 1, 0, 0]eat - [0, 0, 0, 1, 0]apple - [0, 0, 0, 0, 1]
看到這里,One-Hot 編碼的缺點(diǎn)顯而易見(jiàn),詞匯表有多長(zhǎng)則向量維度就有多少,那么要構(gòu)建一個(gè)常用英文單詞詞匯表就有上萬(wàn)個(gè),容易造成維度過(guò)高,計(jì)算存儲(chǔ)量過(guò)大,文本稀疏等問(wèn)題。
▌2.2 詞袋法 Bag of Words
詞袋模型是基于詞頻統(tǒng)計(jì)的一種方法,即統(tǒng)計(jì)每個(gè)單詞在句子中的出現(xiàn)次數(shù)。
I like to eat apple.
這句話可以構(gòu)建詞頻統(tǒng)計(jì)向量為 [1, 1, 1, 1, 1]
(每個(gè)數(shù)字表示詞匯表中該位置單詞出現(xiàn)的次數(shù))
對(duì)于下面句子:
I like to eat apple, he like to eat orange.
詞匯表擴(kuò)展為:[“I”, “l(fā)ike”, “to”, “eat”, “apple”, “he”, “orange”] ,對(duì)應(yīng)的詞頻統(tǒng)計(jì)向量為 [1, 2, 2, 2, 1, 1, 1]。
詞袋法相比于 One-Hot 編碼維度大大減少,由于 One-Hot 只統(tǒng)計(jì)單詞是否出現(xiàn),而詞袋法統(tǒng)計(jì)了出現(xiàn)次數(shù),有助于挖掘文檔中的關(guān)鍵詞(高頻詞),但其并未考慮詞語(yǔ)的重要性,有時(shí)并非出現(xiàn)次數(shù)越多單詞就越重要,因此有了 TF-IDF。
▌2.3 TF-IDF
TF-IDF 在詞頻統(tǒng)計(jì)的基礎(chǔ)上加入了一層“權(quán)重”,即詞頻-逆文檔頻率。
假設(shè)如下兩句話構(gòu)成一個(gè)文檔(實(shí)際會(huì)有更大的語(yǔ)料庫(kù)作文檔)
I like to eat apple.He like to eat orange.
構(gòu)建詞匯表:[“I”, “l(fā)ike”, “to”, “eat”, “apple”, “he”, “orange”]
TF-IDF 計(jì)算公式:


(公式圖片來(lái)自網(wǎng)絡(luò))
計(jì)算TF(詞頻):
“I like to eat apple”: [1, 1, 1, 1, 1, 0, 0]
“he like to eat orange”:[0, 1, 1, 1, 0, 1, 1]
(1 表示詞匯表中該位置單詞在本句中出現(xiàn),0 表示沒(méi)有出現(xiàn))
計(jì)算IDF(逆文檔頻率):
“I”: log(2 / 1) = 0.301
“l(fā)ike”: log(2 / 2) = 0
“to”: log(2 / 2) = 0
“eat”: log(2 / 2) = 0
“apple”: log(2 / 1) = 0.301
“he”: log(2 / 1) = 0.301
“orange”: log(2 / 1) = 0.301
提示:idf 計(jì)算公式中分母的 +1 是為了防止分母為 0,只有在分母非常大的時(shí)候才會(huì)去 +1,這樣對(duì)結(jié)果的影響可忽略
將 TF 值乘以 IDF 值得出 TF-IDF 向量如下:
“I like to eat apple”:[0.301, 0, 0, 0, 0.301, 0, 0]
“he like to eat orange”:[0, 0, 0, 0, 0, 0.301, 0.301]
TF-IDF 考慮了詞語(yǔ)的權(quán)重,但未考慮文本的詞語(yǔ)順序和上下文關(guān)系等,這樣對(duì)于 "我愛(ài)她" 和 "她愛(ài)我" 這兩種文本會(huì)混為同一個(gè)意思。
▌2.4 機(jī)器學(xué)習(xí)做情感分析
通過(guò)將文本編碼為向量后,就可以使用機(jī)器學(xué)習(xí)的方法進(jìn)行模型訓(xùn)練,比如基于樸素貝葉斯、支持向量機(jī)、隨機(jī)森林、XGBoost 等進(jìn)行有監(jiān)督學(xué)習(xí)分類(lèi)任務(wù)。
第一個(gè)案例,我們基于預(yù)訓(xùn)練的 TextBlob 來(lái)看機(jī)器學(xué)習(xí)做情感分析的效果。TextBlob 默認(rèn)基于樸素貝葉斯分類(lèi)器(Naive Bayes Classifier),使用了由電影評(píng)論組成的大型語(yǔ)料庫(kù)"NLTK(Natural Language Toolkit) movie_reviews",基于這個(gè)訓(xùn)練好的分類(lèi)器,TextBlob 可以直接對(duì)文本進(jìn)行情感分析。
提示:雖然TextBlob的情感分析模型是基于電影評(píng)論訓(xùn)練的,但它通常對(duì)許多其他主題和領(lǐng)域的文本也能提供合理的分析結(jié)果。
#安裝包
pip install textblob==0.17.1
from textblob import TextBlob
# 需要進(jìn)行情感分析的文本
text = "I love programming in Python! Its simplicity is so empowering."
# 創(chuàng)建TextBlob對(duì)象
blob = TextBlob(text)
# 計(jì)算文本的情感分析結(jié)果
sentiment = blob.sentiment
# 輸出情感分析結(jié)果
print(f"Polarity: {sentiment.polarity}, Subjectivity: {sentiment.subjectivity}")

其返回值包括極性Polarity:(-1~1)-1 表示非常負(fù)面,+1 表示非常正面,0 表示中立;主觀性Subjectivity(0~1)0 表示純客觀描述,1 表示非常主觀。
第二個(gè)案例,我們將從特征工程開(kāi)始構(gòu)建一個(gè)情感分類(lèi)模型,機(jī)器學(xué)習(xí)建模一般分為如下幾個(gè)步驟。
(1)數(shù)據(jù)收集與預(yù)處理:
收集文本數(shù)據(jù)集,對(duì)數(shù)據(jù)進(jìn)行清洗、去除噪聲和不相關(guān)的信息,如去除停用詞、標(biāo)點(diǎn)符號(hào)、單詞糾錯(cuò)、詞形還原等。同時(shí)需要一部分?jǐn)?shù)據(jù)帶有情感標(biāo)簽用于監(jiān)督學(xué)習(xí),如果沒(méi)有情感標(biāo)簽咋辦?那就人工打標(biāo),專(zhuān)門(mén)有從事人工打標(biāo)的團(tuán)隊(duì)。
(2)特征提?。?br>根據(jù)業(yè)務(wù)需求和任務(wù)類(lèi)型,選擇適合的特征提取方法,特征提取方法包括 One-Hot編碼、詞袋模型、TF-IDF 以及后面要介紹的 Word2Vec 詞嵌入等不同的方法。
(3)模型訓(xùn)練:
根據(jù)任務(wù)類(lèi)型,選擇適合的分類(lèi)器進(jìn)行訓(xùn)練,比如樸素貝葉斯、支持向量機(jī)、決策樹(shù)和神經(jīng)網(wǎng)絡(luò)等,并且可以使用交叉驗(yàn)證和網(wǎng)格搜索等技術(shù)來(lái)優(yōu)化模型。
使用測(cè)試集來(lái)評(píng)估模型的性能,通常采用準(zhǔn)確率、F1分?jǐn)?shù)、召回率和精確率等指標(biāo)來(lái)評(píng)價(jià)模型的性能。

(樣本樣例)
# 使用 conda 默認(rèn)已安裝常用的機(jī)器學(xué)習(xí)包
# 數(shù)據(jù)來(lái)自 Kaggle:Amazon Fine Food Reviews
# https://www.kaggle.com/datasets/snap/amazon-fine-food-reviews?resource=download
# 加載數(shù)據(jù)并進(jìn)行分析預(yù)處理
import pandas as pd
data = pd.read_csv("Reviews.csv")
# 使用 nltk 包,去停用詞,字母小寫(xiě)化,刪除標(biāo)點(diǎn),糾錯(cuò),詞形還原等
# ...省略,詳細(xì)見(jiàn)附錄源碼
# 標(biāo)簽 data 的 Score 如果大于3,那么就是正面評(píng)價(jià),否則就是負(fù)面評(píng)價(jià)
data['sentiment'] = data['Score'].apply(lambda rating : +1 if rating > 3 else 0)
# 劃分測(cè)試集合訓(xùn)練集
from sklearn.model_selection import train_test_split
train_text, test_text, train_labels, test_labels = train_test_split(data['Text'], data['sentiment'], random_state=2023)
# 使用 TF-IDF 做特征工程
from sklearn.feature_extraction.text import TfidfVectorizer
tfidf = TfidfVectorizer()
train_tfidf = tfidf.fit_transform(train_text)
#SVM建模
from sklearn import svm
clf = svm.SVC()
model = clf.fit(train_tfidf, train_labels)
#預(yù)測(cè)
test_tfidf = tfidf.transform(test_text)
predictions = model.predict(test_tfidf)
#效果評(píng)估
from sklearn.metrics import accuracy_score
print(accuracy_score(test_labels, predictions))

(評(píng)估準(zhǔn)確率得分)
03
基于深度神經(jīng)網(wǎng)絡(luò)的情感分析
相較于機(jī)器學(xué)習(xí)的特征工程,深度神經(jīng)網(wǎng)絡(luò)可以自動(dòng)構(gòu)建特征,尤其是對(duì)于文本特征,無(wú)論從詞頻統(tǒng)計(jì)還是其他統(tǒng)計(jì)方式所構(gòu)建的特征都無(wú)法捕捉到詞的相似性和相關(guān)性,而這是基于連接的深度神經(jīng)網(wǎng)絡(luò)所擅長(zhǎng)的,因此大量 NLP 開(kāi)始基于深度學(xué)習(xí)方法。
▌3.1 Word2Vec
Word2Vec 是 Word Embeddings (詞嵌入)的一種表示方法,它能夠捕捉詞之間的相似性以及詞義的各種關(guān)系。Word2Vec通過(guò)訓(xùn)練一個(gè)淺層神經(jīng)網(wǎng)絡(luò)(淺層的意思是它只有一個(gè)隱藏層),使得這個(gè)神經(jīng)網(wǎng)絡(luò)能夠根據(jù)當(dāng)前詞預(yù)測(cè)其周?chē)脑~ (該方法也叫 Skip-gram),或根據(jù)用上下文信息預(yù)測(cè)當(dāng)前詞(該方法也叫 Continuous Bag of Words,縮寫(xiě) CBOW)。經(jīng)過(guò)訓(xùn)練后,我們可以提取神經(jīng)網(wǎng)絡(luò)的詞向量表示,以便在其他自然語(yǔ)言處理任務(wù)(情感分析)中使用。

(圖片來(lái)自鄧鈺博士論文[3])
以 Skip-gram 為例:
假設(shè)我們有一個(gè)句子:“貓?jiān)谏嘲l(fā)上睡覺(jué)”,我們?cè)O(shè)置窗口大小為 2(上下文的范圍)?,F(xiàn)在,我們要根據(jù)"貓"、“沙發(fā)"這兩個(gè)上下文詞預(yù)測(cè)目標(biāo)詞"在”。
Skip-gram方法會(huì)嘗試不斷調(diào)整網(wǎng)絡(luò)權(quán)重改變這兩個(gè)詞的向量,以使預(yù)測(cè)目標(biāo)詞的概率最大化。訓(xùn)練完成后,每個(gè)詞都會(huì)對(duì)應(yīng)一個(gè)向量表示。
"貓"可能對(duì)應(yīng)向量 [0.06, 0.52, -0.23, …]"沙發(fā)"可能對(duì)應(yīng)向量 [0.72, 0.35, -0.61, …]
因此 Word2Vec 能夠捕捉詞義的相似性及各種關(guān)系,其所構(gòu)建的詞向量具有連續(xù)性、稠密性,且具有較低的維度,適用于許多機(jī)器學(xué)習(xí)和深度學(xué)習(xí)模型進(jìn)一步做情感分析建模。在情感分析任務(wù)中,可以利用詞向量之間的距離或相似度來(lái)度量詞語(yǔ)與情感之間的關(guān)系。
Word2Vec 也有其缺點(diǎn),首先對(duì)于未出現(xiàn)在訓(xùn)練語(yǔ)料庫(kù)中的詞(未登錄詞),無(wú)法直接提供向量表示。其次它無(wú)法有效處理多義詞的情況,因?yàn)槊總€(gè)詞只有一個(gè)固定的向量表示,和上下文無(wú)關(guān),無(wú)法做到詞義消歧。
“bank" 在英語(yǔ)中有銀行的意思,也有河岸的意思,我們需要根據(jù)該詞的上下文推斷其具體詞義。
"球" 在中文中可以指代圓形物體,也可以是足球、籃球、羽毛球、乒乓球,在不同上下文中詞義千差萬(wàn)別,不能用一個(gè)向量統(tǒng)一替代。
▌3.2 GloVe
GloVe (Global Vectors for Word Representation 全局詞向量)是一種無(wú)監(jiān)督學(xué)習(xí)算法,基于詞與詞之間的共現(xiàn)統(tǒng)計(jì)信息,通過(guò)最小化上下文詞與目標(biāo)詞概率之間的平方損失來(lái)產(chǎn)生詞向量。
與Word2Vec方法不同,GloVe 考慮了整個(gè)語(yǔ)料庫(kù)的統(tǒng)計(jì)信息,而不是局限于固定大小的滑動(dòng)窗口。
舉例說(shuō)明:
假設(shè)在某個(gè)語(yǔ)料庫(kù)中,兩個(gè)詞語(yǔ) “ice” 和 “steam” 共同出現(xiàn)場(chǎng)景較少,而 “ice” 和 “water” 以及 “steam” 和 “water” 共同出現(xiàn)場(chǎng)景較多。通過(guò)學(xué)習(xí)詞共現(xiàn)矩陣,GloVe 可以發(fā)現(xiàn)這些詞之間的關(guān)系,將 “ice” 和 “steam” 關(guān)聯(lián)起來(lái),具有類(lèi)似語(yǔ)義的詞在向量空間中的距離更近。
其優(yōu)點(diǎn)是利用了全局統(tǒng)計(jì)信息,因此在捕獲詞與詞之間的關(guān)系方面更有效,因此也具有更好的可解釋性。但 GloVe 仍無(wú)法有效處理多義詞的情況,因?yàn)槊總€(gè)詞僅有一個(gè)固定的向量表示。同時(shí)對(duì)語(yǔ)料庫(kù)的預(yù)處理需求較高,因?yàn)樾枰獦?gòu)建詞共現(xiàn)矩陣和計(jì)算全局共現(xiàn)統(tǒng)計(jì)信息。
▌3.3 FastText
FastText 是一種基于 Word2Vec 的改進(jìn)模型,它不僅可以為每個(gè)單詞生成一個(gè)向量表示,還可以為每個(gè)單詞的 N-gram 子序列生成向量表示,然后將單詞向量和其子序列的向量相加,得到最終的向量表示,這種方法可以捕捉到單詞的內(nèi)部結(jié)構(gòu)和上下文信息。
舉例來(lái)說(shuō)
對(duì)于詞語(yǔ) “apple”,F(xiàn)astText 可以表示為子詞集合:
{“app”, “appl”, “ple”, “pple”, “apple”}
然后將這些子詞的向量表示與整個(gè)詞的向量表示求和,得到最終的詞向量表示,利用子詞信息提高詞向量表示的泛化能力和準(zhǔn)確性。
我喜歡看足球比賽
經(jīng)過(guò)分詞處理后,再以字符 N-gram(假設(shè) n=2)進(jìn)行字符細(xì)粒度拆分如下。
我: 我
喜歡:喜歡, 喜, 歡
看: 看
足球:足球, 足, 球
比賽:比賽, 比, 賽
FastText 模型進(jìn)行訓(xùn)練,過(guò)程中同時(shí)考慮子詞信息(比賽、比、賽)。通過(guò)以上過(guò)程,F(xiàn)astText 可以在多粒度上表示詞語(yǔ),更好地捕捉詞形變化、構(gòu)詞規(guī)律等信息。如字“決賽”與“比賽”,“決”與“比”意義較遠(yuǎn),但由于它們都含有“賽”字,這種聯(lián)系在FastText 模型中可以得到體現(xiàn),提高詞向量表示的泛化能力。
04
基于語(yǔ)言模型的情感分析
以上介紹的方法均是將文本詞語(yǔ)轉(zhuǎn)為數(shù)值向量,屬于空間向量模型(Vector Space Model),通過(guò)提取詞語(yǔ)的數(shù)學(xué)特征,為進(jìn)一步的文本挖掘、相似性度量、聚類(lèi)、分類(lèi)等任務(wù)提供基礎(chǔ)。
接下來(lái)要介紹的語(yǔ)言模型(Language Model)是一種計(jì)算詞語(yǔ)在給定語(yǔ)料庫(kù)上的概率的方法。語(yǔ)言模型通俗講就是通過(guò)計(jì)算語(yǔ)句存在的概率,來(lái)判斷詞語(yǔ)序列是不是真實(shí)自然語(yǔ)言(這些詞連在一起還是不是人話)。語(yǔ)言模型可以用于文本生成、文本自動(dòng)補(bǔ)全、拼寫(xiě)糾錯(cuò)等任務(wù),也可通過(guò)微調(diào)來(lái)完成情感分析等任務(wù)。
向量空間模型主要關(guān)注如何將文本(詞語(yǔ))表示為向量,而語(yǔ)言模型則關(guān)注計(jì)算給定文本序列(詞語(yǔ))的概率,對(duì)于一個(gè)確定的概念或表達(dá),哪種表示結(jié)果的可能性更大。
比如翻譯這段文字:
今天天氣很好.1 = Today is a fine day.2 = Today is a good day.
最后要的結(jié)果通過(guò)判斷 P(1)和 P(2)哪個(gè)概率更大。
語(yǔ)言模型主要包括:統(tǒng)計(jì)語(yǔ)言模型如 N-gram模型,和基于神經(jīng)網(wǎng)絡(luò)的語(yǔ)言模型,如 LSTM、GRU、基于 Transfomer 的語(yǔ)言模型(大語(yǔ)言模型)。
▌4.1 N-gram
N-gram 模型是基于馬爾科夫假設(shè)的統(tǒng)計(jì)語(yǔ)言模型,是計(jì)算自然語(yǔ)言中長(zhǎng)度為 N 的連續(xù)詞組出現(xiàn)的頻率。
給定一個(gè)句子:S = {w1,w2,w3,…,wn}
生成該句子的概率為:p(S) = p(w1,w2,w3,w4,w5,…,wn)
鏈?zhǔn)椒ǖ玫剑簆(S) = p(w1)p(w2|w1)p(w3|w1,w2)…p(wn|w1,w2,…,wn-1)
最后這個(gè) p(S) 就是我們所要的統(tǒng)計(jì)語(yǔ)言模型。
但是由于語(yǔ)料中數(shù)據(jù)稀疏問(wèn)題, p(w1)p(w2|w1)p(w3|w1,w2)…p(wn|w1,w2,…,wn-1) 最后很可能變成了 0,所以要做一個(gè)簡(jiǎn)化。其實(shí)文本中的詞,它出現(xiàn)的概率很大程度上由這個(gè)單詞前面的一個(gè)或幾個(gè)單詞決定的(和后繼詞無(wú)關(guān)),這就是馬爾科夫假設(shè)。
那么通過(guò)假設(shè)其與 1個(gè),2個(gè),3個(gè),N個(gè)詞決定,可以做如下計(jì)算:
Unigram:N=1,即單個(gè)詞的頻率。在這種情況下,模型僅考慮每個(gè)詞的概率,而忽略詞與詞之間的關(guān)系。例如,對(duì)于文本“我愛(ài)你,你愛(ài)我”,Unigram概率分布為:P(我)=0.33,P(愛(ài))=0.33,P(你)=0.33。
Bigram:N=2,即兩個(gè)連續(xù)詞的頻率。此時(shí),模型計(jì)算每個(gè)詞在給定前一個(gè)詞的情況下的概率。例如,對(duì)于文本“我愛(ài)你,你愛(ài)我”,Bigram概率分布為:P(我|愛(ài))=0.5,P(你|我)=1,P(愛(ài)|我)=0.5等。
Trigram:N=3,即三個(gè)連續(xù)詞的頻率。在這個(gè)模型中,每個(gè)詞的出現(xiàn)概率依賴于其前兩個(gè)詞。例如,對(duì)于文本“我愛(ài)吃蘋(píng)果,我愛(ài)喝水”,Trigram概率分布為:P(吃|我愛(ài))=0.5,P(喝|我愛(ài))=0.5,P(蘋(píng)果|愛(ài)吃)=1等。
N-gram:N>3,通常用于捕捉更長(zhǎng)的詞組關(guān)系。隨著N的增加,模型可以捕捉到更豐富的上下文信息。然而,隨著N的增加,概率分布的計(jì)算量和數(shù)據(jù)稀疏性問(wèn)題也會(huì)增加。可以采用平滑技術(shù)(如Add-One平滑、Good-Turing平滑等)來(lái)處理概率分布的計(jì)算。
在情感分析任務(wù)中,N-gram模型可以捕獲局部情感信息,所學(xué)習(xí)到的概率分布可以用于評(píng)估文本的情感傾向。
▌4.2 基于 Transformer 模型
Transformer 自問(wèn)世以來(lái),由于其良好的算法設(shè)計(jì),更易并行化處理,可以捕捉長(zhǎng)距離位置信息,比 RNN / LSTM 具備更優(yōu)異的表現(xiàn),已成為 NLP 領(lǐng)域的一種強(qiáng)大且受歡迎的算法。
Transformer Embedding 是一種基于注意力機(jī)制的模型編碼方法,它能夠捕捉單詞的位置信息,關(guān)注單詞的上下文關(guān)系和語(yǔ)義,即模型關(guān)注輸入序列中每個(gè)單詞與其他單詞之間的關(guān)系,進(jìn)而消除單詞歧義,提高模型的準(zhǔn)確性和泛化能力。
舉例說(shuō)明:
The animal didn't cross the street because it was too tired.
這里 it 指代的是 animal 還是 street?這個(gè)問(wèn)題人類(lèi)肯定可以閱讀理解得出,而對(duì)于機(jī)器如何理解呢?
通過(guò) Attention 公式計(jì)算(具體原理下次展開(kāi)講講)得出,animal 和 it 的相關(guān)性更高,因此 it 指代 animal。

(圖片來(lái)自網(wǎng)絡(luò):注意力相關(guān)性,橘色相關(guān)性強(qiáng))
對(duì)于給定的輸入句子,它首先計(jì)算出每個(gè)單詞與其他單詞的相關(guān)性,然后根據(jù)這些相關(guān)性將它們組合在一起。這樣可以捕捉到句子中所有單詞之間的復(fù)雜關(guān)系,從而更好地表達(dá)句子的含義。而基于此預(yù)訓(xùn)練出的模型,可以通過(guò)微調(diào)應(yīng)用下游情感任務(wù)分析中。
目前已經(jīng)有大量預(yù)訓(xùn)練的基于 Transformer 的語(yǔ)言模型,而通常由于其參數(shù)量巨大,也被稱(chēng)為大語(yǔ)言模型。如 BERT、GPT、T5 、GLM、PalM 等,這些模型已經(jīng)在大型語(yǔ)料庫(kù)上進(jìn)行了預(yù)訓(xùn)練,參數(shù)中已“記憶了“大量詞向量及其關(guān)系,可以通過(guò)微調(diào)后直接應(yīng)用到下游任務(wù)(如情感分析)中。
下面通過(guò)案例講解如何使用大語(yǔ)言模型做情感分析:
首先選擇一個(gè)合適的預(yù)訓(xùn)練語(yǔ)言模型(如 BERT、GPT或其他 Transformer-based模型),這些預(yù)訓(xùn)練模型已經(jīng)在大量語(yǔ)料上進(jìn)行了訓(xùn)練,可以捕捉到詞匯之間的語(yǔ)義和句法關(guān)系。
然后利用這些預(yù)訓(xùn)練模型進(jìn)行遷移學(xué)習(xí),將模型適應(yīng)到具體的情感分類(lèi)任務(wù)。具體步驟如下:
(1)準(zhǔn)備標(biāo)注數(shù)據(jù),和機(jī)器學(xué)習(xí)一樣
(2)微調(diào)預(yù)訓(xùn)練模型:加載預(yù)訓(xùn)練模型,并在模型頂部加上一個(gè)全連接層,用于輸出分類(lèi)預(yù)測(cè)。使用訓(xùn)練集對(duì)模型進(jìn)行微調(diào),使其學(xué)習(xí)特定的情感分類(lèi)任務(wù)。
(3)模型評(píng)估與選擇:在驗(yàn)證集上評(píng)估微調(diào)后的模型性能,如準(zhǔn)確率、F1分?jǐn)?shù)等??梢酝ㄟ^(guò)調(diào)整模型參數(shù)、模型結(jié)構(gòu)或訓(xùn)練策略(如學(xué)習(xí)率、批次大小等)進(jìn)行優(yōu)化。
(4)完成情感分類(lèi):使用訓(xùn)練好的模型對(duì)未標(biāo)注的文本進(jìn)行情感分類(lèi)。
這里使用 RoBERTa 做演示, Robustly Optimized BERT Pre-training Approach 是根據(jù) BERT 模型架構(gòu)進(jìn)行改進(jìn)的,采用的訓(xùn)練數(shù)據(jù)比 BERT 更大,訓(xùn)練過(guò)程中還采用了一些其他的優(yōu)化策略,例如動(dòng)態(tài)掩碼,更長(zhǎng)的序列長(zhǎng)度等。
#這里仍選用上面的 Amazon Fine Food ReViews 數(shù)據(jù)集#加載模型
import torch
import transformers
# 加載 RoBERTa 預(yù)訓(xùn)練模型和 tokenizer
model = transformers.RobertaForSequenceClassification.from_pretrained('roberta-base')
tokenizer = transformers.RobertaTokenizer.from_pretrained('roberta-base')
# 將train_text_data轉(zhuǎn)成可放入 tokenizer 的格式
train_text_token = tokenizer.batch_encode_plus(train_text.values.tolist(), max_length=128, padding=True, truncation=True)
# 將數(shù)據(jù)包裝成 PyTorch tensor 格式
train_dataset = torch.utils.data.TensorDataset(torch.tensor(train_text_token['input_ids']),
torch.tensor(train_text_token['attention_mask']),
torch.tensor(train_labels.to_list()))
# 訓(xùn)練微調(diào)模型
# 定義訓(xùn)練參數(shù)和優(yōu)化器
batch_size = 32
epochs = 5
optimizer = torch.optim.Adam(params=model.parameters(), lr=1e-5)
# 訓(xùn)練
model.train()
train_loader = torch.utils.data.DataLoader(train_dataset, batch_size=batch_size, shuffle=True)
for epoch in range(epochs):
for batch in train_loader:
input_ids, attention_mask, labels = tuple(t for t in batch)
optimizer.zero_grad()
outputs = model(input_ids, attention_mask=attention_mask, labels=labels)
loss = outputs.loss
logits = outputs.logits
loss.backward()
optimizer.step()
基于 RoBERTa 模型對(duì)帶標(biāo)簽的文本分類(lèi)數(shù)據(jù)做了微調(diào)訓(xùn)練,訓(xùn)練后在用于評(píng)估測(cè)試數(shù)據(jù)。
# 驗(yàn)證
model.eval()
with torch.no_grad():
val_encodings = tokenizer(test_text.values.tolist(), truncation=True, padding=True, max_length=128)
val_dataset = torch.utils.data.TensorDataset(torch.tensor(val_encodings['input_ids']),
torch.tensor(val_encodings['attention_mask']),
torch.tensor(test_labels.tolist()))
val_loader = torch.utils.data.DataLoader(val_dataset, batch_size=batch_size)
num_correct = 0
num_total = 0
for batch in val_loader:
input_ids, attention_mask, labels = tuple(t for t in batch)
outputs = model(input_ids, attention_mask=attention_mask)
logits = outputs.logits
predictions = torch.argmax(logits, dim=1)
num_correct += (predictions == labels).sum().item()
num_total += labels.size(0)
accuracy = num_correct / num_total
print(f'Accuracy: {accuracy:.2f}')

(評(píng)估準(zhǔn)確率得分)
這里可以看到使用了相同的樣本,微調(diào)后的 RoBERTa 情感分類(lèi)的準(zhǔn)確率是 0.91 (高于 SVM 的 0.85),但是微調(diào)時(shí)間也是真長(zhǎng),幾百條數(shù)據(jù)做了 5次 epoch 用了 25min (mac Intel i5 Core 4c)。
這里使用的 RoBERTa-Base 參數(shù)量(約為 1.1億) 仍然比較小,可以使用 GPT3.5、GPT4、PaLM2 等更大模型來(lái)做情感分析任務(wù),當(dāng)然計(jì)算量也會(huì)更大,最好上 GPU 來(lái)跑。
05
總結(jié)與展望
對(duì)文本進(jìn)行情感分類(lèi)是一條無(wú)止盡的路,不斷有新的方法涌現(xiàn),這張圖很好的展示了對(duì)于 Embedding 技術(shù)的發(fā)展歷程。
(圖片來(lái)自網(wǎng)絡(luò))
最后對(duì)常用文本情感分析方法做個(gè)匯總:

▌?wù)雇?/span>
鑒于篇幅和研究有限,仍有一些研究方法并未提及或展開(kāi)。基于知識(shí)圖譜和圖神經(jīng)網(wǎng)絡(luò)的情感分析方法也是目前主流研究方向。本文研究的情感分析更偏向于社交媒體評(píng)論類(lèi)的短文本情感分析,對(duì)于新聞?lì)愇臋n型長(zhǎng)本文,有 LDA Doc2Vec 方法。對(duì)于中文的分詞方法也有諸多研究和困難點(diǎn)未展開(kāi)說(shuō)明。此外,基于圖片、視頻、音頻、文本等多模態(tài)的研究方法也是未來(lái)的研究方向。
▌參考文獻(xiàn)
[1] B. Pang, L. Lee, S. Vaithyanathan. Thumbs up? sentiment classification using machine learning techniques[C]. Empirical Methods in Natural Language Processing, 2002: 79-86
[2] B. Liu, L. Zhang. Sentiment analysis and opinion mining[J]. Synthesis Lectures on Human Language Technologies, 2012,5(1):1-167
[3] Samar Al-Saqqa and Arafat Awajan. The Use of Word2vec Model in Sentiment Analysis: A Survey[J]. Association for Computing Machinery, 2019: 39-43
[4] 鄧鈺. 面向短文本的情感分析關(guān)鍵技術(shù)研究. 2021. [D]. 電子科技大學(xué)
[5] Deng, Xiang, et al. LLMs to the Moon? Reddit Market Sentiment Analysis with Large Language Models. Companion Proceedings of the ACM Web Conference 2023
[6] Vaswani A, Shazeer N, Parmar N, et al. Attention is all you need[J]. Advances in neural information processing systems, 2017, 30
[7] 閆曉妍. 基于深度學(xué)習(xí)的中文在線評(píng)論情感分析研究.2022. [D]
[8] Zhang W, Deng Y, Liu B, et al. Sentiment Analysis in the Era of Large Language Models: A Reality Check[J]. arXiv preprint arXiv:2305.15005, 2023
文章完整代碼和數(shù)據(jù)請(qǐng)關(guān)注公眾號(hào) 技術(shù)歲月 ,發(fā)送關(guān)鍵字 情感分析 獲取。
