sklearn 特徵提取,字典特徵提取,文本特徵抽提取

sklearn安裝

在linux或windows終端輸入

pip3 install Scikit-learn

安裝較慢則替換源

pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple

以下內容會用到sklearn的API接口,官網:https://scikit-learn.org/stable/modules/classes.html

 

字典特徵提取

sklearn可對字典進行特徵值化,如對一組人體數據進行特徵值化。

本例使用到了sklearn的API接口:sklearn.feature_extraction.DictVectorizer

from sklearn.feature_extraction import DictVectorizer

def dictVetor():
    dict=DictVectorizer()
    data=dict.fit_transform([{'身高':180,'體重':160,'頭髮長度':'short'},
                             {'身高':170,'體重':120,'頭髮長度':'short'},
                             {'身高':165,'體重':100,'頭髮長度':'long'}])
    print(dict.get_feature_names())
    print(data)

if __name__=="__main__":
    dictVetor()

 打印出的結果爲scipy提供的sparse稀疏矩陣,初看似乎看不出任何意義,下面看一下另一種輸出格式

將程序中dict=DictVectorizer()添加一個參數,dict=DictVectorizer(sparse=False),sparase=False將輸出numpy的ndarray矩陣

這樣看上去似乎清楚多了,DictVectorizer提取4個特徵值,體重,頭髮長度=long,頭髮長度=short,身高

輸出一個3*4的二維矩陣,3行對應我們提供的字典變量裏的三組值,4列對應四個特徵,第一行輸出體重,第二行輸出0/1,0代表不是長髮,1代表是長髮,第三行與第二行同質,第四行輸出身高

而頭髮長度=long,頭髮長度=short爲什麼要以01來表示,實際上是爲了解決內存空間,我們把它稱爲one-hot編碼

意義何在?

進行字典特徵提取的意義在與,其本質通過分析特徵來判斷一個目標值,以上面的例子來講,若體重較重,頭髮爲短髮,身高較高的一組數據,就更加符合男性的特徵,那麼它的目標值就應該爲男性,反正升高較矮,體重較輕,頭髮長度爲長髮的一組值就更加符合女性的特徵。

 

文本特徵提取

文本特徵提取是指對文本數據進行特徵值化,如以下這個實例,對一段文字進行特徵值化,將文本數據轉換爲特徵值,並統計出現的次數。

本例使用到了sklearn的API接口:sklearn.feature_extraction.text.CountVectorizer

from sklearn.feature_extraction.text import CountVectorizer

vector = CountVectorizer()

res=vector.fit_transform(["Sklearn is simple and efficient tools for predictive data analysis,"
                          "Accessible to everybody, "
                          "and reusable in various contexts,"
                          "Built on NumPy, SciPy, and matplotlib,"
                          "Open source, commercially usable - BSD license"])

print(vector.get_feature_names())

print(res.toarray())

對文本中出現的每一個單詞進行了小寫轉化並輸出個數。 

意義何在?

進行文本特徵提取的意義何在呢?試想一下,對一段文字,我們通過特徵提取出每個單詞出現的次數,計算出在總單詞中的佔比,就可以對該篇文章的內容進行預測 ,比如出現較多的科技詞彙,那麼改變文章偏向於科技讀物類,若出現較多情感詞彙,那麼就偏向於情感類讀物,依次推類。

補充:中文文本提取思路

中文文本不同與英文文本,因爲英文每個單詞間有空格,非常適合提取,而中文的一段話是沒有空格的,使用sklearn直接進行提取會得到比較奇怪的特徵值,所以我們需要先對中文文本進行分詞,這裏推薦一個庫,庫名爲jieba,下面來看看使用效果。

from sklearn.feature_extraction.text import CountVectorizer
from sklearn.feature_extraction import DictVectorizer
import jieba

vector = CountVectorizer()

#jieba默認返回迭代器對象,需轉換爲列表後再轉換爲字符串
c1=jieba.cut("男性,身高一米八,短頭髮,喜歡打球")
c2=jieba.cut("男性,身高一米七,短頭髮,喜歡唱歌")
c3=jieba.cut("女性,身高一米六,長頭髮,喜歡逛淘寶")

l1=list(c1)
l2=list(c2)
l3=list(c3)
str1="".join(l1)
str2="".join(l2)
str3="".join(l3)

res=vector.fit_transform([str1,str2,str3])

print(vector.get_feature_names())

print(res.toarray())

 

參考文檔:

特徵提取的目的:https://cloud.tencent.com/developer/news/369843

one-hot編碼:https://juejin.im/post/5d15840e5188255c23553204

稀疏矩陣庫scipy.sparse:https://blog.csdn.net/pipisorry/article/details/41762945

numpy ndarray:https://danzhuibing.github.io/py_numpy_ndarray.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章