TF |
您所在的位置:网站首页 › cos12度等于多少 › TF |
TF-IDF文字表示方法與詞雲圖作者:由 月來客棧 發表于 農業時間:2020-05-22 在 前面的一篇文章 中,我們介紹了兩種基本的用於文字表示的詞袋模型表示方法,兩者之間的唯一區別就是一個考慮的詞頻而另外一個沒有。下面我們再介紹另外一種應用更為常見和廣泛的詞袋模型表示方式——TFIDF表示方法。之所以陸續的會出現不同的向量化表示形式,其最終目的都只有一個,即儘可能準確的對原始文字進行表示。 1 TF-IDF TF-IDF為 詞頻-逆文件頻率(term frequence - inverse document frequence) 的簡稱。首先需要明白的是TF-IDF實際上是TF與IDF兩者的乘積。之所以出現TF-IDF的原因在於,通常來說在一個樣本中一次詞出現的頻率越高,其重要性應該對應越高,即考慮到詞頻對文字向量的影響;但是如果僅僅只是考慮到這一個因素則同樣會帶來一個新的弊端,即有的詞不只是在某個樣本中出現的頻率高,其實它在整個資料集中的出現頻率都很高,而這樣的詞往往也是沒有意義的。因此,TF-IDF的做法是透過詞的逆文件頻率來加以修正調整。 1.1 計算步驟 詞頻 考慮到每個樣本有長短之分,我們對“詞頻”進行一個標準化處理: 逆文件頻率 可以發現,如果 一個詞越常見,那麼分母就越大,逆文件頻率就越小越接近0 。分母之所以要加1,是為了避免分母為0(即所有文件都不包含該詞)的平滑處理。log表示對得到的值取對數(此處為自然對數)。 然後將計算得到的TF乘以IDF便得到了一個詞的TF-IDF權重值。接著,對於資料集中的每個詞都進行計算對應的TF-IDF值,最後將所有的值組合成一個矩陣。 注:如果這個詞沒有出現在詞表中,那麼其對應的TF-IDF則為0 1.2 計算示例 假定某訓練文字長度為1000個詞,“中國”、“蜜蜂”、“養殖”各出現20次,則這三個詞的“詞頻”(TF)都為0。02。然後,搜尋Google發現,包含“的”字的網頁共有250億張,假定這就是中文網頁總數(即總樣本數)。包含“中國”的網頁共有62。3億張,包含“蜜蜂”的網頁為0。484億張,包含“養殖”的網頁為0。973億張。則它們的逆文件頻率(IDF)和TF-IDF如下: 包含該詞的文件數(億)TFIDFTF-IDF 中國62。30。020。6030。0121蜜蜂0。4840。022。7130。0543養殖0。9730。022。4100。0482 如: 從上表可見,“蜜蜂”的TF-IDF值最高,“養殖”其次,“中國”最低。所以,如果只選擇一個詞,“蜜蜂”就是這篇文章的關鍵詞。 2 實現 上面我們已經介紹完了TF-IDF的計算原理,下面我們再透過sklearn中實現的 TfidfVectorizer 類方法來做一個具體的文字處理示例。 from sklearn。feature_extraction。text import TfidfVectorizer s = [‘文字 分詞 工具 可 用於 對 文字 進行 分詞 處理’, ‘常見 的 用於 處理 文字 的 分詞 處理 工具 有 很多’] tfidf = TfidfVectorizer(stop_words=None, token_pattern=r“(?u)\b\w\w+\b”, max_features=6) weight = tfidf。fit_transform(s)。toarray() word = tfidf。get_feature_names() print(‘vocabulary list:\n’) vocab = tfidf。vocabulary_。items() vocab = sorted(vocab, key=lambda x: x[1]) print(vocab) print(‘IFIDF詞頻矩陣:’) print(weight) for i in range(len(weight)): # 列印每類文字的tf-idf詞語權重,第一個for遍歷所有文字, # 第二個for便利某一類文字下的詞語權重 print(u“————-這裡輸出第”, i, u“類文字的詞語tf-idf權重————”) for j in range(len(word)): print(word[j], weight[i][j]) # 第i個文字中,第j個次的tfidf值 關於 TfidfVectorizer 的使用有幾點注意: (1)引數 stopword=[‘用於’,‘文字’] 為自定義一個停用詞表。如果不指定停用詞表,則預設將所有單個漢字視為停用詞,即透過設定引數 token_pattern=r“(?u)\b\w\w+\b” 來進行控制。 (2)可以設 token_pattern=r“(?u)\b\w+\b” ,即不考慮停用詞,將所有的詞都加入到詞表中。 (3)引數 max_features=k 用來選擇出現頻率最高的前k個詞作為詞表。 結果: vocabulary list : [( ‘分詞’ , 0 ), ( ‘處理’ , 1 ), ( ‘工具’ , 2 ), ( ‘常見’ , 3 ), ( ‘文字’ , 4 ), ( ‘用於’ , 5 )] IFIDF詞頻矩陣 : [[ 0。60302269 0。30151134 0。30151134 0。 0。60302269 0。30151134 ] [ 0。31661852 0。63323704 0。31661852 0。44499628 0。31661852 0。31661852 ]] ————- 這裡輸出第 0 個文字的詞語tf - idf權重 ———— 分詞 0。6030226891555273 處理 0。30151134457776363 工具 0。30151134457776363 常見 0。0 文字 0。6030226891555273 用於 0。30151134457776363 ————- 這裡輸出第 1 個文字的詞語tf - idf權重 ———— 分詞 0。3166185217347375 處理 0。633237043469475 工具 0。3166185217347375 常見 0。44499628487896004 文字 0。3166185217347375 用於 0。3166185217347375 待處理得到TF-IDF詞頻矩陣後,我們就能將其輸入到其他模型中,進行下一步的分類或者回歸任務中。 3 詞雲圖 在這裡順便在介紹一個好玩的工具包 word cloud ,這個工具可以根據得到的詞頻字典來生成對應的詞雲圖。 如圖所示便是根據一個宋詞資料集所畫出來的詞雲圖,字型越大表示該詞在整個資料集中的重要性越高。 3.1 詞雲圖生成 透過 word cloud 這個工具包,上面的詞雲圖透過簡單的幾行程式碼就能實現: def show_word_cloud(word_fre): word_cloud = WordCloud(font_path=‘。/data/simhei。ttf’, background_color=‘white’, max_font_size=70) word_cloud。fit_words(word_fre) plt。imshow(word_cloud) plt。xticks([])#去掉橫座標 plt。yticks([])#去掉縱座標 plt。show() 其中 font_path 表示指定字型路徑,如果是英文的就就可以不用指定; word_fre 為一個字典,而畫詞雲圖的關鍵就是得到這個字典。字典的形式為 {‘word’:weight} ,其中 weight 既可以是詞頻(如透過分詞後統計每個詞的詞頻),也可以是詞語對應的權重值(如透過TFIDF計算得到每個詞的權重)。 3.2 計算詞頻 由於本篇文章介紹的是TFIDF,所以這裡我們以TFIDF為例來計算得到生成詞雲圖所需要的字典。如下程式碼所示,我們只需要將前面的程式碼略微修改,就能得到這個字典: def get_tf_idf_rank(top_k_words=500, file_path=None): x = load_data_and_cut(file_path=file_path) tfidf = TfidfVectorizer(max_features=top_k_words) # 預設值 weight = tfidf。fit_transform(x)。toarray() word = tfidf。get_feature_names() word_fre = {} for i in range(len(weight)): for j in range(len(word)): if word[j] not in word_fre: word_fre[word[j]] = weight[i][j] else: word_fre[word[j]] = max(word_fre[word[j]], weight[i][j]) return word_fre 在返回得到這個字典 word_fre 後,便可以透過上面的程式碼來畫出詞雲圖。 4 總結 在本篇文章中,我們首先介紹了什麼是TF-IDF以及為什麼我們要用TF-IDF這種詞袋模型;接著我們詳細介紹了TF-IDF的計算過程,並以一個例項進行了演算;最後介紹了sklearn中TF-IDF模組的用法。本次內容就到此結束,感謝閱讀! 若有任何疑問與見解,請發郵件至[email protected]。com並附上文章連結,青山不改,綠水長流,月來客棧見! 引用 [1]示例程式碼 : https:// github。com/moon-hotel/M achineLearningWithMe 交流群:883638095 標簽: word IDF tf 詞頻 文字上一篇:早上起來就比晚上瘦0.1,這是新陳代謝慢了嘛? 下一篇:這是表白的意思嗎? |
今日新闻 |
推荐新闻 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |