在文本分类问题中,我们通常进行特征提取,这时,我们需要利用到要介绍的工具,或者其他工具。文本的特征提取特别重要,体现这个系统做的好坏,分类的准确性,文本的特征需要自己构建,常用的有 n-gram 模型
,ti-idf 模型
。但是这些模型共同的特点就是太稀疏了。一般情况下需要 降维
,比如 SVD
,其实很多模型也可以用来进行特征选择比如 决策树
,L1 正则
也可以用来进行特征选择,具体原理这里就不讲了。sklearn
这个强大的工具帮我们实现了很多算法,超级好用。
CountVectorizer 与 TfidfVectorizer,这两个类都是特征数值计算的常见方法。对于每一个训练文本,CountVectorizer 只考虑每种词汇在该训练文本中出现的频率,而TfidfVectorizer 除了考量某一词汇在当前训练文本中出现的频率之外,同时关注包含这个词汇的其它训练文本数目的倒数。相比之下,训练文本的数量越多,TfidfVectorizer 这种特征量化方式就更有优势。
例:
#python2.7 sklearn version 0.18.1from sklearn.feature_extraction.text import CountVectorizerX_test = ['I sed about sed the lack','of any Actually']count_vec=CountVectorizer(stop_words=None)print count_vec.fit_transform(X_test).toarray()print '\nvocabulary list:\n\n',count_vec.vocabulary_>>>>[[1 0 0 1 1 0 2 1] [0 1 1 0 0 1 0 0]] (0, 4) 1 (0, 7) 1 (0, 0) 1 (0, 6) 2 (0, 3) 1 (1, 1) 1 (1, 2) 1 (1, 5) 1vocabulary list:{u'about': 0, u'i': 3, u'of': 5, u'lack': 4, u'actually': 1, u'sed': 6, u'the': 7, u'any': 2}
首先介绍一下如何计算tf-idf,并且需要明确的是tf-idf=tf*idf,也就是说tf与idf分别是两个不同的东西。其中tf为谋个训练文本中,某个词的出现次数,即词频(Term Frequency);idf为逆文档频率(Inverse Document Frequency),对于词频的权重调整系数。
其中:
\begin{align*}
词频(TF)=某个词在文章中的出现次数
\end{align*}
考虑到文章有长短之分,为了便于不同文章的比较,进行”词频”标准化。
\begin{align*}
词频(TF)=\frac{某个词在文章中的出现次数}{文章的总词数}
\end{align*}
或者
\begin{align*}
词频(TF)=\frac{某个词在文章中的出现次数}{该训练文本中出现最多次的词数}
\end{align*}
\begin{align*}
词频(TF)=\frac{某个词在文章中的出现次数}{文章的总词数}\[1ex]
或者\[1ex]
词频(TF)=\frac{某个词在文章中的出现次数}{该训练文本中出现最多次的词数}
\end{align*}
逆文档频率(IDF)=log(总样本数包含有该词的文档数 1)
来源:http://www.icode9.com/content-4-38951.html联系客服