基於機器學習和TFIDF的情感分類演算法,詳解自然語言處理

華為雲開發者社群發表於2022-01-05
摘要:這篇文章將詳細講解自然語言處理過程,基於機器學習和TFIDF的情感分類演算法,並進行了各種分類演算法(SVM、RF、LR、Boosting)對比

本文分享自華為雲社群《[Python人工智慧] 二十三.基於機器學習和TFIDF的情感分類(含詳細的NLP資料清洗)》,作者: eastmount。

在資料分析和資料探勘中,通常需要經歷前期準備、資料爬取、資料預處理、資料分析、資料視覺化、評估分析等步驟,而資料分析之前的工作幾乎要花費資料工程師近一半的工作時間,其中的資料預處理也將直接影響後續模型分析的好壞。圖是資料預處理的基本步驟,包括中文分詞、詞性標註、資料清洗、特徵提取(向量空間模型儲存)、權重計算(TF-IDF)等。

基於機器學習和TFIDF的情感分類演算法,詳解自然語言處理

一.中文分詞

當讀者使用Python爬取了中文資料集之後,首先需要對資料集進行中文分詞處理。由於英文中的詞與詞之間是採用空格關聯的,按照空格可以直接劃分片語,所以不需要進行分詞處理,而中文漢字之間是緊密相連的,並且存在語義,詞與詞之間沒有明顯的分隔點,所以需要藉助中文分詞技術將語料中的句子按空格分割,變成一段段詞序列。下面開始詳細介紹中文分詞技術及Jiaba中文分詞工具。

中文分詞(Chinese Word Segmentation)指將漢字序列切分成一個個單獨的詞或詞串序列,它能夠在沒有詞邊界的中文字串中建立分隔標誌,通常採用空格分隔。下面舉個簡單示例,對句子“我是程式設計師”進行分詞操作。

輸入:我是程式設計師
輸出1:我\是\程\序\員
輸出2:我是\是程\程式\序員
輸出3:我\是\程式設計師

簡單舉個例子,程式碼中主要匯入Jieba擴充套件包,然後呼叫其函式進行中文分詞。

#encoding=utf-8  
import jieba  
 
text = "北京理工大學生前來應聘"  

data = jieba.cut(text,cut_all=True)   #全模式
print("[全模式]: ", " ".join(data))
 
data = jieba.cut(text,cut_all=False)  #精確模式  
print("[精確模式]: ", " ".join(data))
 
data = jieba.cut(text)  #預設是精確模式 
print("[預設模式]: ", " ".join(data))

data = jieba.cut_for_search(text)  #搜尋引擎模式   
print("[搜尋引擎模式]: ", " ".join(data))

上述程式碼輸出如下,包括全模式、精確模式和搜尋引擎模式輸出的結果。

基於機器學習和TFIDF的情感分類演算法,詳解自然語言處理

二.資料清洗

在分析語料的過程中,通常會存在一些髒資料或噪聲片語干擾我們的實驗結果,這就需要對分詞後的語料進行資料清洗(Data Cleaning)。比如前面使用Jieba工具進行中文分詞,它可能存在一些髒資料或停用詞,如“我們”、“的”、“嗎”等。這些詞降低了資料質量,為了得到更好的分析結果,需要對資料集進行資料清洗或停用詞過濾等操作。

  • 殘缺資料
  • 重複資料
  • 錯誤資料
  • 停用詞

這裡主要講解停用詞過濾,將這些出現頻率高卻不影響文字主題的停用詞刪除。在Jieb分詞過程中引入stop_words.txt停用詞詞典,如果存在則過濾即可。

基於機器學習和TFIDF的情感分類演算法,詳解自然語言處理

下面是從大眾點評、美團之類的網站抓取“黃果樹瀑布”的評論資訊,我們通過Jieba工具對其進行中文分詞。

  • 好評:5000條
  • 差評:1000條

基於機器學習和TFIDF的情感分類演算法,詳解自然語言處理

完整程式碼:

# -*- coding:utf-8 -*-
import csv
import pandas as pd
import numpy as np
import jieba
import jieba.analyse

