首先采用最容易上手的方式对文本进行分类: TF-IDF + 机器学习分类器
1.文本表示方法
文本是非结构化数据,而机器是要接受数字或者向量作为输入运算的。且文本还是不定长度的,那么要将文本转化为计算机能够运算的方式。这种方法一般叫做词向量嵌入,它把不定长文本投射到定长空间,是分类第一步。
词向量嵌入方法有:
1)one-hot:经典独热,即把句子当成一个list,每个字有各自索引,那么每个字对应的向量就是仅有相应索引为1其他为0的,长度为句子长度的向量。ex:
句子1:我爱你
句子2:我也爱你
那么对所有句子的所有不重复的字(4个)进行索引,将每个字确定一个编号,如以下字典所示:
{“我”:1,"爱"2:,“你”:3,“也”:4}
那么“我”对应[1,0,0,0],“爱”对应[0,1,0,0], "你"对应[0,0,1,0],"也"对应[0,0,0,1]。
2)bag of words:词袋法。输入的是句子中每个字出现的频率,一个句子转化的向量也是为不重复字符的长度.
句子1: 我爱你,我也爱你
- 句子2:我喜欢美好的事物
那么基于这两个句子,构造字典如下:
{“我”:1,"爱"2:,“你”:3,“也”:4,“喜”:5,“欢”:6,“美”:7,“好”:8,“的”:9,"事"10:,“情”:11}
句子1 转换为: { 2, 2, 2, 1, 0, 0, 0, 0, 0, 0, 0}
句子2转换为:{ 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1}
可以在sklearn中直接调用CountVectorizer
from sklearn.feature_extraction.text import CountVectorizer
corpus = [
'I love you.',
'I love you too.',
'Happy day.',
'Always happy'
]
vectorizer = CountVectorizer()
vectorizer.fit_transform(corpus).toarray()
- N-gram
N-Gram是一种基于统计语言模型的算法。它的基本思想是将文本里面的内容按照字节进行大小为N的滑动窗口操作,形成了长度是N的字节片段序列。每一个字节片段称为gram,对所有gram的出现频度进行统计,并且按照事先设定好的阈值进行过滤,形成关键gram列表,也就是这个文本的向量特征空间,列表中的每一种gram就是一个特征向量维度。该模型基于这样一种假设,第N个词的出现只与前面N-1个词相关,而与其它任何词都不相关,整句的概率就是各个词出现概率的乘积。
实际操作, N-gram与Count Vectors类似,但是加入了相邻单词组合成为新的单词,并进行计数。
如果N取值为2,则句子2就变为:
我喜 欢美 好的 事物
4)TF-IDF
TF-IDF 分数由两部分组成:第一部分是词语频率(Term Frequency),第二部分是逆文档频率(Inverse Document Frequency)。其中计算语料库中文档总数除以含有该词语的文档数量,然后再取对数就是逆文档频率。
TF(t)= 该词语在当前文档出现的次数 / 当前文档中词语的总数
IDF(t)= log_e(文档总数 / 出现该词语的文档总数)
- 基于机器学习的文本分类
1) Counter vectors + rfclassifiler