使用word2vec對微博進行情感分析和分類

2021-08-28 16:44:01 字數 3178 閱讀 7161

word2vec可以將詞語轉換為高維向量空間中的向量表示,它能揭示上下文關係。首先使用word2vec,將其訓練得到詞向量作為特徵權重,然後根據情感詞典和詞性的兩種特徵選擇方法篩選出有價值的特徵,最後引入svm訓練和**,最終達到情感分類的目的。使用word2vec會得到vectors.bin詞向量模型檔案,對於文字聚類而言,word2vec提供了乙個內部命令來獲得近義詞列表。我們只需要輸入distance 命令便可實現詞語之間相似性的比較,繼而達到聚類目的。

./distance vectors.bin 

訓練完成後,輸入要聚類的詞便可以得到與輸入詞語義最接近的 詞列表與余弦距離。它包含正面情感詞語,負面情感詞語,正面評價詞語和負面評價詞語四個檔案。

情感詞典構建:中國知網(hownet)中文情感分析用詞語集;

so-pmi:

pmi指的是點互資訊

pmi(a, b)=p(a,b)/(p(a)p(b))

假設有乙個句子集合,總量為n

出現a次數為a,出現b次數為b

a和b同時出現在同一句話中的次數為c

則有p(a)=a/n, p(b)=b/n, p(a,b)=c/n

帶入到公式裡就算出pmi了。

1、首先使用庖丁分詞工具將微博內容分解成分離的單詞,然後我們按照使用70%的資料作為訓練集並得到乙個擴充套件的微博情感詞典,使用so-pmi演算法進行詞語情感傾向性分析

使用情感詞典和聯絡資訊分析文字情感具有很好的粒度和分析精確度。

word2vec 和 doc2vec

最近,谷歌開發了乙個叫做 word2vec 的方法,該方法可以在捕捉語境資訊的同時壓縮資料規模。word2vec實際上是兩種不同的方法:continuous bag of words (cbow) 和 skip-gram。cbow的目標是根據上下文來**當前詞語的概率。skip-gram剛好相反:根據當前詞語來**上下文的概率(如圖 1 所示)。這兩種方法都利用人工神經網路作為它們的分類演算法。起初,每個單詞都是乙個隨機 n 維向量。經過訓練之後,該演算法利用 cbow 或者 skip-gram 的方法獲得了每個單詞的最優向量。

現在這些詞向量已經捕捉到上下文的資訊。我們可以利用基本代數公式來發現單詞之間的關係(比如,「國王」-「男人」+「女人」=「王后」)。這些詞向量可以代替詞袋用來**未知資料的情感狀況。該模型的優點在於不僅考慮了語境資訊還壓縮了資料規模(通常情況下,詞彙量規模大約在300個單詞左右而不是之前模型的100000個單詞)。因為神經網路可以替我們提取出這些特徵的資訊,所以我們僅需要做很少的手動工作。但是由於文字的長度各異,我們可能需要利用所有詞向量的平均值作為分類演算法的輸入值,從而對整個文字文件進行分類處理。

然而,即使上述模型對詞向量進行平均處理,我們仍然忽略了單詞之間的排列順序對情感分析的影響。作為乙個處理可變長度文字的總結性方法,quoc le 和 tomas mikolov 提出了 doc2vec方法。除了增加乙個段落向量以外,這個方法幾乎等同於 word2vec。和 word2vec 一樣,該模型也存在兩種方法:distributed memory(dm) 和 distributed bag of words(dbow)。dm 試圖在給定上下文和段落向量的情況下**單詞的概率。在乙個句子或者文件的訓練過程中,段落 id 保持不變,共享著同乙個段落向量。dbow 則在僅給定段落向量的情況下**段落中一組隨機單詞的概率。(如圖 2 所示)

利用 python 實現的 word2vec 例項

在本節中,我們展示了人們如何在情感分類專案中使用詞向量。我們可以在 anaconda 分發版中找到 genism 庫,或者可以通過 pip 安裝 genism 庫。從這裡開始,你可以訓練自己語料庫(乙個文字資料集)的詞向量或者從文字格式或二進位制格式檔案中匯入已經訓練好的詞向量。

emoji 推文的情感分析

