特征提取
定义
将任意数据(如⽂本或图像)转换为可⽤于机器学习的数字特征
- 注:特征值化是为了计算机更好的去理解数据
特征提取分类:
- 字典特征提取(特征离散化)
- ⽂本特征提取
- 图像特征提取(深度学习将介绍)
特征提取API
sklearn.feature_extraction
字典特征提取
作⽤:对字典数据进⾏特征值化
- sklearn.feature_extraction.DictVectorizer(sparse=True,…)
- DictVectorizer.fit_transform(X)
- X:字典或者包含字典的迭代器返回值
- 返回sparse矩阵
- DictVectorizer.get_feature_names() 返回类别名称
- DictVectorizer.fit_transform(X)
应⽤
我们对以下数据进⾏特征提取
from sklearn.feature_extraction import DictVectorizer
from sklearn.feature_extraction.text import CountVectorizer, TfidfVectorizer
import jieba
# 忽略警告
import warnings
warnings.filterwarnings('ignore')
def dict_demo():
"""
字典特征提取
:return: None
"""
# 1.获取数据
data = [{'city': '北京', 'temperature': 100},
{'city': '上海', 'temperature': 60},
{'city': '深圳', 'temperature': 30}]
# 2.字典特征提取
# 2.1 实例化⼀个转换器类
transfer = DictVectorizer(sparse=True)
# 2.2 调⽤fit_transform转换
new_data = transfer.fit_transform(data)
print(new_data) # 返回结果
# 2.3 获取具体属性名
names = transfer.get_feature_names()
print("属性名字是:\n", names)
dict_demo()
(0, 1) 1.0 (0, 3) 100.0 (1, 0) 1.0 (1, 3) 60.0 (2, 2) 1.0 (2, 3) 30.0 属性名字是: ['city=上海', 'city=北京', 'city=深圳', 'temperature']
⽂本特征提取
作⽤:对⽂本数据进⾏特征值化
- sklearn.feature_extraction.text.CountVectorizer( stop_words = [] )
- 返回词频矩阵
- CountVectorizer.fit_transform(X)
- X : ⽂本或者包含⽂本字符串的可迭代对象
- 返回值 : 返回sparse矩阵
- CountVectorizer.get_feature_names() 返回值 : 单词列表
- sklearn.feature_extraction.text.TfidfVectorizer
英文提取
我们对以下数据进⾏特征提取:
def english_count_demo():
"""
文本特征提取-英文
:return: None
"""
# 获取数据
data = ["life is is short,i like python",
"life is too long,i dislike python"]
# 文本特征转换
# error: transfer = CountVectorizer(sparse=True) # 注意:没有sparse这个参数
transfer = CountVectorizer(stop_words=["dislike"])
new_data = transfer.fit_transform(data)
# 查看特征名字
names = transfer.get_feature_names()
print("特征名字是:\n", names)
print(new_data.toarray()) # 该种显示更加方便查看
print(new_data) # 这种显示节约内存
english_count_demo()
特征名字是: ['is', 'life', 'like', 'long', 'python', 'short', 'too'] [[2 1 1 0 1 1 0] [1 1 0 1 1 0 1]] (0, 1) 1 (0, 0) 2 (0, 5) 1 (0, 2) 1 (0, 4) 1 (1, 1) 1 (1, 0) 1 (1, 4) 1 (1, 6) 1 (1, 3) 1
中文提取
def chinese_count_demo1():
"""
文本特征提取-中文
:return: None
"""
# 获取数据
data = ["人生苦短,我喜欢Python", "生活 太长久,我不喜欢Python"]
# 文本特征转换
transfer = CountVectorizer()
new_data = transfer.fit_transform(data)
# 查看特征名字
names = transfer.get_feature_names()
print("特征名字是:\n", names)
print(new_data.toarray())
print(new_data)
# 发现以 ‘,’或者空格 分割,不符合我们的要求
chinese_count_demo1()
特征名字是: ['人生苦短', '太长久', '我不喜欢python', '我喜欢python', '生活'] [[1 0 0 1 0] [0 1 1 0 1]] (0, 0) 1 (0, 3) 1 (1, 4) 1 (1, 1) 1 (1, 2) 1
jieba分词
- jieba.cut()
- 返回词语组成的⽣成器
def cut_word(text):
"""
中文分词
:param text:
:return:
"""
return " ".join(list(jieba.cut(text)))
# 查看jieba分词的效果
cut_word('我爱你python, 人生苦读,我用python')
Building prefix dict from the default dictionary ... Loading model from cache /var/folders/0q/2y7xgmvn00b1090yx3d_n1140000gn/T/jieba.cache Loading model cost 0.276 seconds. Prefix dict has been built successfully. '我爱你 python , 人生 苦读 , 我用 python'
def chinese_count_demo2():
"""
文本特征提取-中文
:return: None
"""
# 1.获取数据
data = ["一种还是一种今天很残酷,明天更残酷,后天很美好,但绝对大部分是死在明天晚上,所以每个人不要放弃今天。",
"我们看到的从很远星系来的光是在几百万年之前发出的,这样当我们看到宇宙时,我们是在看它的过去。",
"如果只用一种方式了解某样事物,你就不会真正了解它。了解事物真正含义的秘密取决于如何将其与我们所了解的事物相联系。"]
# 2.文章分割
list = []
for temp in data:
list.append(cut_word(temp))
print(list) # 查看分词效果
# 3.文本特征转换
# 3.1 实例化+转化
transfer = CountVectorizer(stop_words=["一种", "今天"])
new_data = transfer.fit_transform(list)
# 3.2 查看特征名字
names = transfer.get_feature_names()
print("特征名字是:\n", names)
print(new_data.toarray())
print(new_data)
chinese_count_demo2()
['一种 还是 一种 今天 很 残酷 , 明天 更 残酷 , 后天 很 美好 , 但 绝对 大部分 是 死 在 明天 晚上 , 所以 每个 人 不要 放弃 今天 。', '我们 看到 的 从 很 远 星系 来 的 光是在 几百万年 之前 发出 的 , 这样 当 我们 看到宇宙 时 , 我们 是 在 看 它 的 过去 。', '如果 只用 一种 方式 了解 某样 事物 , 你 就 不会 真正 了解 它 。 了解事物 真正 含义 的 秘密 取决于 如何 将 其 与 我们 所 了解 的 事物 相 联系 。'] 特征名字是: ['不会', '不要', '之前', '了解', '事物', '光是在', '几百万年', '发出', '取决于', '只用', '后天', '含义', '大部分', '如何', '如果', '宇宙', '我们', '所以', '放弃', '方式', '明天','星系', '晚上', '某样', '残酷', '每个', '看到', '真正', '秘密', '绝对', '美好', '联系','过去', '还是', '这样'] [[0 1 0 0 0 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 1 0] [0 0 1 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 0 1] [1 0 0 4 3 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 0]] (0, 33) 1 (0, 24) 2 (0, 20) 2 (0, 10) 1 (0, 30) 1 (0, 29) 1 (0, 12) 1 (0, 22) 1 (0, 17) 1 (0, 25) 1 (0, 1) 1 (0, 18) 1 (1, 16) 3 (1, 26) 2 (1, 21) 1 (1, 5) 1 (1, 6) 1 (1, 2) 1 (1, 7) 1 (1, 34) 1 (1, 15) 1 (1, 32) 1 (2, 16) 1 (2, 14) 1 (2, 9) 1 (2, 19) 1 (2, 3) 4 (2, 23) 1 (2, 4) 3 (2, 0) 1 (2, 27) 2 (2, 11) 1 (2, 28) 1 (2, 8) 1 (2, 13) 1 (2, 31) 1
Tf-idf⽂本特征提取
- TF-IDF的主要思想是 :如果某个词或短语在⼀篇⽂章中出现的概率⾼,并且在其他⽂章中很少出现,则认为此词或 者短语具有很好的类别区分能⼒,适合⽤来分类。
- TF-IDF作⽤ :⽤以评估⼀字词对于⼀个⽂件集或⼀个语料库中的其中⼀份⽂件的重要程度。
公式
- 词频(term frequency,tf)指的是某⼀个给定的词语在该⽂件中出现的频率
- 逆向⽂档频率(inverse document frequency,idf)是⼀个词语普遍重要性的度量。某⼀特定词语的idf,可以由总 ⽂件数⽬除以包含该词语之⽂件的数⽬,再将得到的商取以10为底的对数得到
def tfidf_demo():
"""
文本特征提取-中文
:return: None
"""
# 1.获取数据
data = ["一种还是一种今天很残酷,明天更残酷,后天很美好,但绝对大部分是死在明天晚上,所以每个人不要放弃今天。",
"我们看到的从很远星系来的光是在几百万年之前发出的,这样当我们看到宇宙时,我们是在看它的过去。",
"如果只用一种方式了解某样事物,你就不会真正了解它。了解事物真正含义的秘密取决于如何将其与我们所了解的事物相联系。"]
# 2.文章分割
list = []
for temp in data:
list.append(cut_word(temp))
print(list) # 查看分词效果
# 3.文本特征转换
# 3.1 实例化+转化
transfer = TfidfVectorizer(stop_words=['⼀种', '不会', '不要']) # 评估一个词对判断文章类型的 重要程度
new_data = transfer.fit_transform(list)
# 3.2 查看特征名字
names = transfer.get_feature_names()
print("特征名字是:\n", names)
print(new_data.toarray())
print(new_data)
tfidf_demo()
['一种 还是 一种 今天 很 残酷 , 明天 更 残酷 , 后天 很 美好 , 但 绝对 大部分 是 死 在 明天 晚上 , 所以 每个 人 不要 放弃 今天 。', '我们 看到 的 从 很 远 星系 来 的 光是在 几百万年 之前 发出 的 , 这样 当 我们 看到宇宙 时 , 我们 是 在 看 它 的 过去 。', '如果 只用 一种 方式 了解 某样 事物 , 你 就 不会 真正 了解 它 。 了解事物 真正 含义 的 秘密 取决于 如何 将 其 与 我们 所 了解 的 事物 相 联系 。'] 特征名字是: ['一种', '之前', '了解', '事物', '今天', '光是在', '几百万年', '发出', '取决于', '只用', '后天', '含义', '大部分', '如何', '如果', '宇宙', '我们', '所以', '放弃', '方式', '明天', '星系', '晚上', '某样', '残酷', '每个', '看到', '真正', '秘密', '绝对', '美好', '联系', '过去', '还是', '这样'] [[0.31502084 0. 0. 0. 0.41421455 0. 0. 0. 0. 0. 0.20710727 0. 0.20710727 0. 0. 0. 0. 0.20710727 0.20710727 0. 0.41421455 0. 0.20710727 0. 0.41421455 0.20710727 0. 0. 0. 0.20710727 0.20710727 0. 0. 0.20710727 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. 0.2410822 ] [0.12153751 0. 0.6392289 0.47942167 0. 0. 0. 0. 0.15980722 0.15980722 0. 0.15980722 0. 0.15980722 0.15980722 0. 0.12153751 0. 0. 0.15980722 0. 0. 0. 0.15980722 0. 0. 0. 0.31961445 0.15980722 0. 0. 0.15980722 0. 0. 0. ]] (0, 18) 0.20710727279309013 (0, 25) 0.20710727279309013 (0, 17) 0.20710727279309013 (0, 22) 0.20710727279309013 (0, 12) 0.20710727279309013 (0, 29) 0.20710727279309013 (0, 30) 0.20710727279309013 (0, 10) 0.20710727279309013 (0, 20) 0.41421454558618026 (0, 24) 0.41421454558618026 (0, 4) 0.41421454558618026 (0, 33) 0.20710727279309013 (0, 0) 0.3150208384859317 (1, 32) 0.24108220270067757 (1, 15) 0.24108220270067757 (1, 34) 0.24108220270067757 (1, 7) 0.24108220270067757 (1, 1) 0.24108220270067757 (1, 6) 0.24108220270067757 (1, 5) 0.24108220270067757 (1, 21) 0.24108220270067757 (1, 26) 0.48216440540135513 (1, 16) 0.5500476874707075 (2, 31) 0.15980722478871637 (2, 13) 0.15980722478871637 (2, 8) 0.15980722478871637 (2, 28) 0.15980722478871637 (2, 11) 0.15980722478871637 (2, 27) 0.31961444957743274 (2, 3) 0.47942167436614913 (2, 23) 0.15980722478871637 (2, 2) 0.6392288991548655 (2, 19) 0.15980722478871637 (2, 9) 0.15980722478871637 (2, 14) 0.15980722478871637 (2, 16) 0.12153751355546512 (2, 0) 0.12153751355546512