怎樣做情感分析

本文結(jié)構(gòu):

  1. 什么是情感分析咐蚯?
  2. 怎么分析,技術(shù)上如何實現(xiàn)?

cs224d Day 7: 項目2-命名實體識別

2016課程地址
項目描述地址


什么是情感分析煞抬?

就是要識別出用戶對一件事一個物或一個人的看法狼钮、態(tài)度碳柱,比如一個電影的評論,一個商品的評價熬芜,一次體驗的感想等等莲镣。根據(jù)對帶有情感色彩的主觀性文本進(jìn)行分析,識別出用戶的態(tài)度涎拉,是喜歡瑞侮,討厭,還是中立曼库。在實際生活中有很多應(yīng)用区岗,例如通過對 Twitter 用戶的情感分析,來預(yù)測股票走勢毁枯、預(yù)測電影票房慈缔、選舉結(jié)果等,還可以用來了解用戶對公司种玛、產(chǎn)品的喜好藐鹤,分析結(jié)果可以被用來改善產(chǎn)品和服務(wù)瓤檐,還可以發(fā)現(xiàn)競爭對手的優(yōu)劣勢等等。

怎么分析娱节,技術(shù)上如何實現(xiàn)挠蛉?

首先這是個分類問題。

最開始的方案是在文中找到具有各種感情色彩屬性的詞肄满,統(tǒng)計每個屬性的詞的個數(shù)谴古,哪個類多,這段話就屬于哪個屬性稠歉。但是這存在一個問題掰担,例如 don't like ,一個屬于否定怒炸,一個屬于肯定带饱,統(tǒng)計之后變成 0 了,而實際上應(yīng)該是否定的態(tài)度阅羹。再有一種情況是勺疼,前面幾句是否定,后面又是肯定捏鱼,那整段到底是中立還是肯定呢执庐,為了解決這樣的問題,就需要考慮上下文的環(huán)境导梆。

2013年谷歌發(fā)了兩篇論文耕肩,介紹了 Continuous Bag of Words (CBOW) 和 Skip-gram 這兩個模型,也就是 Word2Vec 方法问潭,這兩種模型都是先將每個單詞轉(zhuǎn)化成一個隨機的 N 維向量猿诸,訓(xùn)練之后得到每個單詞的最優(yōu)表示向量,區(qū)別是狡忙,CBOW 是根據(jù)上下文來預(yù)測當(dāng)前詞語梳虽,Skip-gram 剛好相反,是根據(jù)當(dāng)前詞語來預(yù)測上下文灾茁。

Word2Vec 方法不僅可以捕捉上下文語境窜觉,同時還壓縮了數(shù)據(jù)規(guī)模,讓訓(xùn)練更快更高效北专。通過這個模型得到的詞向量已經(jīng)可以捕捉到上下文的信息禀挫。比如,可以利用基本代數(shù)公式來發(fā)現(xiàn)單詞之間的關(guān)系(比如拓颓,“國王”-“男人”+“女人”=“王后”)语婴。用這些自帶上下文信息的詞向量來預(yù)測未知數(shù)據(jù)的情感狀況的話,就可以更準(zhǔn)確。

word2vec

今天的小項目砰左,就是用 word2vec 去解決情感分析問題的匿醒。先來簡單介紹一下大體思路,然后進(jìn)入代碼版塊缠导。

思路分為兩部分廉羔,第一步,就是先用 word2vec 和 SGD 訓(xùn)練出每個單詞的最優(yōu)表示向量僻造。第二步憋他,用 Softmax Regression 對訓(xùn)練數(shù)據(jù)集的每個句子進(jìn)行訓(xùn)練髓削,得到分類器的參數(shù),用這個參數(shù)就可以預(yù)測新的數(shù)據(jù)集的情感分類蔬螟。其中訓(xùn)練數(shù)據(jù)集的每個句子汽畴,都對應(yīng)一個0-1之間的浮點得分,將這個得分化為 0-4 整數(shù)型 5 個級別忍些,分別屬于 5 種感情類別,討厭罢坝,有點討厭,中立嘁酿,有點喜歡隙券,喜歡闹司。然后將每個句子的詞轉(zhuǎn)化成之前訓(xùn)練過的詞向量娱仔,這樣哪些詞屬于哪個類就知道了,然后用分類器得到分類的邊界游桩,得到的參數(shù)就可以用來進(jìn)行預(yù)測牲迫。

具體實現(xiàn)

接下來以一個初學(xué)者的角度來講一下要如何利用這幾個模型和算法來實現(xiàn)情感分析這個任務(wù)的,因為項目的代碼有點多借卧,不方便全寫在文章里盹憎,可以去這里查看完整代碼。

第一步铐刘,用 word2vec 和 SGD 訓(xùn)練出每個單詞的最優(yōu)表示向量陪每。

  • 執(zhí)行 c7_run_word2vec.py
  • 其中訓(xùn)練詞向量的方法是 c5_word2vec.py
  • 同時用 c6_sgd.py 訓(xùn)練參數(shù),并且將結(jié)果保存起來,每1000次迭代保存在一個文件中 saved_params_1000.npy

