TF-IDF说明
TF-IDF是文本挖掘预处理的基本步骤,在讲解前需要先简单介绍文本向量化的一种建模方法——词袋模型。
词袋模型
词袋模型(Bag of Words,简称BoW)是文本建模常用的向量表示方法。
它只考虑词在文本中出现的次数,不考虑文本中词之间的上下文关系。
先来看看构建词袋模型的一个例子:
有下面4个文本,每个文本就一句话。
文本1:"I come to China to travel"
文本2:"This is a car polupar in China"
文本3:"I love tea and Apple"
文本4:"The work is to write some papers in science"
上面4个文本包含的不重复单词有19个(按照字母顺序),这称为这4个文本的词汇表。
'and', 'apple', 'car', 'china', 'come', 'in', 'is', 'love', 'papers', 'polupar',
'science', 'some', 'tea', 'the', 'this', 'to', 'travel', 'work', 'write'
'I'
是英文中的停用词,所以不参加词频统计。
停用词就是极其常见却没有什么实际含义的词,后面用到的代码把
'I'
设定为了停用词。
统计词汇表中的每个词在各个文本中出现的次数,如下表:
这样就把各个文本给向量化了,每一行代表对应的文本,这就是4个文本的词袋模型。
从上面的例子可以看出,词袋模型是关注词频(词在文本中出现的次数)的向量表示方法。
下面理顺一下词袋模型构建的步骤:
-
对文本进行分词,例子用的是英文文本,通过空格和标点符号就可以分词。
实际工作中英文分词推荐使用nltk,下面是调用nltk分词的一个小示例。
# 导入nltk包 import nltk # 用于分词的文本 sentence = "At eight o'clock on Thursday morning Arthur didn't feel very good." # 分词结果 tokens = nltk.word_tokenize(sentence) print(tokens)
分词输出结果
['At', 'eight', "o'clock", 'on', 'Thursday', 'morning', 'Arthur', 'did', "n't", 'feel', 'very', 'good', '.']
对于中文分词,则推荐用jieba分词,下面是jieba分词的一个小示例。
import jieba seg_list = jieba.cut("我来到北京清华大学") print ("分词结果: " + "/ ".join(seg_list))
输出结果
分词结果: 我/ 来到/ 北京/ 清华大学
-
创建词汇表,包含所有的不重复词,并排除停用词。
-
统计词汇表中的每个词在各个文本中出现的次数。
CountVectorizer做的事情就是上面的文本向量化过程,调用CountVectorizer的代码如下:
from sklearn.feature_extraction.text import CountVectorizer
# 文本集
corpus=["I come to China to travel",
"This is a car polupar in China",
"I love tea and Apple ",
"The work is to write some papers in science"]
vectorizer = CountVectorizer()
vec_count = vectorizer.fit_transform(corpus)
print(vec_count)
结果
(0, 16) 1
(0, 3) 1
(0, 15) 2
(0, 4) 1
(1, 5) 1
(1, 9) 1
(1, 2) 1
(1, 6) 1
(1, 14) 1
(1, 3) 1
(2, 1) 1
(2, 0) 1
(2, 12) 1
(2, 7) 1
(3, 10) 1
(3, 8) 1
(3,