Python文本特征提取 CountVectorizer,TfidfVectorizer
特征提取:
将文本数据转化成特征向量的过程
不考虑词语出现的顺序,每个出现过的词汇单独作为一列特征,这些不重复的特征词汇集合为词表,每一个文本都可以在很长的词表上统计出一个很多列的特征向量。
如果每个文本都出现的词汇,一般被标记为"停用词"不计入特征向量。
主要有两个API来实现 CountVectorizer 和 TfidfVectorizer
CountVectorizer:
只考虑词汇在文本中出现的频率
TfidfVectorizer:
除了考量某词汇在文本出现的频率,还关注包含这个词汇的所有文本的数量
TfidfVectorizer能够削减高频没有意义的词汇出现带来的影响, 挖掘更有意义的特征,相比之下,文本条目越多,Tfid的效果会越显著
下面对两种提取特征的方法,分别设置停用词和不停用,使用朴素贝叶斯进行分类预测,比较评估效果。
from sklearn.datasets import fetch_20newsgroups
from sklearn.model_selection import train_test_split
from sklearn.feature_extraction.text import CountVectorizer,TfidfVectorizer
from sklearn.naive_bayes import MultinomialNB
from sklearn.metrics import classification_report
#下载新闻数据
news = fetch_20newsgroups(subset = "all")
#分割训练数据和测试数据
x_train,x_test,y_train,y_test = train_test_split(news.data,news.target,
test_size = 0.25,random_state = 33)
#采用CountVectorizer提取特征向量
# 默认配置不去除停用词
count_vec = CountVectorizer()
x_count_train = count_vec.fit_transform(x_train)
x_count_test = count_vec.transform(x_test)
# 去除停用词
count_stop_vec = CountVectorizer(analyzer='word', stop_words='english')
x_count_stop_train = count_stop_vec.fit_transform(x_train)
x_count_stop_test = count_stop_vec.transform(x_test)
#采用TfidfVectorizer()提取特征向量
# 默认配置不去除停用词
tfid_vec = TfidfVectorizer()
x_tfid_train = tfid_vec.fit_transform(x_train)
x_tfid_test = tfid_vec.transform(x_test)
# 去除停用词
tfid_stop_vec = TfidfVectorizer(analyzer='word', stop_words='english')
x_tfid_stop_train = tfid_stop_vec.fit_transform(x_train)
x_tfid_stop_test = tfid_stop_vec.transform(x_test)
#使用朴素贝叶斯分类器,分别对两种提取出来的特征值进行学习和预测
#方法一:对CountVectorizer提取特征向量,进行学习和预测
mnb_count = MultinomialNB()
mnb_count.fit(x_count_train,y_train)#学习
mnb_count_y_predict = mnb_count.predict(x_count_test)#预测
#去除停用词
mnb_count_stop = MultinomialNB()
mnb_count_stop.fit(x_count_stop_train