#新增自定義詞典和停用詞典
jieba.load_userdict("user_dict.txt")
stop_list = pd.read_csv('stop_words.txt',
                        engine='python',
                        encoding='utf-8',
                        delimiter="\n",
                        names=['t'])['t'].tolist()

#中文分詞函式
def txt_cut(juzi):
    return [w for w in jieba.lcut(juzi) if w not in stop_list]

#寫入分詞結果
fw = open('fenci_data.csv', "a+", newline = '',encoding = 'gb18030')
writer = csv.writer(fw)  
writer.writerow(['content','label'])

# 使用csv.DictReader讀取檔案中的資訊
labels = []
contents = []
file = "data.csv"
with open(file, "r", encoding="UTF-8") as f:
    reader = csv.DictReader(f)
    for row in reader:
        # 資料元素獲取
        if row['label'] == '好評':
            res = 0
        else:
            res = 1
        labels.append(res)
        content = row['content']
        seglist = txt_cut(content)
        output = ' '.join(list(seglist))            #空格拼接
        contents.append(output)
 
        #檔案寫入
        tlist = []
        tlist.append(output)
        tlist.append(res)
        writer.writerow(tlist)

print(labels[:5])
print(contents[:5])
fw.close()

執行結果如下圖所示,一方面它將特殊標點符號、停用詞過濾,另一方面匯入了user_dict.txt詞典,將“黃果樹瀑布”、“風景區”等專有名詞分詞,否則它可能會劃分為“黃果樹”和“瀑布”、“風景”和“區”。

基於機器學習和TFIDF的情感分類演算法,詳解自然語言處理

  • 資料清洗前

還記得小時候,常常守在電視機前,等候《西遊記》的播出。“你挑著擔,我牽著馬。翻山涉水兩肩雙滑……"熟悉的歌曲,又在耳邊響起時。 這歌詞中的水,就有貴州的水,準確的說,是貴州的黃果樹瀑布;那一簾瀑布,流進了我們的童年,讓我們流連忘返。 黃果樹瀑布並不是只有一個瀑布,而是一個大景區,包括陡坡塘瀑布、天星橋景區、黃果樹大瀑布,其中黃果樹大瀑布是最有名的。

  • 資料清洗後

記得 小時候 守 電視機 前 等候 西遊記 播出 挑 擔 牽 馬 翻山 涉水 兩肩 雙滑 熟悉 歌曲 耳邊 響起 時 歌詞 中 水 貴州 水 準確 說 貴州 黃果樹瀑布 那一簾 瀑布 流進 童年 流連忘返 黃果樹瀑布 瀑布 景區 包括 陡坡 塘 瀑布 天星橋 景區 黃果樹 瀑布 黃果樹 瀑布 有名

三.特徵提取及TF-IDF計算

1.基本概念

權重計算是指通過特徵權重來衡量特徵項在文件表示中的重要程度,給特徵詞賦予一定的權重來衡量統計文字特徵詞。TF-IDF(Term Frequency-Invers Document Frequency)是近年來用於資料分析和資訊處理經典的權重計算技術。該技術根據特徵詞在文字中出現的次數和在整個語料中出現的文件頻率來計算該特徵詞在整個語料中的重要程度,其優點是能過濾掉一些常見卻無關緊要的詞語,儘可能多的保留影響程度高的特徵詞。

TF-IDF的計算公式如下,式中TF-IDF表示詞頻TF和倒文字詞頻IDF的乘積,TF-IDF中權重與特徵項在文件中出現的頻率成正比,與在整個語料中出現該特徵項的文件數成反比。TF-IDF值越大則該特徵詞對這個文字的重要程度越高。

基於機器學習和TFIDF的情感分類演算法,詳解自然語言處理

其中,TF詞頻的計算公式如下,ni,j 為特徵詞 ti 在訓練文字 Dj 中出現的次數,分母是文字 Dj 中所有特徵詞的個數,計算的結果即為某個特徵詞的詞頻。

基於機器學習和TFIDF的情感分類演算法,詳解自然語言處理

