簡體   English   中英

scikit學習中的TD / IDF

[英]TD/IDF in scikit-learn

關於如何使用TfidfTransformer( http://scikit-learn.org/stable/modules/feature_extraction.html )為語料庫的n-gram生成TF / IDF,是否有完整的Python 2.7示例? 環顧scikit學習頁面,它只有代碼片段(不完整的示例)。

問候,林

對於TF-IDF特征提取,scikit-learn具有2個類TfidfTransformerTfidfVectorizer 這兩個類實質上具有相同的目的,但應以不同的方式使用。 對於文本特征提取,scikit-learn具有TransformersVectorizers的概念。 矢量化程序直接處理原始文本以生成要素,而“變形器”處理現有要素並將其轉換為新要素。 因此,以此類推, TfidfTransformer使用現有的Term-Frequency功能並將其轉換為TF-IDF功能,而TfidfVectorizer將原始文本作為輸入並直接生成TF-IDF功能。 如果在構建功能部件時沒有現有的文檔術語矩陣,則應始終使用TfidfVectorizer 在黑匣子級別,您應該將TfidfVectorizer視為CountVectorizer再加上TfidfTransformer

現在Tfidfectorizer的工作示例。 請注意,如果這個例子很清楚,那么您將毫無困難地理解為TfidfTransformer給出的TfidfTransformer

現在考慮您的語料庫中有以下4個文檔:

text = [
        'jack and jill went up the hill',
        'to fetch a pail of water',
        'jack fell down and broke his crown',
        'and jill came tumbling after'
       ]

只要迭代字符串,就可以使用任何iterable TfidfVectorizer還支持從文件中讀取文本,他們在文檔中對此進行了詳細討論。 現在,在最簡單的情況下,我們可以初始化TfidfVectorizer對象並將其訓練數據擬合到該對象。 這樣做如下:

tfidf = TfidfVectorizer()
train_features = tfidf.fit_transform(text)
train_features.shape

此代碼僅使Vectorizer fits我們的輸入數據,並生成尺寸為4 x 20的稀疏矩陣。 因此,它將給定文本中的每個文檔轉換為20特征的向量,其中詞匯量為20

對於TfidfVectorizer ,當我們說fit the model ,意味着TfidfVectorizer從語料庫中學習IDF權重。 “轉換數據”是指使用擬合的模型(學習IDF權重)將文檔轉換為TF-IDF向量。 該術語是整個scikit學習的標准。 在分類問題的情況下,它非常有用。 考慮是否要基於某些標記的訓練數據(使用TF-IDF向量作為特征)將文檔分類為肯定的還是否定的。 在這種情況下,您將使用訓練數據構建TF-IDF矢量化器,並且當您看到新的測試文檔時,只需使用已經安裝的 TfidfVectorizer對其進行TfidfVectorizer

因此,如果我們有以下test_txt

test_text = [
        'jack fetch water',
        'jill fell down the hill'
       ]

我們可以通過簡單地構建測試功能

test_data = tfidf.transform(test_text)

這將再次為我們提供2 x 20的稀疏矩陣。 在這種情況下使用的IDF權重是從訓練數據中學到的權重。

這就是簡單的TfidfVectorizer工作方式。 您可以通過在構造函數中傳遞更多參數來使其更加復雜。 這些在Scikit-Learn文檔中有很好的記錄。 我經常使用的一些參數是:

  • ngram_range這使我們可以使用n克令牌構建TF-IDF向量。 例如,如果我通過(1,2) ,則將同時生成unigram和bigrams。
  • stop_words允許我們分別提供停用詞以在此過程中忽略。 過濾掉幾乎所有文檔中的“ the”,“ of”等單詞是一種常見的做法。
  • min_dfmax_df這使我們能夠根據文檔頻率來動態過濾詞匯表。 例如,通過將max_df0.7 ,我可以讓我的應用程序自動刪除特定於域的停用詞。 例如,在醫學期刊中, 疾病一詞可以被視為停用詞。

除此之外,您還可以參考我為項目編寫的示例代碼 盡管沒有很好的文檔說明,但是函數的命名非常好。

希望這可以幫助!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM