赞
踩
目录
*首先我们先回顾一下学习计划()二)中提到的文本向量化表示:https://blog.csdn.net/weixin_42483560/article/details/89218698
- from sklearn.feature_extraction.text import CountVectorizer
-
- vectorizer=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"]
-
-
- print (vectorizer.fit_transform(corpus).toarray())
- [[0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 2 1 0 0]
- [0 0 1 1 0 1 1 0 0 1 0 0 0 0 1 0 0 0 0]
- [1 1 0 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0]
- [0 0 0 0 0 1 1 0 1 0 1 1 0 1 0 1 0 1 1]]
第一条文本中,"come","China"和“Travel”各出现1次,而“to“出现了两次。似乎看起来这个文本与”to“这个特征更关系紧密。但是实际上”to“是一个非常普遍的词,几乎所有的文本都会用到,因此虽然它的词频为2,但是重要性却比词频为1的"China"和“Travel”要低的多。如果我们的向量化特征仅仅用词频表示就无法反应这一点。因此我们需要进一步的预处理来反应文本的这个特征,而这个预处理就是TF-IDF。
TF-IDF:Term Frequency - Inverse Document Frequency,即“词频-逆文本频率”。它由两部分组成,TF和IDF。
前面的TF也就是我们前面说到的词频,我们之前做的向量化也就是做了文本中各个词的出现频率统计,并作为文本特征,这个很好理解。关键是后面的这个IDF,即“逆文本频率”如何理解。在上一节中,我们讲到几乎所有文本都会出现的"to"其词频虽然高,但是重要性却应该比词频低的"China"和“Travel”要低。我们的IDF就是来帮助我们来反应这个词的重要性的,进而修正仅仅用词频表示的词特征值。
定性得解释的话:IDF反应了一个词在所有文本中出现的频率,如果一个词在很多的文本中出现,那么它的IDF值应该低,比如上文中的“to”。而反过来如果一个词在比较少的文本中出现,那么它的IDF值应该高。比如一些专业的名词如“Machine Learning”。这样的词IDF值应该高。一个极端的情况,如果一个词在所有的文本中都出现,那么它的IDF值应该为0。
用平滑的数学公式表示为:IDF(x)=log((N+1)/(N(x)+1))+1
则TF−IDF的表达式为:TF−IDF(x)=TF(x)∗IDF(x)
sklearn库中有两种TF-IDF实现方式:
1.CountVectorizer类向量化之后再调用TfidfTransformer类进行预处理
2.用TfidfVectorizer完成向量化与TF-IDF预处理。
- from sklearn.feature_extraction.text import TfidfTransformer
- 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()
-
- transformer = TfidfTransformer()
- tfidf = transformer.fit_transform(vectorizer.fit_transform(corpus))
- print (tfidf)
- from sklearn.feature_extraction.text import TfidfVectorizer
-
- tfidf2 = TfidfVectorizer()
- re = tfidf2.fit_transform(corpus)
- print (re)
直接给出式子:
概率论中我们知道:如果x跟y不相关,则p(x,y)=p(x)p(y)。二者相关性越大,则p(x, y)就相比于p(x)p(y)越大。用后面的式子可能更
好理解,在y出现的情况下x出现的条件概率p(x|y)除以x本身出现的概率p(x),自然就表示x跟y的相关程度。
直接给出式子:.
其衡量的是两个随机变量之间的相关性,即一个随机变量中包含的关于另一个随机变量的信息量。所谓的随机变量,即随机试验结
果的量的表示,可以简单理解为按照一个概率分布进行取值的变量,比如随机抽查的一个人的身高就是一个随机变量。
可以看出,互信息其实就是对X和Y的所有可能的取值情况的点互信息PMI的加权和。因此,点互信息这个名字还是很形象的。
- from sklearn import metrics as mr
- mr.mutual_info_score(label,x)
以上语句计算的就是label和x之间的互信息值。
现在利用以上语句对小结2中生成的特征矩阵进行特征筛选:
- from sklearn.feature_extraction.text import TfidfTransformer
- from sklearn.feature_extraction.text import CountVectorizer
- from sklearn import metrics as mr
-
- 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()
-
- transformer = TfidfTransformer()
- #tfidf = transformer.fit_transform(vectorizer.fit_transform(corpus))
- a = vectorizer.fit_transform(corpus).toarray()
- print(a)
- print(mr.mutual_info_score(a[1],a[2]))
- #print (tfidf)
结果如下
- 0.09232984929764276
- (0, 16) 0.4424621378947393
- (0, 15) 0.697684463383976
- (0, 4) 0.4424621378947393
- (0, 3) 0.348842231691988
- (1, 14) 0.45338639737285463
- (1, 9) 0.45338639737285463
- (1, 6) 0.3574550433419527
- (1, 5) 0.3574550433419527
- (1, 3) 0.3574550433419527
- (1, 2) 0.45338639737285463
- (2, 12) 0.5
- (2, 7) 0.5
- (2, 1) 0.5
- (2, 0) 0.5
- (3, 18) 0.3565798233381452
- (3, 17) 0.3565798233381452
- (3, 15) 0.2811316284405006
- (3, 13) 0.3565798233381452
- (3, 11) 0.3565798233381452
- (3, 10) 0.3565798233381452
- (3, 8) 0.3565798233381452
- (3, 6) 0.2811316284405006
- (3, 5) 0.2811316284405006
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。