倒文件頻率(Inverse Document Frequency,簡稱IDF)是Spark Jones在1972年提出的,用於計算詞與文獻相關權重的經典方法。計算公式如下,引數|D|表示語料的文字總數,|Dt| 表示文字所包含特徵詞 tj 的數量。

基於機器學習和TFIDF的情感分類演算法,詳解自然語言處理

在倒文件頻率方法中,權重是隨著特徵詞的文件數量的變化呈反向變化。如某些常用詞“我們”、“但是”、“的”等,在所有文件中出現頻率很高,但它的IDF值卻非常低。甚至如果它每篇文件都出現,則log1的計算結果為0,從而降低了這些常用詞的作用;相反,如果某篇介紹“人工智慧”的詞,僅僅在該篇文件中出現很多次,它的作用就非常高。

TF-IDF技術的核心思想是如果某個特徵詞在一篇文章中出現的頻率TF高,並且在其他文章中很少出現,則認為此詞或者短語具有很好的類別區分能力,適合用來做權重計算。TF-IDF演算法簡單快速,結果也符合實際情況,是文字挖掘、情感分析、主題分佈等領域的常用手段。

2.程式碼實現

Scikit-Learn中主要使用Scikit-Learn中的兩個類CountVectorizer和TfidfTransformer,用來計算詞頻和TF-IDF值。

  • CountVectorizer

該類是將文字詞轉換為詞頻矩陣的形式。比如“I am a teacher”文字共包含四個單詞,它們對應單詞的詞頻均為1,“I”、“am”、“a”、“teacher”分別出現一次。CountVectorizer將生成一個矩陣 a[M][N],共M個文字語料,N個單詞,比如a[i][j]表示單詞j在i類文字下的詞頻。再呼叫fit_transform()函式計算各個詞語出現的次數,get_feature_names()函式獲取詞庫中的所有文字關鍵詞。

基於機器學習和TFIDF的情感分類演算法,詳解自然語言處理

  • TfidTransformer

當使用CountVectorizer類計算得到詞頻矩陣後,接下來通過TfidfTransformer類實現統計vectorizer變數中每個詞語的TF-IDF值。TF-IDF值採用矩陣陣列的形式儲存,每一行資料代表一個文字語料,每一行的每一列都代表其中一個特徵對應的權重,得到TF-IDF後就可以運用各種資料分析演算法進行分析,比如聚類分析、LDA主題分佈、輿情分析等等。

基於機器學習和TFIDF的情感分類演算法,詳解自然語言處理

完整程式碼:

# -*- coding:utf-8 -*-
import csv
import pandas as pd
import numpy as np
import jieba
import jieba.analyse
from scipy.sparse import coo_matrix
from sklearn import feature_extraction  
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.feature_extraction.text import CountVectorizer
from sklearn.feature_extraction.text import TfidfTransformer

#----------------------------------第一步 讀取檔案--------------------------------
with open('fenci_data.csv', 'r', encoding='UTF-8') as f:
    reader = csv.DictReader(f)
    labels = []
    contents = []
    for row in reader:
        labels.append(row['label']) #0-好評 1-差評
        contents.append(row['content'])

print(labels[:5])
print(contents[:5])

#----------------------------------第二步 資料預處理--------------------------------
#將文字中的詞語轉換為詞頻矩陣 矩陣元素a[i][j] 表示j詞在i類文字下的詞頻
vectorizer = CountVectorizer()

#該類會統計每個詞語的tf-idf權值
transformer = TfidfTransformer()

#第一個fit_transform是計算tf-idf 第二個fit_transform是將文字轉為詞頻矩陣
tfidf = transformer.fit_transform(vectorizer.fit_transform(contents))
for n in tfidf[:5]:
    print(n)
print(type(tfidf))

# 獲取詞袋模型中的所有詞語  
word = vectorizer.get_feature_names()
for n in word[:10]:
    print(n)
print("單詞數量:", len(word))

#將tf-idf矩陣抽取出來,元素w[i][j]表示j詞在i類文字中的tf-idf權重
#X = tfidf.toarray()
X = coo_matrix(tfidf, dtype=np.float32).toarray() #稀疏矩陣 注意float
print(X.shape)
print(X[:10])

輸出結果如下所示:

<class 'scipy.sparse.csr.csr_matrix'>
aaaaa
achievements
amazing
ananananan
ancient
anshun
aperture
app

單詞數量: 20254
(6074, 20254)
[[0. 0. 0. ... 0. 0. 0.]
 [0. 0. 0. ... 0. 0. 0.]
 [0. 0. 0. ... 0. 0. 0.]
 ...
 [0. 0. 0. ... 0. 0. 0.]
 [0. 0. 0. ... 0. 0. 0.]
 [0. 0. 0. ... 0. 0. 0.]]

3.MemoryError記憶體溢位錯誤

當我們資料量很大時,矩陣往往儲存不了這麼大的資料,會出現如下錯誤:

  • ValueError: array is too big; arr.size * arr.dtype.itemsize is larger than the maximum possible size.
  • MemoryError: Unable to allocate array with shape (26771, 69602) and data type float64

我提供的解決方法如下:

  • 停用詞過濾降低不需要的特徵詞
  • scipy包的提供了稀疏矩陣的建立,使用coo_matrix(tfidf, dtype=np.float32)轉換tfidf
  • CountVectorizer(min_df=5)增加min_df引數,過濾掉出現頻率少的特徵詞,該引數可以不斷除錯
    max_df用於刪除過於頻繁出現的術語,稱為語料庫特定的停用詞,預設的max_df是1.0即忽略出現在100%文件的術語;min_df用於刪除不經常出現的術語min_df=5表示忽略少於5個文件中出現的術語。
  • 使用GPU或擴大記憶體解決

四.基於邏輯迴歸的情感分類

獲取文字TF-IDF值之後,本小節簡單講解使用TF-IDF值進行情感分類的過程,主要包括如下步驟:

  • 對中文分詞和資料清洗後的語料進行詞頻矩陣生成操作。主要呼叫CountVectorizer類計算詞頻矩陣,生成的矩陣為X。
  • 呼叫TfidfTransformer類計算詞頻矩陣X的TF-IDF值,得到Weight權重矩陣。
  • 呼叫Sklearn機器學習包執行分類操作,呼叫fit()函式訓練,並將預測的類標賦值給pre陣列。
  • 呼叫Sklearn庫PCA()函式進行降維操作,將這些特徵降低為二維,對應X和Y軸,接著進行視覺化呈現。
  • 演算法優化及演算法評估。

邏輯迴歸完整程式碼:

# -*- coding:utf-8 -*-
import csv
import pandas as pd
import numpy as np
import jieba
import jieba.analyse
from scipy.sparse import coo_matrix
from sklearn import feature_extraction  
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.feature_extraction.text import CountVectorizer
from sklearn.feature_extraction.text import TfidfTransformer
from sklearn.model_selection import train_test_split
from sklearn.metrics import classification_report
from sklearn.linear_model import LogisticRegression
from sklearn.ensemble import RandomForestClassifier
from sklearn.tree import DecisionTreeClassifier
from sklearn import svm
from sklearn import neighbors
from sklearn.naive_bayes import MultinomialNB

#----------------------------------第一步 讀取檔案--------------------------------
with open('fenci_data.csv', 'r', encoding='UTF-8') as f:
    reader = csv.DictReader(f)
    labels = []
    contents = []
    for row in reader:
        labels.append(row['label']) #0-好評 1-差評
        contents.append(row['content'])

print(labels[:5])
print(contents[:5])

#----------------------------------第二步 資料預處理--------------------------------
#將文字中的詞語轉換為詞頻矩陣 矩陣元素a[i][j] 表示j詞在i類文字下的詞頻
vectorizer = CountVectorizer(min_df=5)

#該類會統計每個詞語的tf-idf權值
transformer = TfidfTransformer()

#第一個fit_transform是計算tf-idf 第二個fit_transform是將文字轉為詞頻矩陣
tfidf = transformer.fit_transform(vectorizer.fit_transform(contents))
for n in tfidf[:5]:
    print(n)
print(type(tfidf))

# 獲取詞袋模型中的所有詞語  
word = vectorizer.get_feature_names()
for n in word[:10]:
    print(n)