word2vec:
上面提到了奶稠,它有兩種模型 CBOW 和 Skip-gram俯艰,每一種都可以用來訓(xùn)練生成最優(yōu)的詞向量,同時還有兩種 cost function 的定義方式锌订,一種是 Softmax cost function竹握, 一種是 Negative sampling cost function,所以在提到 word2vec 的時候辆飘,其實是可以有 4 種搭配的方法的啦辐,這個小項目里用到的是 Skip-gram 和 Negative sampling cost function 的結(jié)合方式。

先定義 skipgram 函數(shù):
給一個中心詞 currentWord蜈项,和它的窗口大小為 2C 的上下文 contextWords芹关,要求出代表它們的詞向量矩陣 W1 和 W2。


def skipgram(currentWord, C, contextWords, tokens, inputVectors, outputVectors,
    dataset, word2vecCostAndGradient = softmaxCostAndGradient):
    """ Skip-gram model in word2vec """
    
    currentI = tokens[currentWord]                      #the order of this center word in the whole vocabulary
    predicted = inputVectors[currentI, :]               #turn this word to vector representation
    
    cost = 0.0
    gradIn = np.zeros(inputVectors.shape)
    gradOut = np.zeros(outputVectors.shape)
    for cwd in contextWords:                            #contextWords is of 2C length
        idx = tokens[cwd]
        cc, gp, gg = word2vecCostAndGradient(predicted, idx, outputVectors, dataset)
        cost += cc                                      #final cost/gradient is the 'sum' of result calculated by each word in context
        gradOut += gg
        gradIn[currentI, :] += gp
    
    return cost, gradIn, gradOut

這里用到的成本函數(shù)是 Negative sampling紧卒,我們的目的就是要使這個成本函數(shù)達(dá)到最小侥衬,然后用這個極值時的參數(shù) grad, 也就是可以得到要求的 wordvectors。要增加準(zhǔn)確度迂苛,所以可以多次生成中心詞和上下文進(jìn)行訓(xùn)練怔檩,然后取平均值,也就是函數(shù) word2vec_sgd_wrapper 做的事情怀樟。

def negSamplingCostAndGradient(predicted, target, outputVectors, dataset, K=10):
    """ Negative sampling cost function for word2vec models """
    
    grad = np.zeros(outputVectors.shape)
    gradPred = np.zeros(predicted.shape)
    
    indices = [target]
    for k in xrange(K):
        newidx = dataset.sampleTokenIdx()
        while newidx == target:
            newidx = dataset.sampleTokenIdx()
        indices += [newidx]
    
    labels = np.array([1] + [-1 for k in xrange(K)])
    vecs = outputVectors[indices, :]
    
    t = sigmoid(vecs.dot(predicted) * labels)
    cost = -np.sum(np.log(t))
    
    delta = labels * (t-1)
    gradPred = delta.reshape((1, K+1)).dot(vecs).flatten()
    gradtemp = delta.reshape((K+1, 1)).dot(predicted.reshape(1, predicted.shape[0]))
    
    for k in xrange(K+1):
        grad[indices[k]] += gradtemp[k, :]
        
    return cost, gradPred, grad

**接著用 sgd **迭代 40000 次得到訓(xùn)練好的 wordVectors。

wordVectors0 = sgd(
    lambda vec: word2vec_sgd_wrapper(skipgram, tokens, vec, dataset, C,
        negSamplingCostAndGradient),
        wordVectors, 0.3, 40000, None, True, PRINT_EVERY=10)

關(guān)于 word2vec 之前有寫過一篇 word2vec 模型思想和代碼實現(xiàn)盆佣,想了解詳細(xì)原理和具體怎樣實現(xiàn)的童鞋可以去這個這里看往堡。

第二步,用 Softmax Regression 對訓(xùn)練數(shù)據(jù)集進(jìn)行分類學(xué)習(xí)共耍。

  • 執(zhí)行 c10_sentiment.py
  • 其中用 c6_sgd.py 去訓(xùn)練權(quán)重 weights虑灰,
  • 然后用 c8_softmaxreg.py 根據(jù)訓(xùn)練好的 features,labels痹兜,weights 進(jìn)行類別 label 的預(yù)測。

先將數(shù)據(jù)集分為三部分佃蚜,training set,deviation set熟尉,和 test set洲脂。

trainset = dataset.getTrainSentences()
devset = dataset.getDevSentences()
testset = dataset.getTestSentences()
 

在 trainset 中,每句話對應(yīng)一個情感的得分或者說是分類往果,先將每個 word 在 token 中找到序號,然后在第一步訓(xùn)練好的 wordvectors 中找到相應(yīng)的詞向量堕油。

trainFeatures[i, :] = getSentenceFeature(tokens, wordVectors, words)
 

然后用 sgd 和 softmax_wrapper 迭代 10000 次去訓(xùn)練 weights:

weights = sgd(lambda weights: softmax_wrapper(trainFeatures, trainLabels, weights, regularization), weights, 3.0, 10000, PRINT_EVERY=100)

接著用 softmax regression 進(jìn)行分類的預(yù)測:

 _, _, pred = softmaxRegression(trainFeatures, trainLabels, weights)

