CountVectorizer方法進行特征提取 from sklearn.feature.extraction.text import CountVectorizer 這個方法根據分詞進行數量統計繼續文本分類 文本特征提取 作用:對文本進行特征值化 sklearn.feature_extractio ...
方法一:CountVectorizer方法進行特征提取
from sklearn.feature.extraction.text import CountVectorizer
這個方法根據分詞進行數量統計繼續文本分類
文本特征提取
作用:對文本進行特征值化
sklearn.feature_extraction.text.CountVectorizer(stop_words = [])
返回:詞頻矩陣
CountVectorizer.fit_transform(X) X:文本或者包含文本字元串的可迭代對象
返回:sparse矩陣 在後面加上 .toarray() 可以轉換為二維數組
CountVectorizer.inverse_transform(X) X:array數組或者sparse矩陣
返回:轉換之前數據格
CountVectorizer.get_feature_names()
返回:單詞列表,也可以說是返回特征名字
中文特征提取舉例(手動分詞)
from sklearn.feature_extraction.text import CountVectorizer #中文 需要分詞,否則是以整句作為一個詞。英文則不需要,因為英文單詞本來就有空格 def chinese_text_count_demo(): data = ["我 愛 北京 天安門", "天安門 上 太陽 升"] # 1、實例化一個轉換器類(為什麼叫轉化器,因為是將 文本 轉化為 數值) transfer = CountVectorizer() # 2、調用fit_transform data_new = transfer.fit_transform(data) print("data_new:\n", data_new.toarray()) print("特征名字:\n", transfer.get_feature_names()) return None if __name__ == '__main__': chinese_text_count_demo() 輸出結果: data_new: [[1 1 0] [0 1 1]] 特征名字: ['北京', '天安門', '太陽']
解析:上面第一行表示的是,data第一句話
數字表示的是,這個 特征詞 出現的次數
中文特征提取舉例(使用jieba分詞)
首先你需要在自己的cmd命令行中下載jieba
pip3 install jieba / pip install jieba
from sklearn.feature_extraction.text import CountVectorizer import jieba def cut_word(text): #進行中文分詞 return " ".join(list(jieba.cut(text))) # jieba.cut(text)返回的是一個生成器對象,需要轉換為迭代器 #return "".join(jieba.lcut(text)) #jieba.cut(text)直接返回一個列表list def auto_chinese_text_count_demo(): data = ["你說這該怎麼辦" ,"唐龍大聲問怎麼回事" ,"晚上找個地方喝幾盅怎麼樣" ,"老忠領他們到朱老明那裡站在大柏樹墳前說你看看這個地勢怎麼樣我們的人要是從城裡過來經過大渡口或是小渡口沿著千里堤"] data_new = [] for sent in data: data_new.append(cut_word(sent)) print("句子分詞後:\n", data_new) # 1、實例化一個轉換器類 transfer = CountVectorizer(stop_words = ["說","的"])#停頓詞應該預處理清理,這裡只是示範 # 2、調用fit_transform data_vector_value = transfer.fit_transform(data_new) print("data_vector_value:\n", data_vector_value.toarray()) print("特征名字:\n", transfer.get_feature_names()) return None if __name__ =='__main__': auto_chinese_text_count_demo() 輸出結果: 句子分詞後: ['你 說 這 該 怎麼辦', '唐龍 大聲 問 怎麼回事', '晚上 找個 地方 喝 幾盅 怎麼樣', '老忠領 他們 到 朱老明 那裡 站 在 大柏樹 墳前 說 你 看看 這個 地勢 怎麼樣 我們 的 人 要 是從 城裡 過來 經過 大渡口 或是 小 渡口 沿著 千里 堤'] data_vector_value: [[0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0] [0 0 0 1 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0] [0 1 0 0 0 1 0 0 0 0 0 0 0 1 0 0 1 0 1 0 0 0 0 0 0 0 0 0] [1 0 1 0 1 0 1 1 0 1 1 0 0 1 1 1 0 1 0 1 1 1 1 1 1 1 1 1]] 特征名字: ['他們', '幾盅', '千里', '唐龍', '地勢', '地方', '墳前', '城裡', '大聲', '大柏樹', '大渡口', '怎麼辦', '怎麼回事', '怎麼樣', '我們', '或是', '找個', '是從', '晚上', '朱老明', '沿著', '渡口', '看看', '經過', '老忠領', '過來', '這個', '那裡']
方法二:TfidfVectorizer方法進行特征提取
from sklearn.feature_extraction.text import TfidfVectorizer
sklearn.feature_extraction.text.TfidfVectorizer(stop_words=None)
返回:權重矩陣
TfidfVectorizer.fit_transform(X)
X:文本或者包括文本字元串的可迭代對象
返回:sparse矩陣
TfidfVectorizer.inverse_transform(X)
X:array數組或者sparse矩陣
返回:轉換之前數據格式
TfidfVectorizer.get_feature_names()
返回:單詞列表,也可以說是特征名字
TfidfVectorizer衡量的就是一個詞在文章中的重要程度
TF-IDF的主要思想是:如果某個詞或短語在一篇文章中出現的概率高,並且在其他文章中很少出現,則認為此詞或者短語具有很好的類別區分能力。(適合:分類)
TF-IDF作用:用以評估一字詞對於一個文件集或一個語料庫中的其中一份文件的重要程度。
TfidfVectorizer = TF + IDF
--> TF - 詞頻(term frequency,tf) --> IDF - 逆向文檔頻率(inverse document frequency, idf) 舉例: 假設現在有兩個關鍵詞“經濟”,“非常”。 現在基礎數據是1000篇文章的語料庫。其中1000篇文章“非常”一詞出現的頻率很高,10篇文章“經濟”一詞出現的很高。 計算公式: TF(詞頻)= 出現的頻率/總次數 IDF(逆向文檔頻率) = log10 (文件總數/包含該詞語的文件數目) TF-IDF = TF * IDF 要求計算: 現有兩篇文章 文章A(100詞):10次“經濟” TF-IDF:0.2 tf:10/100 = 0.1 idf:lg (1000/10) = 2 文章B(100詞):10次“非常” TF-IDF:0.1 tf:10/100 = 0.1 idf:lg (1000/100) = 1
from sklearn.feature_extraction.text import TfidfVectorizer import jieba def cut_word(text): #進行中文分詞 return " ".join(list(jieba.cut(text))) # jieba.cut(text)返回的是一個生成器對象,需要轉換為迭代器 #return "".join(jieba.lcut(text)) #jieba.cut(text)直接返回一個列表list def tf_idf_demo(): data = ["你說這該怎麼辦" ,"唐龍大聲問怎麼回事" ,"晚上找個地方喝幾盅怎麼樣" ,"老忠領他們到朱老明那裡站在大柏樹墳前說你看看這個地勢怎麼樣我們的人要是從城裡過來經過大渡口或是小渡口沿著千里堤"] data_new = [] for sent in data: data_new.append(cut_word(sent)) transfer = TfidfVectorizer( stop_words = ["的","說"]) data_feature_value = transfer.fit_transform(data_new) print("data_feature_value:\n", data_feature_value.toarray()) print("特征名字:\n", transfer.get_feature_names()) return None if __name__ =='__main__': tf_idf_demo() 輸出結果: data_feature_value: [[0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 1. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. ] [0. 0. 0. 0.57735027 0. 0. 0. 0. 0.57735027 0. 0. 0. 0.57735027 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. ] [0. 0.46516193 0. 0. 0. 0.46516193 0. 0. 0. 0. 0. 0. 0. 0.36673901 0. 0. 0.46516193 0. 0.46516193 0. 0. 0. 0. 0. 0. 0. 0. 0. ] [0.22575266 0. 0.22575266 0. 0.22575266 0. 0.22575266 0.22575266 0. 0.22575266 0.22575266 0. 0. 0.17798599 0.22575266 0.22575266 0. 0.22575266 0. 0.22575266 0.22575266 0.22575266 0.22575266 0.22575266 0.22575266 0.22575266 0.22575266 0.22575266]] 特征名字: ['他們', '幾盅', '千里', '唐龍', '地勢', '地方', '墳前', '城裡', '大聲', '大柏樹', '大渡口', '怎麼辦', '怎麼回事', '怎麼樣', '我們', '或是', '找個', '是從', '晚上', '朱老明', '沿著', '渡口', '看看', '經過', '老忠領', '過來', '這個', '那裡']
參考鏈接:https://www.cnblogs.com/ftl1012/p/10498480.html