NLP入门——天池新闻文本分类(3)基于机器学习的文本分类
基于机器学习的文本分类
这一次任务中会使用机器学习的模型来进行文本分类。机器学习的模型十分丰富,并且包括很多个分支。本次将使用一些传统机器学习进行文本分类。
学习目标
- 学会
TF-IDF
的原理和使用 - 使用
sklearn
的机器学习模型来进行文本分类
机器学习模型
机器学习中的分类模型有很多种,常见的分类器有K近邻
、决策树
、随机森林
、支撑向量机
、朴素贝叶斯
、逻辑回归
等等,本章中我们会用到RidgeClassifier
文本表示方法
机器学习算法的训练过程中,如果给定N个样本,每个样本有M个特征,这样就组成了N*M的样本矩阵然后完成算法的训练和预测。同样的在计算机视觉中会将图片像素看作特征,每张图就相当于hight * width * 3的特征图,一个三维矩阵。
但是由于在自然语言领域中,文本长度通常是不定的。将文本表示为计算机可以运算的数字或向量特征的方法称为词嵌入(Word Embedding)
方法。词嵌入会将不定长文本转换到定长特征空间中,是文本分类的第一步。
One-hot编码
One-hot编码将句子中每个单词用一个离散向量表示。具体的是将所有句子中出现的单词/词编码一个索引,然后根据索引进行赋值。
句子1: 我 爱 北 京 天 安 门
句子2: 我 喜 欢 上 海
先根据所有句子的字确定索引:
{
'我': 1, '爱': 2, '北': 3, '京': 4, '天': 5,
'安': 6, '门': 7, '喜': 8, '欢': 9, '上': 10, '海': 11
}
一共包括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:我 爱 北 京 天 安 门
转换为 [1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0]
句子2:我 喜 欢 上 海
转换为 [1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1]
可以使用sklearn中的CountVectorizer
来实现这一个转换:
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()
# 输出
array([[0, 1, 1, 1, 0, 0, 1, 0, 1],
[0, 2, 0, 1, 0, 1, 1, 0, 1],
[1, 0, 0, 1, 1, 0, 1, 1, 1],
[0, 1, 1, 1, 0, 0, 1, 0, 1]], dtype=int64)
N-gram
N-gram也是统计单词词频,但是在语料库中加入了相邻单词组成的词语。如当N取值为2时,上述句子1和句子2就变为:
句句⼦子1:我爱 爱北 北京 京天 天安 安门
句句⼦子2:我喜 喜欢 欢上 上海
TF-IDF
TF-IDF
分数是由两部分组成:第一部分是词语频率
(Term Frequency),第二部分是逆文档频率
(Inverse Document Frequency)。
字词的重要性会随着他在文件中出现次数成正比增加,但是会随着他在语料库中出现的频率中出现的频率成反比下降。
- TF
TF表示关键字在文档中出现的频率。 t f i j tf_{ij} t