1. 程式人生 > 實用技巧 >NLP——天池新聞文字分類 Task1

NLP——天池新聞文字分類 Task1

NLP——新聞文字處理:TASK1 賽題理解與nlp初識

1.資料讀取

在競賽主頁下載好資料集利用pandas開啟:

#coding=utf-8
import pandas as pd
#my_font = font_manager.FontProperties(fname="C:\Windows\Fonts\msyh.ttc")

#設定顯示範圍
pd.set_option('display.max_columns', 1000)
pd.set_option('display.width', 1000)
pd.set_option('display.max_colwidth', 1000)

csvframe = pd.read_csv('data_list_0715.csv',encoding='gbk',header=0)
print(csvframe)

注:在資料集命名時儘量不要使用n為開頭字母,會導致python語句識別錯誤.

讀取完成後可看到給出的三個資料集的連結:

0         train_set.csv.zip    訓練集資料(選手需要自行解壓)  236.11MB         https://tianchi-competition.oss-cn-hangzhou.aliyuncs.com/531810/train_set.csv.zip
1            test_a.csv.zip  測試集A榜資料(選手需要自行解壓)   59.12MB            https://tianchi-competition.oss-cn-hangzhou.aliyuncs.com/531810/test_a.csv.zip
2  test_a_sample_submit.csv          測試集A榜提交樣例   97.66KB  https://tianchi-competition.oss-cn-hangzhou.aliyuncs.com/531810/test_a_sample_submit.csv

下載後即可得到題目所給資料集,分別為訓練集,測試集與樣例。
以下是部分資料集:

0       2\t2967 6758 339 2021 1854 3731 4109 3792 4149...
1       11\t4464 486 6352 5619 2465 4802 1452 3137 577...
2       3\t7346 4068 5074 3747 5681 6093 1777 2226 735...
3       2\t7159 948 4866 2109 5520 2490 211 3956 5520 ...
4       3\t3646 3055 3055 2490 4659 6065 3370 5814 246...

2.評價標準:F1-score

多分類問題的機器學習競賽常常將F1-score作為最終的測評方法。

公式表達

\[F_{1}=2 \cdot \frac{\text {precision} \cdot \text {recall}}{\text {precision}+\text {recall}} \]

其中P(Precision)為精確率,R(recall)為召回率。F1-score認為精確率與召回率同等重要。另外還有其他類似的評價標準:

\[F_{\beta}=\left(1+\beta^{2}\right) \cdot \frac{\text { precision } \cdot \text { recall }}{\left(\beta^{2} \cdot \text { precision }\right)+\text { recall }} \]


### 計算過程 下面介紹幾個符號: TP:預測答案正確; FP:將其他類標籤錯誤預測為本類別 FN:將本類別標籤錯誤預測為其他類別 則P表示被分類器判定為正例中,正樣本的比重: $$\text {precision}_{k}=\frac{T P}{T P+F P}$$ R表示被預測為正例的樣本佔總正例的比重: $$\text { recall}_{k}=\frac{T P}{T P+F N}$$ 再計算每一類別的f1值: $$f 1_{k}=\frac{2 \cdot \text { precision }_{k} \cdot \text { recall }_{k}}{\text { precision }_{k}+\text { recall }_{k}}$$ 最終將結果進行加權就可得到f1-score: $$\text {score}=\left(\frac{1}{n} \sum f 1_{k}\right)^{2}$$ ### 程式碼實現 可利用sklearn包進行F1-score的計算,具體程式碼如下:
#coding=utf-8
from sklearn.metrics import f1_score
#分類器預測得到的類別
y_pred = [0, 1, 1, 1, 2, 2]
#目標的真實類別
y_true = [0, 1, 0, 2, 1, 1]

print(f1_score(y_true, y_pred, average='macro'))#如果不考慮類別的不平衡性,計算巨集平均,則使用‘macro’
print(f1_score(y_true, y_pred, average='weighted'))#考慮類別的不平衡性,需要計算類別的加權平均 

得到結果:

0.3333333333333333
0.38888888888888884

3.解題思路

TF-IDF+機器學習分類器

特徵提取包括特徵選擇與特徵權重運算,其中,特徵選擇是,根據某個評價指標獨立地對原始特徵項(詞項)進行評分排序,從中選擇得分最高的一些特徵項(詞項)進行評分排序,從中選擇得分最高的一些特徵項,過濾掉其餘特徵項。
TF-IDF主要用於特徵權重計算,它表示一個詞的重要度與在類別內的詞頻成正比,與所有類別出現的次數成反比。

\[t f_{i j}=\frac{n_{i, j}}{\sum_{k} n_{k, j}} \]

\[T F_{w}=\frac{\text { 在某一類中詞條中 } w \text { 出現的次數 }}{\text { 該類中所有的詞條數目 }} \]

\[i d f_{i}=\log \frac{|D|}{\left|\left\{j: t_{i} \in d_{j}\right\}\right|} \]

\[I D F=\log \left(\frac{\text { 語料庫的文件總教 }}{\text { 包含詞條 } w \text { 的文件教 }+1}\right) \]

程式碼實現:

from sklearn.feature_extraction.text import CountVectorizer
from sklearn.feature_extraction.text import TfidfTransformer

x_train = ['TF-IDF 主要 思想 是', '演算法 一個 重要 特點 可以 脫離 語料庫 背景',
           '如果 一個 網頁 被 很多 其他 網頁 連結 說明 網頁 重要']
x_test = ['原始 文字 進行 標記', '主要 思想']

# 該類會將文字中的詞語轉換為詞頻矩陣,矩陣元素a[i][j] 表示j詞在i類文字下的詞頻
vectorizer = CountVectorizer(max_features=10)
# 該類會統計每個詞語的tf-idf權值
tf_idf_transformer = TfidfTransformer()
# 將文字轉為詞頻矩陣並計算tf-idf
tf_idf = tf_idf_transformer.fit_transform(vectorizer.fit_transform(x_train))
# 將tf-idf矩陣抽取出來,元素a[i][j]表示j詞在i類文字中的tf-idf權重
x_train_weight = tf_idf.toarray()

# 對測試集進行tf-idf權重計算
tf_idf = tf_idf_transformer.transform(vectorizer.transform(x_test))
x_test_weight = tf_idf.toarray()  # 測試集TF-IDF權重矩陣

print('輸出x_train文字向量:')
print(x_train_weight)
print('輸出x_test文字向量:')
print(x_test_weight)

可得到結果:

[[0.70710678 0.         0.70710678 0.         0.         0.
  0.         0.         0.         0.        ]
 [0.         0.3349067  0.         0.44036207 0.         0.44036207
  0.44036207 0.44036207 0.         0.3349067 ]
 [0.         0.22769009 0.         0.         0.89815533 0.
  0.         0.         0.29938511 0.22769009]]
輸出x_test文字向量:
[[0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]
 [0. 0. 1. 0. 0. 0. 0. 0. 0. 0.]]

FastText文字分類器

FastText是Facebook AI Research在16年開源的一種文字分類器。 其特點就是fast。相對於其它文字分類模型,如SVM,Logistic Regression等模型,fastText能夠在保持分類效果的同時,大大縮短了訓練時間。