print("單詞數量:", len(word))

#將tf-idf矩陣抽取出來,元素w[i][j]表示j詞在i類文字中的tf-idf權重
#X = tfidf.toarray()
X = coo_matrix(tfidf, dtype=np.float32).toarray() #稀疏矩陣 注意float
print(X.shape)
print(X[:10])

#----------------------------------第三步 資料劃分--------------------------------
#使用 train_test_split 分割 X y 列表
X_train, X_test, y_train, y_test = train_test_split(X, 
                                                    labels, 
                                                    test_size=0.3, 
                                                    random_state=1)

#--------------------------------第四步 機器學習分類--------------------------------
# 邏輯迴歸分類方法模型
LR = LogisticRegression(solver='liblinear')
LR.fit(X_train, y_train)
print('模型的準確度:{}'.format(LR.score(X_test, y_test)))
pre = LR.predict(X_test)
print("邏輯迴歸分類")
print(len(pre), len(y_test))
print(classification_report(y_test, pre))
print("\n")

執行結果如下圖所示:

基於機器學習和TFIDF的情感分類演算法,詳解自然語言處理

五.演算法效能評估

演算法評價很多實時需要我們自己編寫程式去實現,比如繪製ROC曲線、統計各種特徵資訊、顯示4位數結果。這裡作者嘗試自定義準確率(Precision)、召回率(Recall)和F特徵值(F-measure),其計算公式如下:

基於機器學習和TFIDF的情感分類演算法,詳解自然語言處理

由於本文主要針對2分類問題,其實驗評估主要分為0和1兩類,完整程式碼如下:

# -*- coding:utf-8 -*-
import csv
import pandas as pd
import numpy as np
import jieba
import jieba.analyse
from scipy.sparse import coo_matrix
from sklearn import feature_extraction  
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.feature_extraction.text import CountVectorizer
from sklearn.feature_extraction.text import TfidfTransformer
from sklearn.model_selection import train_test_split
from sklearn.metrics import classification_report
from sklearn.linear_model import LogisticRegression
from sklearn.ensemble import RandomForestClassifier
from sklearn.tree import DecisionTreeClassifier
from sklearn import svm
from sklearn import neighbors
from sklearn.naive_bayes import MultinomialNB

#----------------------------------第一步 讀取檔案--------------------------------
with open('fenci_data.csv', 'r', encoding='UTF-8') as f:
    reader = csv.DictReader(f)
    labels = []
    contents = []
    for row in reader:
        labels.append(row['label']) #0-好評 1-差評
        contents.append(row['content'])

print(labels[:5])
print(contents[:5])

#----------------------------------第二步 資料預處理--------------------------------
#將文字中的詞語轉換為詞頻矩陣 矩陣元素a[i][j] 表示j詞在i類文字下的詞頻
vectorizer = CountVectorizer(min_df=5)

#該類會統計每個詞語的tf-idf權值
transformer = TfidfTransformer()

#第一個fit_transform是計算tf-idf 第二個fit_transform是將文字轉為詞頻矩陣
tfidf = transformer.fit_transform(vectorizer.fit_transform(contents))
for n in tfidf[:5]:
    print(n)
print(type(tfidf))

# 獲取詞袋模型中的所有詞語  
word = vectorizer.get_feature_names()
for n in word[:10]:
    print(n)
print("單詞數量:", len(word))

#將tf-idf矩陣抽取出來,元素w[i][j]表示j詞在i類文字中的tf-idf權重
#X = tfidf.toarray()
X = coo_matrix(tfidf, dtype=np.float32).toarray() #稀疏矩陣 注意float
print(X.shape)
print(X[:10])

#----------------------------------第三步 資料劃分--------------------------------
#使用 train_test_split 分割 X y 列表
X_train, X_test, y_train, y_test = train_test_split(X, 
                                                    labels, 
                                                    test_size=0.3, 
                                                    random_state=1)

#--------------------------------第四步 機器學習分類--------------------------------
# 邏輯迴歸分類方法模型
LR = LogisticRegression(solver='liblinear')
LR.fit(X_train, y_train)
print('模型的準確度:{}'.format(LR.score(X_test, y_test)))
pre = LR.predict(X_test)
print("邏輯迴歸分類")
print(len(pre), len(y_test))
print(classification_report(y_test, pre))

