以BBC新聞文章為例:應用XGBoost等算法進行文本分類

2021-01-13 讀芯術

全文共7034字,預計學習時長14分鐘

圖片來源:unsplash.com/@knightwill

本文將以BBC新聞文章分類為例,討論不同的文本分類技術。同時,本文將討論如何用不同向量空間模型代表文本數據。

為解決此問題,將使用到Python、Sci-kit-learn、Genism和Xgboost庫等工具。

獲取數據

本問題涉及到的數據可以在Kaggle上找到。本數據集包含BBC新聞文本及其雙欄CSV格式的分類列表,展示如下:

import pandas as pd

bbc_text_df = pd.read_csv('../data/bbc-text.csv')

bbc_text_df.head()

表中似乎含有許多長文本。後續章節將對其作詳細論述。現在的問題是:若給定一個「文本」,就需要預測其類別。這無疑是一個多累文本分類的問題。

數據探索及視覺化呈現

首先,我們需要知道有哪些類別。

%matplotlib inline

import seaborn as sns

import matplotlib.pyplot as plt

plt.figure(figsize=(12,5))

sns.countplot(x=bbc_text_df.category, color='green')

plt.title('BBC text class distribution', fontsize=16)

plt.ylabel('Class Counts', fontsize=16)

plt.xlabel('Class Label', fontsize=16)

plt.xticks(rotation='vertical');

由圖可知,有五個類別。可將其稱為「類」。顯然,該類別的分配並無太多偏斜。

下一步是弄清數據集該「文本」領域中包含何種內容。因此需要先清理文本。

文本清理通常包含以下步驟:

1. 英文字母小寫化

2. 去除標點

3. 去除整數、數字

4. 去除多餘空格

5. 去除標籤(如<html>, <p>等)

6. 去除停用詞(如and、to、the等)

7. 詞幹提取(將單詞轉換至詞源形式)

此次使用了Python的「genism」庫進行文本清理工作。

from gensim import utils

import gensim.parsing.preprocessing as gsp

filters = [

gsp.strip_tags,

gsp.strip_punctuation,

gsp.strip_multiple_whitespaces,

gsp.strip_numeric,

gsp.remove_stopwords,

gsp.strip_short,

gsp.stem_text

]

def clean_text(s):

s = s.lower()

s = utils.to_unicode(s)

for f in filters:

s = f(s)

return s

可應用「clean_text」功能完成這項任務。

把記錄的文本領域的第一段內容列印出來。

bbc_text_df.iloc[2,1]

清理後

clean_text(bbc_text_df.iloc[2,1])

文本可能稍微缺乏語法邏輯,但這是為了便於理解。

接下來會編寫一個功能,將「文本」內容視覺化呈現為「文字雲」。

%matplotlib inline

from wordcloud import WordCloud

def plot_word_cloud(text):

wordcloud_instance = WordCloud(width = 800, height = 800,

background_color ='black',

stopwords=None,

min_font_size = 10).generate(text)

plt.figure(figsize = (8, 8), facecolor = None)

plt.imshow(wordcloud_instance)

plt.axis("off")

plt.tight_layout(pad = 0)

plt.show()

需要連結所有文本,並將其導入此功能。

texts = ''

for index, item in bbc_text_df.iterrows():

texts = texts + ' ' + clean_text(item['text'])

plot_word_cloud(texts)

會出現如下結果:

單詞越大,意味著其出現頻率越高。所以「年 (year) 」、「時間 (time) 」、「人 (peopl) 」是出現頻率最高的詞。

現在進行更深入的分析:在某一特定「類別」理,「文本」的「文字雲」。

為其編寫一項一般/通用功能。

def plot_word_cloud_for_category(bbc_text_df, category):

text_df = bbc_text_df.loc[bbc_text_df['category'] == str(category)]

texts = ''

for index, item in text_df.iterrows():

texts = texts + ' ' + clean_text(item['text'])

plot_word_cloud(texts)

比如,「技術」這一「類別」的「文字雲」

plot_word_cloud_for_category(bbc_text_df,'tech')

因此,「技術」這一類別中最常出現的詞是「人 (peopl)」、「techlog」、「遊戲 (game)」等。

而對於「運動」類別:

plot_word_cloud_for_category(bbc_text_df,'sport')

