詞向量構(gòu)造 - Tf-idf模型

前面我們總結(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)的頻率。

Tf = \frac {單個詞} {該文章的總詞數(shù)}

Idf(Inverse document frequency ):逆文檔頻率,語料庫所有的文檔/含有該詞的文檔數(shù)目。

Idf = log(\frac{語料庫中所有的文檔數(shù)目}{含有該詞的文檔數(shù)目})

Tf-idf = Tf * Idf

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

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