一、特征提取概要:
1、定义:将任意数据(如文本或图像)转换为可用于机器学习的数字特征。
注:特征值化是为了计算机更好的去理解数据。
2、特征提取分类:
- 字典特征提取(特征离散化)
- 文本特征提取
- 图像特征提取(深度学习介绍)
3、特征提取API:sklearn.feature_extraction
二、字典特征提取:
作用:对字典数据进行特征值化。
1、API:from sklearn.feature_extraction import DictVectorizer
2、sklearn.feature_extraction.DictVectorizer(sparse=True)解析:
- DictVectorizer.fit_transform(X)。
(1) X:字典或者包含字典的迭代器返回值。
(2) 返回sparse矩阵。 - DictVectorizer.get_feature_names()返回类别名称。
3、流程分析:
(1)实例化类DictVectorizer。
(2)调用fit_transform方法输入数据并转换(注意返回格式)
4、代码分析🌰: 对字典类型的数据特征提取
[{'city': '北京', 'temperature': 100},
{'city': '上海', 'temperature': 60},
{'city': '深圳', 'temperature': 30}]
from sklearn.feature_extraction import DictVectorizer
from sklearn.feature_extraction.text import CountVectorizer, TfidfVectorizer
import jieba
def dict_demo():
"""
对字典类型的数据进行特征提取
:return: None
"""
# 1、获取数据
data = [{'city': '北京', 'temperature': 100},
{'city': '上海', 'temperature': 60},
{'city': '深圳', 'temperature': 30}]
# 2.字典特征提取
# 2.1 实例化一个转换器
# transfer = DictVectorizer(sparse=False)
transfer = DictVectorizer(sparse=True)
# 2.2 调用fit_transform进行转换
new_data = transfer.fit_transform(data)
print("字典特征提取-返回的转换结果:\n", new_data)
# 2.3 打印特征名字:获取具体属性名
names = transfer.get_feature_names()
print("字典特征提取-特征名字是:\n", names)
return None
if __name__ == '__main__':
dict_demo()
5、运行结果:
6、字典类型特征提取小结:对于特征当中存在类别信息的,我们都会做one-hot编码处理。
三、文本特征提取:
作用:对文本数据进行特征值化。
1、API:from sklearn.feature_extraction.text import CountVectorizer
2、sklearn.feature_extraction.text.CountVectorizer(stop_words=[])解析:
- 返回词频矩阵。
- CountVectorizer.fit_transform(X)
(1) X:文本或者包含文本字符串的可迭代对象
(2) 返回值:返回sparse矩阵 - CountVectorizer.get_feature_names() 返回值:单词列表
3、sklearn.feature_extraction.text.fidfVectorizer
4、流程分析:
(1)实例化类CountVectorizer。
(2)调用fit_transform方法输入数据并转换(注意返回格式,利用toarray()进行sparse矩阵转换array数组)
5、英文文本特征提取代码演示🌰:["life is short,i like python! Oh ", "life is too long,i dislike python"]
from sklearn.feature_extraction import DictVectorizer
from sklearn.feature_extraction.text import CountVectorizer, TfidfVectorizer
import jieba
def english_text_count_demo():
"""
对文本进行特征提取,countvetorizer - 英文
:return: None
"""
# 1、获取数据集
data = ["life is short,i like python! Oh ", "life is too long,i dislike python"]
# 2、文本特征提取
# 2.1 实例化一个转换器类
# transfer = CountVectorizer(sparse=False) # 注意,没有sparse这个参数
transfer = CountVectorizer()
transfer = CountVectorizer(stop_words=["oh"]) # 单个字母不统计,标点符号也不统计
# 2.2 调用fit_transform
new_data = transfer.fit_transform((data))
print("英文文本特征提取的结果:\n", new_data.toarray())
# 2.3 查看特征名字
names = transfer.get_feature_names()
print("英文文本特征提取-返回的特征名字:\n", names)
# print(new_data.toarray)
# print(new_data)
if __name__ == '__main__':
english_text_count_demo()
5.1、英文特征提取代码运行结果:
6、中文特征提取-01-不用jieba分词-代码🌰:text = ["人生苦短,我喜欢python,我喜欢python", "人生漫长,我不喜欢python!"]
from sklearn.feature_extraction import DictVectorizer
from sklearn.feature_extraction.text import CountVectorizer, TfidfVectorizer
import jieba
def chinese_text_count_demo1():
"""
对文本进行特征提取,countvetorizer - 中文
:return: None
"""
# 1、获取数据集
data = ["人生苦短,我喜欢python,我喜欢python", "人生漫长,我不喜欢python!"]
# 2、文本特征提取
# 2.1 实例化一个转换器类
transfer = CountVectorizer()
# 2.2 调用fit_transform
new_data = transfer.fit_transform((data))
print("中文文本特征提取的结果:\n", new_data.toarray())
# 2.3 查看特征名字
names = transfer.get_feature_names()
print("中文文本特征提取-返回的特征名字:\n", names)
# print(new_data.toarray)
# print(new_data)
if __name__ == '__main__':
chinese_text_count_demo1()
6.1、中文特征提取-01-不用jieba分词-代码运行结果:不支持单个中文字!
7、中文特征提取-02-使用jieba分词:
7.1、jieba分词处理:
(1)、 jieba.cut() : 返回词语组成的生成器,需要安装jieba库。
(2)、分析过程:
- 准备句子,利用 jieba.cut()进行分词。
- 实例化CountVectorizer。
- 将分词结果变成字符串当作fit_transform的输入值。
(3)、定义一个jieba分词方法-代码🌰:
def cut_word(text):
"""
对中文进行分词
"我爱北京天安门" --> "我 爱 北京 天安门"
:param text:
:return: text
"""
# 用结巴对中文字符串进行分词
text = " ".join(list(jieba.cut(text)))
# print(text)
return text
7.2、中文特征提取-02-使用jieba分词代码🌰:
from sklearn.feature_extraction import DictVectorizer
from sklearn.feature_extraction.text import CountVectorizer, TfidfVectorizer
import jieba
def cut_word(text):
"""
对中文进行分词
"我爱北京天安门" --> "我 爱 北京 天安门"
:param text:
:return: text
"""
# 用结巴对中文字符串进行分词
text = " ".join(list(jieba.cut(text)))
# print(text)
return text
def chinese_text_count_demo2():
"""
对文本进行特征提取,countvetorizer - 中文
:return: None
"""
# 1、获取数据集
data = ["不仅百花齐放是美,一枝独秀也是美;不仅清晨的朝阳是美,落日的余晖也是美;不仅树木的嫩芽是美,凋零的落叶也是美。"
"美是芬芳的花朵,让人陶醉;美是甜蜜的蜜糖,让人回味;美是绚丽的彩虹,让人追求。"
"阳光是冬天里的一把火,为我们带来温暖;阳光是黑夜中的一缕曙光,为我们带来希望;阳光是航行时远处的灯塔,为我们指明方向。在阳光下,我们自由地呼吸着同一片空气。"]
# 2.文章分割 - 将原始数据转换成分好词的形式
text_list = []
for temp in data:
text_list.append(cut_word(temp))
print(text_list)
# 3.文本特征提取
# 3.1 实例化一个转换器类 : 会搜索停用词列表:https://blog.csdn.net/u010533386/article/details/51458591粘贴到文档里
transfer = CountVectorizer(stop_words=["一次", "一片"])
# 3.2 调用fit_transform
new_data = transfer.fit_transform((text_list))
print("中文文本特征提取的结果:\n", new_data.toarray())
# 3.3 查看特征名字
names = transfer.get_feature_names()
print("中文文本特征提取-返回的特征名字:\n", names)
# print(new_data.toarray)
# print(new_data)
if __name__ == '__main__':
chinese_text_count_demo2()
7.3、中文特征提取-02-使用jieba分词代码运行结果:
四、Tf-idf 文本特征提取:
1、TF-IDF的主要思想:如果某个词或短语在一片文章中出现的概率高,并且在其他文章中很少出现,则认为此词语或者短语具有很好的类别区分的能力,适合用来分类。
2、TF-IDF作用:用以评估一字词对于一个文件集或一个语料库中的其中一份文件的重要程度。
3、公式:
- 词频(term frequency, tf):指的是某一个给定的词语在该文件中出现的频率。
- 逆向文档频率(inverse document frequency, idf) 是一个词语普遍重要性的度量。某一特定词语的idf,可以由总文件数目除以包含该词语之文件的数目,再将得到的商取以10为底的对数得到这个词的重要程度:
4、Tf-idf的重要性:分类机器学习算法进行文章分类中前期数据处理方式。
5、Tf-idf 文本特征提取 的 API:from sklearn.feature_extraction.text import TfidfVectorizer
6、Tf-idf 文本特征提取代码实现🌰:
from sklearn.feature_extraction import DictVectorizer
from sklearn.feature_extraction.text import CountVectorizer, TfidfVectorizer
import jieba
def dict_demo():
"""
对字典类型的数据进行特征提取
:return: None
"""
# 1、获取数据
data = [{'city': '北京', 'temperature': 100},
{'city': '上海', 'temperature': 60},
{'city': '深圳', 'temperature': 30}]
# 2.字典特征提取
# 2.1 实例化一个转换器
# transfer = DictVectorizer(sparse=False)
transfer = DictVectorizer(sparse=True)
# 2.2 调用fit_transform进行转换
new_data = transfer.fit_transform(data)
print("字典特征提取-返回的转换结果:\n", new_data)
# 2.3 打印特征名字:获取具体属性名
names = transfer.get_feature_names()
print("字典特征提取-特征名字是:\n", names)
return None
def english_text_count_demo():
"""
对文本进行特征提取,countvetorizer - 英文
:return: None
"""
# 1、获取数据集
data = ["life is short,i like python! Oh ", "life is too long,i dislike python"]
# 2、文本特征提取
# 2.1 实例化一个转换器类
# transfer = CountVectorizer(sparse=False) # 注意,没有sparse这个参数
transfer = CountVectorizer()
transfer = CountVectorizer(stop_words=["oh"]) # 单个字母不统计,标点符号也不统计
# 2.2 调用fit_transform
new_data = transfer.fit_transform((data))
print("英文文本特征提取的结果:\n", new_data.toarray())
# 2.3 查看特征名字
names = transfer.get_feature_names()
print("英文文本特征提取-返回的特征名字:\n", names)
# print(new_data.toarray)
# print(new_data)
def cut_word(text):
"""
对中文进行分词
"我爱北京天安门" --> "我 爱 北京 天安门"
:param text:
:return: text
"""
# 用结巴对中文字符串进行分词
text = " ".join(list(jieba.cut(text)))
# print(text)
return text
def chinese_text_count_demo1():
"""
对文本进行特征提取,countvetorizer - 中文
:return: None
"""
# 1、获取数据集
data = ["不仅百花齐放是美,一枝独秀也是美;不仅清晨的朝阳是美,落日的余晖也是美;不仅树木的嫩芽是美,凋零的落叶也是美。"
"美是芬芳的花朵,让人陶醉;美是甜蜜的蜜糖,让人回味;美是绚丽的彩虹,让人追求。"
"阳光是冬天里的一把火,为我们带来温暖;阳光是黑夜中的一缕曙光,为我们带来希望;阳光是航行时远处的灯塔,为我们指明方向。在阳光下,我们自由地呼吸着同一片空气。"]
# 2、文本特征提取
# 2.1 实例化一个转换器类
transfer = CountVectorizer()
# 2.2 调用fit_transform
new_data = transfer.fit_transform((data))
print("中文文本特征提取的结果:\n", new_data.toarray())
# 2.3 查看特征名字
names = transfer.get_feature_names()
print("中文文本特征提取-返回的特征名字:\n", names)
# print(new_data.toarray)
# print(new_data)
def chinese_text_count_demo2():
"""
对文本进行特征提取,countvetorizer - 中文
:return: None
"""
# 1、获取数据集
data = ["不仅百花齐放是美,一枝独秀也是美;不仅清晨的朝阳是美,落日的余晖也是美;不仅树木的嫩芽是美,凋零的落叶也是美。"
"美是芬芳的花朵,让人陶醉;美是甜蜜的蜜糖,让人回味;美是绚丽的彩虹,让人追求。"
"阳光是冬天里的一把火,为我们带来温暖;阳光是黑夜中的一缕曙光,为我们带来希望;阳光是航行时远处的灯塔,为我们指明方向。在阳光下,我们自由地呼吸着同一片空气。"]
# 2.文章分割 - 将原始数据转换成分好词的形式
text_list = []
for temp in data:
text_list.append(cut_word(temp))
print(text_list)
# 3.文本特征提取
# 3.1 实例化一个转换器类 : 会搜索停用词列表:https://blog.csdn.net/u010533386/article/details/51458591粘贴到文档里
transfer = CountVectorizer(stop_words=["一次", "一片"])
# 3.2 调用fit_transform
new_data = transfer.fit_transform((text_list))
print("中文文本特征提取的结果:\n", new_data.toarray())
# 3.3 查看特征名字
names = transfer.get_feature_names()
print("中文文本特征提取-返回的特征名字:\n", names)
# print(new_data.toarray)
# print(new_data)
def tfidf_demo():
"""
对文本进行特征提取,countvetorizer - 中文
:return: None
"""
# 1、获取数据集
data = ["不仅百花齐放是美,一枝独秀也是美;不仅清晨的朝阳是美,落日的余晖也是美;不仅树木的嫩芽是美,凋零的落叶也是美。"
"美是芬芳的花朵,让人陶醉;美是甜蜜的蜜糖,让人回味;美是绚丽的彩虹,让人追求。"
"阳光是冬天里的一把火,为我们带来温暖;阳光是黑夜中的一缕曙光,为我们带来希望;阳光是航行时远处的灯塔,为我们指明方向。在阳光下,我们自由地呼吸着同一片空气。"]
# 2.文章分割 - 将原始数据转换成分好词的形式
text_list = []
for temp in data:
text_list.append(cut_word(temp))
print(text_list)
# 3.文本特征提取
# 3.1 实例化一个转换器类 : 会搜索停用词列表:https://blog.csdn.net/u010533386/article/details/51458591粘贴到文档里
# transfer = CountVectorizer(stop_words= ["一次", "一片"])
transfer = TfidfVectorizer()
# 3.2 调用fit_transform
new_data = transfer.fit_transform((text_list))
print("中文文本特征提取的结果:\n", new_data.toarray())
# 3.3 查看特征名字
names = transfer.get_feature_names()
print("中文文本特征提取-返回的特征名字:\n", names)
if __name__ == '__main__':
# dict_demo()
# english_text_count_demo()
# chinese_text_count_demo1()
# cut_word("我爱你python,人生苦短,我用python")
# chinese_text_count_demo2()
tfidf_demo()
7、TF-IDF运行结果:
五、总结:
1、特征提取:将任意数据(如文本或图像)转换为可以用于机器学习的数字特征。
2、特征提取分类:
(1)字典特征提取(特征离散化)
(2)文本特征提取
(3)图像特征提取
3、字典特征提取:
(1)字典特征提取就是对类别型数据进行转换。
(2)api:sklearn.feature_extraction.DictVectorizer(sparse=True)
aparse:矩阵,1.节省内存; 2.提高读取效率
注意:对于特征当中存在类别信息的我们都会做one-hot编码处理
4、文本特征提取(英文):
(1)api : sklearn.feature_extraction.text.CountVectorizer(stop_words=[])
stop_words -- 停用词
注意:没有sparse这个参数; 单个字母,标点符号不做统计。
5、文本特征提取(中文):
注意:
- 1.在中文文本特征提取之前,需要对句子或文章进行分词(jieba分词)。
- 2.里面依旧可以使用停用词,进行词语的限制。
6、TF-IDF:
(1)主要思想:
1、如果某个词或短语在一篇文章中出现的概率高,并且在其他文章中很少出现,则认为此词或者短语具有很好的权重。
2、 类别区分能力,适合用来分类。
(2)TF-IDF:
1、tf -- 词频
2、idf -- 逆向文档频率
(3) api : sklearn.feature_extraction.text.TfidfVectorizer
(4) 注意 :分类机器学习算法进行文章分类中前期数据处理方式。