一、什么是特征工程
機器學(xué)習(xí)領(lǐng)域的大神Andrew Ng(吳恩達)老師說“Coming up with features is difficult, time-consuming, requires expert knowledge. “Applied machine learning” is basically feature engineering. ”
注:業(yè)界廣泛流傳:數(shù)據(jù)和特征決定了機器學(xué)習(xí)的上限,而模型和算法只是逼近這個上限而已
特征工程是使用專業(yè)背景知識和技巧處理數(shù)據(jù),使得特征能在機器學(xué)習(xí)算法上發(fā)揮更好的作用的過程
意義:會直接影響機器學(xué)習(xí)的效果
二、用什么做特征工程
目前就是sklearn
三、特征工程的位置與數(shù)據(jù)處理的比較
1、pandas
一個數(shù)據(jù)讀取非常方便以及基本的處理格式的工具
2、sklearn
對于特征的處理提供了強大的接口
3、特征工程包含內(nèi)容
(1)特征抽取
(2)特征預(yù)處理
(3)特征降維
4、特征抽取/特征提取
比如有一篇英文短文,要對文章進行分類:
機器學(xué)習(xí)算法 -- 統(tǒng)計方法 -- 數(shù)學(xué)公式
數(shù)學(xué)公式不能處理字符串,要把文本字符串轉(zhuǎn)換成數(shù)值的類型
問題:文本類型轉(zhuǎn)換成數(shù)值怎么轉(zhuǎn)?
分類船倉位
問題:類型轉(zhuǎn)換成數(shù)值?
onehot編碼或者啞變量
四、特征提取
1、什么是特征提取
將任意數(shù)據(jù)(如文本或圖像)轉(zhuǎn)換為可用于機器學(xué)習(xí)的數(shù)字特征
注:特征值化是為了計算機更好的去理解數(shù)據(jù)
(1)字典特征提取(特征離散化)
(2)文本特征提取
(3)圖像特征提?。ㄉ疃葘W(xué)習(xí)將介紹)
2、特征提取API
sklearn.feature_extraction
五、字典的特征提取
sklearn.feature_extraction.DictVectorizer(sparse=True, ...)
作用:對字段數(shù)據(jù)進行特征值化
說明:
vector 數(shù)學(xué)里是向量,物理里是矢量
matrix 矩陣,二維數(shù)組
如果將向量存儲在計算機中,可以用一維數(shù)組來存儲
1、DicVectorizer.fit_transform(X)
X:字段或者包含字典的迭代器
返回值:返回sparse矩陣
2、DicVectorizer.inverse_transform(X)
X:array數(shù)組或者sparse矩陣
返回值:轉(zhuǎn)換之前數(shù)據(jù)格式
3、DicVectorizer.get_feature_names()
返回值:返回類別名稱
4、例子
我們對以下數(shù)據(jù)進行特征提取
[{'city': '北京','temperature':100}
{'city': '上海','temperature':60}
{'city': '深圳','temperature':30}]
上面一行代表feature_names,下面三行就是data
解釋一下,如果有三個城市就有3個0,字典排列順序是幾第幾個0就變成1,有點像二進制編碼
樣本是一個三行兩列的矩陣,當(dāng)進行字典特征抽取之后,樣本量變成4列了
把城市類別轉(zhuǎn)換成了one-hot編碼
5、修改day01_machine_learning.py
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.feature_extraction import DictVectorizer
def datasets_demo():
"""
sklearn數(shù)據(jù)集使用
"""
#獲取數(shù)據(jù)集
iris = load_iris()
print("鳶尾花數(shù)據(jù)集:\n", iris)
print("查看數(shù)據(jù)集描述:\n", iris["DESCR"])
print("查看特征值的名字:\n", iris.feature_names)
print("查看特征值幾行幾列:\n", iris.data.shape)
#數(shù)據(jù)集的劃分
x_train, x_test, y_train, y_test = train_test_split(iris.data, iris.target, test_size=0.2, random_state=22)
print("訓(xùn)練集的特征值:\n", x_train, x_train.shape)
return None
def dict_demo():
"""
字典特征抽取
"""
data = [{'city': '北京','temperature':100},{'city': '上海','temperature':60},{'city': '深圳','temperature':30}]
# 1、實例化一個轉(zhuǎn)換器類
transfer = DictVectorizer()
# 2、調(diào)用fit_transform()
data_new = transfer.fit_transform(data)
print("data_new:\n", data_new)
return None
if __name__ == "__main__":
# 代碼1:sklearn數(shù)據(jù)集使用
#datasets_demo()
# 代碼2:字典特征抽取
dict_demo()
運行結(jié)果:
data_new:
(0, 1) 1.0
(0, 3) 100.0
(1, 0) 1.0
(1, 3) 60.0
(2, 2) 1.0
(2, 3) 30.0
為什么是這個結(jié)果:
這個API將X傳進來之后,返回sparse矩陣(sparse英文是稀疏的意思,就是稀疏矩陣)
如果設(shè)置:transfer = DictVectorizer(sparse=False)
就會得到預(yù)想的結(jié)果:
data_new:
[[ 0. 1. 0. 100.]
[ 1. 0. 0. 60.]
[ 0. 0. 1. 30.]]
怎么看稀疏矩陣:某些矩陣中,非0元素遠少于0元素。典型存儲方法:三元組法,(行,列,元素值)
就是標(biāo)注了稀疏矩陣中的非零元素的位置以及對應(yīng)的值,通俗點講:0行1列的數(shù)值是1,在預(yù)想結(jié)果里就能找到
好處是節(jié)省內(nèi)存,提高加載效率
增加打印特征名:
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.feature_extraction import DictVectorizer
def datasets_demo():
"""
sklearn數(shù)據(jù)集使用
"""
#獲取數(shù)據(jù)集
iris = load_iris()
print("鳶尾花數(shù)據(jù)集:\n", iris)
print("查看數(shù)據(jù)集描述:\n", iris["DESCR"])
print("查看特征值的名字:\n", iris.feature_names)
print("查看特征值幾行幾列:\n", iris.data.shape)
#數(shù)據(jù)集的劃分
x_train, x_test, y_train, y_test = train_test_split(iris.data, iris.target, test_size=0.2, random_state=22)
print("訓(xùn)練集的特征值:\n", x_train, x_train.shape)
return None
def dict_demo():
"""
字典特征抽取
"""
data = [{'city': '北京','temperature':100},{'city': '上海','temperature':60},{'city': '深圳','temperature':30}]
# 1、實例化一個轉(zhuǎn)換器類
transfer = DictVectorizer(sparse=False)
# 2、調(diào)用fit_transform()
data_new = transfer.fit_transform(data)
print("data_new:\n", data_new)
print("特征名字:\n", transfer.get_feature_names())
return None
if __name__ == "__main__":
# 代碼1:sklearn數(shù)據(jù)集使用
#datasets_demo()
# 代碼2:字典特征抽取
dict_demo()
data_new:
[[ 0. 1. 0. 100.]
[ 1. 0. 0. 60.]
[ 0. 0. 1. 30.]]
特征名字:
['city=上海', 'city=北京', 'city=深圳', 'temperature']
六、文本特征提取
1、作用
對文本數(shù)據(jù)進行特征值化
單詞作為特征,特征詞
2、方法一:CountVectorizer
sklearn.feature_extraction.text.CountVectorizer(stop_words=[])
返回值:返回詞頻矩陣
3、CountVectorizer.fit_transform(X)
X:文本或者包含文本字符串的可迭代對象
返回值:返回sparse矩陣
4、CountVectorizer.inverse_transform(X)
X:array數(shù)組或者sparse矩陣
返回值:轉(zhuǎn)換之前的數(shù)據(jù)格式
5、CountVectorizer.get_feature_names()
返回值:單詞列表
6、例子
我們對一下數(shù)據(jù)進行特征提取
["life is short,i like python",
"life is too long,i dislike python"]
為什么沒有i,因為api設(shè)計的時候認為單詞做分類或情感分析意義不大
7、修改day01_machine_learning.py
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.feature_extraction import DictVectorizer
from sklearn.feature_extraction.text import CountVectorizer
def datasets_demo():
"""
sklearn數(shù)據(jù)集使用
"""
#獲取數(shù)據(jù)集
iris = load_iris()
print("鳶尾花數(shù)據(jù)集:\n", iris)
print("查看數(shù)據(jù)集描述:\n", iris["DESCR"])
print("查看特征值的名字:\n", iris.feature_names)
print("查看特征值幾行幾列:\n", iris.data.shape)
#數(shù)據(jù)集的劃分
x_train, x_test, y_train, y_test = train_test_split(iris.data, iris.target, test_size=0.2, random_state=22)
print("訓(xùn)練集的特征值:\n", x_train, x_train.shape)
return None
def dict_demo():
"""
字典特征抽取
"""
data = [{'city': '北京','temperature':100},{'city': '上海','temperature':60},{'city': '深圳','temperature':30}]
# 1、實例化一個轉(zhuǎn)換器類
transfer = DictVectorizer(sparse=False)
# 2、調(diào)用fit_transform()
data_new = transfer.fit_transform(data)
print("data_new:\n", data_new)
print("特征名字:\n", transfer.get_feature_names())
return None
def count_demo():
"""
文本特征抽取
"""
data = ["life is short,i like like python", "life is too long,i dislike python"]
# 1、實例化一個轉(zhuǎn)換器類
transfer = CountVectorizer()
# 2、調(diào)用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__":
# 代碼1:sklearn數(shù)據(jù)集使用
#datasets_demo()
# 代碼2:字典特征抽取
#dict_demo()
# 代碼3:文本特征抽取
count_demo()
運行結(jié)果:
data_new:
[[0 1 1 2 0 1 1 0]
[1 1 1 0 1 1 0 1]]
特征名字:
['dislike', 'is', 'life', 'like', 'long', 'python', 'short', 'too']
統(tǒng)計每個樣本特征詞出現(xiàn)的個數(shù)
8、中文文本特征抽取
問題:如果我們將數(shù)據(jù)替換成中文?
那么得到的結(jié)果是把整句作為了一個詞,手工打空格則不支持單個中文詞!
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.feature_extraction import DictVectorizer
from sklearn.feature_extraction.text import CountVectorizer
def datasets_demo():
"""
sklearn數(shù)據(jù)集使用
"""
#獲取數(shù)據(jù)集
iris = load_iris()
print("鳶尾花數(shù)據(jù)集:\n", iris)
print("查看數(shù)據(jù)集描述:\n", iris["DESCR"])
print("查看特征值的名字:\n", iris.feature_names)
print("查看特征值幾行幾列:\n", iris.data.shape)
#數(shù)據(jù)集的劃分
x_train, x_test, y_train, y_test = train_test_split(iris.data, iris.target, test_size=0.2, random_state=22)
print("訓(xùn)練集的特征值:\n", x_train, x_train.shape)
return None
def dict_demo():
"""
字典特征抽取
"""
data = [{'city': '北京','temperature':100},{'city': '上海','temperature':60},{'city': '深圳','temperature':30}]
# 1、實例化一個轉(zhuǎn)換器類
transfer = DictVectorizer(sparse=False)
# 2、調(diào)用fit_transform()
data_new = transfer.fit_transform(data)
print("data_new:\n", data_new)
print("特征名字:\n", transfer.get_feature_names())
return None
def count_demo():
"""
文本特征抽取
"""
data = ["life is short,i like like python", "life is too long,i dislike python"]
# 1、實例化一個轉(zhuǎn)換器類
transfer = CountVectorizer()
# 2、調(diào)用fit_transform()
data_new = transfer.fit_transform(data)
print("data_new:\n", data_new.toarray())
print("特征名字:\n", transfer.get_feature_names())
return None
def count_chinese_demo():
"""
中文文本特征抽取
"""
data = ["我 愛 北京 天安門", "天安門 上 太陽 升"]
# 1、實例化一個轉(zhuǎn)換器類
transfer = CountVectorizer()
# 2、調(diào)用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__":
# 代碼1:sklearn數(shù)據(jù)集使用
#datasets_demo()
# 代碼2:字典特征抽取
#dict_demo()
# 代碼3:文本特征抽取
#count_demo()
# 代碼4:中文文本特征抽取
count_chinese_demo()
運行結(jié)果:
data_new:
[[1 1 0]
[0 1 1]]
特征名字:
['北京', '天安門', '太陽']
9、CountVectorizer的stop_words
stop_words:停用詞
我們認為有一些詞對最終分類沒有好處的,可以搜索停用詞表
10、對以下三句話進行特征值化
今天很殘酷,明天更殘酷,后天很美好,
但絕對大部分是死在明天晚上,所以每個人不要放棄今天。
我們看到的從很遠星系來的光是在幾百萬年前之前發(fā)出的,
這樣當(dāng)我們看到宇宙時,我們是在看它的過去。
如果只用一種方式了解某樣事物,你就不會真正了解它。
了解事物真正含義的秘密取決于如何將其與我們所了解的事物相聯(lián)系。
(1)準(zhǔn)備句子,利用jieba.cut進行分詞,安裝庫:pip3 install jieba
(2)實例化CountVectorizer
(3)將分詞結(jié)果變成字符串當(dāng)做fit_transform的輸入值
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.feature_extraction import DictVectorizer
from sklearn.feature_extraction.text import CountVectorizer
import jieba
def datasets_demo():
"""
sklearn數(shù)據(jù)集使用
"""
#獲取數(shù)據(jù)集
iris = load_iris()
print("鳶尾花數(shù)據(jù)集:\n", iris)
print("查看數(shù)據(jù)集描述:\n", iris["DESCR"])
print("查看特征值的名字:\n", iris.feature_names)
print("查看特征值幾行幾列:\n", iris.data.shape)
#數(shù)據(jù)集的劃分
x_train, x_test, y_train, y_test = train_test_split(iris.data, iris.target, test_size=0.2, random_state=22)
print("訓(xùn)練集的特征值:\n", x_train, x_train.shape)
return None
def dict_demo():
"""
字典特征抽取
"""
data = [{'city': '北京','temperature':100},{'city': '上海','temperature':60},{'city': '深圳','temperature':30}]
# 1、實例化一個轉(zhuǎn)換器類
transfer = DictVectorizer(sparse=False)
# 2、調(diào)用fit_transform()
data_new = transfer.fit_transform(data)
print("data_new:\n", data_new)
print("特征名字:\n", transfer.get_feature_names())
return None
def count_demo():
"""
文本特征抽取
"""
data = ["life is short,i like like python", "life is too long,i dislike python"]
# 1、實例化一個轉(zhuǎn)換器類
transfer = CountVectorizer()
# 2、調(diào)用fit_transform()
data_new = transfer.fit_transform(data)
print("data_new:\n", data_new.toarray())
print("特征名字:\n", transfer.get_feature_names())
return None
def count_chinese_demo():
"""
中文文本特征抽取
"""
data = ["我 愛 北京 天安門", "天安門 上 太陽 升"]
# 1、實例化一個轉(zhuǎn)換器類
transfer = CountVectorizer()
# 2、調(diào)用fit_transform
data_new = transfer.fit_transform(data)
print("data_new:\n", data_new.toarray());
print("特征名字:\n", transfer.get_feature_names())
return None
def cut_word(text):
"""
進行中文分詞
"""
return " ".join(list(jieba.cut(text))) #返回一個分詞生成器對象,強轉(zhuǎn)成list,再join轉(zhuǎn)成字符串
def count_chinese_demo2():
"""
中文文本特征抽取,自動分詞
"""
# 1、將中文文本進行分詞
data = ["今天很殘酷,明天更殘酷,后天很美好,但絕對大部分是死在明天晚上,所以每個人不要放棄今天。",
"我們看到的從很遠星系來的光是在幾百萬年前之前發(fā)出的,這樣當(dāng)我們看到宇宙時,我們是在看它的過去。",
"如果只用一種方式了解某樣事物,你就不會真正了解它。了解事物真正含義的秘密取決于如何將其與我們所了解的事物相聯(lián)系。"]
data_new = []
for sent in data:
data_new.append(cut_word(sent))
print(data_new)
# 2、實例化一個轉(zhuǎn)換器類
transfer = CountVectorizer()
# 3、調(diào)用fit_transform()
data_final = transfer.fit_transform(data_new)
print("data_final:\n", data_final.toarray())
print("特征名字:\n", transfer.get_feature_names())
return None
if __name__ == "__main__":
# 代碼1:sklearn數(shù)據(jù)集使用
#datasets_demo()
# 代碼2:字典特征抽取
#dict_demo()
# 代碼3:文本特征抽取
#count_demo()
# 代碼4:中文文本特征抽取
#count_chinese_demo()
# 代碼5:中文文本特征抽取,自動分詞
count_chinese_demo2()
# 代碼6: 測試jieba庫中文分詞
#print(cut_word("我愛北京天安門"))
執(zhí)行結(jié)果:
Building prefix dict from the default dictionary ...
Loading model from cache /tmp/jieba.cache
Loading model cost 1.304 seconds.
Prefix dict has been built successfully.
['今天 很 殘酷 , 明天 更 殘酷 , 后天 很 美好 , 但 絕對 大部分 是 死 在 明天 晚上 , 所以 每個 人 不要 放棄 今天 。', '我們 看到 的 從 很 遠 星系 來 的 光是在 幾百萬年 前 之前 發(fā)出 的 , 這樣 當(dāng) 我們 看到 宇宙 時 , 我們 是 在 看 它 的 過去 。', '如果 只用 一種 方式 了解 某樣 事物 , 你 就 不會 真正 了解 它 。 了解 事物 真正 含義 的 秘密 取決于 如何 將 其 與 我們 所 了解 的 事物 相 聯(lián)系 。']
data_final:
[[0 0 1 0 0 0 2 0 0 0 0 0 1 0 1 0 0 0 0 1 1 0 2 0 1 0 2 1 0 0 0 1 1 0 0 0]
[0 0 0 1 0 0 0 1 1 1 0 0 0 0 0 0 0 1 3 0 0 0 0 1 0 0 0 0 2 0 0 0 0 0 1 1]
[1 1 0 0 4 3 0 0 0 0 1 1 0 1 0 1 1 0 1 0 0 1 0 0 0 1 0 0 0 2 1 0 0 1 0 0]]
特征名字:
['一種', '不會', '不要', '之前', '了解', '事物', '今天', '光是在', '幾百萬年', '發(fā)出', '取決于', '只用', '后天', '含義', '大部分', '如何', '如果', '宇宙', '我們', '所以', '放棄', '方式', '明天', '星系', '晚上', '某樣', '殘酷', '每個', '看到', '真正', '秘密', '絕對', '美好', '聯(lián)系', '過去', '這樣']
這種方式是根據(jù)一個詞,在一篇文章中出現(xiàn)的次數(shù)來分類的。但是像一些詞“我們”、“你們”等在所有文章都出現(xiàn)很多次,我們更希望的是在某一個類別的文章中,出現(xiàn)的次數(shù)很多,但是在其他類別的文章中出現(xiàn)很少,這樣的詞更有利于我們分類。
要找到這種關(guān)鍵詞。引出了TfidfVectorizer
11、方法二:TfidfVectorizer
sklearn.feature_extraction.text.TfidfVectorizer
12、Tf-idf文本特征提取
(1)TF-IDF的主要思想是:如果某個詞或短語在一篇文章中出現(xiàn)的概率高,并且在其他文章中很少出現(xiàn),則認為此詞或者短語具有很好的類別區(qū)分能力,適合用來分類
(2)TF-IDF作用:用以評估一字詞對于一個文件集或一個語料庫中的其中一份文件的重要程度。
13、Tf-idf公式
(1)詞頻(term frequency,tf)指的是某一個給定的詞語在該文件中出現(xiàn)的頻率
(2)逆向文檔頻率(inverse document frequency,idf)是一個詞語普遍重要性的度量。某一特定詞語的idf,可以由總文件數(shù)目除以包含該詞語之文件的數(shù)目,再將得到的商取以10為底的對數(shù)得到
(3)最終得出結(jié)果可以理解為重要程度
注:假如一篇文件的總詞語數(shù)是100個,而詞語"非常"出現(xiàn)了5次,那么"非常"一詞在該文件中的詞頻就是5/100=0.05。而計算文件頻率(IDF)的方法是以文件集的文件總數(shù),除以出現(xiàn)"非常"一詞的文件數(shù)。所以,如果"非常"一詞在1,000份文件出現(xiàn)過,而文件總數(shù)是10,000,000份的話,其逆向文件頻率就是lg(10,000,000 / 1,0000)=3。最后"非常"對于這篇文檔的tf-idf的分?jǐn)?shù)為0.05 * 3=0.15
14、Tf-idf表示重要程度
兩個詞:經(jīng)濟、非常
1000篇文章 -- 語料庫
100篇文章 -- 非常
10篇文章 -- 經(jīng)濟
兩篇文章
文章A(100詞):10次經(jīng)濟
? ? tf:10 / 100 = 0.1
? ? idf:log 10 (1000 / 10) = 2
? ? tf-idf:0.2
文章B(100詞):10次非常
? ? tf:10 / 100 = 0.1
? ? idf:log 10 (1000 / 100) = 1
? ? tf-idf:0.1
? ? 對數(shù)?
? ? ? ? 2 ^ 3 = 8
? ? ? ? log 2 (8) = 3
? ? ? ? log 10 (10) = 1
15、API
sklearn.feature_extraction.text.TfidfVectorizer(stop_words=None,...)
返回值:返回詞的權(quán)重矩陣
16、TfidfVectorizer.fit_transform(X)
X:文本或者包含文本字符串的可迭代對象
返回值:返回sparse矩陣
17、TfidfVectorizer.inverse_transform(X)
X:array數(shù)組或者sparse矩陣
返回值:轉(zhuǎn)換之前數(shù)據(jù)格式
18、TfidfVectorizer.get_feature_names()
返回值:單詞列表
19、用tfidf進行特征抽取
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.feature_extraction import DictVectorizer
from sklearn.feature_extraction.text import CountVectorizer, TfidfVectorizer
import jieba
def datasets_demo():
"""
sklearn數(shù)據(jù)集使用
"""
#獲取數(shù)據(jù)集
iris = load_iris()
print("鳶尾花數(shù)據(jù)集:\n", iris)
print("查看數(shù)據(jù)集描述:\n", iris["DESCR"])
print("查看特征值的名字:\n", iris.feature_names)
print("查看特征值幾行幾列:\n", iris.data.shape)
#數(shù)據(jù)集的劃分
x_train, x_test, y_train, y_test = train_test_split(iris.data, iris.target, test_size=0.2, random_state=22)
print("訓(xùn)練集的特征值:\n", x_train, x_train.shape)
return None
def dict_demo():
"""
字典特征抽取
"""
data = [{'city': '北京','temperature':100},{'city': '上海','temperature':60},{'city': '深圳','temperature':30}]
# 1、實例化一個轉(zhuǎn)換器類
transfer = DictVectorizer(sparse=False)
# 2、調(diào)用fit_transform()
data_new = transfer.fit_transform(data)
print("data_new:\n", data_new)
print("特征名字:\n", transfer.get_feature_names())
return None
def count_demo():
"""
文本特征抽取
"""
data = ["life is short,i like like python", "life is too long,i dislike python"]
# 1、實例化一個轉(zhuǎn)換器類
transfer = CountVectorizer()
# 2、調(diào)用fit_transform()
data_new = transfer.fit_transform(data)
print("data_new:\n", data_new.toarray())
print("特征名字:\n", transfer.get_feature_names())
return None
def count_chinese_demo():
"""
中文文本特征抽取
"""
data = ["我 愛 北京 天安門", "天安門 上 太陽 升"]
# 1、實例化一個轉(zhuǎn)換器類
transfer = CountVectorizer()
# 2、調(diào)用fit_transform
data_new = transfer.fit_transform(data)
print("data_new:\n", data_new.toarray());
print("特征名字:\n", transfer.get_feature_names())
return None
def cut_word(text):
"""
進行中文分詞
"""
return " ".join(list(jieba.cut(text))) #返回一個分詞生成器對象,強轉(zhuǎn)成list,再join轉(zhuǎn)成字符串
def count_chinese_demo2():
"""
中文文本特征抽取,自動分詞
"""
# 1、將中文文本進行分詞
data = ["今天很殘酷,明天更殘酷,后天很美好,但絕對大部分是死在明天晚上,所以每個人不要放棄今天。",
"我們看到的從很遠星系來的光是在幾百萬年前之前發(fā)出的,這樣當(dāng)我們看到宇宙時,我們是在看它的過去。",
"如果只用一種方式了解某樣事物,你就不會真正了解它。了解事物真正含義的秘密取決于如何將其與我們所了解的事物相聯(lián)系。"]
data_new = []
for sent in data:
data_new.append(cut_word(sent))
print(data_new)
# 2、實例化一個轉(zhuǎn)換器類
transfer = CountVectorizer()
# 3、調(diào)用fit_transform()
data_final = transfer.fit_transform(data_new)
print("data_final:\n", data_final.toarray())
print("特征名字:\n", transfer.get_feature_names())
return None
def tfidf_demo():
"""
用tf-idf的方法進行文本特征抽取
"""
# 1、將中文文本進行分詞
data = ["今天很殘酷,明天更殘酷,后天很美好,但絕對大部分是死在明天晚上,所以每個人不要放棄今天。",
"我們看到的從很遠星系來的光是在幾百萬年前之前發(fā)出的,這樣當(dāng)我們看到宇宙時,我們是在看它的過去。",
"如果只用一種方式了解某樣事物,你就不會真正了解它。了解事物真正含義的秘密取決于如何將其與我們所了解的事物相聯(lián)系。"]
data_new = []
for sent in data:
data_new.append(cut_word(sent))
print(data_new)
# 2、實例化一個轉(zhuǎn)換器類
transfer = TfidfVectorizer()
# 3、調(diào)用fit_transform()
data_final = transfer.fit_transform(data_new)
print("data_final:\n", data_final.toarray())
print("特征名字:\n", transfer.get_feature_names())
return None
if __name__ == "__main__":
# 代碼1:sklearn數(shù)據(jù)集使用
#datasets_demo()
# 代碼2:字典特征抽取
#dict_demo()
# 代碼3:文本特征抽取
#count_demo()
# 代碼4:中文文本特征抽取
#count_chinese_demo()
# 代碼5:中文文本特征抽取,自動分詞
#count_chinese_demo2()
# 代碼6: 測試jieba庫中文分詞
#print(cut_word("我愛北京天安門"))
# 代碼7:用tf-idf的方法進行文本特征抽取
tfidf_demo()
執(zhí)行結(jié)果:文章來源:http://www.zghlxwxcb.cn/news/detail-534710.html
Building prefix dict from the default dictionary ...
Loading model from cache /tmp/jieba.cache
Loading model cost 1.415 seconds.
Prefix dict has been built successfully.
['今天 很 殘酷 , 明天 更 殘酷 , 后天 很 美好 , 但 絕對 大部分 是 死 在 明天 晚上 , 所以 每個 人 不要 放棄 今天 。', '我們 看到 的 從 很 遠 星系 來 的 光是在 幾百萬年 前 之前 發(fā)出 的 , 這樣 當(dāng) 我們 看到 宇宙 時 , 我們 是 在 看 它 的 過去 。', '如果 只用 一種 方式 了解 某樣 事物 , 你 就 不會 真正 了解 它 。 了解 事物 真正 含義 的 秘密 取決于 如何 將 其 與 我們 所 了解 的 事物 相 聯(lián)系 。']
data_final:
[[0. 0. 0.21821789 0. 0. 0.
0.43643578 0. 0. 0. 0. 0.
0.21821789 0. 0.21821789 0. 0. 0.
0. 0.21821789 0.21821789 0. 0.43643578 0.
0.21821789 0. 0.43643578 0.21821789 0. 0.
0. 0.21821789 0.21821789 0. 0. 0. ]
[0. 0. 0. 0.2410822 0. 0.
0. 0.2410822 0.2410822 0.2410822 0. 0.
0. 0. 0. 0. 0. 0.2410822
0.55004769 0. 0. 0. 0. 0.2410822
0. 0. 0. 0. 0.48216441 0.
0. 0. 0. 0. 0.2410822 0.2410822 ]
[0.15698297 0.15698297 0. 0. 0.62793188 0.47094891
0. 0. 0. 0. 0.15698297 0.15698297
0. 0.15698297 0. 0.15698297 0.15698297 0.
0.1193896 0. 0. 0.15698297 0. 0.
0. 0.15698297 0. 0. 0. 0.31396594
0.15698297 0. 0. 0.15698297 0. 0. ]]
特征名字:
['一種', '不會', '不要', '之前', '了解', '事物', '今天', '光是在', '幾百萬年', '發(fā)出', '取決于', '只用', '后天', '含義', '大部分', '如何', '如果', '宇宙', '我們', '所以', '放棄', '方式', '明天', '星系', '晚上', '某樣', '殘酷', '每個', '看到', '真正', '秘密', '絕對', '美好', '聯(lián)系', '過去', '這樣']
20、Tf-idf的重要性
分類機器學(xué)習(xí)算法進行文章分類中前期數(shù)據(jù)處理方式
?文章來源地址http://www.zghlxwxcb.cn/news/detail-534710.html
到了這里,關(guān)于機器學(xué)習(xí)基礎(chǔ)之《特征工程(2)—特征工程介紹、特征抽取》的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!