????????
目錄
一、原理
二、實戰(zhàn)
sklearn中提供的文本處理方法
1、導(dǎo)包
?2、初始化詞頻向量/tf_idf的訓(xùn)練參數(shù)
3、CountVectorizer訓(xùn)練及應(yīng)用函數(shù)
4、CountVectorizer使用
5、TfidfTransformer訓(xùn)練及應(yīng)用函數(shù)
6、TfidfTransformer訓(xùn)練及應(yīng)用函數(shù)
三、劃重點
少走10年彎路
????????tf-idf作為文體特征提取的常用統(tǒng)計方法之一,適合用于文本分類任務(wù),本文從原理、參數(shù)詳解及實戰(zhàn)全方位詳解tf-idf,掌握本篇即可輕松上手并用于文本數(shù)據(jù)分類。
一、原理
????????tf 表示詞頻(某單詞在某文本中的出現(xiàn)次數(shù)/該文本中所有詞的詞數(shù)),idf表示逆文本頻率(語料庫中包含某單詞的文本數(shù)、的倒數(shù)、取log),tf-idf則表示詞頻?*?逆文檔頻率,tf-idf認為詞的重要性隨著它在文本中出現(xiàn)的次數(shù)成正比增加,但同時會隨著它在整個語料庫中出現(xiàn)的頻率成反比下降。
????????idf表達式如下,其中k為包含某詞的文本數(shù),n為整個語料庫的文本數(shù)
?
????????對idf進行平滑、避免出現(xiàn)極大/極小值(smooth_idf=True)
二、實戰(zhàn)
sklearn中提供的文本處理方法
(1)CountVectorizer:?將文本文檔集合轉(zhuǎn)換為詞頻/字符頻數(shù)矩陣,在單個類中實現(xiàn)了 tokenization (字符級+詞級分詞)、n-grams、剔除停用詞、篩選高頻詞和 occurrence counting (頻數(shù)統(tǒng)計)
(2)TfidfTransformer:將詞頻/字符頻數(shù)矩陣轉(zhuǎn)換為標準化的 tf 或 tf-idf 矩陣,Tf 表示詞頻、而 tf-idf 表示詞頻乘以逆文檔頻率,常用于文本分類。
(3)TfidfVectorizer:直接將原始文檔集合轉(zhuǎn)換為tf-idf 特征矩陣,將?CountVectorizer?和TfidfTransformer的所有功能組合在一個模型中。
實際應(yīng)用結(jié)果如下圖(1-grams + 2-grams):
本文通過使用例子實戰(zhàn),展示這幾類的使用方法及功能,以及詳細的參數(shù)解釋、方便不同需求下自行使用。
1、導(dǎo)包
import warnings
warnings.filterwarnings('ignore')
import numpy as np
import pandas as pd
from sklearn.feature_extraction.text import CountVectorizer,TfidfTransformer,TfidfVectorizer
?2、初始化詞頻向量/tf_idf的訓(xùn)練參數(shù)
????????由于存在功能組合的問題,TfidfVectorizer參數(shù)=CountVectorizer參數(shù)+TfidfTransformer參數(shù),因此初始化參數(shù)函數(shù)將三部分參數(shù)匯總,通過設(shè)置傳參label、用于確定所需要返回的參數(shù)字典。
def init_params(label='TfidfVectorizer'):
params_count={
'analyzer': 'word', # 取值'word'-分詞結(jié)果為詞級、'char'-字符級(結(jié)果會出現(xiàn)he is,空格在中間的情況)、'char_wb'-字符級(以單詞為邊界),默認值為'word'
'binary': False, # boolean類型,設(shè)置為True,則所有非零計數(shù)都設(shè)置為1.(即,tf的值只有0和1,表示出現(xiàn)和不出現(xiàn))
'decode_error': 'strict',
'dtype': np.float64, # 輸出矩陣的數(shù)值類型
'encoding': 'utf-8',
'input': 'content', # 取值filename,文本內(nèi)容所在的文件名;file,序列項必須有一個'read'方法,被調(diào)用來獲取內(nèi)存中的字節(jié);content,直接輸入文本字符串
'lowercase': True, # boolean類型,計算之前是否將所有字符轉(zhuǎn)換為小寫。
'max_df': 1.0, # 詞匯表中忽略文檔頻率高于該值的詞;取值在[0,1]之間的小數(shù)時表示文檔頻率的閾值,取值為整數(shù)時(>1)表示文檔頻數(shù)的閾值;如果設(shè)置了vocabulary,則忽略此參數(shù)。
'min_df': 1, # 詞匯表中忽略文檔頻率低于該值的詞;取值在[0,1]之間的小數(shù)時表示文檔頻率的閾值,取值為整數(shù)時(>1)表示文檔頻數(shù)的閾值;如果設(shè)置了vocabulary,則忽略此參數(shù)。
'max_features': None, # int或 None(默認值).設(shè)置int值時建立一個詞匯表,僅用詞頻排序的前max_features個詞創(chuàng)建語料庫;如果設(shè)置了vocabulary,則忽略此參數(shù)。
'ngram_range': (1, 2), # 要提取的n-grams中n值范圍的下限和上限,min_n <= n <= max_n。
'preprocessor': None, # 覆蓋預(yù)處理(字符串轉(zhuǎn)換)階段,同時保留標記化和 n-gram 生成步驟。僅適用于analyzer不可調(diào)用的情況。
'stop_words': 'english', # 僅適用于analyzer='word'。取值english,使用內(nèi)置的英語停用詞表;list,自行設(shè)置停停用詞列表;默認值None,不會處理停用詞
'strip_accents': None,
'token_pattern': '(?u)\\b\\w\\w+\\b', # 分詞方式、正則表達式,默認篩選長度>=2的字母和數(shù)字混合字符(標點符號被當(dāng)作分隔符)。僅在analyzer='word'時使用。
'tokenizer': None, # 覆蓋字符串標記化步驟,同時保留預(yù)處理和 n-gram 生成步驟。僅適用于analyzer='word'
'vocabulary': None, # 自行設(shè)置詞匯表(可設(shè)置字典),如果沒有給出,則從輸入文件/文本中確定詞匯表
}
params_tfidf={
'norm': None, # 輸出結(jié)果是否標準化/歸一化。l2:向量元素的平方和為1,當(dāng)應(yīng)用l2范數(shù)時,兩個向量之間的余弦相似度是它們的點積;l1:向量元素的絕對值之和為1
'smooth_idf': True, # 在文檔頻率上加1來平滑 idf ,避免分母為0
'sublinear_tf': False, # 應(yīng)用次線性 tf 縮放,即將 tf 替換為 1 + log(tf)
'use_idf': True, # 是否計算idf,布爾值,F(xiàn)alse時idf=1。
}
if label=='CountVectorizer':
return params_count
elif label=='TfidfTransformer':
return params_tfidf
elif label=='TfidfVectorizer':
params_count.update(params_tfidf)
return params_count
3、CountVectorizer訓(xùn)練及應(yīng)用函數(shù)
def CountVectorizer_train(train_data,params):
cv = CountVectorizer(**params)
# 輸入訓(xùn)練集矩陣,每行表示一個文本
# 訓(xùn)練,構(gòu)建詞匯表以及詞項idf值,并將輸入文本列表轉(zhuǎn)成VSM矩陣形式
cv_fit = cv.fit_transform(train_data)
return cv
def CountVectorizer_apply(model):
print('詞匯表')
print(model.vocabulary_)
print('------------------------------')
print('特證名/詞匯列表')
print(model.get_feature_names())
print('------------------------------')
print('idf_列表')
print(model.idf_)
print('------------------------------')
data=['Tokyo Japan Chinese']
print('{} 文本轉(zhuǎn)化VSM矩陣'.format(data))
print(model.transform(data).toarray())
print('------------------------------')
print('轉(zhuǎn)化結(jié)果輸出為dataframe')
print(pd.DataFrame(model.transform(data).toarray(),columns=model.get_feature_names()))
print('------------------------------')
print('model參數(shù)查看')
print(model.get_params())
print('------------------------------')
4、CountVectorizer使用
train_data = ["Chinese Beijing Chinese",
"Chinese Chinese Shanghai",
"Chinese Macao",
"Tokyo Japan Chinese"]
params=init_params('CountVectorizer')
cv_model=CountVectorizer_train(train_data,params)
CountVectorizer_apply(cv_model)
查看結(jié)果可以發(fā)現(xiàn),VSM矩陣并不是詞頻統(tǒng)計,其實是tf-idf的結(jié)果
5、TfidfTransformer訓(xùn)練及應(yīng)用函數(shù)
def TfidfTransformer_train(train_data,params):
tt = TfidfTransformer(**params)
tt_fit = tt.fit_transform(train_data)
return tt
def TfidfTransformer_apply(model):
print('idf_列表')
print(model.idf_)
print('------------------------------')
data=[[1, 1, 0, 2, 1, 1, 0, 1]]
print('詞頻列表{} 轉(zhuǎn)化VSM矩陣'.format(data))
print(model.transform(data).toarray())
print('------------------------------')
print('model參數(shù)查看')
print(model.get_params())
print('------------------------------')
train_data=[[1, 1, 1, 0, 1, 1, 1, 0],
[1, 1, 0, 1, 1, 1, 0, 1]]
params=init_params('TfidfTransformer')
tt_model=TfidfTransformer_train(train_data,params)
TfidfTransformer_apply(tt_model)
6、TfidfTransformer訓(xùn)練及應(yīng)用函數(shù)
def TfidfVectorizer_train(train_data,params):
tv = TfidfVectorizer(**params)
# 輸入訓(xùn)練集矩陣,每行表示一個文本
# 訓(xùn)練,構(gòu)建詞匯表以及詞項idf值,并將輸入文本列表轉(zhuǎn)成VSM矩陣形式
tv_fit = tv.fit_transform(train_data)
return tv
def TfidfVectorizer_apply(tv_model):
print('tv_model詞匯表')
print(tv_model.vocabulary_)
print('------------------------------')
print('tv_model特證名/詞匯列表')
print(tv_model.get_feature_names())
print('------------------------------')
print('idf_列表')
print(tv_model.idf_)
print('------------------------------')
data=['Tokyo Japan Chinese']
print('{} 文本轉(zhuǎn)化VSM矩陣'.format(data))
print(tv_model.transform(data).toarray())
print('------------------------------')
print('轉(zhuǎn)化結(jié)果輸出為dataframe')
print(pd.DataFrame(tv_model.transform(data).toarray(),columns=tv_model.get_feature_names()))
print('------------------------------')
print('tv_model參數(shù)查看')
print(tv_model.get_params())
print('------------------------------')
train_data = ["Chinese Beijing Chinese",
"Chinese Chinese Shanghai",
"Chinese Macao",
"Tokyo Japan Chinese"]
params=init_params('TfidfVectorizer')
tv_model=TfidfVectorizer_train(train_data,params)
TfidfVectorizer_apply(tv_model)
將train_data的tf-idf矩陣轉(zhuǎn)化為dataframe結(jié)果
pd.DataFrame(tv_model.transform(train_data).toarray(),
columns=tv_model.get_feature_names())
三、劃重點
少走10年彎路
????????關(guān)注公眾號Python風(fēng)控模型與數(shù)據(jù)分析,回復(fù) tfidf實戰(zhàn) 獲取本篇的.py代碼,不用動手直接調(diào)用、它不香嗎?
? ? ? ? 還有更多理論、代碼分享,沒有任何保留的輸出、不值得一個關(guān)注嗎?文章來源:http://www.zghlxwxcb.cn/news/detail-788350.html
文章來源地址http://www.zghlxwxcb.cn/news/detail-788350.html
到了這里,關(guān)于tf-idf原理 & TfidfVectorizer參數(shù)詳解及實戰(zhàn)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!