失眠网,内容丰富有趣,生活中的好帮手!
失眠网 > 特征工程-特征提取:字典特征提取 文本特征提取 jieba分词处理 Tf-idf文本特征提取

特征工程-特征提取:字典特征提取 文本特征提取 jieba分词处理 Tf-idf文本特征提取

时间:2021-08-11 20:02:42

相关推荐

特征工程-特征提取:字典特征提取 文本特征提取 jieba分词处理 Tf-idf文本特征提取

日萌社

人工智能AI:Keras PyTorch MXNet TensorFlow PaddlePaddle 深度学习实战(不定时更新)

什么是特征提取呢?

1 特征提取

1.1 定义

将任意数据(如文本或图像)转换为可用于机器学习的数字特征

注:特征值化是为了计算机更好的去理解数据

特征提取分类: 字典特征提取(特征离散化)文本特征提取图像特征提取(深度学习将介绍)

1.2 特征提取API

sklearn.feature_extraction

2 字典特征提取

作用:对字典数据进行特征值化

sklearn.feature_extraction.DictVectorizer(sparse=True,…) DictVectorizer.fit_transform(X) X:字典或者包含字典的迭代器返回值返回sparse矩阵DictVectorizer.get_feature_names() 返回类别名称

2.1 应用

我们对以下数据进行特征提取

[{'city': '北京','temperature':100},{'city': '上海','temperature':60},{'city': '深圳','temperature':30}]

2.2 流程分析

实例化类DictVectorizer调用fit_transform方法输入数据并转换(注意返回格式)

from sklearn.feature_extraction import DictVectorizerdef dict_demo():"""对字典类型的数据进行特征抽取:return: None"""data = [{'city': '北京','temperature':100}, {'city': '上海','temperature':60}, {'city': '深圳','temperature':30}]# 1、实例化一个转换器类transfer = DictVectorizer(sparse=False)# 2、调用fit_transformdata = transfer.fit_transform(data)print("返回的结果:\n", data)# 打印特征名字print("特征名字:\n", transfer.get_feature_names())return None

注意观察没有加上sparse=False参数的结果