最常出現的詞是「plai」、「遊戲 (game) 」、「運動員 (player) 」、「勝利 (win) 」、「比賽 (match) 」、「英格蘭 (England) 」等。

對於「政治」類別:

plot_word_cloud_for_category(bbc_text_df,'politics')

最常出現的詞是「治理 (govern) 」、「人 (people) 」、「布萊爾 (blair) 」、「國家 (countri) 」、「部長 (Minist) 」等。

毫無疑問,每一個類別中都有自己獨有的詞彙。也可以這樣理解:每一個「文本」的內容都在暗示某個語境,從而決定其類別。

需要進行向量空間分析,並將其應用於模型,以證實以上推斷。

向量空間建模及構建管道

對於任何自然語言處理問題,都有必要進行向量空間建模。以兩個最常見的向量空間模型為例:Doc2Vec和Tf-Idf。首先,把數據分成特徵和類別。

df_x = bbc_text_df['text']

df_y = bbc_text_df['category']

Doc2Vec

使用「Genism」庫的Doc2Vec編寫一般/通用「Doc2VecTransfoemer」。

from gensim.models.doc2vec import TaggedDocument, Doc2Vec

from sklearn.base import BaseEstimator

from sklearn import utils as skl_utils

from tqdm import tqdm

import multiprocessing

import numpy as np

class Doc2VecTransformer(BaseEstimator):

def __init__(self, vector_size=100, learning_rate=0.02, epochs=20):

self.learning_rate = learning_rate

self.epochs = epochs

self._model = None

self.vector_size = vector_size

self.workers = multiprocessing.cpu_count() - 1

def fit(self, df_x, df_y=None):

tagged_x = [TaggedDocument(clean_text(row).split(), [index]) for index, row in enumerate(df_x)]

model = Doc2Vec(documents=tagged_x, vector_size=self.vector_size, workers=self.workers)

for epoch in range(self.epochs):

model.train(skl_utils.shuffle([x for x in tqdm(tagged_x)]), total_examples=len(tagged_x), epochs=1)

model.alpha -= self.learning_rate

model.min_alpha = model.alpha

self._model = model

return self

def transform(self, df_x):

return np.asmatrix(np.array([self._model.infer_vector(clean_text(row).split())

for index, row in enumerate(df_x)]))

應用該轉換器,可以看到「DocVec」如下:

doc2vec_trf = Doc2VecTransformer()

doc2vec_features = doc2vec_trf.fit(df_x).transform(df_x)

doc2vec_features

因此,這是一組文本數據的數位化呈現。可以把這個數字特徵應用到機器學習算法中。下面以LogisticRegression, RandomForest和XGBoost為例進行操作。

對於每一個案例,都應用數據集對模型進行五層/級交叉驗證並試運行。精確度得分將會是五個層級的平均分。

Doc2Vec和LogisticRegression管道

精確度變得非常低!!

再來看其它分類器。

Doc2Vec和RandomForest管道

from sklearn.pipeline import Pipeline

from sklearn.linear_model import LogisticRegression

from sklearn.model_selection import cross_val_score

pl_log_reg = Pipeline(steps=[('doc2vec',Doc2VecTransformer()),

('log_reg', LogisticRegression(multi_class='multinomial', solver='saga', max_iter=100))])

scores = cross_val_score(pl_log_reg, df_x, df_y, cv=5,scoring='accuracy')

print('Accuracy for Logistic Regression: ', scores.mean())

精確度也不是很高!!

Doc2Vec和XGBoost管道

import xgboost as xgb

pl_xgb = Pipeline(steps=[('doc2vec',Doc2VecTransformer()),

('xgboost', xgb.XGBClassifier(objective='multi:softmax'))])

scores = cross_val_score(pl_xgb, df_x, df_y, cv=5)

print('Accuracy for XGBoost Classifier : ', scores.mean())

精確度並未提高多少。

「Doc2Vec」運行狀況並不良好。

下面看「Tf-Idf」向量空間模型。

Tf-Idf

為「Tf-Idf」編寫一個相似的轉換器。

from sklearn.feature_extraction.text import TfidfVectorizer

class Text2TfIdfTransformer(BaseEstimator):

def __init__(self):

self._model = TfidfVectorizer()

pass

def fit(self, df_x, df_y=None):

df_x = df_x.apply(lambda x : clean_text(x))

self._model.fit(df_x)

return self

def transform(self, df_x):

return self._model.transform(df_x)