上面用到了不同的 REGULARIZATION=[0.0, 0.00001, 0.00003, 0.0001, 0.0003, 0.001, 0.003, 0.01] 掉缺,在其中選擇 accuracy 最好的 REGULARIZATION 和相應(yīng)的結(jié)果

best_dev = 0
for result in results:
    if result["dev"] > best_dev:
        best_dev = result["dev"]
        BEST_REGULARIZATION = result["reg"]
        BEST_WEIGHTS = result["weights"]

用這個最好的參數(shù)在 test set 上進(jìn)行預(yù)測:

_, _, pred = softmaxRegression(testFeatures, testLabels, BEST_WEIGHTS)

并且的到 accuracy:

print "Test accuracy (%%): %f" % accuracy(testLabels, pred)

下圖是 accuracy 和 REGULARIZATION 在 devset 和 trainset 上的趨勢:

accuracy

以上就是 sentiment analysis 的基本實現(xiàn)眶明,把它和爬蟲相結(jié)合搜囱,會有很多好玩的玩兒法蜀肘!

[cs224d]

Day 1. 深度學(xué)習(xí)與自然語言處理 主要概念一覽
Day 2. TensorFlow 入門
Day 3. word2vec 模型思想和代碼實現(xiàn)
Day 4. 怎樣做情感分析
Day 5. CS224d-Day 5: RNN快速入門
Day 6. 一文學(xué)會用 Tensorflow 搭建神經(jīng)網(wǎng)絡(luò)
Day 7. 用深度神經(jīng)網(wǎng)絡(luò)處理NER命名實體識別問題
Day 8. 用 RNN 訓(xùn)練語言模型生成文本
Day 9. RNN與機器翻譯
Day 10. 用 Recursive Neural Networks 得到分析樹
Day 11. RNN的高級應(yīng)用


我是 不會停的蝸牛Alice
85后全職主婦
喜歡人工智能,行動派
創(chuàng)造力灸促,思考力浴栽,學(xué)習(xí)力提升修煉進(jìn)行中
歡迎您的喜歡,關(guān)注和評論被廓!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末嫁乘,一起剝皮案震驚了整個濱河市球碉,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌挎春,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,311評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件能庆,死亡現(xiàn)場離奇詭異搁胆,居然都是意外死亡丰涉,警方通過查閱死者的電腦和手機斯碌,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,339評論 2 382
  • 文/潘曉璐 我一進(jìn)店門傻唾,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人伪煤,你說我怎么就攤上這事凛辣。” “怎么了防泵?”我有些...
    開封第一講書人閱讀 152,671評論 0 342
  • 文/不壞的土叔 我叫張陵捷泞,是天一觀的道長寿谴。 經(jīng)常有香客問我,道長咏瑟,這世上最難降的妖魔是什么痪署? 我笑而不...
    開封第一講書人閱讀 55,252評論 1 279
  • 正文 為了忘掉前任惠桃,我火速辦了婚禮辖试,結(jié)果婚禮上罐孝,老公的妹妹穿的比我還像新娘肥缔。我一直安慰自己,他們只是感情好改艇,可當(dāng)我...
    茶點故事閱讀 64,253評論 5 371
  • 文/花漫 我一把揭開白布谒兄。 她就那樣靜靜地躺著社付,像睡著了一般。 火紅的嫁衣襯著肌膚如雪燕鸽。 梳的紋絲不亂的頭發(fā)上啊研,一...
    開封第一講書人閱讀 49,031評論 1 285
  • 那天鸥拧,我揣著相機與錄音,去河邊找鬼麸锉。 笑死舆声,一個胖子當(dāng)著我的面吹牛柳爽,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播蛾找,決...
    沈念sama閱讀 38,340評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼打毛,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了幻枉?” 一聲冷哼從身側(cè)響起熬甫,我...
    開封第一講書人閱讀 36,973評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎瞻颂,沒想到半個月后郑象,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,466評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡藕坯,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,937評論 2 323
  • 正文 我和宋清朗相戀三年炼彪,在試婚紗的時候發(fā)現(xiàn)自己被綠了辐马。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片局义。...
    茶點故事閱讀 38,039評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡萄唇,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出湃密,到底是詐尸還是另有隱情四敞,我是刑警寧澤,帶...
    沈念sama閱讀 33,701評論 4 323
  • 正文 年R本政府宣布达箍,位于F島的核電站铺厨,受9級特大地震影響硬纤,放射性物質(zhì)發(fā)生泄漏咬摇。R本人自食惡果不足惜煞躬,卻給世界環(huán)境...
    茶點故事閱讀 39,254評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望在扰。 院中可真熱鬧雷客,春花似錦、人聲如沸皱卓。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,259評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至颅和,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間蹭越,已是汗流浹背教届。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評論 1 262
  • 我被黑心中介騙來泰國打工巍佑, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留寄悯,地道東北人。 一個月前我還...
    沈念sama閱讀 45,497評論 2 354
  • 正文 我出身青樓脆栋,卻偏偏與公主長得像,于是被迫代替她去往敵國和親椿争。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,786評論 2 345

推薦閱讀更多精彩內(nèi)容