天池NLP新闻文本分类学习赛心得-Task3
赛题链接:https://tianchi.aliyun.com/competition/entrance/531810/introduction
对新闻文本分类方式有很多种,深度学习也大多是基于机器学习思想展开的,所以在这次文本分类中可以首先对其使用机器学习模型来解决文本分类问题,之后再用深度学习模型对其进行分类预测。
机器学习在分类过程中肯定有较多的局限性,一是在空间上的,内存使用量可能较多,在大文本传入的情况下可能会造成内存溢出;二是时间上的,机器学习模型对于分类问题优化量可能不足,导致在模型训练中需要耗费大量时间。
机器学习的文本比较
在 NLP中,文本分类和图片分类有着较大的不同,文本是不定长的,一般采取将文本表示成计算机能够运行的数字或向量的方法,也称词嵌入方法。
- One-hot
使用One-hot将每一个单词使用离散的向量表示。
如:
句子1:我 爱 北 京 天 安 门
句子2:我 喜 欢 上 海
先将每一字确定编号:
{
‘我’: 1, ‘爱’: 2, ‘北’: 3, ‘京’: 4, ‘天’: 5,
‘安’: 6, ‘门’: 7, ‘喜’: 8, ‘欢’: 9, ‘上’: 10, ‘海’: 11
}
转换为一个11维度稀疏向量:
我:[1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
爱:[0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0]
…
海:[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1]
- Bag of Words
Bag of Words(词袋表示),也称为Count Vectors,每个文档的字/词可以使用其出现次数来进行表示。
如:
句子1:我 爱 北 京 天 安 门
句子2:我 喜 欢 上 海
直接统计每个字出现的次数,并进行赋值:
句子1:我 爱 北 京 天 安 门
转换为 [1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0]
句子2:我 喜 欢 上 海
转换为 [1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1]
python中可以利用sklearn模块:
from sklearn.feature_extraction.text import CountVectorizer
## 由于中文不能很好的表现稀疏矩阵,用英文文本代替。
corpus = [
'This is the first document.',
'This document is the second document.',
'And this is the third one.',
'Is this the first document?',
]
vectorizer = CountVectorizer()
vectorizer.fit_transform(corpus).toarray()
- TF-IDF
TF-IDF 分数由两部分组成:第一部分是词语频率(Term Frequency),第二部分是逆文档频率(Inverse Document Frequency)。其中计算语料库中文档总数除以含有该词语的文档数量,然后再取对数就是逆文档频率。
TF(t)= 该词语在当前文档出现的次数 / 当前文档中词语的总数
IDF(t)= log_e(文档总数 / 出现该词语的文档总数)
同样可以使用 sklearn 模块进行训练:
# TF-IDF + RidgeClassifier
from sklearn.feature_extraction.text import TfidfVectorizer
tfidf = TfidfVectorizer(ngram_range=(1,3), max_features=3000)
train_test = tfidf.fit_transform(train_df['text'])
clf = RidgeClassifier()
clf.fit(train_test[:10000], train_df['label'].values[:10000])
val_pred = clf.predict(train_test[10000:])
print(f1_score(train_df['label'].values[10000:], val_pred, average='macro'))
可以调整ngram_range、max_df、min_df、max_features来使模型的拟合度更好。