赞
踩
- tfidf原理,特征筛选
参考: https://www.jianshu.com/p/9b2eb69ab735
tiidf选择值更高的词作为句子的表达(作为特征),进而做分类任务或者相关度排序任务。那么值是什么值呢?tfidf其实是td与idf的操作。全称为term frequence - inverse document frequence,前者为某个单词在文档中出现的频率,后者为包含该单词的文档的频率 的倒数。用来拉低前者的值,很明显若每个文档都拥有或曾经出现某个词,那这个词很廉价,没有什么意思,需要筛掉,即让他的值低一些。
在tfidf的基础上,发展起来了BM25,对tfidf进行了一些优化。主要体现在词频的变化,已经句子等长度的归一化等。感觉改进版的tfidf与BM25已经很像了,不知道理解的对不对..
tfidf的使用,直接使用sklearn.feature_extraction.text import TfidfTransformer即可。或者先使用CounterVectorizer进行向量化。
参考代码: https://www.cnblogs.com/pinard/p/6693230.html
- from sklearn.feature_extraction.text import TfidfTransformer
- from sklearn.feature_extraction.text import CountVectorizer
-
- corpus=["我们 是 天使 的 爸爸 美女","美女 你们 天使 是 天使 的 孩子","美女 你们 做为 恶魔 不会 心痛 嘛","美女 天使 和 恶魔 的 区别 是 什么"]
-
- vectorizer=CountVectorizer()
-
- tranformer=TfidfTransformer()
- tfidf=tranformer.fit_transform(vectorizer.fit_transform(corpus))
-
- print(tfidf)
-
- x=zip(vectorizer.get_feature_names(),range(0,len(vectorizer.get_feature_names())))
- print(list(x))
-
结果如下,很明显看出对于每个文档来说,那些单词(特征)是重要,而哪些是不重要的,据此进行特征选择,做接下来的任务。
-
- from sklearn.feature_extraction.text import TfidfVectorizer
- tfidf2=TfidfVectorizer()
- re=tfidf2.fit_transform(corpus)
- print(re)
也可以直接使用TfidfVectorizer来进行直接计算。
另外 https://www.jianshu.com/p/f3b92124cd2b 包含了除sklearn之外,使用gensim进行tfidf计算的方法,以及使用python实现。使用的是原版的tfidf,没有对其做改进,即对tf进行log等操作。
- 互信息原理, 特征筛选
互信息中引申初了点互信息,前者是后者所有取值可能性的乘积与加和的操作。互信息反应了两个变量之间的相关度。如果两个变量之间相关度很高,认为有数据冗余,我们可以保留其中一个变量。
-
- from sklearn import metrics as mr
-
- label=[1,1,1,1,1,0,0,0,0]
- x1=["x","x","x","x","x","y","y","y","y"]
- x2=["x","x","x","y","y","y","y","x","x"]
- x3=["x","x","x","x","x","y","y","y","y"]
- x4=["x","x","x","x","y","y","y","y","y"]
- res1=mr.mutual_info_score(label,x1)
- res2=mr.mutual_info_score(label,x2)
- res3=mr.mutual_info_score(label,x3)
- res4=mr.mutual_info_score(label,x4)
-
- print(res1)
- print(res2)
- print(res3)
- print(res4)
- print("---------------")
- res1_4=mr.mutual_info_score(x1,x4)
- res1_3=mr.mutual_info_score(x1,x3)
- res1_2=mr.mutual_info_score(x1,x2)
- print(res1_4)
- print(res1_3)
- print(res1_2)

如上图所示,假如将1,2,3,4分别看作是不同的特征,那么可以看出特征1和特征2相对于3,4来说是不相关的,在做任务时,如果只选择二维特征,则保留特征1和2.
参考:
https://blog.csdn.net/u013710265/article/details/72848755
代码链接:https://github.com/mathCrazyy/NLP_task/tree/master/NLP_task3
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。