词袋模型作为NLP领域内比较经典的文本表示思想,有很多不同的表示方法。
BooleanVector
BooleanVector是基于布尔值与one-hot的思想而形成的。用一个词表大小的向量来表示文本,文本中出现的词汇在向量中对应的位置将其置为1。比如句子1的表示结果如下:
BooleanVector(句子2) = [0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1]
BooleanVector的文本表示方法表示简单,但是有很大的问题。例如,如果一个词在文本中出现多次则和出现单次的文本表示结果一致。也就是说,如果一个句子是句子2本身,而另一个句子是句子2的两倍复制,则最终表示的文本向量一致。
CountVector
CountVector表示方法改善了BooleanVector的缺陷。而是利用词汇在句子中出现的数量来代替了布尔值。句子2可以表示为如下的向量:
CountVector(句子2) = [0, 0, 0, 0, 0, 1, 1, 2, 1, 1, 1]
可以看出句子2在的
字出现的位置被置为了2,这是由于“的”字本身在句子中出现了两次。
TF-IDF
TF-IDF(term frequency–inverse document frequency)翻译为词频-逆文本频率。在BooleanVector和CountVector的文本表示方法中,每个词汇的重要性都是一样的,这显然不符合常识的。所以利用TF-IDF算法在语料中计算一下每个词汇在当前文本中的权值,将其作为文本向量的分量更为合理。
TF-IDF的计算方法如下:
其中,TF代表了词汇在文本中的频率,分子部分为当前词汇出现的次数,分母为文本中所有词汇出现的次数之和,也就是当前文本的总词数(不去重)。IDF代表了逆文档频率,N代表语料中有多少文本, 表示语料中包含当前词汇的文本数量。
TF揭示一个词汇在文本中的频率越高则越重要,IDF揭示一个词汇出现在其他文本中的次数越多约不重要。
N-gram
由于上述的表示方式均没有考虑词序的不同,也就是说“北京/今天/的/天气/比/昨天/的/好”和“好/昨天/的/天气/比/今天/的/北京”两个句子在文本的表示向量是一致的。这显然不合理,词序的不同也会导致文本含义的不同,同样的向量不能体现文本的差异。所以N-gram的表示方式在一定程度上考虑了文本词序的这一特征。
以Bi-gram为例,句子1和句子2的词表就会有所变化:
Bi-gram词表
我们,公司: 1
公司,坐落: 2
坐落,于 : 3
于,北京 : 4
北京,今天: 5
今天,的 : 6
的, 天气 : 7
天气, 比 : 8
比, 昨天 : 9
昨天,的 : 10
的,好 : 11
最终的句子1和句子2可以表示为如下的向量:
Bi-gram(句子1) = [1,1,1,1,0,0,0,0,0,0,0]
Bi-gram(句子2) = [0,0,0,0,1,1,1,1,1,1,1]
词带模型它作为NLP领域中最经典的文本表示方式,它的的思想和实现相对简单,但是也有很多的不足:1.不能表示词序信息,2.文本向量随者词表的增大而变大,3.不能很好的反映文本的语义。