現在我們將分析帶有 emoji 表情推文的情感狀況。我們利用 emoji 表情對我們的資料新增模糊的標籤。笑臉表情(:-))表示樂觀情緒,皺眉標籤(:-()表示悲觀情緒。總的 400000 條推文被分為樂觀和悲觀兩組資料。我們隨機從這兩組資料中抽取樣本,構建比例為 8:2 的訓練集和測試集。隨後,我們對訓練集資料構建 word2vec 模型,其中分類器的輸入值為推文中所有詞向量的加權平均值。我們可以利用 scikit-learn 構建許多機器學習模型。

首先,我們匯入資料並構建 word2vec 模型:

接下來,為了利用下面的函式獲得推文中所有詞向量的平均值,我們必須構建作為輸入文字的詞向量。

調整資料集的量綱是資料標準化處理的一部分,我們通常將資料集轉化成服從均值為零的高斯分布,這說明數值大於均值表示樂觀,反之則表示悲觀。為了使模型更有效,許多機器學習模型需要預先處理資料集的量綱,特別是文字分類器這類具有許多變數的模型。

最後我們需要建立測試集向量並對其標準化處理:

接下來我們想要通過計算測試集的**精度和 roc 曲線來驗證分類器的有效性。 roc 曲線衡量當模型引數調整的時候,其真陽性率和假陽性率的變化情況。在我們的案例中,我們調整的是分類器模型截斷閾值的概率。一般來說,roc 曲線下的面積(auc)越大,該模型的表現越好。你可以在這裡找到更多關於 roc 曲線的資料

(在這個案例中我們使用羅吉斯回歸的隨機梯度下降法作為分類器演算法。

隨後我們利用 matplotlib 和 metric 庫來構建 roc 曲線。

roc 曲線如下圖所示:

在沒有建立任何型別的特性和最小文字預處理的情況下,我們利用 scikit-learn 構建的簡單線性模型的**精度為 73%。有趣的是,刪除標點符號會影響**精度,這說明 word2vec 模型可以提取出文件中符號所包含的資訊。處理單獨的單詞,訓練更長時間,做更多的資料預處理工作,和調整模型的引數都可以提高**精度。我發現使用人工神經網路(anns)模型可以提高 5% 的**精度。需要注意的是,scikit-learn 沒有提供 ann 分類器的實現工具,所以我利用了自己建立的自定義庫:

分類結果的精度為 77%。對於任何機器學習專案來說,選擇正確的模型通常是一種藝術而非科學的行為。如果你想要使用我自定義的庫,你可以在我的 github 主頁上找到它,但是這個庫非常混亂而且沒有定期維護!如果你想要貢獻自己的力量,請隨時復刻我的專案。

結論我希望你已經看到 word2vec 和 doc2vec 的實用性和便捷性。通過乙個非常簡單的演算法,我們可以獲得豐富的詞向量和段落向量,這些向量資料可以被應用到各種各樣的 nlp 應用中。更關鍵的是谷歌公司開放了他們自己的預訓練詞向量結果,這個詞向量是基於乙個別人難以獲取的大資料集而訓練得到的。如果你想要在大資料集中訓練自己的向量結果,現在已經有乙個基於 apache spark 的 word2vec 實現工具。

與word2vec 原來word2vec那麼簡單

說到word2vec,它可謂非結構化資料裡面的佼佼者,尤其是在推薦和nlp當中,足以體現它的優勢所在,並且多年一直備受工業界喜愛.那麼word2vec到底是怎麼個原理的,發現身邊總是有很多人問,確不能準確的說出為什麼是兩個矩陣,到底是怎麼自動反向傳播的,以及對於softmax之後那麼大的維度資料,是...

word2vec使用說明

word2vec是谷歌2013年開源的工具,原始 這個工具能比較高效的訓練出詞向量。word2vec 引數說明 預設 word2vec train text8 output vectors.bin cbow 0 size 100 window 5 negative 0 hs 1 sample 1e ...

word2vec學習參考

最近看nlp的東西比較多。就拿現在google 基於神經網路做的 word2vec 作為部落格的開始吧,今後會陸陸續續補充內容。基本是分4塊內容 1.神經網路語言模型 2.語言模型分層優化 3.word2vec 原理 4.google word2vec 看一點寫一點,先扔些參考資料鏈接上去。附上在研...