提取文本的特徵,把文本用特徵表示出來,是文本分類的前提,使用sklearn作文本的特徵提取,須要導入TfidfVectorizer模塊。html
from sklearn.feature_extraction.text import TfidfVectorizer
sklearn提取文本特徵時,最重要的兩個步驟是:建立Tfidf向量生成器,把原始文檔轉換爲詞-文檔矩陣。python
使用TfidfVectorizer()函數建立向量生成器,最經常使用的參數是:stow_words="english",ngram_range,max_df,min_df ,其餘參數請參考官方文檔:web
sklearn.feature_extraction.text.TfidfVectorizer(stop_words=None, ngram_range=(1, 1), max_df=1.0, min_df=1, ...)
把原始文檔轉換爲詞-文檔矩陣,返回的是一個稀疏矩陣:函數
fit_transform(raw_documents, y=None)
特徵提取的簡單步驟,corpus是語料,其結構是文檔列表,每個列表項都是一個文檔(doc),語料共有5個文檔:spa
from sklearn.feature_extraction.text import TfidfVectorizer corpus = [ 'Where can I find information about how to become a Surface or Surface Hub Microsoft Authorized Device Reseller (ADR)?' ,'If you are interested in becoming a Surface or Surface Hub Microsoft Authorized Device Reseller' ,'you should contact a Microsoft Surface Authorized Device Distributor and sign up to receive updates on the ADR program.' ,'Microsoft partner website: Contact a Microsoft Surface Authorized Device Distributor' ,'Sign up to receive updates on becoming a Microsoft Surface Hub ADR or installer' ] vectorizer = TfidfVectorizer(stop_words ="english") matrix= vectorizer.fit_transform(corpus)
1,查看文本特徵.net
從原始文檔列表(語料)中獲取特徵列表,相比原始文本的分詞,特徵顯得更有意義,分析返回的特徵,這5個文檔放回18個特徵:rest
>>> print(vectorizer.get_feature_names()) ['adr', 'authorized', 'contact', 'device', 'distributor', 'hub', 'information', 'installer',
'interested', 'microsoft', 'partner', 'program', 'receive', 'reseller', 'sign', 'surface', 'updates', 'website']
2,獲取term和特徵索引的映射code
詞和特徵之間有映射關係,例如,詞information對應的特徵的索引是6,orm
>>> items=vectorizer.vocabulary_.items() >>> print(items) dict_items([('information', 6), ('surface', 15), ('hub', 5), ('microsoft', 9), ('authorized', 1),
('device', 3), ('reseller', 13), ('adr', 0), ('interested', 8), ('contact', 2), ('distributor', 4),
('sign', 14), ('receive', 12), ('updates', 16), ('program', 11), ('partner', 10), ('website', 17), ('installer', 7)])
把dict_items結構轉換爲Python的字典結構:htm
>>> feature_dict = {v: k for k, v in vectorizer.vocabulary_.items()} >>> feature_dict {6: 'information', 15: 'surface', 5: 'hub', 9: 'microsoft', 1: 'authorized', 3: 'device',
13: 'reseller', 0: 'adr', 8: 'interested', 2: 'contact', 4: 'distributor', 14: 'sign',
12: 'receive', 16: 'updates', 11: 'program', 10: 'partner', 17: 'website', 7: 'installer'}
3,查看詞-文檔矩陣
fit_transform()返回的是稀疏矩陣,屬性shape表示矩陣的行-列數量,該共有5行18列,列表明的是特徵,行表明的原始文檔的數量,value表明該文檔包含特徵的TD-IDF值,範圍從0-1。
>>> matrix.shape (5, 18) >>> print(matrix.todense()) [[0.32228866 0.27111938 0. 0.27111938 0. 0.32228866 0.48123496 0. 0. 0.22931104 0. 0. 0. 0.38825733 0. 0.45862207 0. 0. ] [0. 0.28640134 0. 0.28640134 0. 0.34045484 0. 0. 0.50836033 0.24223642 0. 0. 0. 0.41014192 0. 0.48447285 0. 0. ] [0.2782744 0.2340932 0.33523388 0.2340932 0.33523388 0. 0. 0. 0. 0.19799453 0. 0.41551375 0.33523388 0. 0.33523388 0.19799453 0.33523388 0. ] [0. 0.25015965 0.35824188 0.25015965 0.35824188 0. 0. 0. 0. 0.42316685 0.44403158 0. 0. 0. 0. 0.21158343 0. 0.44403158] [0.32281764 0. 0. 0. 0. 0.32281764 0. 0.48202482 0. 0.22968741 0. 0. 0.38889459 0. 0.38889459 0.22968741 0.38889459 0. ]]
特徵提取的兩種方法:詞袋(Bag of Words)和TF-IDF
1,詞袋模型
詞袋模型(BoW)是從文本中提取特徵的最簡單方法。 BoW將文本轉換爲文檔中單詞出現的矩陣。 該模型關注文檔中是否出現給定單詞。
有三個文檔(doc),每一個文檔是一行文本。
根據這三個文檔,建立文檔和切詞的矩陣,並計算單詞出如今文檔中的次數,這個矩陣叫作文檔-詞矩陣(DTM,Document-Term Matrix)。
這個矩陣使用的是單個詞,也能夠使用兩個或多個詞的組合,叫作bi-gram模型或tri-gram模型,統稱n-gram模型。
from sklearn.feature_extraction.text import CountVectorizer from nltk.tokenize import RegexpTokenizer #tokenizer to remove unwanted elements from out data like symbols and numbers token = RegexpTokenizer(r'[a-zA-Z0-9]+') cv = CountVectorizer(lowercase=True,stop_words='english',ngram_range = (1,1),tokenizer = token.tokenize) text_counts= cv.fit_transform(text_data)
2,TF-IDF模型
TF( 詞頻)是Term Frequency,計算每一個單詞在每一個文檔中的數量(頻數),TF依賴於BOW模型的輸出。
IDF(逆文檔頻率)是Inverse Document Frequency,反映關鍵詞的廣泛程度——當一個詞越廣泛(即有大量文檔包含這個詞)時,其IDF值越低;反之,則IDF值越高。IDF是包含該單詞的文檔數量和文檔總數的對數縮放比例。
TF-IDF(術語頻率 - 逆文檔頻率)模型是TF和IDF結合的產物,TF-IDF=TF*IDF。 在文檔中具備高tf-idf的單詞,大多數時間發生在給定文檔中,而且在其餘文檔中不存在,因此這些詞是該文檔的特徵詞。
from sklearn.feature_extraction.text import TfidfVectorizer tf=TfidfVectorizer() text_tf= tf.fit_transform(doc_list)
參考文檔:
sklearn.feature_extraction.text.TfidfVectorizer