#----------------------------------第五步 評價結果--------------------------------
def classification_pj(name, y_test, pre):
    print("演算法評價:", name)
 
    # 正確率 Precision = 正確識別的個體總數 /  識別出的個體總數
    # 召回率 Recall = 正確識別的個體總數 /  測試集中存在的個體總數
    # F值 F-measure = 正確率 * 召回率 * 2 / (正確率 + 召回率)

    YC_B, YC_G = 0,0  #預測 bad good
    ZQ_B, ZQ_G = 0,0  #正確
    CZ_B, CZ_G = 0,0  #存在

    #0-good 1-bad 同時計算防止類標變化
    i = 0
    while i<len(pre):
        z = int(y_test[i])   #真實 
        y = int(pre[i])      #預測

        if z==0:
            CZ_G += 1
        else:
            CZ_B += 1
 
        if y==0:
            YC_G += 1
        else:
            YC_B += 1

        if z==y and z==0 and y==0:
            ZQ_G += 1
        elif z==y and z==1 and y==1:
            ZQ_B += 1
        i = i + 1

    print(ZQ_B, ZQ_G, YC_B, YC_G, CZ_B, CZ_G)
    print("")

    # 結果輸出
    P_G = ZQ_G * 1.0 / YC_G
    P_B = ZQ_B * 1.0 / YC_B
    print("Precision Good 0:", P_G)
    print("Precision Bad 1:", P_B)

    R_G = ZQ_G * 1.0 / CZ_G
    R_B = ZQ_B * 1.0 / CZ_B
    print("Recall Good 0:", R_G)
    print("Recall Bad 1:", R_B)

    F_G = 2 * P_G * R_G / (P_G + R_G)
    F_B = 2 * P_B * R_B / (P_B + R_B)
    print("F-measure Good 0:", F_G)
    print("F-measure Bad 1:", F_B)

#函式呼叫
classification_pj("LogisticRegression", y_test, pre)

輸出結果如下:

邏輯迴歸分類
1823 1823
              precision    recall  f1-score   support

           0       0.94      0.99      0.97      1520
           1       0.93      0.70      0.80       303

    accuracy                           0.94      1823
   macro avg       0.94      0.85      0.88      1823
weighted avg       0.94      0.94      0.94      1823

演算法評價: LogisticRegression
213 1504 229 1594 303 1520

Precision Good 0: 0.9435382685069009
Precision Bad 1: 0.9301310043668122
Recall Good 0: 0.9894736842105263
Recall Bad 1: 0.7029702970297029
F-measure Good 0: 0.9659601798330122
F-measure Bad 1: 0.800751879699248

六.演算法對比實驗

1.RandomForest

程式碼如下:

# 隨機森林分類方法模型 n_estimators:森林中樹的數量
clf = RandomForestClassifier(n_estimators=20)
clf.fit(X_train, y_train)
print('模型的準確度:{}'.format(clf.score(X_test, y_test)))
print("\n")
pre = clf.predict(X_test)
print('預測結果:', pre[:10])
print(len(pre), len(y_test))
print(classification_report(y_test, pre))
classification_pj("RandomForest", y_test, pre)
print("\n")

輸出結果:

基於機器學習和TFIDF的情感分類演算法,詳解自然語言處理

2.SVM

程式碼如下:

# SVM分類方法模型
SVM = svm.LinearSVC() #支援向量機分類器LinearSVC
SVM.fit(X_train, y_train)
print('模型的準確度:{}'.format(SVM.score(X_test, y_test)))
pre = SVM.predict(X_test)
print("支援向量機分類")
print(len(pre), len(y_test))
print(classification_report(y_test, pre))
classification_pj("LinearSVC", y_test, pre)
print("\n")

輸出結果:

基於機器學習和TFIDF的情感分類演算法,詳解自然語言處理

3.樸素貝葉斯

程式碼如下:

#樸素貝葉斯模型
nb = MultinomialNB()
nb.fit(X_train, y_train)
print('模型的準確度:{}'.format(nb.score(X_test, y_test)))
pre = nb.predict(X_test)
print("樸素貝葉斯分類")
print(len(pre), len(y_test))
print(classification_report(y_test, pre))
classification_pj("MultinomialNB", y_test, pre)
print("\n")

輸出結果:

基於機器學習和TFIDF的情感分類演算法,詳解自然語言處理

4.KNN

該演算法準確率不高,並且執行時間較長,不建議大家用於文字分析。某些情況的演算法對比倒是還行,核心程式碼如下:

#最近鄰演算法
knn = neighbors.KNeighborsClassifier(n_neighbors=7) 
knn.fit(X_train, y_train)
print('模型的準確度:{}'.format(knn.score(X_test, y_test)))
pre = knn.predict(X_test)
print("最近鄰分類")
print(classification_report(y_test, pre))
classification_pj("KNeighbors", y_test, pre)
print("\n")

輸出結果:

基於機器學習和TFIDF的情感分類演算法,詳解自然語言處理

5.決策樹

程式碼如下:

#決策樹演算法
dtc = DecisionTreeClassifier()
dtc.fit(X_train, y_train)
print('模型的準確度:{}'.format(dtc.score(X_test, y_test)))
pre = dtc.predict(X_test)
print("決策樹分類")
print(len(pre), len(y_test))
print(classification_report(y_test, pre))
classification_pj("DecisionTreeClassifier", y_test, pre)
print("\n")

輸出結果:

基於機器學習和TFIDF的情感分類演算法,詳解自然語言處理

6.SGD

程式碼如下:

#SGD分類模型
from sklearn.linear_model.stochastic_gradient import SGDClassifier
sgd = SGDClassifier()
sgd.fit(X_train, y_train)
print('模型的準確度:{}'.format(sgd.score(X_test, y_test)))
pre = sgd.predict(X_test)
print("SGD分類")
print(len(pre), len(y_test))
print(classification_report(y_test, pre))
classification_pj("SGDClassifier", y_test, pre)
print("\n")

輸出結果:

基於機器學習和TFIDF的情感分類演算法,詳解自然語言處理

7.MLP

該演算法時間比較慢,核心程式碼如下:

#MLP分類模型
from sklearn.neural_network.multilayer_perceptron import MLPClassifier
mlp = MLPClassifier()
mlp.fit(X_train, y_train)
print('模型的準確度:{}'.format(mlp.score(X_test, y_test)))
pre = mlp.predict(X_test)
print("MLP分類")
print(len(pre), len(y_test))
print(classification_report(y_test, pre))
classification_pj("MLPClassifier", y_test, pre)
print("\n")

輸出結果:

基於機器學習和TFIDF的情感分類演算法,詳解自然語言處理

8.GradientBoosting

該演算法時間比較慢,程式碼如下:

#GradientBoosting分類模型
from sklearn.ensemble import GradientBoostingClassifier
gb = GradientBoostingClassifier()
gb.fit(X_train, y_train)
print('模型的準確度:{}'.format(gb.score(X_test, y_test)))
pre = gb.predict(X_test)
print("GradientBoosting分類")
print(len(pre), len(y_test))
print(classification_report(y_test, pre))
classification_pj("GradientBoostingClassifier", y_test, pre)
print("\n")

輸出結果:

基於機器學習和TFIDF的情感分類演算法,詳解自然語言處理

9.AdaBoost

程式碼如下:

#AdaBoost分類模型
from sklearn.ensemble import AdaBoostClassifier
AdaBoost = AdaBoostClassifier()
AdaBoost.fit(X_train, y_train)
print('模型的準確度:{}'.format(AdaBoost.score(X_test, y_test)))
pre = AdaBoost.predict(X_test)
print("AdaBoost分類")
print(len(pre), len(y_test))
print(classification_report(y_test, pre))
classification_pj("AdaBoostClassifier", y_test, pre)
print("\n")

輸出結果:

基於機器學習和TFIDF的情感分類演算法,詳解自然語言處理

 

點選關注,第一時間瞭解華為雲新鮮技術~

相關文章