天池比賽--新聞文本分類(一)

2021-02-20 AI社區

賽題分析

本賽題是一個入門級的文本多分類問題,賽題數據是新聞文本數據,為了防止人工標註按照字符級別進行了匿名處理。

數據包含14個類別,類別標籤映射字典如下:

{'科技': 0, '股票': 1, '體育': 2, '娛樂': 3, '時政': 4, '社會': 5, '教育': 6, '財經': 7, '家居': 8, '遊戲': 9, '房產': 10, '時尚': 11, '彩票': 12, '星座': 13}

比賽數據劃分為:訓練集20w條,測試集A 5w條,測試集B 5w條。

數據

評測標準評價標準為類別f1_score的均值,結果越大越好

解題思路

文本分類的思路通常包括兩種:

文本特徵提取+機器學習分類器

深度學習微調

具體方法有:

詞袋模型+分類器

TF-IDF+分類器

WordVec+分類器

FastText

TextCNN 文本分類

Bert 文本分類

數據探索

文本類型數據分析,一般包括:

%matplotlib inlineimport numpy as npimport pandas as pdimport matplotlib.pyplot as pltfrom sklearn.feature_extraction.text import TfidfVectorizerfrom sklearn.feature_extraction.text import CountVectorizerfrom sklearn.naive_bayes import MultinomialNBfrom sklearn.linear_model import RidgeClassifierfrom sklearn.metrics import f1_scoreplt.rcParams['font.sans-serif']=['SimHei']plt.rcParams['axes.unicode_minus']=False

1、數據加載
train_df=pd.read_csv("d:/data/aliyun/news/train_set.csv",sep='\t',nrows=40000)test_df=pd.read_csv("d:/data/aliyun/news/test_a.csv",sep='\t')print('train dataframe shape=>',train_df.shape)print('test dataframe shape=>',test_df.shape)train_df.head(3)

train dataframe shape=> (40000, 2)

test dataframe shape=> (50000, 1)

2、類別分布統計

用於發現類別不均衡問題,通常解決方法有:欠採樣、過採樣、代價敏感學習

tag2id={'科技': 0, '股票': 1, '體育': 2, '娛樂': 3, '時政': 4, '社會': 5, '教育': 6, '財經': 7, '家居': 8, '遊戲': 9, '房產': 10, '時尚': 11, '彩票': 12, '星座': 13}id2tag={y:x for x,y in tag2id.items()}value_counts=train_df['label'].value_counts()news_index=[id2tag[x] for x in value_counts.index]plt.bar(news_index,value_counts.values)

3、文本長度分布統計

部分算法要求輸入的文本長度相同,對於不足或超過設定長度的文本分別進行padding或truncation

train_df['words']=train_df['text'].apply(lambda x: x.split())train_df['word_count']=train_df['words'].apply(lambda x: len(x))train_df.head(3)

train_df['word_count'].describe()

#文本長度大於5000的數據有222條print(train_df['word_count'][train_df['word_count']>5000].count())  #只繪製文本長度小於5000的數據plt.hist(train_df[train_df['word_count']<5000]['word_count'],bins=100) plt.xlabel('word count')

4、數據集詞頻統計

詞頻特別高的單詞通常為標點符號、介詞等停用詞,有些算法需要去掉停用詞。

from collections import defaultdictword_count=defaultdict(int)for line in train_df['words']:    for word in line:        word_count[word]=word_count[word]+1sorted_word_count=sorted(word_count.items(),key=lambda kv:kv[1],reverse=True)sorted_word_count[:10]

[('3750', 1493823),
('648', 981796),
('900', 650003),
('3370', 402088),
('6122', 318080),
('4464', 308330),
('7399', 289577),
('4939', 276546),
('3659', 249766),

('4811', 230110)]

文本向量化

文本向量化是文本特徵提取的一種方法,常見的文本向量化方法包括:

1、使用詞袋模型文本向量化
%%timecv=CountVectorizer()vec=cv.fit_transform(train_df['text'])cv_train_x,cv_test_x,cv_train_y,cv_test_y=vec[:20000],vec[20000:],train_df.iloc[:20000]['label'],train_df.iloc[20000:]['label']

2、使用TF-IDF進行文本向量化
%%timetf_idf=TfidfVectorizer(ngram_range=(1,3),max_features=3000)vec=tf_idf.fit_transform(train_df['text'])tf_train_x,tf_test_x,tf_train_y,tf_test_y=vec[:20000],vec[20000:],train_df.iloc[:20000]['label'],train_df.iloc[20000:]['label']


文本分類

此處只使用TF-IDF文本向量化的結果作為特徵,分別使用樸素貝葉斯和嶺回歸模型進行分類

1、使用樸素貝葉斯模型分類
bayes_model=MultinomialNB()bayes_model.fit(tf_train_x,tf_train_y)test_pred=bayes_model.predict(tf_test_x)f1_score(tf_test_y,test_pred,average='macro')

0.7418091913024885

2、使用嶺回歸模型分類
rc_model=RidgeClassifier()rc_model.fit(tf_train_x,tf_train_y)test_pred=rc_model.predict(tf_test_x)f1_score(tf_test_y,test_pred,average='macro')

