【NLP】Task3:特征选择
文章目錄
- 背景
- 一、TF_IDF原理
- 1、TF(item frequency)
- 2、逆向文件頻率IDF(inverse document frequency)
- 3、TF-IDF
- 二、TF-IDF實現
- 1、方法一
- 2、方法二
- 三、互信息原理
- 1、點互信息(PMI)
- 2、互信息MI
- 四、對特征矩陣使用互信息進行特征篩選
- 1、sklearn.metrics.mutual_info_score
- 2、sklearn.feature_selection.mutual_info_classif
背景
將下面4個短文本做了詞頻統計:
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"]不考慮停用詞,處理后得到的詞向量如下:
[[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原理
TF-IDF(Term Frequency - Inverse Document Frequency,詞頻-逆文本頻率)。TF-IDF是一種統計方法,用以評估一字詞對于一個文件集或一個語料庫中的其中一份文件的重要程度。 字詞的重要性隨著它在文件中出現的次數成正比增加,但同時會隨著它在語料庫中出現的頻率成反比下降。
它由兩部分組成,TF和IDF。
- TF(詞頻),即統計文本中各個詞的出現頻率,并作為文本特征。
- IDF,即“逆文本頻率”。一個詞語普遍重要性的度量。
1、TF(item frequency)
詞頻TF(item frequency):
某一給定詞語在該文本中出現次數。該數字通常會被歸一化(分子一般小于分母),以防止它偏向長的文件,因為不管該詞語重要與否,它在長文件中出現的次數很可能比在段文件中出現的次數更大。
TF(x)=M(x)MTF(x)=\frac{M(x)}{M}TF(x)=MM(x)?
其中,MMM 表示文章的總詞數,M(x)M(x)M(x) 表示詞xxx在文章中的出現次數。
2、逆向文件頻率IDF(inverse document frequency)
逆向文件頻率IDF(inverse document frequency):一個詞語普遍重要性的度量。
主要思想是:如果包含詞條 t 的文檔越少, IDF越大,則說明詞條具有很好的類別區分能力。某一特定詞語的IDF,可以由總文件數目除以包含該詞語之文件的數目,再將得到的商取對數得到。
對于 xxx 的IDF的基本公式如下:
IDF(x)=logNN(x)IDF(x)=log\frac{N}{N(x)}IDF(x)=logN(x)N?
其中,NNN代表語料庫中文本的總數,N(x)N(x)N(x)代表語料庫中包含詞xxx的文本總數。
為了避免特殊情況,對上式進行平滑處理,使得語料庫中沒有出現的詞也可以得到一個合適的IDF值。最常見的IDF平滑后的公式如下:
IDF(x)=logN+1N(x)+1+1IDF(x)=log\frac{N+1}{N(x)+1}+1IDF(x)=logN(x)+1N+1?+1
3、TF-IDF
TF?IDF(x)=TF(x)×IDF(x)TF-IDF(x)=TF(x)\times IDF(x)TF?IDF(x)=TF(x)×IDF(x)
二、TF-IDF實現
使用兩種方法實現TF-IDF:
- 第一種方法是在用 CountVectorizer類 向量化之后再調用 TfidfTransformer類 進行預處理。
- 第二種方法是直接用 TfidfVectorizer 完成向量化與TF-IDF預處理。
1、方法一
# -*- coding:utf-8 -*- from sklearn.feature_extraction.text import TfidfTransformer from sklearn.feature_extraction.text import CountVectorizercorpus = ["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)輸出的各個文本各個詞的TF-IDF值如下:
(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.28113162844050062、方法二
TfidfVectorizer()類
推薦使用:一步到位完成向量化,TF-IDF與標準化。
from sklearn.feature_extraction.text import TfidfVectorizercorpus = ["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"]tfidf2 = TfidfVectorizer() re = tfidf2.fit_transform(corpus) print(re)輸出的各個文本各個詞的TF-IDF值和第一種的輸出完全相同。
三、互信息原理
1、點互信息(PMI)
點互信息(Pointwise Mutual Information, PMI):用來衡量兩個事物之間的相關性(比如兩個詞)。點互信息PMI其實就是從信息論里面的互信息這個概念里面衍生出來的。
公式如下:
PMI(x;y)=logp(x,y)p(x)p(y)=logp(x∣y)p(x)=logp(y∣x)p(y)PMI(x;y)=log\frac{p(x,y)}{p(x)p(y)}=log\frac{p(x|y)}{p(x)}=log\frac{p(y|x)}{p(y)}PMI(x;y)=logp(x)p(y)p(x,y)?=logp(x)p(x∣y)?=logp(y)p(y∣x)?
若 xxx 與 yyy 不相關,則 p(x,y)=p(x)p(y)p(x,y)=p(x)p(y)p(x,y)=p(x)p(y)。兩者相關性越大,則 p(x,y)p(x,y)p(x,y) 就相比于 p(x)p(y)p(x)p(y)p(x)p(y) 越大。
例如:衡量 like 這個詞的極性(正向情感還是負向情感)==》預先挑選一些正向情感的詞,比如 good。然后計算 like 跟 good 的PMI。
2、互信息MI
互信息:衡量兩個隨機變量之間的相關性。即一個隨機變量中包含的關于另一個隨機變量的信息量。
可以看出,互信息其實就是對X和Y的所有可能的取值情況的點互信息PMI的加權和。
公式:
I(X;Y)=∑x∈X∑y∈Yp(x,y)logp(x,y)p(x)p(y)I(X;Y)=\sum_{x\in X}\sum_{y\in Y}p(x,y)log\frac{p(x,y)}{p(x)p(y)}I(X;Y)=x∈X∑?y∈Y∑?p(x,y)logp(x)p(y)p(x,y)?
四、對特征矩陣使用互信息進行特征篩選
1、sklearn.metrics.mutual_info_score
計算互信息
from sklearn import datasets from sklearn import metrics as mriris = datasets.load_iris() x = iris.data label = iris.target x0 = x[:, 0] x1 = x[:, 1] x2 = x[:, 2] x3 = x[:, 3]# 計算各特征與label的互信息 print(mr.mutual_info_score(x0, label)) print(mr.mutual_info_score(x1, label)) print(mr.mutual_info_score(x2, label)) print(mr.mutual_info_score(x3, label))輸出結果
0.6078468394475832 0.35810955263431954 1.002510220562348 0.99528853845000192、sklearn.feature_selection.mutual_info_classif
互信息計算
from sklearn import datasets from sklearn.feature_selection import mutual_info_classifiris = datasets.load_iris() x = iris.data label = iris.targetmutual_info = mutual_info_classif(x, label, discrete_features=False) print(mutual_info)輸出結果
[0.52034027 0.28205642 0.99381377 0.99660608]總結
以上是生活随笔為你收集整理的【NLP】Task3:特征选择的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【NLP实战】Task1 数据集探索
- 下一篇: 【LeetCode】687. 最长同值路