特征工程·TFIDF提取特征


本文介紹文本處理時比較常用且有效的tfidf特征提取方法

 

1. 提取tf特征

TF即是詞頻(Term Frequency)是文本信息量統計方法之一,簡單來說就是統計此文本中每個詞的出現頻率

def computeTF(wordDict, bow): tfDict = {} bowCount = len(bow) for word, count in wordDict.items(): tfDict[word] = count / float(bowCount) return tfDict
  • 傳入參數wordDict是包含字詞及其出現頻次的字典,bow是包含所有字詞的列表

2. 提取IDF特征

idf即逆向文檔頻率(Inverse Document Frequency),用來衡量一個詞的普遍重要性,一般通過文檔總數/包含該詞匯的文檔數,再取對數得到的值

def computeIDF(docList): import math idfDict = {} N = len(docList) idfDict = dict.fromkeys(docList[0].keys(), 0) for doc in docList: for word, val in doc.items(): if word in idfDict: if val > 0: idfDict[word] += 1
            else: if val > 0: idfDict[word] = 1

    for word, val in idfDict.items(): idfDict[word] = math.log10(N / float(val)) return idfDict

 

  • 傳入的參數為包含多個字詞字典的列表,字典的鍵為單詞,值就是含有該次的文檔數

3. 提取TF-IDF特征

tf-idf即是tf * idf所得到的值,可以衡量某個詞在所有文檔中的信息量。假設有n個詞的文檔A,某個詞的出現次數為t,且該詞在w份文檔中出現過,總共有x份文件

  • 則tf = t / n,tf越大則說明該次在文檔中的信息量越大
  • 而idf = log(x / w),idf越小則說明該詞在所有文檔中就越普遍不具有區分度
  • 而tf-idf = (t / n) * (log(x / w)), w的值越小tf-idf的值反而越大則說明該詞在文檔中的信息量越大,更具有區分度
def computeTFIDF(tfBow, idfs):
    tfidf = {}
    for word, val in tfBow.items():
        tfidf[word] = val * idfs[word]
    return tfidf
  • 傳入的參數為之前計算得到的包含tf和idf值的字典

4. 直接調用sklearn庫的api生成TF-IDF詞向量

from sklearn.feature_extraction.text import TfidfVectorizer
count_vec = TfidfVectorizer(binary=False, decode_error='ignore', stop_words='english')

 

  • 設定參數獲得tfidf向量化實例count_vec,binary參數若為真表示將所有頻次非0的tfidf值設置為1(而非輸出設置為二元)

傳入數據進行擬合然后轉化為詞向量的形式

s1 = 'I love you so much'
s2 = 'I hate you! shit!'
s3 = 'I like you, but just like you'
response = count_vec.fit_transform([s1, s2, s3]) # s must be string
print(count_vec.get_feature_names())
print(response.toarray())

 

輸出去掉英文停用詞后的結果如下

[‘shit’, ‘hate’, ‘just’, ‘like’, ‘love’]
[[0. 0. 0. 0. 1. ]
[0.70710678 0.70710678 0. 0. 0. ]
[0. 0. 0.4472136 0.89442719 0. ]]

    • 第1列為特征名即單詞,后3列分別為單詞在每個文本中的tfidf值
    • 此外在我們進行模型訓練訓練時,對訓練集數據使用fit_transform方法,對測試集直接使用transform即可以訓練集的特征為基准轉化詞向量


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM