TF

您所在的位置:网站首页 cos12度等于多少 TF

TF

2023-05-17 12:09| 来源: 网络整理| 查看: 265

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 計算步驟

詞頻

\begin{aligned} TF=\text{某個詞在文章中的出現次數} \end{aligned} \\

考慮到每個樣本有長短之分,我們對“詞頻”進行一個標準化處理:

\begin{aligned} &TF=\frac{\text{某個詞在樣本中的出現次數}}{\text{該樣本的總詞數}}\\[1ex] &\text{或者}\\[1ex] &TF=\frac{\text{某個詞在樣本中的出現次數}}{\text{該樣本中出現最多詞的次數}} \end{aligned} \\

逆文件頻率

IDF=\log\left(\frac{\text{總樣本數}}{\text{包含有該詞的樣本數+1}}\right) \\

可以發現,如果

一個詞越常見,那麼分母就越大,逆文件頻率就越小越接近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

如:

0.02*\log\left(\frac{25000000000}{6230000000+1}\right)=0.02*0.603=0.0121 \\

從上表可見,“蜜蜂”的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

,這個工具可以根據得到的詞頻字典來生成對應的詞雲圖。

TF-IDF文字表示方法與詞雲圖

如圖所示便是根據一個宋詞資料集所畫出來的詞雲圖,字型越大表示該詞在整個資料集中的重要性越高。

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