返回的结果:(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']

这个结果并不是我们想要看到的,所以加上参数,得到想要的结果:

返回的结果:[[ 0. 1. 0. 100.][ 1. 0. 0. 60.][ 0. 0. 1. 30.]]特征名字:['city=上海', 'city=北京', 'city=深圳', 'temperature']

之前在学习pandas中的离散化的时候,也实现了类似的效果。我们把这个处理数据的技巧叫做”one-hot“编码

2.3 总结

对于特征当中存在类别信息的我们都会做one-hot编码处理

3 文本特征提取

作用:对文本数据进行特征值化

sklearn.feature_extraction.text.CountVectorizer(stop_words=[])

返回词频矩阵CountVectorizer.fit_transform(X) X:文本或者包含文本字符串的可迭代对象返回值:返回sparse矩阵CountVectorizer.get_feature_names() 返回值:单词列表

sklearn.feature_extraction.text.TfidfVectorizer

3.1 应用

我们对以下数据进行特征提取

["life is short,i like python","life is too long,i dislike python"]

3.2 流程分析

实例化类CountVectorizer调用fit_transform方法输入数据并转换 (注意返回格式,利用toarray()进行sparse矩阵转换array数组)

from sklearn.feature_extraction.text import CountVectorizerdef text_count_demo():"""对文本进行特征抽取,countvetorizer:return: None"""data = ["life is short,i like like python", "life is too long,i dislike python"]# 1、实例化一个转换器类# transfer = CountVectorizer(sparse=False) # 注意,没有sparse这个参数transfer = CountVectorizer()# 2、调用fit_transformdata = transfer.fit_transform(data)print("文本特征抽取的结果:\n", data.toarray())print("返回特征名字:\n", transfer.get_feature_names())return None

返回结果:

文本特征抽取的结果:[[0 1 1 2 0 1 1 0][1 1 1 0 1 1 0 1]]返回特征名字:['dislike', 'is', 'life', 'like', 'long', 'python', 'short', 'too']

问题:如果我们将数据替换成中文?

"人生苦短,我喜欢Python","生活太长久,我不喜欢Python"

那么最终得到的结果是

为什么会得到这样的结果呢,仔细分析之后会发现英文默认是以空格分开的。其实就达到了一个分词的效果,所以我们要对中文进行分词处理

3.3 jieba分词处理

jieba.cut() 返回词语组成的生成器

需要安装下jieba库

pip3 install jieba

3.4 案例分析

对以下三句话进行特征值化

今天很残酷,明天更残酷,后天很美好,但绝对大部分是死在明天晚上,所以每个人不要放弃今天。我们看到的从很远星系来的光是在几百万年之前发出的,这样当我们看到宇宙时,我们是在看它的过去。如果只用一种方式了解某样事物,你就不会真正了解它。了解事物真正含义的秘密取决于如何将其与我们所了解的事物相联系。

分析 准备句子,利用jieba.cut进行分词实例化CountVectorizer将分词结果变成字符串当作fit_transform的输入值

from sklearn.feature_extraction.text import CountVectorizerimport jiebadef cut_word(text):"""对中文进行分词"我爱北京天安门"————>"我 爱 北京 天安门":param text::return: text"""# 用结巴对中文字符串进行分词text = " ".join(list(jieba.cut(text)))return textdef text_chinese_count_demo2():"""对中文进行特征抽取:return: None"""data = ["一种还是一种今天很残酷,明天更残酷,后天很美好,但绝对大部分是死在明天晚上,所以每个人不要放弃今天。","我们看到的从很远星系来的光是在几百万年之前发出的,这样当我们看到宇宙时,我们是在看它的过去。","如果只用一种方式了解某样事物,你就不会真正了解它。了解事物真正含义的秘密取决于如何将其与我们所了解的事物相联系。"]# 将原始数据转换成分好词的形式text_list = []for sent in data:text_list.append(cut_word(sent))print(text_list)# 1、实例化一个转换器类# transfer = CountVectorizer(sparse=False)transfer = CountVectorizer()# 2、调用fit_transformdata = transfer.fit_transform(text_list)print("文本特征抽取的结果:\n", data.toarray())print("返回特征名字:\n", transfer.get_feature_names())return None

返回结果:

Building prefix dict from the default dictionary ...Dumping model to file cache /var/folders/mz/tzf2l3sx4rgg6qpglfb035_r0000gn/T/jieba.cacheLoading model cost 1.032 seconds.['一种 还是 一种 今天 很 残酷 , 明天 更 残酷 , 后天 很 美好 , 但 绝对 大部分 是 死 在 明天 晚上 , 所以 每个 人 不要 放弃 今天 。', '我们 看到 的 从 很 远 星系 来 的 光是在 几百万年 之前 发出 的 , 这样 当 我们 看到 宇宙 时 , 我们 是 在 看 它 的 过去 。', '如果 只用 一种 方式 了解 某样 事物 , 你 就 不会 真正 了解 它 。 了解 事物 真正 含义 的 秘密 取决于 如何 将 其 与 我们 所 了解 的 事物 相 联系 。']Prefix dict has been built succesfully.文本特征抽取的结果:[[2 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 1 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 0 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 0]]返回特征名字:['一种', '不会', '不要', '之前', '了解', '事物', '今天', '光是在', '几百万年', '发出', '取决于', '只用', '后天', '含义', '大部分', '如何', '如果', '宇宙', '我们', '所以', '放弃', '方式', '明天', '星系', '晚上', '某样', '残酷', '每个', '看到', '真正', '秘密', '绝对', '美好', '联系', '过去', '还是', '这样']

但如果把这样的词语特征用于分类,会出现什么问题?

请看问题:

该如何处理某个词或短语在多篇文章中出现的次数高这种情况

3.5 Tf-idf文本特征提取

TF-IDF的主要思想是:如果某个词或短语在一篇文章中出现的概率高,并且在其他文章中很少出现,则认为此词或者短语具有很好的类别区分能力,适合用来分类。TF-IDF作用:用以评估一字词对于一个文件集或一个语料库中的其中一份文件的重要程度。

3.5.1 公式

词频(term frequency,tf)指的是某一个给定的词语在该文件中出现的频率逆向文档频率(inverse document frequency,idf)是一个词语普遍重要性的度量。某一特定词语的idf,可以由总文件数目除以包含该词语之文件的数目,再将得到的商取以10为底的对数得到

最终得出结果可以理解为重要程度。

举例:假如一篇文章的总词语数是100个,而词语"非常"出现了5次,那么"非常"一词在该文件中的词频就是5/100=0.05。而计算文件频率(IDF)的方法是以文件集的文件总数,除以出现"非常"一词的文件数。所以,如果"非常"一词在1,0000份文件出现过,而文件总数是10,000,000份的话,其逆向文件频率就是lg(10,000,000 / 1,0000)=3。最后"非常"对于这篇文档的tf-idf的分数为0.05 * 3=0.15

3.5.2 案例

from sklearn.feature_extraction.text import TfidfVectorizerimport jiebadef cut_word(text):"""对中文进行分词"我爱北京天安门"————>"我 爱 北京 天安门":param text::return: text"""# 用结巴对中文字符串进行分词text = " ".join(list(jieba.cut(text)))return textdef text_chinese_tfidf_demo():"""对中文进行特征抽取:return: None"""data = ["一种还是一种今天很残酷,明天更残酷,后天很美好,但绝对大部分是死在明天晚上,所以每个人不要放弃今天。","我们看到的从很远星系来的光是在几百万年之前发出的,这样当我们看到宇宙时,我们是在看它的过去。","如果只用一种方式了解某样事物,你就不会真正了解它。了解事物真正含义的秘密取决于如何将其与我们所了解的事物相联系。"]# 将原始数据转换成分好词的形式text_list = []for sent in data:text_list.append(cut_word(sent))print(text_list)# 1、实例化一个转换器类# transfer = CountVectorizer(sparse=False)transfer = TfidfVectorizer(stop_words=['一种', '不会', '不要'])# 2、调用fit_transformdata = transfer.fit_transform(text_list)print("文本特征抽取的结果:\n", data.toarray())print("返回特征名字:\n", transfer.get_feature_names())return None

返回结果:

Building prefix dict from the default dictionary ...Loading model from cache /var/folders/mz/tzf2l3sx4rgg6qpglfb035_r0000gn/T/jieba.cacheLoading model cost 0.856 seconds.Prefix dict has been built succesfully.['一种 还是 一种 今天 很 残酷 , 明天 更 残酷 , 后天 很 美好 , 但 绝对 大部分 是 死 在 明天 晚上 , 所以 每个 人 不要 放弃 今天 。', '我们 看到 的 从 很 远 星系 来 的 光是在 几百万年 之前 发出 的 , 这样 当 我们 看到 宇宙 时 , 我们 是 在 看 它 的 过去 。', '如果 只用 一种 方式 了解 某样 事物 , 你 就 不会 真正 了解 它 。 了解 事物 真正 含义 的 秘密 取决于 如何 将 其 与 我们 所 了解 的 事物 相 联系 。']文本特征抽取的结果:[[ 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.436435780.0.21821789 0.0.43643578 0.21821789 0.0.0.0.21821789 0.21821789 0.0.0.218217890. ][ 0.2410822 0.0.0.0.2410822 0.24108220.2410822 0.0.0.0.0.0.0.0.2410822 0.55004769 0.0.0.0.0.2410822 0.0.0.0.0.482164410.0.0.0.0.0.24108220.0.2410822 ][ 0.0.644003 0.48300225 0.0.0.0.0.16100075 0.16100075 0.0.16100075 0.0.161000750.16100075 0.0.12244522 0.0.0.161000750.0.0.0.16100075 0.0.0.0.3220015 0.16100075 0.0.0.16100075 0.0.0. ]]返回特征名字:['之前', '了解', '事物', '今天', '光是在', '几百万年', '发出', '取决于', '只用', '后天', '含义', '大部分', '如何', '如果', '宇宙', '我们', '所以', '放弃', '方式', '明天', '星系', '晚上', '某样', '残酷', '每个', '看到', '真正', '秘密', '绝对', '美好', '联系', '过去', '还是', '这样']

3.6 Tf-idf的重要性

分类机器学习算法进行文章分类中前期数据处理方式

4 小结

特征提取【了解】 将任意数据(如文本或图像)转换为可用于机器学习的数字特征特征提取分类:【了解】 字典特征提取(特征离散化)文本特征提取图像特征提取字典特征提取【知道】 字典特征提取就是对类别型数据进行转换api:sklearn.feature_extraction.DictVectorizer(sparse=True,…) aparse矩阵 1.节省内容2.提高读取效率注意: 对于特征当中存在类别信息的我们都会做one-hot编码处理文本特征提取(英文)【知道】 api:sklearn.feature_extraction.text.CountVectorizer(stop_words=[]) stop_words -- 停用词注意:没有sparse这个参数单个字母,标点符号不做统计文本特征提取(中文)【知道】 注意: 1.在中文文本特征提取之前,需要对句子(文章)进行分词(jieba)2.里面依旧可以使用停用词,进行词语的限制tfidf【知道】 主要思想: 如果某个词或短语在一篇文章中出现的概率高,并且在其他文章中很少出现,则认为此词或者短语具有很好的类别区分能力,适合用来分类tfidf tf -- 词频idf -- 逆向文档频率api:sklearn.feature_extraction.text.TfidfVectorizer注意: 分类机器学习算法进行文章分类中前期数据处理方式

feature_extraction_demo.py

# coding:utf-8from sklearn.feature_extraction import DictVectorizerfrom sklearn.feature_extraction.text import CountVectorizer, TfidfVectorizerimport jiebadef dict_demo():"""字典特征提取:return: None"""# 1.获取数据data = [{'city': '北京', 'temperature': 100},{'city': '上海', 'temperature': 60},{'city': '深圳', 'temperature': 30}]# 2.字典特征提取# 2.1 实例化transfer = DictVectorizer(sparse=True)# 2.2 转换new_data = transfer.fit_transform(data)print(new_data)# 2.3 获取具体属性名names = transfer.get_feature_names()print("属性名字是:\n", names)def english_count_demo():"""文本特征提取-英文:return: None"""# 获取数据data = ["life is is short,i like python","life is too long,i dislike python"]# 文本特征转换# 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)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)def cut_word(text):"""中文分词:param text::return:"""# ret = " ".join(list(jieba.cut(text)))# print(ret)return " ".join(list(jieba.cut(text)))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)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()new_data = transfer.fit_transform(list)# 3.2 查看特征名字names = transfer.get_feature_names()print("特征名字是:\n", names)print(new_data.toarray())print(new_data)if __name__ == '__main__':dict_demo()english_count_demo()chinese_count_demo1()cut_word("我爱你python, 人生苦读,我用python")chinese_count_demo2()tfidf_demo()

如果觉得《特征工程-特征提取:字典特征提取 文本特征提取 jieba分词处理 Tf-idf文本特征提取》对你有帮助,请点赞、收藏,并留下你的观点哦!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。