本文采用的是词集模型。
词集模型:将每个单词出现与否作为一个特征,即忽略了单词出现的次数,从而将句子转化为单词向量后,该向量中只有0和1;对应的是词袋模型,将考虑单词出现的次数,从而得到的单词向量,除了0和1还有大于1的整数。
相关概念:
文档:是训练集合,包含了多个句子
句子:对应一个词向量,向量的长度与词汇表的长度相同,元素为1代表对应位置词汇表中的单词出现,否则不出现
单词(词条):句子中的一个词,对应词向量中的一个元素
词汇表:包含了文档中所有可能出现的单词,但不重复。
说明:c即文本分类的取值,如正常邮件和垃圾邮件;x即某个单词
1、利用文档构建词汇表,假设长度为n,n即文档不重复单词的个数
如下文档(假设每行为一个句子的单词的切分),构成的词汇表为【one, two, three, four,five, six,seven】
单词 |
单词 |
单词 |
单词 |
Lable |
one |
two |
three |
four |
0 |
two |
three |
four |
five |
0 |
three |
four |
five |
six |
1 |
four |
five |
six |
seven |
1 |
上面假设了每个句子一样长,实际上不一定相同,但并不影响这个理解过程
2、根据构建的词汇表将文档转化为训练矩阵m*n,其中m为句子的个数,n为词向量的长度
上述文档转化后的词向量为:
1 1 1 1 00 0
0 1 1 1 10 0
0 0 1 1 11 0
0 0 0 1 11 1
3、计算概率(假设为二分类)
如下为标量:
p(c=0)=0.5 label为0的句子的个数/句子的总数m
p(c=1)=0.5 label为1的句子的个数/句子的总数m
p(wi|c=0) 词向量中第i个单词在Label=0的句子中出现的概率:从训练矩阵中将Label=0的行向量都取 出来,将所有行的第i列加起来作为分子,将所有元素都加起来(其实就是一堆1相加)作为分母,相除可得
p(one|c=0)=1/8 p(two|c=0)=1/4 p(three|c=0)=1/4 p(four|c=0)=1/4 p(five|c=0)=1/8 p(six|c=0)=0 p(seven|c=0)=0
p(wi|c=1) 词向量中第i个单词在Label=1的句子中出现的概率:从训练矩阵中将Label=1的行向量都取出来,将所有行的第i列加起来作为分子,将所有元素都加起来(其实就是一堆1相加)作为分母,相除可得
p(one|c=1)=0 p(two|c=1)=0 p(three|c=1)=1/8 p(four|c=1)=1/4 p(five|c=1)=1/4 p(six|c=1)=1/4 p(seven|c=1)=1/8
如下为向量:
p0V=【p(w1|c=0),p(w2|c=0),p(w3|c=0),…,p(wn|c=0)】=[1/8 1/4 1/4 1/4 1/8 0 0 ]
P1V=【p(w1|c=1),p(w2|c=1),p(w3|c=1),…,p(wn|c=1)】=[0 0 1/8 1/4 1/4 1/4 1/8 ]
先将该句子转化为词向量V
该句子为0类的概率:Sum(V.dot(p0V)),即将V中每个元素与p0V中对应的每个元素相乘并求和
该句子为1类的概率:Sum(V.dot(p1V)),即将V中每个元素与p1V中对应的每个元素相乘并求和
比较两个概率值,哪个大则属于哪一类
假设有如下句子[one five tree two seven],转换为句子向量为[11 1 0 1 0 1]
(说明:这个模型是不考虑单词之间的关系的以及先后顺序的)
P(c=0)=1/8*1+1/4*1+1/4*1*1/4*0+1/8*1+0*0+1*0=6/8
P(c=1) = 0 *1+ 0*1+ 1/8*1+1/4*0 + 1/4*1+ 1/4*0+ 1/8*1=4/8
所以该句子为0类