0.8880642674979569

預測測試集數據,並提交結果
vec=tf_idf.fit_transform(test_df['text'])result=rc_model.predict(vec)pd.DataFrame(data=result,columns=['label']).to_csv('result.csv',index=False)

本文僅做了一個最基本的實現,可以作為一個base,後續的優化方向有:

1、特徵處理:padding、truncation、去除停用詞等

2、模型融合

3、使用bert等深度學習方法 Fine-Tuning

更多天池、kaggle比賽題講解請掃下方二維碼,關注:「 AI社區 」


加小編微信(備註:機器學習)

拉你入「機器學習交流群」

相關焦點

  • 零基礎入門NLP - 新聞文本分類,正式賽第一名方案分享
    阿里雲天池發布 作者:康一帥    江蘇科技大學研究生、NLP競賽Top1大家好,我是康一帥,天池ID是nano-。本科畢業於濰坊學院,專業是電子科學與技術(和NLP沒一毛錢關係),碩士畢業於江蘇科技大學,專業是信號與信息處理。研究生階段開始接觸機器學習和深度學習,當時的主要方向是計算機視覺。畢業一年半,現就職於杭州中軟安人,擔任算法工程師,主要從事NLP相關工作。
  • 文本對分類以及多標籤分類問題的解決思路
    現實生活中,有大量的文本需要人工區分類,而自然語言相關技術的發展使得人們可以通過算法的手段代替手工,極大的加速了社會的發展.而文本分類任務一直是NLP一隻老掉牙的事,從常規的新聞文本分類到特定領域的多類分類(Multiclass classification)  和多標籤分類(Multilabel classification).
  • 天池新賽題 NLP預訓練模型大比武!
    GLUE九項任務涉及到自然語言推斷、文本蘊含、情感分析、語義相似等多個任務。像BERT、XLNet、RoBERTa、ERINE、T5等知名模型都會在GLUE進行測試。(上述獎項以最終決賽的成績名次決定)賽題數據說明賽題精選了以下3個具有代表性的任務,要求選手提交的模型能夠同時預測每個任務對應的標籤:數據說明OCNLI:是第一個非翻譯的、使用原生漢語的大型中文自然語言推理數據集;OCEMOTION:是包含7個分類的細粒度情感性分析數據集
  • 機器學習自動文本分類
    網頁、電子郵件、科學期刊、電子書、學習內容、新聞和社交媒體都充滿了文本數據。我們想要快速創建、分析和報告信息,自動文本分類也就應運而生了。更多乾貨內容請關注微信公眾號「AI 前線」,(ID:ai-front)文本分類是對文本進行智能分類。使用機器學習來實現這些任務的自動化,使整個過程更加快速高效。人工智慧和機器學習可以說是近來最受益的技術。
  • 以BBC新聞文章為例:應用XGBoost等算法進行文本分類
    圖片來源:unsplash.com/@knightwill本文將以BBC新聞文章分類為例,討論不同的文本分類技術。同時,本文將討論如何用不同向量空間模型代表文本數據。/data/bbc-text.csv')bbc_text_df.head()表中似乎含有許多長文本。後續章節將對其作詳細論述。現在的問題是:若給定一個「文本」,就需要預測其類別。這無疑是一個多累文本分類的問題。
  • 基於Text-CNN模型的中文文本分類實戰
    本文介紹NLP中文本分類任務中核心流程進行了系統的介紹,文末給出一個基於Text-CNN模型在搜狗新聞數據集上二分類的Demo。文本分類是自然語言處理領域最活躍的研究方向之一,從樣本數據的分類標籤是否互斥上來說,可以分為文本多分類與文本多標籤分類。
  • 文本分類的14種算法
    1)伯努利貝葉斯即特徵的取值只有取和不取兩類(0和1),對應樸素貝葉斯公式中,p(yi)=標籤為yi的文本數(句子數)/文本總數(句子總數)p(xj|yi)=(標籤為yi的文本中出現了單詞xj的文本數+1)/(標籤為yi的文本數+2)。
  • 乾貨| 深度學習在文本分類中的應用
    文本分類的應用非常廣泛。,判斷文本情感屬於{非常消極,消極,中立,積極,非常積極}中的哪一類新聞主題分類:判斷新聞屬於哪個類別,如財經、體育、娛樂等自動問答系統中的問句分類社區問答系統中的問題分類:多標籤分類,如知乎看山杯
  • 文本分類又來了,用 Scikit-Learn 解決多類文本分類問題
    翻譯 | 朱茵      整理 | 餘杭  MY 在商業領域有很多文本分類的應用,比如新聞故事通常由主題來分類;內容或產品常常被打上標籤;基於如何在線談論產品或品牌,用戶被分成支持者等等。然而大部分的文本分類文章和網上教程是二進位的文本分類,像垃圾郵件過濾(spam vs. ham)、情感分析(積極的和消極的)。在大量實例中,我們現實世界的問題要比這些複雜的多。因此,這是我們今天要做的:將消費者的財務投訴分成12個預定義的類。這些數據可以從 data.gov 下載。
  • [天池平臺]NLP中文預訓練模型泛化能力挑戰賽
    )OCNLI:是第一個非翻譯的、使用原生漢語的大型中文自然語言推理數據集;OCEMOTION:是包含7個分類的細粒度情感性分析數據集;TNEWS:來源於今日頭條的新聞版塊,共包含15個類別的新聞;數據格式任務1:OCNLI–中文原版自然語言推理
  • 基於TorchText的PyTorch文本分類
    文本分類是自然語言處理的重要應用之一。在機器學習中有多種方法可以對文本進行分類。但是這些分類技術大多需要大量的預處理和大量的計算資源。在這篇文章中,我們使用PyTorch來進行多類文本分類,因為它有如下優點:PyTorch提供了一種強大的方法來實現複雜的模型體系結構和算法,其預處理量相對較少,計算資源(包括執行時間)的消耗也較少。
  • 一文讀懂深度學習文本分類方法
    最近有很多小夥伴想了解深度學習在文本分類的發展,因此,筆者整理最近幾年比較經典的深度文本分類方法,希望幫助小夥伴們了解深度學習在文本分類中的應用。筆者整理了近些年的相關深度文本分類論文,關注「AI算法之心」,後臺回復「文本分類論文」即可下載。
  • 文本分類六十年
    文本分類文本分類流程在許多自然語言處理(NLP)下遊任務中,例如情感分析,主題標記,自動問答和對話行為分類,文本分類(給文本指定某一預定義標籤的過程)是一項意義重大且十分必要的任務。但是,與淺層模型不同的是,深度學習通過學習一系列的非線性變換模式將特徵工程直接映射到輸出,從而將特徵工程集成到模型擬合過程中。文本分類發展歷程從1960年代到2010年代,基於淺層學習的文本分類模型佔主導地位。
  • 天池新聞推薦入門賽學習打卡task01
    今天帶來的是對阿里雲天池&Datawhale零基礎入門新聞推薦算法賽事的學習打卡筆記第一部分—賽題理解+baseline。本文大致介紹了推薦算法的相關背景知識,以及賽事的基本分析。本文素材來自網絡及datawhale,糾錯指正、深入探討,咱們評論區見。
  • Tensorflow教程-雙向的LSTM文本分類
    ,講述了利用單向的LSTM進行文本分類,單向的神經網絡只能根據前面的信息推出後面的信息,但是只看前面的詞是遠遠不夠的,舉個簡單的例子:我今天生病了,我想___一天。今天的教程就是利用雙向的LSTM進行文本分類,單向的LSTM的文本分類可以參考Tensorflow教程-循環神經網絡文本分類。
  • 基於人民網新聞標題的短文本自動分類研究
    摘要: 自動文本分類技術將人類從繁瑣的手工分類中解放出來,使分類任務變的更為高效,為進一步的數據挖掘和分析奠定基礎。對於新聞來說,簡短的新聞標題是新聞內容的高度總結,針對短文本的分類研究一直是自動文本分類技術的研究熱點。
  • 基於CNN的中文文本分類算法(可應用於垃圾文本過濾、情感分析等場景)
    傳統機器學習的做法是先進行特徵工程,構建出特徵向量後,再將特徵向量輸入各種分類模型(貝葉斯、SVM、神經網絡等)進行分類。隨著深度學習的發展以及RNN、CNN的陸續出現,特徵向量的構建將會由網絡自動完成,因此我們只要將文本的向量表示輸入到網絡中就能夠完成自動完成特徵的構建與分類過程。就分類任務而言,CNN比RNN更為合適。
  • 貝葉斯新聞分類實戰項目詳解
    社會、娛樂、電影等各種分類,數以億計的新聞,通過機器學習完成分類。那麼我們自己能不能自己做一個新聞分類的應用呢?答案是肯定的,本文將帶領大家學習基於貝葉斯方法的新聞分類實戰,快來學習吧。新聞分類也是一樣,根據一篇新聞的內容,推斷其最有可能哪個類別。下面就開始新聞分類的實戰之旅。新聞分類實戰1. 文本分詞就是將獲取到的新聞數據,轉化成有一個個詞語組成的樣式。
  • 短文本分類常見技術:文本表示
    在chatbot的構建過程中,對用戶的意圖進行識別是其中比較重要的一個部分,而意圖識別的核心問題是如何對短文本進行分類。短文本由於自身內容的長度相較於長文本而言比較短,包含信息量少、容易存在語義歧義,這些都是短文本分類時需要考慮的問題。為了對短文本進行分析,我們首先需要將其轉化為便於計算機處理的數據形式,下面介紹一些常見的建模方法。
  • 文本分類實戰--從TFIDF到深度學習CNN系列效果對比(附代碼)
    ,從理論到代碼實現進行總結,其中涉及CHI選擇特徵詞,TFIDF計算權重,樸素貝葉斯、決策樹、SVM、XGBoost等算法,實現傳統的文本分類並取得了不錯的效果。此外,還是用cnn卷積神經網絡實現了中文的文本分類,效果要優於上述算法。完整源碼(包括冠軍源碼) 獲取方式:關注微信公眾號 datayx  然後回復 文本分類 即可獲取。