乡下人产国偷v产偷v自拍,国产午夜片在线观看,婷婷成人亚洲综合国产麻豆,久久综合给合久久狠狠狠9

  • <output id="e9wm2"></output>
    <s id="e9wm2"><nobr id="e9wm2"><ins id="e9wm2"></ins></nobr></s>

    • 分享

      Python有趣|中文文本情感分析

       昵稱16619343 2019-03-28
      前言

      前文給大家說了python機(jī)器學(xué)習(xí)的路徑,這光說不練假把式,這次,羅羅攀就帶大家完成一個中文文本情感分析的機(jī)器學(xué)習(xí)項(xiàng)目,今天的流程如下:

      數(shù)據(jù)情況和處理

      數(shù)據(jù)情況

      這里的數(shù)據(jù)為大眾點(diǎn)評上的評論數(shù)據(jù)(王樹義老師提供),主要就是評論文字和打分。我們首先讀入數(shù)據(jù),看下數(shù)據(jù)的情況:

      1. import numpy as np

      2. import pandas as pd

      3. data = pd.read_csv('data1.csv')

      4. data.head

      情感劃分

      對star字段看唯一值,打分有1,2,4,5。

      中文文本情感分析屬于我們的分類問題(也就是消極和積極),這里是分?jǐn)?shù),那我們設(shè)計(jì)代碼,讓分?jǐn)?shù)小于3的為消極(0),大于3的就是積極(1)。

      定義一個函數(shù),然后用apply方法,這樣就得到了一個新列(數(shù)據(jù)分析里的知識點(diǎn))

      1. def make_label(star):

      2. if star >3:

      3. return1

      4. else:

      5. return0

      6. data['sentiment']= data.star.apply(make_label)

      工具包(snownlp)

      我們首先不用機(jī)器學(xué)習(xí)方法,我們用一個第三庫(snownlp),這個庫可以直接對文本進(jìn)行情感分析(記得安裝),使用方法也是很簡單。返回的是積極性的概率。

      1. from snownlp importSnowNLP

      2. text1 ='這個東西不錯'

      3. text2 ='這個東西很垃圾'

      4. s1 =SnowNLP(text1)

      5. s2 =SnowNLP(text2)

      6. print(s1.sentiments,s2.sentiments)

      7. # result 0.8623218777387431 0.21406279508712744

      這樣,我們就定義大于0.6,就是積極的,同樣的方法,就能得到結(jié)果。

      1. def snow_result(comemnt):

      2. s =SnowNLP(comemnt)

      3. if s.sentiments >=0.6:

      4. return1

      5. else:

      6. return0

      7. data['snlp_result']= data.comment.apply(snow_result)

      上面前五行的結(jié)果看上去很差(5個就2個是對的),那到底有多少是對的了?我們可以將結(jié)果與sentiment字段對比,相等的我就計(jì)數(shù),這樣在除以總樣本,就能看大概的精度了。

      1. counts =0

      2. for i in range(len(data)):

      3. if data.iloc[i,2]== data.iloc[i,3]:

      4. counts+=1

      5. print(counts/len(data))

      6. # result 0.763

      樸素貝葉斯

      前面利用第三庫的方法,結(jié)果不是特別理想(0.763),而且這種方法存在一個很大的弊端:針對性差。

      什么意思了?我們都知道,不同場景下,語言表達(dá)都是不同的,例如這個在商品評價中有用,在博客評論中可能就不適用了。

      所以,我們需要針對這個場景,訓(xùn)練自己的模型。本文將使用sklearn實(shí)現(xiàn)樸素貝葉斯模型(原理在后文中講解)。slearn小抄先送上(下文有高清下載地址)。

      大概流程為:

      • 導(dǎo)入數(shù)據(jù)

      • 切分?jǐn)?shù)據(jù)

      • 數(shù)據(jù)預(yù)處理

      • 訓(xùn)練模型

      • 測試模型

      jieba分詞

      首先,我們對評論數(shù)據(jù)分詞。為什么要分詞了?中文和英文不一樣,例如:i love python,就是通過空格來分詞的;我們中文不一樣,例如:我喜歡編程,我們要分成我/喜歡/編程(通過空格隔開),這個主要是為了后面詞向量做準(zhǔn)備。

      1. import jieba

      2. def chinese_word_cut(mytext):

      3. return' '.join(jieba.cut(mytext))

      4. data['cut_comment']= data.comment.apply(chinese_word_cut)

      劃分?jǐn)?shù)據(jù)集

      分類問題需要x(特征),和y(label)。這里分詞后的評論為x,情感為y。按8:2的比例切分為訓(xùn)練集和測試集。

      1. X = data['cut_comment']

      2. y = data.sentiment

      3. from sklearn.model_selection import train_test_split

      4. X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=22)

      詞向量(數(shù)據(jù)處理)

      電腦是沒法識別文字的,只能識別數(shù)字。那文本怎么處理了,最簡單的就是詞向量。什么是詞向量,我們通過一個案例來說明下,下面是我們的文本:

      1. I love the dog

      2. I 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)鍵詞(過于獨(dú)特),去除掉。

      • token_pattern:主要是通過正則處理掉數(shù)字和標(biāo)點(diǎn)符號。

      • stop_words:設(shè)置停用詞表,這樣的詞我們就不會統(tǒng)計(jì)出來(多半是虛擬詞,冠詞等等),需要列表結(jié)構(gòu),所以代碼中定義了一個函數(shù)來處理停用詞表。

      1. from sklearn.feature_extraction.text importCountVectorizer

      2. def get_custom_stopwords(stop_words_file):

      3. with open(stop_words_file)as f:

      4. stopwords = f.read

      5. stopwords_list = stopwords.split('\n')

      6. custom_stopwords_list =[i for i in stopwords_list]

      7. return

      8. stop_words_file ='哈工大停用詞表.txt'

      9. stopwords = get_custom_stopwords(stop_words_file)

      10. vect =CountVectorizer(max_df =0.8,

      11. min_df =3,

      12. token_pattern=u'(?u)\\b[^\\d\\W]\\w+\\b',

      13. stop_words=frozenset(stopwords))

      如果想看到底出來的是什么數(shù)據(jù),可通過下面代碼查看。

      1. test = pd.DataFrame(vect.fit_transform(X_train).toarray, columns=vect.get_feature_names)

      2. test.head

      訓(xùn)練模型

      訓(xùn)練模型,很簡單,用的是樸素貝葉斯算法,結(jié)果為0.899,比之前的snownlp好很多了。

      1. from sklearn.naive_bayes importMultinomialNB

      2. nb =MultinomialNB

      3. X_train_vect = vect.fit_transform(X_train)

      4. nb.fit(X_train_vect, y_train)

      5. train_score = nb.score(X_train_vect, y_train)

      6. print(train_score)

      7. # result 0.899375

      測試數(shù)據(jù)

      當(dāng)然,我們需要測試數(shù)據(jù)來驗(yàn)證精確度了,結(jié)果為0.8275,精度還是不錯的。

      1. X_test_vect = vect.transform(X_test)

      2. print(nb.score(X_test_vect, y_test))

      3. # result 0.8275

      當(dāng)然,我們也可以將結(jié)果放到data數(shù)據(jù)中:

      1. X_vec = vect.transform(X)

      2. nb_result = nb.predict(X_vec)

      3. data['nb_result']= nb_result

      • 樣本量少

      • 模型沒調(diào)參

      • 沒有交叉驗(yàn)證

      代碼下載:https://github.com/panluoluo/crawler-analysis,下載完整數(shù)據(jù)和代碼。

        本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點(diǎn)擊一鍵舉報。
        轉(zhuǎn)藏 分享 獻(xiàn)花(0

        0條評論

        發(fā)表

        請遵守用戶 評論公約

        類似文章 更多