1. 程式人生 > 實用技巧 >第三天學習進度--文字情感分類(二)

第三天學習進度--文字情感分類(二)

昨天在情感處理的學習中瞭解到了關於word2vec的用法,今天我們繼續康康doc2vec究竟在情感分類的過程中是如何使用的。

doc2vec,也就是常說的文件向量,根據網上查閱到的零碎的資料,大概可以瞭解到,文件向量其實是詞向量的拓寬層面上的應用,是詞向量的基礎上進行延伸的一種應用方式。文件向量能夠識別的是一串不定長分開了之後的句子之間的相似程度,或者說一個經過分詞了之後的句子究竟是歸屬到那一個類別上的

與傳統的樸素貝葉斯文字分類的效果不同的是,他能夠給出對應分類的所屬型別的置信度,因為doc2vec的模型在訓練的時候依然是應用到了神經網路的模型,這個模型在運算的過程中能夠得到其置信度。因此在對應與之相關的句子或者句子所屬的類別的判斷、推薦層面有著比傳統樸素貝葉斯的分類更加明顯的效果(能夠做相似性的句子、文章推薦)。

再者,因為tf-idf在判斷上僅僅考慮到詞在文章或句子中的出現頻率並沒有考慮到詞與詞之間的順序(例如昨天所說的高興和不高興,兩者就多了一個不,但是二者的含義(情感)是完全不同的),而文件向量中的分詞之間考慮到順序,在處理過程中能正堆不定長的分詞後的列表進行對應模型的構建,相對來說,文件向量在對情感分類的任務上擁有比樸素貝葉斯的分類更加優秀的效果。

多說無益,用一個實際的例子來看看文件向量在情感分類上的效果吧。

昨天的學習進度中就提及到原本只有兩個分類的消極和積極的文字中,消極和積極的帶有情感的文字經過構建的tf-idf+樸素貝葉斯分類準確率不足50%!!而隨機數命中消極和積極的概率都有50%,這從某種層面上說,這個tf-idf+樸素貝葉斯基本不具有對情感分類的能力。

接下來看看文件向量對於同樣的資料進行訓練了之後,情感分類的能力如何。

先提供我在訓練的時候所用的兩個情感分類的訓練集:積極消極情感訓練集

在使用doc2vec之前,先簡單瞭解python中doc2vec的基本用法。

doc2vec在gensim中就已經給我們提供了模組,使我們在使用doc2vec的時候變得特別簡單

安裝完gensim後,匯入對應模組即可

from gensim.models import Doc2Vec
import gensim.models.doc2vec as docvec

訓練模型及其模型引數說明,其中x_train是指代入模型中訓練的資料

# 模型引數說明:
#
1.dm=1 PV-DM dm=0 PV-DBOW。 # 2.size 所得向量的維度。 # 3.window 上下文詞語離當前詞語的最大距離。 # 4.alpha 初始學習率,在訓練中會下降到min_alpha。 # 5.min_count 詞頻小於min_count的詞會被忽略。 # 6.max_vocab_size 最大詞彙表size,每一百萬詞會需要1GB的記憶體,預設沒有限制。 # 7.sample 下采樣比例。 # 8.iter 在整個語料上的迭代次數(epochs),推薦10到20。 # 9.hs=1 hierarchical softmax ,hs=0(default) negative sampling。 # 10.dm_mean=0(default) 上下文向量取綜合,dm_mean=1 上下文向量取均值。 # 11.dbow_words:1訓練詞向量,0只訓練doc向量。 model=Doc2Vec(x_train,dm=1, min_count=1, window=3, vector_size=size, sample=1e-3, negative=5,workers=4) model.train(x_train, total_examples=model.corpus_count, epochs=200)

那麼如何構建一個代入模型訓練的資料x_train呢?

首先,我們需要一個分詞好的句子的列表,還有一個這個列表所對應的標籤。

然後我們利用這些句子和標籤構成的x_train,代入上述的訓練過程中就可以構建出對應的文件向量模型model了。

其中

split_sentences是指用jieba分詞好的句子的列表 格式有點像[['不','高興'],['很','開心']]
labels則是指的對應的分詞前的句子所對應的句子型別,如對應上述的['消極','積極']
TaggedDocument=docvec.TaggedDocument
x_train=[]
for i,one in enumerate(split_sentences):
    document=TaggedDocument(one,[labels[i]])
    x_train.append(document)

經過了這個步驟後,就得到了對應的訓練資料 x_train了

接著瞭解一下其他函式,儲存好訓練的模型

model.save(path)

載入訓練模型

model = Doc2Vec.load(path)

根據text來推理分詞向量

vector = model.infer_vector(fc.cutstring(text,stopwordfile=None,cut_all=True),alpha=0.025,steps=500)

最後就是最常用的一個函式,也就是根據模型來推斷與句子最相似的型別

其中sims包含了由對應的句子型別(也就是上面的labels對應的標籤)和置信度所構成的列表。

其中vector就是根據上面的text來推理的分詞向量
sims = model.docvecs.most_similar([vector], topn=topn)

根據上面對於doc2vec的一些簡單的瞭解了之後,構建出上面提供的積極和消極情感文字訓練集的一個文件向量的模型後

在淘寶上,搜尋隨便一個產品對應的好評和差評,看看其效果如何。

第一次測試:

衣服收到了,大小合適穿著很舒服的,面料舒服柔軟,物美價廉值得購買。

期待的結果應該是:pos (積極)

我們來看看最終的結果是什麼:

pos 0.7829157114028931
neg 0.5710924863815308

可以看到此次識別結果是pos 符合期待結果

第二次測試:

衣服質量不錯!自己喜歡的款式! 適合胖胖的我! 物美廉價!會推薦給身邊的姐妹的 值得關注的店鋪奧大愛 顧慮衣服剛剛收到就穿在身上有點褶皺

期待的結果應該是:pos (積極)

最終的結果:

pos 0.7631765007972717
neg 0.5995559692382812

可以看到此次識別結果是pos 符合期待結果

第三次測試:

真的貨不對版! 袖長不夠 衣長不夠 就連領子的開口大小都不對… 好評都是買的吧? 後悔死了 簡直氣死了… 要不是我收了沒看就出國了 早就退了!!騙子啊!!

期待的結果應該是:neg (消極)

最終的結果:

neg 0.6845046281814575
pos 0.29343491792678833

可以看到此次識別結果是neg符合期待結果

第四次測試

太薄了,一件毛衣還不如一個秋衣重,質量太差了

期待的結果應該是:neg (消極)

最終的結果:

neg 0.7289400696754456
pos 0.583489179611206

可以看到此次識別結果是neg符合期待結果

第五次測試

之前買的藍色,今天收到鴕色的,兩件衣服一個碼,長短差一公分多,有點離譜

期待的結果應該是:neg (消極)

最終的結果:

neg 0.78685462474823
pos 0.5400851368904114

可以看到此次識別結果是neg符合期待結果

第六次測試

這個價格能買到這質量值了,很柔軟貼膚,舒適,顏色也正,準備再買件!

期待的結果應該是:pos (積極)

最終的結果:

pos 0.7345569133758545
neg 0.5632465481758118

可以看到此次識別結果是pos 符合期待結果

在淘寶上隨機選6個評論後,文字分類均符合對應的情感分類

結論:文件向量在情感分類上具有強大的作用,6次隨機取樣情感分類結果均正確