天池NLP新闻文本分类学习赛心得-Task4
赛题链接:https://tianchi.aliyun.com/competition/entrance/531810/introduction
对文本类数据分类不仅可以用传统机器学习,也可以用深度学习。通过sklearn实践通过机器学习对文本数据进行分类,或多或少有点点缺陷,而深度学习既能够提供特征提取功能,也可以完成分类功能。
- Fasttext
模型犹如名字一样,非常简单通过Embedding层将单词映射到稠密空间,学习到的Embedding空间维度比较低,可以快速训练,将句子中所有的单词在Embedding空间中进行平均,进而完成分类操作。
Fasttext模型:
使用fasttext训练:
import pandas as pd
import fasttext
from sklearn.metrics import f1_score
# 之前将训练集存为pickle格式,较快的读取
train_df = pd.read_pickle('train_set.pkl')
# 剔除在所有文本中出现频次较多的字符,可能为标点,符号无实际意义
train_df['text_unique'] = train_df['text'].apply(lambda x: ' '.join(list(set(x.split(' ')))))
all_lines = ' '.join(list(train_df['text_unique']))
word_count = Counter(all_lines.split(' '))
word_count = sorted(word_count.items(), key=lambda x: int(x[1]), reverse=True)
word_count = [(k, int(round(v/train_df.shape[0]*100,0))) for k, v in word_count]
word_count10 = [k for k, v in word_count if v >= 85]
word_delete = '|'.join([f'({i})( )?' for i in word_count10])
train_df2['text2'] = train_df2['text'].str.replace(f"{word_delete}",'')
# 另存为一个副本数据框
train_df3 = train_df2[['label','text2']].rename(columns={'text2':'text'})
# 转换为 Fasttext 需要的格式
train_df3['label_ft'] = '__label__' + train_df3['label'].astype(str)
train_df3[['text','label_ft']].iloc[:-5000].to_csv('train_fast.csv', index=None, header=None,sep='\t')
# 训练
model = fasttext.train_supervised('train_fast.csv', lr=1.0, dim=300, wordNgrams=2, verbose=2, minCount=1, epoch=30, loss='hs', bucket=2000000)
# 验证
val_pred = [model.predict(x)[0][0].split('__')[-1] for x in train_df.iloc[-5000:]['text']]
print(f1_score(train_df['label'].values[-5000:].astype(str), val_pred, average='macro'))
验证集f1得分:
我不知道是不是电脑太次了,明明是个fasttext,训练起来应该要比TF-IDF快吧,每次训练都耗费了半个小时,结果也比较一般般。或许是我急于求成,应该先小样本训练的有比较好的结果再进行增数据,先这样,等之后再次使用fasttext时再来更新。