【火爐煉AI】機器學習041-NLP句子情感分析
【火爐煉AI】機器學習041-NLP句子情感分析
(本文所使用的Python庫和版本號: Python 3.6, Numpy 1.14, scikit-learn 0.19, matplotlib 2.2 )
在NLP中有一個非常實用的應用領域--情感分析,情感分析是用NLP技術分析一段給定文字的情感型別,是積極的還是消極的,是樂觀的還是悲觀的等。比如在股市中,我們知道,往往大眾最悲觀的時候往往是股市的大底,而最樂觀的時候卻是股市的頂部,所以,如果我們能夠掌握大眾的心裡情感狀況,那麼也就能大概知道股市的底和頂,換言之,也就能夠在股市上掙得大把大把的銀子了。
1. 準備資料集
本專案所使用的資料集也是由nltk內部提供,其中的corpus模組中有movies_reviews,可以給我們提供“積極”和“消極”的語句文字。
# 1, 準備資料集from nltk.corpus import movie_reviews pos_fileIds=movie_reviews.fileids('pos') # 載入積極文字檔案neg_fileIds=movie_reviews.fileids('neg') # 消極文字檔案print(len(pos_fileIds)) # 1000print(len(neg_fileIds)) # 1000 print(pos_fileIds[:5]) print(neg_fileIds[:5])# 由此可看出,movie_reviews.fileids是載入各種類別文字的檔案,# 並返回該檔名組成的list# 如果想要檢視某個文字檔案的內容,可以使用print(movie_reviews.words(fileids=['pos/cv000_29590.txt']))
-------------------------------------輸---------出--------------------------------
1000
1000
['pos/cv000_29590.txt', 'pos/cv001_18431.txt', 'pos/cv002_15918.txt', 'pos/cv003_11664.txt', 'pos/cv004_11636.txt']
['neg/cv000_29416.txt', 'neg/cv001_19502.txt', 'neg/cv002_17424.txt', 'neg/cv003_12683.txt', 'neg/cv004_12641.txt']
['films', 'adapted', 'from', 'comic', 'books', 'have', ...]
--------------------------------------------完-------------------------------------
雖然上面把文字檔案的名稱提取出來,但是我們還需要從這些txt檔案中提取出所需要的特徵,使用這些特徵才能進行後續的分類器建模。
# 2, 處理資料集def extract_features(word_list): '''專門一個函式來提取特徵''' return dict([(word,True) for word in word_list]) # 此處加True的作用是構成dict,實質意義不大pos_features=[(extract_features(movie_reviews.words(fileids=[f])),'Pos') for f in pos_fileIds] neg_features=[(extract_features(movie_reviews.words(fileids=[f])),'Neg') for f in neg_fileIds] print(pos_features[:3]) # 列印下看看內容是否正確dataset=pos_features+neg_features # 將兩部分結合起來作為一個dataset
列印出來的結果很長,可以參考裡面的程式碼。
2. 建立模型,訓練特徵
# 構建模型,訓練模型from nltk import NaiveBayesClassifierfrom nltk.classify import accuracy as nltk_accuracy np.random.shuffle(dataset) rows=int(len(dataset)*0.8) # 80%為train settrain_set,test_set=dataset[:rows],dataset[rows:] print('Num of train_set: ',len(train_set), '/nNum of test_set: ',len(test_set)) clf=NaiveBayesClassifier.train(train_set)# 檢視該模型在test set上的表現acc=nltk_accuracy(clf,test_set) print('Accuracy: {:.2f}%'.format(acc*100))
-------------------------------------輸---------出--------------------------------
Num of train_set: 1600
Num of test_set: 400
Accuracy: 70.75%
--------------------------------------------完-------------------------------------
由此可以看出該模型在測試集上的表現為:準確率70.75%
# 檢視模型內部資訊# 該分類器是分析某段文字中哪些單詞與“積極”的關聯最大,# 哪些與“消極”的關聯最大,進而分析這些關鍵詞的出現來判斷某句話是積極或消極# 列印這些關鍵詞for key_word in clf.most_informative_features()[:10]: print(key_word[0])
-------------------------------------輸---------出--------------------------------
outstanding
insulting
ludicrous
affecting
magnificent
breathtaking
avoids
strongest
fascination
slip
--------------------------------------------完-------------------------------------
可以看出,這些關鍵詞對於區分一個句子是積極還是消極有著至關重要的作用,或者說,如果某個句子中有了這些關鍵詞,就可以區分這個句子的情感是積極還是消極,這些單詞越多,模型預測的準確率就越高。
3. 用成熟模型預測新樣本
# 用該模型來預測新樣本,檢視新句子的情感是積極還是消極new_samples = [ "It is an amazing movie", "This is a dull movie. I would never recommend it to anyone.", "The cinematography is pretty great in this movie", "The direction was terrible and the story was all over the place" ]for sample in new_samples: predict_P=clf.prob_classify(extract_features(sample.split())) pred_sentiment=predict_P.max() print('Sample: {}, Type: {}, Probability: {:.2f}%'.format( sample,pred_sentiment,predict_P.prob(pred_sentiment)*100))
-------------------------------------輸---------出--------------------------------
Sample: It is an amazing movie, Type: Pos, Probability: 61.45%
Sample: This is a dull movie. I would never recommend it to anyone., Type: Neg, Probability: 80.12%
Sample: The cinematography is pretty great in this movie, Type: Pos, Probability: 63.63%
Sample: The direction was terrible and the story was all over the place, Type: Neg, Probability: 63.89%
--------------------------------------------完-------------------------------------
########################小**********結###############################
1,NLTK中所使用的分類器需要用dict型別的資料作為features來資料,故而我們需要自定義一個extract_features函式,來將單詞轉變為dict型別。
2,NLTK中已經整合了很多分類器,比如NaiveBayesClassifier,這些分類器已經整合了字串處理方面的各種細節,使用起來很方便。
#################################################################
注:本部分程式碼已經全部上傳到()上,歡迎下載。
參考資料:
1, Python機器學習經典例項,Prateek Joshi著,陶俊傑,陳小莉譯
作者:煉丹老頑童
連結:
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/2157/viewspace-2817670/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 【火爐煉AI】機器學習039-NLP文字分類器AI機器學習文字分類
- 【火爐煉AI】機器學習037-NLP文字分塊AI機器學習
- 【火爐煉AI】機器學習050-提取影像的Star特徵AI機器學習特徵
- 【火爐煉AI】機器學習036-NLP詞形還原AI機器學習
- 【火爐煉AI】機器學習002-標記編碼方法AI機器學習
- 【火爐煉AI】機器學習028-五分鐘教你打造機器學習流水線AI機器學習
- 【火爐煉AI】機器學習049-提取影象的SIFT特徵點AI機器學習特徵
- 【火爐煉AI】機器學習048-Harris檢測影像角點AI機器學習
- 【火爐煉AI】機器學習042-NLP文字的主題建模AI機器學習
- 【火爐煉AI】機器學習049-提取影像的SIFT特徵點AI機器學習特徵
- 【火爐煉AI】機器學習040-NLP性別判斷分類器AI機器學習
- 【火爐煉AI】機器學習031-KNN迴歸器模型的構建AI機器學習KNN模型
- 【火爐煉AI】機器學習054-用ICA做盲源分離AI機器學習
- 【火爐煉AI】機器學習047-影像的直方圖均衡化操作AI機器學習直方圖
- 【火爐煉AI】機器學習004-嶺迴歸器的構建和模型評估AI機器學習模型
- 【火爐煉AI】機器學習017-使用GridSearch搜尋最佳引數組合AI機器學習
- 【火爐煉AI】機器學習026-股票資料聚類分析-近鄰傳播演算法AI機器學習聚類演算法
- 【火爐煉AI】機器學習052-OpenCV構建人臉鼻子眼睛檢測器AI機器學習OpenCV
- 【火爐煉AI】機器學習005-多項式迴歸器的建立和測試AI機器學習
- 【火爐煉AI】機器學習053-資料降維絕招-PCA和核PCAAI機器學習PCA
- 【火爐煉AI】機器學習032-使用者之間相似度的計算AI機器學習
- 【火爐煉AI】機器學習014-用SVM構建非線性分類模型AI機器學習模型
- 【火爐煉AI】機器學習019-專案案例:使用SVM迴歸器估算交通流量AI機器學習
- 【火爐煉AI】機器學習024-無監督學習模型的效能評估--輪廓係數AI機器學習模型
- 【火爐煉AI】機器學習020-使用K-means演算法對資料進行聚類分析AI機器學習演算法聚類
- 【火爐煉AI】機器學習022-使用均值漂移聚類演算法構建模型AI機器學習聚類演算法模型
- 【火爐煉AI】機器學習006-用決策樹迴歸器構建房價評估模型AI機器學習模型
- 【火爐煉AI】機器學習007-用隨機森林構建共享單車需求預測模型AI機器學習隨機森林模型
- 【火爐煉AI】機器學習051-視覺詞袋模型+極端隨機森林建立影象分類器AI機器學習視覺模型隨機森林
- 【火爐煉AI】機器學習051-視覺詞袋模型+極端隨機森林建立影像分類器AI機器學習視覺模型隨機森林
- 【火爐煉AI】機器學習045-對股票資料進行隱馬爾科夫建模AI機器學習馬爾科夫
- 【火爐煉AI】機器學習009-用邏輯迴歸分類器解決多分類問題AI機器學習邏輯迴歸
- 【火爐煉AI】機器學習015-如何處理樣本數偏差較大的資料集AI機器學習
- 【火爐煉AI】深度學習006-移花接木-用Keras遷移學習提升效能AI深度學習Keras遷移學習
- 【火爐煉AI】機器學習013-用樸素貝葉斯分類器估算個人收入階層AI機器學習
- 【火爐煉AI】機器學習010-用樸素貝葉斯分類器解決多分類問題AI機器學習
- 【火爐煉AI】機器學習008-簡單線性分類器解決二分類問題AI機器學習
- 【火爐煉AI】深度學習001-神經網路的基本單元-感知器AI深度學習神經網路