知識(shí)儲(chǔ)備
- 情感分析定義
文本情感分析(也稱(chēng)為意見(jiàn)挖掘)是指自然語(yǔ)言處理、文本挖掘以及計(jì)算機(jī)語(yǔ)言學(xué)等方法來(lái)識(shí)別和提取原素材中的主觀信息。(摘自《維基百科》)
使用到的第三方庫(kù)文件:
snownlp TextBlob(英文) SnowNLP(中文)
TextBlob github:TextBlob
SnowNLP github :SnowNLP
樸素貝葉斯定義
樸素貝葉斯是基于貝葉斯定理與特征條件獨(dú)立假設(shè)的分類(lèi)方法。貝葉斯分類(lèi)器基于一個(gè)簡(jiǎn)單的假定:給定目標(biāo)值時(shí)屬性之間相互條件獨(dú)立(摘自《百度百科》)
- 停用詞定義
在信息檢索中,為節(jié)省存儲(chǔ)空間和提高效率,在處理自然語(yǔ)言數(shù)據(jù)(或文本)之前或之后會(huì)自動(dòng)過(guò)濾掉某些詞或字,這些詞或字即被稱(chēng)為Stop Word(停用詞)(摘自《維基百科》)
目前有很多比較成熟的停用詞表,可以參考這個(gè)
github項(xiàng)目
- 混淆矩陣
混淆矩陣中的4個(gè)數(shù)字,分別代表:
- TP: 本來(lái)是正向,預(yù)測(cè)也是正向的;
- FP: 本來(lái)是負(fù)向,預(yù)測(cè)卻是正向的;
- FN: 本來(lái)是正向,預(yù)測(cè)卻是負(fù)向的;
- TN: 本來(lái)是負(fù)向,預(yù)測(cè)也是負(fù)向的。
混淆矩陣數(shù)字含義
開(kāi)始干活吧
- 文本文件讀入
import pandas as pd
# 讀入文本文件
df = pd.read_csv()
- 定義函數(shù)將星級(jí)評(píng)分大于3分的,當(dāng)成正向情感,取值為1,反之取值為0
def make_label(df):
df["sentiment"] =df['comment_ratting'].apply(lambda x: 1 if x>3 else 0)
- 拆分特征和標(biāo)簽
# 提取全部特征值
X = df[['comment']]
y = df.sentiment
- 中文分詞
# 結(jié)巴分詞工具做分詞操作
import jieba
def chinese_word_cut(content):
return ' '.join([word for word in jieba.cut(content,cut_all=False) if len(word)>=2])
# apply函數(shù),對(duì)每行評(píng)論進(jìn)行分詞
X['cutted_comment'] = X.comment_infos.apply(chinese_word_cut)
- 訓(xùn)練集和測(cè)試集拆分
from sklearn.model_selection import train_test_split
# from sklearn.cross_validation import train_test_split (sklearn版本低于0.18,請(qǐng)使用該行)
# random_state 保證隨機(jī)數(shù)在不同環(huán)境中保持一致,以便驗(yàn)證模型效果
X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=1)
- 中文停用詞處理
def get_custom_stopwords(stop_words_file):
with open(stop_words_file) as f:
stopwords = f.read()
stopwords_list = stopwords.split('\n')
custom_stopwords_list = [i for i in stopwords_list]
return custom_stopwords_list
stop_word_file = '中文停用詞文件'
stopwords = get_custom_stopwords(stop_words_file)
- 特征向量化
from sklearn.feature_extraction.text import CountVectorizer
vect = CountVectorizer(
max_df = 0.8,# 在超過(guò)這一比例的文檔中出現(xiàn)的關(guān)鍵詞(過(guò)于平凡),去除掉。
min_df = 3, # 在低于這一數(shù)量的文檔中出現(xiàn)的關(guān)鍵詞(過(guò)于獨(dú)特),去除掉。
token_pattern=u'(?u)\\b[^\\d\\W]\\w+\\b', #取出數(shù)字特征
stop_words=frozenset(stopwords))
)
# 向量化工具轉(zhuǎn)化分詞后的訓(xùn)練集語(yǔ)句,并轉(zhuǎn)換為DataFrame對(duì)象
term_matrix = pd.DataFrame(vect.fit_transform(X_train.cutted_comment).toarray(), columns=vect.get_feature_names())
- 利用生成矩陣訓(xùn)練模型
# 樸素貝葉斯分類(lèi)
from sklearn.naive_bayes import MultinomialNB
nb = MultinomialNB()
from sklearn.pipeline import make_pipeline
pipe = make_pipeline(vect, nb)
# 將未特征向量化的訓(xùn)練集內(nèi)容輸入,做交叉驗(yàn)證,計(jì)算模型分類(lèi)準(zhǔn)確率
from sklearn.cross_validation import cross_val_score
print (cross_val_score(pipe, X_train.cutted_comment, y_train, cv=5, scoring='accuracy').mean())
結(jié)果輸出:0.819563608026
- 驗(yàn)證模型準(zhǔn)確度
# 模型擬合
pipe.fit(X_train.cutted_comment, y_train)
# 在測(cè)試集上,對(duì)情感分類(lèi)進(jìn)行預(yù)測(cè)
y_pred = pipe.predict(X_test.cutted_comment)
# 引入sklearn測(cè)量工具集
from sklearn import metrics
print (metrics.accuracy_score(y_test, y_pred))
結(jié)果輸出:0.80612244898
- 混淆矩陣驗(yàn)證
print (metrics.confusion_matrix(y_test, y_pred))
結(jié)果輸出:[[67 3][16 12]]
- SnowNLP進(jìn)行情感分析
from snownlp import SnowNLP
def get_sentiment(text):
return SnowNLP(text).sentiments
# 測(cè)試數(shù)據(jù)集 利用SnowNLP處理
y_pred_snownlp = X_test.comment_infos.apply(get_sentiment)
# 當(dāng)我們查看結(jié)果就會(huì)發(fā)現(xiàn)SnowNLP輸出結(jié)果為[0-1]之間的小數(shù)值
# 所以我們將大于0.5的結(jié)果作為正向,小于0.5的結(jié)果作為負(fù)向y_pred_snownlp_normalized = y_pred_snownlp.apply(lambda x: 1 if x>0.5 else 0)
# 查看模型的準(zhǔn)確率
print (metrics.accuracy_score(y_test, y_pred_snownlp_normalized))
結(jié)果輸出:0.489795918367
結(jié)果很糟糕哦!
小結(jié)
- 如何利用停用詞、詞頻閥值和標(biāo)記模式(token_pattern)移除無(wú)關(guān)的特征詞匯,降低模型復(fù)雜度
- 選用合適的機(jī)器學(xué)習(xí)分類(lèi)模型,對(duì)詞語(yǔ)特征矩陣分類(lèi)的重要性
- 如何使用管道模式,歸并和簡(jiǎn)化機(jī)器學(xué)習(xí)步驟流程
- 如何選擇合適的性能測(cè)試工具,對(duì)模型的效果作出評(píng)估和對(duì)比
相關(guān)閱讀 請(qǐng)移步
初步學(xué)習(xí)有很多不足之處,希望大家多多指教
代碼和數(shù)據(jù)集會(huì)在整理后及時(shí)更新