那麼,文本會變成什麼樣呢?

tfidf_transformer = Text2TfIdfTransformer()

tfidf_vectors = tfidf_transformer.fit(df_x).transform(df_x)

將其維數列印出來。

tfidf_vectors.shape

[「0」]標記總計出現18754次。

print(tfidf_vectors)

現在把此模型運用到實際機器學習模型中。

Tf-Idf & LogisticRegression

pl_log_reg_tf_idf = Pipeline(steps=[('tfidf',Text2TfIdfTransformer()),

('log_reg', LogisticRegression(multi_class='multinomial', solver='saga', max_iter=100))])

scores = cross_val_score(pl_log_reg_tf_idf, df_x, df_y, cv=5,scoring='accuracy')

print('Accuracy for Tf-Idf & Logistic Regression: ', scores.mean())

精確度很高!!

Tf-Idf & RandomForest

pl_random_forest_tf_idf = Pipeline(steps=[('tfidf',Text2TfIdfTransformer()),

('random_forest', RandomForestClassifier())])

scores = cross_val_score(pl_random_forest_tf_idf, df_x, df_y, cv=5,scoring='accuracy')

print('Accuracy for Tf-Idf & RandomForest : ', scores.mean())

Tf-Idf & XGBoost

pl_xgb_tf_idf = Pipeline(steps=[('tfidf',Text2TfIdfTransformer()),

('xgboost', xgb.XGBClassifier(objective='multi:softmax'))])

scores = cross_val_score(pl_xgb_tf_idf, df_x, df_y, cv=5)

print('Accuracy for Tf-Idf & XGBoost Classifier : ', scores.mean())

最後這一個精確度最高!!

毫無疑問,使用Tf-Idf & XGBoost結合模型能夠解決本案例的問題。

結果解讀

儘管在自然語言處理中,「DocVec」模型比「Tf-Idf」模型更高級,但我們的案例證明,後者效果更佳。我們分別使用了基於線性、袋狀以及推進型的分類器。

原因可以這麼理解。在我們的數據集中,每一個「文本」領域包含了一些決定其類別的高頻單詞/標記。因此,應用一個對語境/上下文敏感的模型會使問題更為複雜、(或者)混淆信息。某些文本類別包含一些高頻出現的標記,這些標記提供了大量數值以定義「Tf-Idf」模型。同時,「文本」是細分領域的。

比如,「布萊爾 (blair) 」一詞更可能出現在「政治」類別,而非「運動」類別。因此,像這樣的詞對「Tf-Idf」模型起了作用。

而且,「Doc2Vec」模型更適合應用於語法正確的文本中。

而我們的案例文本本質上過於粗糙。

「維基百科」文本就是一個語法正確的文本。

同時,大量案例和數據科學家的實驗證明,雖然「Tf-Idf」模型次於」DocVec」模型,但前者對於細分領域的文本分類更為有效。

結論

實驗結束。我們對所有分類器和向量空間模型的組合進行了測試。GitHub上有關於這一實驗的Jupyter筆記。

留言 點讚 關注

我們一起分享AI學習與發展的乾貨

歡迎關注全平臺AI垂類自媒體 「讀芯術」

