前面我們總結(jié)過詞袋模型,詞袋模型將文本中所有不重復(fù)的詞看作一個集合,然后對文本中的每句話進(jìn)行編碼。在句子中對于出現(xiàn)的詞標(biāo)記為1,未出現(xiàn)的詞標(biāo)記為0。這樣我們就完成了對文本向量的編碼,然后就可以調(diào)用機(jī)器學(xué)習(xí)模型來對其進(jìn)行擬合。詞袋模型解決了文本編碼的問題,但詞袋模型本身也存在著巨大的缺點。比如:詞袋模型中向量只考慮詞的出現(xiàn)頻率,不考慮該詞的具體含義;詞袋模型構(gòu)造的向量不考慮詞出現(xiàn)的先后順序;詞袋模型構(gòu)造的向量為稀疏矩陣,模型的效果非常有限?;谝陨蠁栴},Tf-idf模型出現(xiàn)了。
1.Tf-idf(詞頻-逆文檔頻率)模型
首先解釋Tf-idf模型中的關(guān)鍵詞。
Tf(Term frequency):詞頻,每個詞在文章中出現(xiàn)的頻率。
Idf(Inverse document frequency ):逆文檔頻率,語料庫所有的文檔/含有該詞的文檔數(shù)目。
Tf-idf模型相比較于詞袋模型的改進(jìn)點:引入了詞的重要性。
舉個例子:假如有《中國陜西特色美食羊肉泡饃》這篇文章,這篇文章中可能“陜西”和“羊肉泡饃”出現(xiàn)的頻率都很高,但是這兩個詞的Idf值是不同的。因為“羊肉泡饃”只出現(xiàn)在特定的文章中,而陜西可以出現(xiàn)在很多文章中,這樣“羊肉泡饃”的Idf值就會很大。所以“羊肉泡饃”更能代表該文章的主題,這是Tf-idf的升級之處。
2.Tf-idf詞向量實現(xiàn)
自己創(chuàng)建一段文本,然后調(diào)用sklearn庫中的Tf-idf算法。
#導(dǎo)入工具包
import numpy as np
import pandas as pd
from sklearn.feature_extraction.text import TfidfVectorizer
#創(chuàng)建文本內(nèi)容
text = ['The dog runs to a cat', 'the cat finds a fish in the basin', 'the bird is flying freely in the sky ']
#初始化Tf-idf模型并訓(xùn)練文本
tf_idf = TfidfVectorizer(analyzer = 'word',stop_words = 'english')
tf_matrix = tf_idf.fit_transform(text)
#查看Tf-idf模型中的關(guān)鍵詞
tf_idf.get_feature_names()
#['basin', 'bird', 'cat', 'dog', 'finds', 'fish', 'flying', 'freely', 'runs', 'sky']
#展示Tf-idf訓(xùn)練后的文本格式
pd.DataFrame(data = tf_matrix.toarray(),columns = vocab)
得到的結(jié)果如圖所示,每一個詞都用一個數(shù)值表示,數(shù)值的大小表示其在文章中的重要程度。
[圖片上傳失敗...(image-ae059c-1598494610636)]
3.Tf-idf文檔說明
class sklearn.feature_extraction.text.TfidfVectorizer(*,
input='content', encoding='utf-8', decode_error='strict',
strip_accents=None, lowercase=True, preprocessor=None, tokenizer=None,
analyzer='word', stop_words=None, token_pattern='(?u)\b\w\w+\b',
ngram_range=(1, 1), max_df=1.0, min_df=1, max_features=None,
vocabulary=None, binary=False, dtype=<class 'numpy.float64'>,
norm='l2', use_idf=True, smooth_idf=True, sublinear_tf=False)
關(guān)鍵參數(shù)說明:
- encoding:編碼方式,默認(rèn)utf-8
- lowercase:是否將文本轉(zhuǎn)化為小寫,默認(rèn)為True
- analyser:編碼的對象,默認(rèn)為word,也可以選擇字符char
- stop_words:停用詞,默認(rèn)為None,英文文本可以指定為'englishi',也可以自己制定停用此表
- ngram_range:詞組的范圍,默認(rèn)為(1,1),即一個詞為一個單位。也可以自己指定如(1,2),(2,2)等
- max_df:可以設(shè)置為范圍在[0.0 1.0]的float,也可以設(shè)置為沒有范圍限制的int,默認(rèn)為1.0。這個參數(shù)的作用是作為一個閾值,當(dāng)構(gòu)造語料庫的關(guān)鍵詞集的時候,如果某個詞的document frequence大于max_df,這個詞不會被當(dāng)作關(guān)鍵詞。如果這個參數(shù)是float,則表示詞出現(xiàn)的次數(shù)與語料庫文檔數(shù)的百分比,如果是int,則表示詞出現(xiàn)的次數(shù)。如果參數(shù)中已經(jīng)給定了vocabulary,則這個參數(shù)無效
- min_df:類似于max_df,不同之處在于如果某個詞的document frequence小于min_df,則這個詞不會被當(dāng)作關(guān)鍵詞
- max_features:默認(rèn)為None,可設(shè)為int,對所有關(guān)鍵詞的term frequency進(jìn)行降序排序,只取前max_features個作為關(guān)鍵詞集
4.小結(jié)
- Tf-idf模型,引入了詞的重要程度指標(biāo),使得構(gòu)造的文本向量更加準(zhǔn)確
- Tf-idf模型,仍然沒有考慮詞語的具體含義
- 下一小結(jié),了解詞嵌入模型(word2vec),將上下文語境引入詞語的向量構(gòu)造中