在進行機器學習的過程中我們經常需要將數據矢量化,即生成某些特定的vector然後再進行訓練和計算。scikit-learn提供了很多vectorizor可以用來實現這個功能,尤其是針對TFIDF算法的相關應用,我們可以很方便的使用scikit-learn的* TfidfVectorizer*來直接生成對應的TFIDF矩陣,可以非常方便的進行下一步數據處理。
TF-IDF
TF-IDF是爲了提取一篇文章的關鍵字而誕生的算法,爲了理解TF-IDF算法,先要理解如下的概念:
- corpus:指所有文檔的集合,示例:
# 如下,一個corpus就是一個list,list中每一句話都可以認爲是一個簡單的文檔
corpus = ["hi, you", "I'm so kind", "kiss me, baby"]
- TF(term frequency):指某個詞在文章中出現的頻率
- IDF(inverse document frequency):簡單理解IDF就是某個詞在corpus中出現的概率越高,那麼它的IDF值越低,比如"the", "a", "you", "me" 此類詞在所有文檔中都會有較高的頻率,所以其IDF值就會很低。
TF-IDF的公式如下圖,關鍵字i針對文章j的tf-idf值:
- 簡單理解下TF-IDF公式就是一個詞在這篇文章中出現的頻率越高,其作爲關鍵字的可能性越大;另一方面,如果一個詞在所有文檔中都有較高的出現頻率,那麼這個詞成爲關鍵字的可能性就越小(如"the", "a"等)
- tf有時也可以如下計算
1 + log(tf)
TfidfVectorizer
基本用法
在scikit-learn中有專門的vectorizer用於將文本類數據進行矢量化,其中TfidfVectorizer
在矢量化的同時還可以計算文檔中各個詞語的tf-idf值,是非常實用的一個文本數據處理工具。先看代碼:
In [105]: from sklearn.feature_extraction.text import TfidfVectorizer
# 每個文檔都是list中一個item,我們也可以使用其它iterator,比如通過generator來進行處理
In [106]: corpus = ["this artical is about scikit-learn vectorizor",
...: "do you like it",
...: "if you like it, please click favorite"]
...:
# TfidfVectorizer初始化的時候,可以有非常多的選項,我們後邊再詳細講述,目前就用默認參數
In [107]: vec = TfidfVectorizer()
# fit函數一般用於load數據集,此處fit還進行了相關的分詞和編碼動作
In [108]: vec.fit(corpus)
Out[108]:
TfidfVectorizer(analyzer='word', binary=False, decode_error='strict',
dtype=<class 'numpy.int64'>, encoding='utf-8', input='content',
lowercase=True, max_df=1.0, max_features=None, min_df=1,
ngram_range=(1, 1), norm='l2', preprocessor=None, smooth_idf=True,
stop_words=None, strip_accents=None, sublinear_tf=False,
token_pattern='(?u)\\b\\w\\w+\\b', tokenizer=None, use_idf=True,
vocabulary=None)
# 通過vocabulary_屬性我們可以看到生成的詞彙表以及每個單詞對應的編碼(也可以認爲是index)
In [110]: vec.vocabulary_
Out[110]:
{'about': 0,
'artical': 1,
'click': 2,
'do': 3,
'favorite': 4,
'if': 5,
'is': 6,
'it': 7,
'learn': 8,
'like': 9,
'please': 10,
'scikit': 11,
'this': 12,
'vectorizor': 13,
'you': 14}
# 每個單詞對應的tf-idf值,比如第0個item1.69314718表示'about'單詞對應的tf-idf值
In [111]: vec.idf_
Out[111]:
array([1.69314718, 1.69314718, 1.69314718, 1.69314718, 1.69314718,
1.69314718, 1.69314718, 1.28768207, 1.69314718, 1.28768207,
1.69314718, 1.69314718, 1.69314718, 1.69314718, 1.28768207])
# transform函數用於將corpus轉換成matrix,這樣的話每個文檔就對應一個vector
# 至此,我們就已經把我們的數據corpus轉化爲了matrix(完成了矢量化)
In [112]: v = vec.transform(corpus)
In [113]: v.shape
Out[113]: (3, 15)
# 從此處可以看出,矢量化之後,其存儲的數值還是tf-idf值
In [114]: v.toarray()
Out[114]:
array([[0.37796447, 0.37796447, 0. , 0. , 0. ,
0. , 0.37796447, 0. , 0.37796447, 0. ,
0. , 0.37796447, 0.37796447, 0.37796447, 0. ],
[0. , 0. , 0. , 0.60465213, 0. ,
0. , 0. , 0.45985353, 0. , 0.45985353,
0. , 0. , 0. , 0. , 0.45985353],
[0. , 0. , 0.41756662, 0. , 0.41756662,
0.41756662, 0. , 0.31757018, 0. , 0.31757018,
0.41756662, 0. , 0. , 0. , 0.31757018]])
TfidfVectorizer參數詳解
- input : string {‘filename’, ‘file’, ‘content’}
當input='filename'時,fit函數接收的序列包含的是文件名,fit數據時會從文件名對應的文件中讀取數據
當input='file'時,序列中就是類文件句柄
否則,序列中就是字符串或者bytes - analyzer : string, {‘word’, ‘char’} or callable
當analyzer='word'時,按照單詞進行切詞
當analyzer='char'時,按照char進行切分
該參數通常結合ngram_range來一起使用,比如當analyzer='word', ngram_range=(1, 2)時,表示按照最少一個單詞,做多兩個單詞進行切詞 - ngram_range : tuple (min_n, max_n),解釋如上
- stop_words : string {‘english’}, list, or None (default)
表示可以忽略的詞,即會從最終的token列表中刪除
當爲'english'時,則爲sklearn.feature_extraction.stop_words.ENGLISH_STOP_WORDS
中定義的詞會被忽略
如果爲list,list中的單詞即爲你要忽略的詞 - token_pattern : string
這裏首先要理解token,token即最終成爲我們的屬性(feature)的那個詞或者字符。token pattern實際是我們可以通過正則表達式來定義我們的token是什麼樣子的。 - max_df : float in range [0.0, 1.0] or int, default=1.0
max document frequency, 即可以設定當某個詞超過一個df(document frequency)的上限時就忽略該詞。當爲0~1的float時表示df的比例,當爲int時表示df數量 - min_df : float in range [0.0, 1.0] or int, default=1
min document frequency, 即可以設定當某個詞低於一個df(document frequency)的下限時就忽略該詞
-max_features : int or None, default=None
最大feature數量,即最多取多少個關鍵詞,假設max_features=10, 就會根據整個corpus中的tf值,取top10的關鍵詞 - norm : ‘l1’, ‘l2’ or None, optional
是否針對數據做normalization,None表示不做normalization - use_idf : boolean, default=True
是否使用idf,如果爲False,則退化爲簡單的詞頻統計 - sublinear_tf : boolean, default=False
如果爲True,則使用1 + log(tf)
來代替tf
常用函數解釋
-
fit
: 主要作用就是load數據,並進行相應計算,如果是TfidfVectorizor就會去計算tf-idf的值 -
transform
: 主要作用是將數據轉化爲matrix形式 -
fit_transform
: 將fit和transform兩個步驟放在一起 -
get_feature_names
: 獲取所有features,即關鍵字列表