NLP系列文章(二)——词袋模型


词袋模型作为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的计算方法如下:
T F I D F ( w o r d i ) = T F ( w o r d i ) × I D F ( w o r d i ) = c o u n t ( w o r d i ) i n c o u n t ( w o r d i ) × log ( N N ( w o r d i ) ) TF-IDF(word_i) = TF(word_i) \times IDF(word_i) \\= \frac{count(word_i)}{\sum_i^ncount(word_i)} \times \log(\frac{N}{N(word_i)})

其中,TF代表了词汇在文本中的频率,分子部分为当前词汇出现的次数,分母为文本中所有词汇出现的次数之和,也就是当前文本的总词数(不去重)。IDF代表了逆文档频率,N代表语料中有多少文本, N ( w o r d i ) N(word_i) 表示语料中包含当前词汇的文本数量。

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.不能很好的反映文本的语义。

猜你喜欢

转载自blog.csdn.net/qq_19672707/article/details/105587338
今日推荐