相關焦點

  • 專欄| NLP概述和文本自動分類算法詳解
    文章分類:依據預設分類體系對文本進行自動歸類。 情感分析:準確分析用戶透過文本表達出的情感傾向。 文章主題模型:抽取出文章的隱含主題。 為了實現這些頂層應用,達觀數據掌握從詞語短串分析個層面的分析技術,開發了包括中文分詞、專名識別、語義分析和詞串分析等模塊。
  • 機器學習算法XGBoost原理和實踐(上)
    小編在之前公眾號文章已介紹了xgboost的安裝方法,接下來將用兩篇文章,介紹XGboost的算法思想和基本原理、實戰(數據處理、核心代碼分享)。如果還沒有安裝包的讀者,請查看之前文章,喜歡可以關注公眾號!XGBoost是boosting算法的其中一種。Boosting算法的思想是將許多弱分類器集成在一起形成一個強分類器。
  • 達觀數據乾貨分享:深度解析文本分類與標籤的應用價值和原理
    信息過載時代,文本分類和文本標籤是我們整合閱讀文本信息的常用手段。本文系統介紹文本分類和文本標籤的技術原理和應用價值,並結合項目案例談談兩者的使用技巧。一、分類和標籤的共性與差異圖書管理員在給圖書分類時,會根據書的內容、形式、體裁等信息,按照《中國圖書館圖書分類法》進行分類。
  • ACL2019|圖表示解決長文本關係匹配問題:騰訊提出概念交互圖算法
    對此,來自阿爾伯塔大學和騰訊 PCG 移動瀏覽器產品部的研究者提出了概念交互圖(Concept Interaction Graph)算法,對比現有的文章關係匹配算法有明顯的效果提升。該論文已被自然語言處理頂會 ACL 2019 接收,項目代碼和數據集已開源。引言判斷兩篇文章之間的語義關係對於新聞系統等應用有著重要的意義。
  • 中文文本分類:你需要了解的10項關鍵內容
    繼上一篇《這5個例子,小學生都能秒懂分類算法》(點擊查看詳情)初步分享了幾種常見的分類算法是什麼,今天和大家聊聊做好中文文本分類的10項關鍵點。文本分類指的是計算機通過算法對輸入的文本按照一定的類目體系進行自動化歸類的過程。在人工智慧浪潮席捲全球的今天,文本分類技術已經被廣泛地應用在文本審核、廣告過濾、情感分析和反黃識別等NLP領域。
  • 文本分類六十年
    這項調查對不同模型之間的性能優劣進行了全面比較,而且指出了各種評測指標的優缺點。最後,對各種算法模型的核心精髓、未來的研究趨勢以及該研究領域面臨的挑戰進行了提煉總結。圖1展示出了基於淺層和深度學習的文本分類方法中所涉及的操作步驟的流程圖。文本數據不同於數字,圖像或信號數據。它要求NLP技術具有能夠進行十分精細化處理的能力。而首先重要的一步是對輸入模型的文本數據進行預處理。淺層學習模型通常需要通過人工標註的方法來獲得良好的樣本特徵,然後使用經典的機器學習算法對其進行分類。
  • 基於人民網新聞標題的短文本自動分類研究
    摘要: 自動文本分類技術將人類從繁瑣的手工分類中解放出來,使分類任務變的更為高效,為進一步的數據挖掘和分析奠定基礎。對於新聞來說,簡短的新聞標題是新聞內容的高度總結,針對短文本的分類研究一直是自動文本分類技術的研究熱點。
  • 多標籤文本分類模型總結
    最近工作中需要對文本進行多標籤分類(Multi-label Text Classification),系統查閱了相關論文,藉此機會整理歸納一下,
  • 樸素貝葉斯與文本分類
    樸素貝葉斯 (Naive Bayesian algorithm) 是一種基於概率統計的分類方法,主要用到了貝葉斯定理和特徵條件獨立性假設。樸素貝葉斯具有悠久的歷史,其算法邏輯比較簡單,有健壯的性能,通常可以用於文本分類、信用評估等方面。
  • 基於Bert和通用句子編碼的Spark-NLP文本分類
    自然語言處理(NLP)是許多數據科學系統中必須理解或推理文本的關鍵組成部分。常見的用例包括文本分類、問答、釋義或總結、情感分析、自然語言BI、語言建模和消歧。NLP在越來越多的人工智慧應用中是越來越重要。如果你正在構建聊天機器人、搜索專利資料庫、將患者與臨床試驗相匹配、對客戶服務或銷售電話進行分級、從財務報告中提取摘要,你必須從文本中提取準確的信息。
  • 劍指LightGBM和XGboost!斯坦福發表NGBoost算法
    Stanford ML Group 最近在他們的論文中發表了一個新算法,其實現被稱為 NGBoost。該算法利用自然梯度將不確定性估計引入到梯度增強中。本文試圖了解這個新算法,並與其他流行的 boosting 算法 LightGBM 和 XGboost 進行比較,以了解它在實踐中是如何工作的。
  • 樸素貝葉斯實戰篇之新浪新聞分類
    這樣,我們的樸素貝葉斯分類器就改進完畢了。三、樸素貝葉斯之過濾垃圾郵件在上篇文章那個簡單的例子中,我們引入了字符串列表。使用樸素貝葉斯解決一些現實生活中的問題時,需要先從文本內容得到字符串列表,然後生成詞向量。下面這個例子中,我們將了解樸素貝葉斯的一個最著名的應用:電子郵件垃圾過濾。
  • 用深度學習(CNN RNN Attention)解決大規模文本分類問題 - 綜述和...
    近來在同時做一個應用深度學習解決淘寶商品的類目預測問題的項目,恰好碩士畢業時論文題目便是文本分類問題,趁此機會總結下文本分類領域特別是應用深度學習解決文本分類的相關的思路、做法和部分實踐的經驗。之所以進行分詞,是因為很多研究表明特徵粒度為詞粒度遠好於字粒度,其實很好理解,因為大部分分類算法不考慮詞序信息,基於字粒度顯然損失了過多「n-gram」信息。具體到中文分詞,不同於英文有天然的空格間隔,需要設計複雜的分詞算法。傳統算法主要有基於字符串匹配的正向/逆向/雙向最大匹配;基於理解的句法和語義分析消歧;基於統計的互信息/CRF方法。
  • 教你用BERT進行多標籤文本分類
    大數據文摘出品來源:medium編譯:李雷、睡不著的iris、Aileen過去的一年,深度神經網絡的應用開啟了自然語言處理的新時代。預訓練模型在研究領域的應用已經令許多NLP項目的最新成果產生了巨大的飛躍,例如文本分類,自然語言推理和問答。
  • 李偉:輿情事件等級評估及基於語義理解實現文本精細化分類
    當前熱度值採集對象只是關於某個事件關鍵詞報導的文章、網頁,後續採集可以把文章本身的點讚、轉發等都加上去。第三要為不同等級事件評分的交叉部分以及閾值的確定方法考慮更詳細規則。 基於知識圖譜和NLP的文本精細化分類 李偉首先闡述了知識圖譜和NLP的文本精細化分類的現實需求。
  • 數據挖掘之文本分類技術,最詳細的原理解讀
    其中選取詞作為文本特徵的方法,也稱為詞袋(Bag of Word)模型。(1)詞袋:是將連續漢字串依照不同的策略與一個「足夠大型的詞典」中的詞進行匹配,若在詞典中找到了相同的該字符串,則表示匹配成功。此類算法根據不同的匹配方向分為正向匹配和逆向匹配,又根據不同的匹配詞語長度分為最大匹配和最小匹配。還存在雙向最大匹配,切分標誌法,最佳匹配法等多種組合方法。
  • NeuralNLP-NeuralClassifier:騰訊開源深度學習文本分類工具
    NeuralNLP是騰訊廣告(Tencent Marketing Solution,TMS)(https://e.qq.com/)數據算法團隊搭建的一個基於PyTorch的深度學習NLP公共實驗平臺,主要涵蓋文本分類、序列標註、語義匹配、BERT微調和文本生成等,目前已經廣泛應用於騰訊廣告業務文本相關的需求場景中,如廣告定向、相關性計算、LookAlike、動態創意、點擊率/轉化率預估等
  • 樸素貝葉斯算法及其應用
    在這篇文章中,我們將嘗試以簡單的方式理解什麼是樸素貝葉斯,它是如何工作的以及我們如何應用樸素貝葉斯分類器將文本或評論分類為「肯定」或「否定」,我們將通過電影評論案例進行研究。什麼是樸素貝葉斯?貝葉斯定理是由Reverend Bayes開發的最早的概率推理算法之一(他過去常常嘗試推斷上帝的存在)並且對於某些用例仍然表現得非常好。
  • 算法習得並強化了人類偏見嗎?如何測量、分析算法中的偏見
    對自然語言處理領域的研究發現算法不僅準確複製了訓練數據中的性別偏見,甚至還在下遊應用任務中放大了偏差(Zhao et al., 2017)。本期推文將以詞向量算法中反映的社會偏見為例,為大家介紹目前測量以及分析算法中偏見的相關研究。
  • 幾種分類算法初識
    下邊是總結的幾種常見分類算法,這裡只是對幾種分類算法的初步認識,後續還得仔細研究。所謂分類,簡單來說,就是根據文本的特徵或屬性,劃分到已有的類別中。常用的分類算法包括:決策樹分類法,樸素的貝葉斯分類算法(native Bayesian classifier)、基於支持向量機(SVM)的分類器,神經網絡法,k-最近鄰法(k-nearest neighbor,kNN),模糊分類法等等1、決策樹決策樹是一種用於對實例進行分類的樹形結構。一種依託於策略抉擇而建立起來的樹。