[机器学习] TF-IDF算法
1.文本數(shù)據(jù)的向量化
1.1名詞解釋
CF:文檔集的頻率,是指詞在文檔集中出現(xiàn)的次數(shù)
DF:文檔頻率,是指出現(xiàn)詞的文檔數(shù)
IDF:逆文檔頻率,idf = log(N/(1+df)),N為所有文檔的數(shù)目,為了兼容df=0情況,將分母弄成1+df。
TF:詞在文檔中的頻率
TF-IDF:TF-IDF= TF*IDF
?
1.2 TF-IDF算法
TF-IDF(詞頻-逆文檔頻率)算法是一種統(tǒng)計(jì)方法,用以評估一字詞對于一個文件集或一個語料庫中的其中一份文件的重要程度。字詞的重要性隨著它在文件中出現(xiàn)的次數(shù)成正比增加,但同時會隨著它在語料庫中出現(xiàn)的頻率成反比下降。該算法在數(shù)據(jù)挖掘、文本處理和信息檢索等領(lǐng)域得到了廣泛的應(yīng)用,如從一篇文章中找到它的關(guān)鍵詞。
?
TF-IDF的主要思想是:如果某個詞或短語在一篇文章中出現(xiàn)的頻率TF高,并且在其他文章中很少出現(xiàn),則認(rèn)為此詞或者短語具有很好的類別區(qū)分能力,適合用來分類。TF-IDF實(shí)際上就是 TF*IDF,其中 TF(Term Frequency),表示詞條在文章Document 中出現(xiàn)的頻率;IDF(Inverse Document Frequency),其主要思想就是,如果包含某個詞 Word的文檔越少,則這個詞的區(qū)分度就越大,也就是 IDF 越大。對于如何獲取一篇文章的關(guān)鍵詞,我們可以計(jì)算這邊文章出現(xiàn)的所有名詞的 TF-IDF,TF-IDF越大,則說明這個名詞對這篇文章的區(qū)分度就越高,取 TF-IDF 值較大的幾個詞,就可以當(dāng)做這篇文章的關(guān)鍵詞。
?
由此可見,當(dāng)一個詞被越多的文檔包含,則IDF值就越小,也就是所這個詞很常見,不是最重要的能區(qū)分文章特性的關(guān)鍵詞。
這樣,某個詞條的TF-IDF的值為 ,即某一個文件中高頻出現(xiàn)的詞條,以及該詞條在整個語料庫文件中低頻出現(xiàn)的現(xiàn)象,就可以產(chǎn)生高權(quán)重的TF-IDF,因此,TF-IDF傾向過濾掉常見的詞語,保留重要的詞語。即:字詞的重要性隨著它在文件中出現(xiàn)的次數(shù)成正比增加,但同時會隨著它在語料庫中出現(xiàn)的頻率成反比下降。
?
優(yōu)缺點(diǎn)
?1. 優(yōu)點(diǎn)是算法的容易理解,便于實(shí)現(xiàn)。
?2.缺點(diǎn):IDF的簡單結(jié)構(gòu)并不能有效地反映單詞的重要程度和特征詞的分布情況,使其無法很好的完成對權(quán)值的調(diào)整功能,所以在一定程度上該算法的精度并不是很高。除此之外,算法也沒喲體現(xiàn)位置信息,對于出現(xiàn)在文章不同位置的詞語都是一視同仁的,而我們知道,在文章首尾的詞語勢必重要性要相對高點(diǎn)。據(jù)此,我們可以或許也可以將處于文章不同位置的詞語賦予不同的權(quán)重。
?
1.3 文本數(shù)據(jù)樣本集
為了講解文本數(shù)據(jù)的向量化,假設(shè)我們有4個文本,所有文本一共有6個不同的詞,如下所示。
?
?
1.4 使用Sklearn提供的TF-IDF方法
?
import jieba import pandas as pd from sklearn.feature_extraction.text import CountVectorizer from sklearn.feature_extraction.text import TfidfTransformerarr = ['第一天我參觀了美術(shù)館', '第二天我參觀了博物館', '第三天我參觀了動物園',]arr = [' '.join(jieba.lcut(i)) for i in arr] # 分詞 print(arr) # 返回結(jié)果: # ['第一天 我 參觀 了 美術(shù)館', '第二天 我 參觀 了 博物館', '第三天 我 參觀 了 動物園']vectorizer = CountVectorizer() X = vectorizer.fit_transform(arr) word = vectorizer.get_feature_names() df = pd.DataFrame(X.toarray(), columns=word) print(df) # 返回結(jié)果: # 動物園 博物館 參觀 第一天 第三天 第二天 美術(shù)館 # 0 0 1 1 0 0 1 # 0 1 1 0 0 1 0 # 1 0 1 0 1 0 0transformer = TfidfTransformer() tfidf = transformer.fit_transform(X) weight = tfidf.toarray() for i in range(len(weight)): # 訪問每一句print("第{}句:".format(i))for j in range(len(word)): # 訪問每個詞if weight[i][j] > 0.05: # 只顯示重要關(guān)鍵字print(word[j],round(weight[i][j],2)) # 保留兩位小數(shù) # 返回結(jié)果 # 第0句:美術(shù)館 0.65 參觀 0.39 第一天 0.65 # 第1句:博物館 0.65 參觀 0.39 第二天 0.65 # 第2句:動物園 0.65 參觀 0.39 第三天 0.65經(jīng)過對數(shù)據(jù)X的計(jì)算之后,返回了權(quán)重矩陣,句中的每個詞都只在該句中出現(xiàn)了一次,因此其TF值相等,由于“參觀”在三句中都出現(xiàn)了,其IDF較其它關(guān)鍵字更低。Sklearn除了實(shí)現(xiàn)基本的TF-IDF算法外,還其行了歸一化、平滑等一系列優(yōu)化操作。詳細(xì)操作可參見Sklearn源碼中的sklearn/feature_extraction/text.py具體實(shí)現(xiàn)。
?
1.5 TF-IDF的使用場景
在做特征工程時,常遇到這樣的問題:從一個短語或短句中提取關(guān)鍵字構(gòu)造新特征,然后將新特征代入分類或者回歸模型,是否需要使用TF-IDF方法?首先,TF是詞頻,即它需要在一個文本中出現(xiàn)多次才有意義,如果在短句中,每個詞最多只出現(xiàn)一次,那么計(jì)算TF不如直接判斷其是否存在。
另外,TF-IDF的結(jié)果展示的是某一詞針對于它所在文檔的重要性,而不是對比兩文檔的差異。比如上例中雖然三個短句都包含“參觀”,IDF較小,由于詞量小TF較大,其最終得分TF-IDF仍然不太低。如果兩個短語屬于不同類別,新特征對于提取分類特征可能沒有意義,但是對于生成文摘就是有意義的關(guān)鍵字。對于此類問題,建議使用:先切分出關(guān)鍵詞,將是否包含該關(guān)鍵詞作為新特征,然后對新特征和目標(biāo)變量做假設(shè)檢驗(yàn),以判斷是否保留該變量的方法提取新特征。
?
總結(jié)
以上是生活随笔為你收集整理的[机器学习] TF-IDF算法的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: [kubernetes] 资源管理 -
- 下一篇: 我的世界手机版怎么附魔武器(汉典我字的基