本文結(jié)構(gòu):
- 什么是情感分析咐蚯?
- 怎么分析,技術(shù)上如何實現(xiàn)?
cs224d Day 7: 項目2-命名實體識別
什么是情感分析煞抬?
就是要識別出用戶對一件事一個物或一個人的看法狼钮、態(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 去解決情感分析問題的匿醒。先來簡單介紹一下大體思路,然后進(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 上的趨勢:
以上就是 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)注和評論被廓!