
數(shù)據(jù)情況和處理
數(shù)據(jù)情況
這里的數(shù)據(jù)為大眾點評上的評論數(shù)據(jù)(王樹義老師提供),主要就是評論文字和打分 。我們首先讀入數(shù)據(jù),看下數(shù)據(jù)的情況:
import numpy as npimport pandas as pddata = https://www.45baike.com/post/pd.read_csv(data1.csv)data.head()情感劃分
什么是骨干網(wǎng)?骨干網(wǎng)絡(luò)是集中的基礎(chǔ)設(shè)施,旨在將不同的路由和數(shù)據(jù)分發(fā)到各種網(wǎng)絡(luò) 。它還處理帶寬管理和各種通道 。
對star字段看唯一值,打分有1,2,4,5 。
中文文本情感分析屬于我們的分類問題(也就是消極和積極),這里是分數(shù),那我們設(shè)計代碼,讓分數(shù)小于3的為消極(0),大于3的就是積極(1) 。
定義一個函數(shù),然后用apply方法 , 這樣就得到了一個新列(數(shù)據(jù)分析里的知識點)
def make_label(star): if star > 3: return 1 else: return 0 data[sentiment] = data.star.apply(make_label)工具包(snownlp)
我們首先不用機器學(xué)習方法,我們用一個第三庫(snownlp) , 這個庫可以直接對文本進行情感分析(記得安裝) , 使用方法也是很簡單 。返回的是積極性的概率 。
from snownlp import SnowNLPtext1 = 這個東西不錯text2 = 這個東西很垃圾s1 = SnowNLP(text1)s2 = SnowNLP(text2)print(s1.sentiments,s2.sentiments) result 0.8623218777387431 0.21406279508712744這樣,我們就定義大于0.6,就是積極的,同樣的方法 , 就能得到結(jié)果 。
def snow_result(comemnt): s = SnowNLP(comemnt) if s.sentiments >= 0.6: return 1 else: return 0 data[snlp_result] = data.comment.apply(snow_result)上面前五行的結(jié)果看上去很差(5個就2個是對的),那到底有多少是對的了?我們可以將結(jié)果與sentiment字段對比,相等的我就計數(shù) , 這樣在除以總樣本,就能看大概的精度了 。
counts = 0for i in range(len(data)): if data.iloc[i,2] == data.iloc[i,3]: counts =1print(counts/len(data)) result 0.763樸素貝葉斯
前面利用第三庫的方法,結(jié)果不是特別理想(0.763) , 而且這種方法存在一個很大的弊端:針對性差 。
什么意思了?我們都知道,不同場景下,語言表達都是不同的,例如這個在商品評價中有用,在博客評論中可能就不適用了 。
所以,我們需要針對這個場景 , 訓(xùn)練自己的模型 。本文將使用sklearn實現(xiàn)樸素貝葉斯模型(原理在后文中講解) 。slearn小抄先送上(下文有高清下載地址) 。
大概流程為:
一加侖等于多少升汽油?加侖和升如何換算加侖是一種容(體)積單位,并且分為兩種:英制加侖和美制加侖,(美制)一加侖=3.785 412升汽油;(英制)一加侖=4.546 092升;加侖的英文全 。
- 導(dǎo)入數(shù)據(jù)
- 切分數(shù)據(jù)
- 數(shù)據(jù)預(yù)處理
- 訓(xùn)練模型
- 測試模型
首先,我們對評論數(shù)據(jù)分詞 。為什么要分詞了?中文和英文不一樣 , 例如:i love python,就是通過空格來分詞的;我們中文不一樣,例如:我喜歡編程 , 我們要分成我/喜歡/編程(通過空格隔開),這個主要是為了后面詞向量做準備 。
import jiebadef chinese_word_cut(mytext): return " ".join(jieba.cut(mytext))data[cut_comment] = data.comment.apply(chinese_word_cut)劃分數(shù)據(jù)集
分類問題需要x(特征),和y(label) 。這里分詞后的評論為x , 情感為y 。按8:2的比例切分為訓(xùn)練集和測試集 。
X = data[cut_comment]y = data.sentimentfrom sklearn.model_selection import train_test_splitX_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=22)詞向量(數(shù)據(jù)處理)
電腦是沒法識別文字的,只能識別數(shù)字 。那文本怎么處理了,最簡單的就是詞向量 。什么是詞向量,我們通過一個案例來說明下,下面是我們的文本:
I love the dogI hate the dog詞向量處理后就是這樣的:
簡單的說,詞向量就是我們將整個文本出現(xiàn)的單詞一一排列,然后每行數(shù)據(jù)去映射到這些列上 , 出現(xiàn)的就是1,沒出現(xiàn)就是0,這樣 , 文本數(shù)據(jù)就轉(zhuǎn)換成了01稀疏矩陣(這也是上文中文分詞的原因,這樣一個詞就是一個列) 。
好在,sklearn中直接有這樣的方法給我們使用 。CountVectorizer方法常用的參數(shù):
- max_df:在超過這一比例的文檔中出現(xiàn)的關(guān)鍵詞(過于平凡),去除掉 。
- min_df:在低于這一數(shù)量的文檔中出現(xiàn)的關(guān)鍵詞(過于獨特) , 去除掉 。
- token_pattern:主要是通過正則處理掉數(shù)字和標點符號 。
- stop_words:設(shè)置停用詞表,這樣的詞我們就不會統(tǒng)計出來(多半是虛擬詞,冠詞等等),需要列表結(jié)構(gòu),所以代碼中定義了一個函數(shù)來處理停用詞表 。
test = pd.DataFrame(vect.fit_transform(X_train).toarray(), columns=vect.get_feature_names())test.head()訓(xùn)練模型
訓(xùn)練模型 , 很簡單,用的是樸素貝葉斯算法 , 結(jié)果為0.899,比之前的snownlp好很多了 。
from sklearn.naive_bayes import MultinomialNBnb = MultinomialNB()X_train_vect = vect.fit_transform(X_train)nb.fit(X_train_vect, y_train)train_score = nb.score(X_train_vect, y_train)print(train_score) result 0.899375測試數(shù)據(jù)
當然,我們需要測試數(shù)據(jù)來驗證精確度了 , 結(jié)果為0.8275,精度還是不錯的 。
X_test_vect = vect.transform(X_test)print(nb.score(X_test_vect, y_test)) result 0.8275當然 , 我們也可以將結(jié)果放到data數(shù)據(jù)中:
X_vec = vect.transform(X)nb_result = nb.predict(X_vec)data[nb_result] = nb_result討論和不足
- 樣本量少
- 模型沒調(diào)參
- 沒有交叉驗證
猜你喜歡
- 測情感澤水困變澤風大過 測情感
- 測情感婚姻 測情感
- 文本情感分析國內(nèi)外研究現(xiàn)狀 百度文本情感分析
- 百度ai情感分析 百度智能云情感分析
- 測感情運勢 測情感
- 百度ai訓(xùn)練情感分類模型 百度情感分析模型
- 測情感的塔羅牌 測情感
- 測情感困卦變否卦 測情感
- 情感分析四維模型的內(nèi)容有哪些 百度情感分析模型
- 參哥情感課程百度云 百度智能云情感分析
