數(shù)據(jù)矢量化 - scikit-learn vectorizor使用詳解

在進(jìn)行機(jī)器學(xué)習(xí)的過程中我們經(jīng)常需要將數(shù)據(jù)矢量化,即生成某些特定的vector然后再進(jìn)行訓(xùn)練和計(jì)算。scikit-learn提供了很多vectorizor可以用來實(shí)現(xiàn)這個(gè)功能,尤其是針對(duì)TFIDF算法的相關(guān)應(yīng)用,我們可以很方便的使用scikit-learn的TfidfVectorizer來直接生成對(duì)應(yīng)的TFIDF矩陣,可以非常方便的進(jìn)行下一步數(shù)據(jù)處理。

TF-IDF

TF-IDF是為了提取一篇文章的關(guān)鍵字而誕生的算法,為了理解TF-IDF算法,先要理解如下的概念:

  • corpus:指所有文檔的集合,示例:
# 如下,一個(gè)corpus就是一個(gè)list,list中每一句話都可以認(rèn)為是一個(gè)簡(jiǎn)單的文檔
corpus = ["hi, you", "I'm so kind", "kiss me, baby"]
  • TF(term frequency):指某個(gè)詞在文章中出現(xiàn)的頻率
  • IDF(inverse document frequency):簡(jiǎn)單理解IDF就是某個(gè)詞在corpus中出現(xiàn)的概率越高,那么它的IDF值越低,比如"the", "a", "you", "me" 此類詞在所有文檔中都會(huì)有較高的頻率,所以其IDF值就會(huì)很低。

TF-IDF的公式如下圖,關(guān)鍵字i針對(duì)文章j的tf-idf值:


tfidf.jpeg
  • 簡(jiǎn)單理解下TF-IDF公式就是一個(gè)詞在這篇文章中出現(xiàn)的頻率越高,其作為關(guān)鍵字的可能性越大;另一方面,如果一個(gè)詞在所有文檔中都有較高的出現(xiàn)頻率,那么這個(gè)詞成為關(guān)鍵字的可能性就越小(如"the", "a"等)
  • tf有時(shí)也可以如下計(jì)算
    1 + log(tf)

TfidfVectorizer

基本用法

在scikit-learn中有專門的vectorizer用于將文本類數(shù)據(jù)進(jìn)行矢量化,其中TfidfVectorizer在矢量化的同時(shí)還可以計(jì)算文檔中各個(gè)詞語的tf-idf值,是非常實(shí)用的一個(gè)文本數(shù)據(jù)處理工具。先看代碼:

In [105]: from sklearn.feature_extraction.text import TfidfVectorizer

# 每個(gè)文檔都是list中一個(gè)item,我們也可以使用其它iterator,比如通過generator來進(jìn)行處理
In [106]: corpus = ["this artical is about scikit-learn vectorizor",
     ...:           "do you like it",
     ...:           "if you like it, please click favorite"]
     ...:

# TfidfVectorizer初始化的時(shí)候,可以有非常多的選項(xiàng),我們后邊再詳細(xì)講述,目前就用默認(rèn)參數(shù)
In [107]: vec = TfidfVectorizer()

# fit函數(shù)一般用于load數(shù)據(jù)集,此處fit還進(jìn)行了相關(guān)的分詞和編碼動(dòng)作
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_屬性我們可以看到生成的詞匯表以及每個(gè)單詞對(duì)應(yīng)的編碼(也可以認(rèn)為是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}

# 每個(gè)單詞對(duì)應(yīng)的tf-idf值,比如第0個(gè)item1.69314718表示'about'單詞對(duì)應(yīng)的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函數(shù)用于將corpus轉(zhuǎn)換成matrix,這樣的話每個(gè)文檔就對(duì)應(yīng)一個(gè)vector
# 至此,我們就已經(jīng)把我們的數(shù)據(jù)corpus轉(zhuǎn)化為了matrix(完成了矢量化)
In [112]: v = vec.transform(corpus)

In [113]: v.shape
Out[113]: (3, 15)

# 從此處可以看出,矢量化之后,其存儲(chǔ)的數(shù)值還是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參數(shù)詳解

  • input : string {‘filename’, ‘file’, ‘content’}
    當(dāng)input='filename'時(shí),fit函數(shù)接收的序列包含的是文件名,fit數(shù)據(jù)時(shí)會(huì)從文件名對(duì)應(yīng)的文件中讀取數(shù)據(jù)
    當(dāng)input='file'時(shí),序列中就是類文件句柄
    否則,序列中就是字符串或者bytes
  • analyzer : string, {‘word’, ‘char’} or callable
    當(dāng)analyzer='word'時(shí),按照單詞進(jìn)行切詞
    當(dāng)analyzer='char'時(shí),按照char進(jìn)行切分
    該參數(shù)通常結(jié)合ngram_range來一起使用,比如當(dāng)analyzer='word', ngram_range=(1, 2)時(shí),表示按照最少一個(gè)單詞,做多兩個(gè)單詞進(jìn)行切詞
  • ngram_range : tuple (min_n, max_n),解釋如上
  • stop_words : string {‘english’}, list, or None (default)
    表示可以忽略的詞,即會(huì)從最終的token列表中刪除
    當(dāng)為'english'時(shí),則為sklearn.feature_extraction.stop_words.ENGLISH_STOP_WORDS中定義的詞會(huì)被忽略
    如果為list,list中的單詞即為你要忽略的詞
  • token_pattern : string
    這里首先要理解token,token即最終成為我們的屬性(feature)的那個(gè)詞或者字符。token pattern實(shí)際是我們可以通過正則表達(dá)式來定義我們的token是什么樣子的。
  • max_df : float in range [0.0, 1.0] or int, default=1.0
    max document frequency, 即可以設(shè)定當(dāng)某個(gè)詞超過一個(gè)df(document frequency)的上限時(shí)就忽略該詞。當(dāng)為0~1的float時(shí)表示df的比例,當(dāng)為int時(shí)表示df數(shù)量
  • min_df : float in range [0.0, 1.0] or int, default=1
    min document frequency, 即可以設(shè)定當(dāng)某個(gè)詞低于一個(gè)df(document frequency)的下限時(shí)就忽略該詞
  • max_features : int or None, default=None
    最大feature數(shù)量,即最多取多少個(gè)關(guān)鍵詞,假設(shè)max_features=10, 就會(huì)根據(jù)整個(gè)corpus中的tf值,取top10的關(guān)鍵詞
  • norm : ‘l1’, ‘l2’ or None, optional
    是否針對(duì)數(shù)據(jù)做normalization,None表示不做normalization
  • use_idf : boolean, default=True
    是否使用idf,如果為False,則退化為簡(jiǎn)單的詞頻統(tǒng)計(jì)
  • sublinear_tf : boolean, default=False
    如果為True,則使用1 + log(tf)來代替tf

常用函數(shù)解釋

  • fit: 主要作用就是load數(shù)據(jù),并進(jìn)行相應(yīng)計(jì)算,如果是TfidfVectorizor就會(huì)去計(jì)算tf-idf的值
  • transform: 主要作用是將數(shù)據(jù)轉(zhuǎn)化為matrix形式
  • fit_transform: 將fit和transform兩個(gè)步驟放在一起
  • get_feature_names: 獲取所有features,即關(guān)鍵字列表

References:

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容