系列文章
天池NLP赛事-新闻文本分类(一) —— 赛题理解
天池NLP赛事-新闻文本分类(二) —— 数据读取和数据分析
天池NLP赛事-新闻文本分类(三)——基于机器学习的文本分类
三、基于机器学习的文本分类
3.1 机器学习模型
- 机器学习能解决一定的问题,但不能奢求机器学习是万能的;
- 机器学习算法有很多种,看具体问题需要什么,再来进行选择;
- 每种机器学习算法有一定的偏好,需要具体问题具体分析;
对于文本分类问题,这里机器学习,可以用:TF-IDF+sklearn机器学习中的模型完成分类
3.2 文本表示方法
在自然语言领域,文本是不定长度的。文本表示成计算机能够运算的数字或向量的方法一般称为词嵌入(Word Embedding)方法。词嵌入将不定长的文本转换到定长的空间内,是文本分类的第一步。
One-hot
这里的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:我 爱 北 京 天 安 门
句子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]
在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()
N-gram
N-gram与Count Vectors类似,不过加入了相邻单词组合成为新的单词,并进行计数。
如果N取值为2,则句子1和句子2就变为:
句子1:我爱 爱北 北京 京天 天安 安门
句子2:我喜 喜欢 欢上 上海
TF-IDF
TF-IDF 分数由两部分组成:第一部分是词语频率(Term Frequency),第二部分是逆文档频率(Inverse Document Frequency)。其中计算语料库中文档总数除以含有该词语的文档数量,然后再取对数就是逆文档频率。
T F ( t ) = 该 词 语 在 当 前 文 档 出 现 的 次 数 当 前 文 档 中 词 语 的 总 数 TF(t)= \frac {该词语在当前文档出现的次数 }{ 当前文档中词语的总数} TF(t)=当前文档中词语的总数该词语在当前文档出现的次数
I D F ( t ) = l o g e 文 档 总 数 出 现 该 词 语 的 文 档 总 数 + 1 IDF(t)= log_e\frac {文档总数}{出现该词语的文档总数+1} IDF(t)=