一、简介
1. 什么是特征提取
将任意数据(如文本或图像)转换为可用于机器学习的数字特征
2. 分类
- 字典特征提取(特征离散化)
- 文本特征提取
- 图像特征提取(深度学习将介绍)
3. 特征提取API
- sklearn.feature_extraction
二、字典特征提取
1. API
- 作用:对字典数据进行特征值化(存在类别信息的做one-hot编码处理)
- sklearn.feature_extraction.DictVectorizer(sparse=True,…)
- DictVectorizer.fit_transform(X)
- X:字典或者包含字典的迭代器返回值
- 返回sparse矩阵
- DictVectorizer.fit_transform(X)
- DictVectorizer.get_feature_names() 返回类别名称
2. 代码演示
from sklearn.feature_extraction import DictVectorizer
data = [{'city': '北京','temperature':100}, {'city': '上海','temperature':60}, {'city': '深圳','temperature':30}]
# 1、实例化一个转换器类
transfer = DictVectorizer(sparse=False)
# 2、调用fit_transform
data = transfer.fit_transform(data)
print("返回结果: \n", data)
# 3. 打印特征名字
print('特征名: \n', transfer.get_feature_names())
三、文本特征提取
1. 英文文本
- sklearn.feature_extraction.text.CountVectorizer(stop_words=[])
- 返回词频矩阵
- CountVectorizer.fit_transform(X)
- X:文本或者包含文本字符串的可迭代对象
- 返回值:返回sparse矩阵
- CountVectorizer.get_feature_names() 返回值:单词列表
- sklearn.feature_extraction.text.TfidfVectorizer
from sklearn.feature_extraction.text import CountVectorizer
data = ["life is short,i like python", "life is is too long,i dislike python"]
transfer = CountVectorizer(stop_words=['is'])
data = transfer.fit_transform(data)
print('文本特征抽取的结果:\n', data.toarray())
print('返回特征名:\n', transfer.get_feature_names())
2. 中文文本
- 使用jieba对中文进行分词处理
import jieba
def cut_word(text):
text = " ".join(list(jieba.cut(text)))
return text
data = ["一种还是一种今天很残酷,明天更残酷,后天很美好,但绝对大部分是死在明天晚上,所以每个人不要放弃今天。",
"我们看到的从很远星系来的光是在几百万年之前发出的,这样当我们看到宇宙时,我们是在看它的过去。",
"如果只用一种方式了解某样事物,你就不会真正了解它。了解事物真正含义的秘密取决于如何将其与我们所了解的事物相联系。"]
data_new = []
for item in data:
data_new.append(cut_word(item))
transfer = CountVectorizer(stop_words=[])
data_new = transfer.fit_transform(data_new)
print('文本特征抽取的结果:\n', data_new.toarray())
print('返回特征名:\n', transfer.get_feature_names())
3. Tf-idf
3.1 Tf-idf介绍
- TF-IDF的主要思想是:
- 如果某个词或短语在一篇文章中出现的概率高,并且在其他文章中很少出现,则认为此词或者短语具有很好的类别区分能力,适合用来分类。
- TF-IDF作用:
- 用以评估一字词对于一个文件集或一个语料库中的其中一份文件的重要程度。
3.2 代码
from sklearn.feature_extraction.text import TfidfVectorizer
def cut_word(text):
text = " ".join(list(jieba.cut(text)))
return text
data = ["一种还是一种今天很残酷,明天更残酷,后天很美好,但绝对大部分是死在明天晚上,所以每个人不要放弃今天。",
"我们看到的从很远星系来的光是在几百万年之前发出的,这样当我们看到宇宙时,我们是在看它的过去。",
"如果只用一种方式了解某样事物,你就不会真正了解它。了解事物真正含义的秘密取决于如何将其与我们所了解的事物相联系。"]
data_new = []
for item in data:
data_new.append(cut_word(item))
transfer = TfidfVectorizer(stop_words=['一种', '不会', '不要'])
data_new = transfer.fit_transform(data_new)
print('文本特征抽取的结果:\n', data_new.toarray())
print('返回特征名:\n', transfer.get_feature_names())