【特征工程】词袋模型/TF-IDF模型/词汇表模型的代码实现(文本特征提取)
文章目录
- 1.词袋模型
- 2.TF-IDF模型
- 3.词汇表模型
1.词袋模型
- 词集模型:单词构成的集合,集合中仅统计单词的有无,不统计具体单词的出现的次数
- 词袋模型:在词集模型的基础上,统计单词出现的次数
两者区别在于词袋模型增加了对具体单词(特征)频率的维度。
1.1导包
from sklearn.feature_extraction.text import CountVectorizer
1.2函数介绍
CountVectorizer:收集的文本文档转换为矩阵的令牌数量
class sklearn.feature_extraction.text.CountVectorizer(*, input='content', encoding='utf-8', decode_error='strict', strip_accents=None, lowercase=True, preprocessor=None, tokenizer=None, stop_words=None, token_pattern='(?u)\b\w\w+\b', ngram_range=(1, 1), analyzer='word', max_df=1.0, min_df=1, max_features=None, vocabulary=None, binary=False, dtype=<class 'numpy.int64'>)
常用参数介绍:
- input:string {‘filename’, ‘file’, ‘content’}, default=’content’。如果“filename”,作为参数传递给fit的序列应该是一个文件名列表,需要读取这些文件名以获取要分析的原始内容。如果“file”,序列项必须有一个“read”方法(类文件对象),该方法被调用来获取内存中的字节;否则,输入应该是一个项目序列,类型可以是string或byte。
- encoding:string, default=’utf-8’,如果字节或文件被给予分析,这种编码被用来解码。
- lowercase:bool, default=True。在标记之前将所有字符转换为小写。
- analyzer:string, {‘word’, ‘char’, ‘char_wb’} or callable, default=’word’。该特征是由n个字母组成还是由n个字母组成。选择“char_wb”创建角色-gram只从文本单词边界;字格词带的边缘空间。
- stop_words:string {‘english’}, list, default=None。如果“english”,则使用内置的英语停止词列表。如果“english”,则使用内置的英语停止词列表。如果一个列表,则假定该列表包含停止词,所有这些词都将从结果标记中删除。只适用于analyzer == ‘word’。
- min_df:float in range [0.0, 1.0] or int, default=1。在构建词汇表时,忽略那些文档频率严格低于给定阈值的术语。这个值在文献中也称为cut-off。如果是浮点数,则该参数表示文档的比例,整数绝对计数。
1.3 代码示例
corpus = ['This is the first document.','This document is the second document.','And this is the third one.','Is this the first document?',]
vectorizer = CountVectorizer()
X = vectorizer.fit_transform(corpus)
# 获取词袋化特征向量
print(X.toarray())
# 获取对应的字节名称
print(vectorizer.get_feature_names())
输出:
[[0 1 1 1 0 0 1 0 1][0 2 0 1 0 1 1 0 1][1 0 0 1 1 0 1 1 1][0 1 1 1 0 0 1 0 1]]
['and', 'document', 'first', 'is', 'one', 'second', 'the', 'third', 'this']
使用现有的词袋的词汇表,对其他文本进行特征提取,我们定义词袋的特征空间叫做词汇表(vocabulary),针对其他文本进行词袋处理时,可以直接使用现有的词汇表:
my_vocalulary = vectorizer.vocabulary_ # 获取词汇表,术语到特征索引的映射,属于字典类型。
new_vectorizer = CountVectorizer(vocabulary=my_vocalulary)
new_corpus = ['And the first']
new_X = new_vectorizer.transform(new_corpus) # 无需再fit,直接使用transform函数
print(new_X.toarray())
print(new_vectorizer.get_feature_names())
输出:
[[1 0 1 0 0 0 1 0 0]]
['and', 'document', 'first', 'is', 'one', 'second', 'the', 'third', 'this']
2.TF-IDF模型
词频与反文档频率模型(term frequency-inverse document frequency,TF-IDF),用以评估某一字词对于一个文件集或一个语料库的重要程度,字词的重要性跟它在文件中出现的次数成正比,同时跟它在语料库中出现的频率成反比。
TF-IDF的主要思想:TF-IDF是指TF乘IDF,其中词频(TF)是根据某个词或短语在一篇文章中出现的频率即词频,如果频率高,并且在其他文章中很少出现,则认为该词具有很好的区分能力;反文档频率(IDF)指:如果包含词条a的文档越少,也就说n越小,IDF越大,说明词条a具有很好的区分能力。
2.1 导包
from sklearn.feature_extraction.text import TfidfTransformer
2.2 函数介绍
class sklearn.feature_extraction.text.TfidfTransformer(*, norm='l2', use_idf=True, smooth_idf=True, sublinear_tf=False)
参数:
- norm:{‘l1’, ‘l2’}, default=’l2’。每个输出行都有单位范数,可以是: ’ l2 ':向量元素的平方和为1。当应用l2范数时,两个向量之间的余弦相似度是它们的点积。‘l1’:向量元素的绝对值之和为1。
- use_idf:bool, default=True。使inverse-document-frequency权重。
- smooth_idf:bool, default=True。通过在文档频率上增加1来平滑idf权重,就好像在一个额外的文档中只包含集合中的每一个词一样。防止零分歧。
- sublinear_tf:bool, default=False。应用次线性tf缩放,即将tf替换为1 + log(tf)。
具体关于TF-IDF的计算方法可详见scikit-learn中文社区
2.3 代码示例
TF-IDF模型常用和词袋模型配合使用,对词袋模型生成的数组进一步处理。
import numpy as np
count = [[1, 1, 1, 1, 0, 1, 0, 0],[1, 2, 0, 1, 1, 1, 0, 0],[1, 0, 0, 1, 0, 1, 1, 1],[1, 1, 1, 1, 0, 1, 0, 0]]
transformer = TfidfTransformer()
tfidf = transformer.fit_transform(count)
print(tfidf.toarray())
输出:
[[0.38408524 0.46979139 0.58028582 0.38408524 0. 0.38408524 0. 0. ][0.28108867 0.6876236 0. 0.28108867 0.53864762 0.28108867 0. 0. ][0.31091996 0. 0. 0.31091996 0. 0.31091996 0.59581303 0.59581303][0.38408524 0.46979139 0.58028582 0.38408524 0. 0.38408524 0. 0. ]]
3.词汇表模型
虽然词袋模型能表现文本由哪些词汇组成,但是无法表达词汇直接的前后关系,词汇表模型弥补了这方面不足。
由于没有找到现成的API直接供我们使用,因此借用TensorFlow2手动实现了该方法:
import tensorflow as tf # 当前测试版本为2.3
x_text = ['i love you','me too','i me too'
]
x_text_list = [tf.keras.preprocessing.text.text_to_word_sequence(a) for a in x_text] # 拆分
# x_text_list:[['i', 'love', 'you'], ['me', 'too'], ['i', 'me', 'too']]
word_set = set() # 获取所有的单词
for text in x_text_list:for word in text:word_set.add(word)
# word_set:{'i', 'love', 'me', 'too', 'you'}
word_list = list(word_set) # 转换为list
word_index = dict((word, word_list.index(word) + 1) for word in word_list) # 获取序号与单词的映射
# word_index:{'me': 1, 'love': 2, 'too': 3, 'you': 4, 'i': 5}
x_index_list = []
for text in x_text_list:x_index_list.append([word_index.get(word, 0) for word in text])
# x_index_list:[[5, 2, 4], [1, 3], [5, 1, 3]]
result = tf.keras.preprocessing.sequence.pad_sequences(x_index_list).tolist() # 统一长度
print(result)
# [[5, 2, 4], [0, 1, 3], [5, 1, 3]]
最终
i love you -> [5,2,4]
me to -> [0,1,3]
i me to -> [5,1,3]
一般情况下,在深度学习模型的搭建过程中还将搭配嵌入层Embedding作为后续处理
【特征工程】词袋模型/TF-IDF模型/词汇表模型的代码实现(文本特征提取)相关推荐
- 04_机器学习概述,什么是机器学习,应用场景,数据来源与类型,网上可用的数据集、常用数据集数据的结构组成、特征工程是什么、意义、特征抽取、sklearn特征抽取API、文本特征抽取(学习笔记)
机器学习概述 人工智能.机器学习.深度学习之间的关系 机器学习框架 Pytorch Caffe2 theano Chainer Scikit-learn 语言支持 机器学习书籍 <面向机器智能 ...
- 【ML特征工程】第 7 章 :通过K-Means 模型堆叠进行非线性特征化
- 机器学习笔记七——特征工程之特征处理
特征处理 1.类别型特征的处理-特征编码 1.1 处理少量特征 1.2处理大量的类别特征 2.文本特征的处理--文本形式转换为向量形式 2.1 词集模型 2.2 词袋(Bag-of-Words,Bow ...
- 词集模型、词袋模型、词向量模型
分词与统计 词集模型(set of words): 单词构成的集合,集合里面的元素不重复,有且只有一个.所以该模型仅仅考虑词是否在文本中出现,不考虑词频,只需一维. 不足:一个词在文本在文本中出现1次 ...
- 【Python自然语言处理】文本向量化的六种常见模型讲解(独热编码、词袋模型、词频-逆文档频率模型、N元模型、单词-向量模型、文档-向量模型)
觉得有帮助请点赞关注收藏~~~ 一.文本向量化 文本向量化:将文本信息表示成能够表达文本语义的向量,是用数值向量来表示文本的语义. 词嵌入(Word Embedding):一种将文本中的词转换成数字向 ...
- 词袋模型和空间金字塔模型
1 词袋模型 李菲菲认为图像可以类比文档,图像的子块或特征点可以看作是单词,则可以统计图像中所有特征的直方图表示图像,即得到图像的BoW(bag of words)模型.图1是BoW模型的示例图,对于 ...
- 谷歌大规模机器学习:模型训练、特征工程和算法选择 (32PPT下载)
本文转自:http://mp.weixin.qq.com/s/Xe3g2OSkE3BpIC2wdt5J-A 谷歌大规模机器学习:模型训练.特征工程和算法选择 (32PPT下载) 2017-01-26 ...
- BoW词袋模型原理学习及Python实现
文章目录 BoW词袋模型原理 为什么要用BoW模型描述图像 构建BoW码本步骤 编码 测试 BoW词袋模型原理 BoW(Bag of Words)词袋模型最初被用在文本分类中,将文档表示成特征矢量.它 ...
- 机器学习的练功心法(三)——特征工程
文章目录 致谢 3 特征工程 3.1 Sklearn工具及数据集 3.2 数据集 3.3 数据集的划分 3.4 特征工程介绍 3.4.1 为什么需要特征工程 3.4.2 什么是特征工程 3.4.3 特 ...
最新文章
- cisco-ccna-第九章测试-work1-汉语
- 2021.02.04 Visual QA论文阅读
- 分布式ID生成器(来源:架构师之路,2017-06-25 58沈剑 架构师之路)
- 《机器学习项目开发实战》送书活动结果公布
- 将python中的小数直接进位的函数_python保留小数位的三种实现方法
- 数据结构关键路径_2021年厦门大学考研丨能源学院845数据结构参考书目推荐
- V-rep学习笔记:机器人逆运动学数值解法(Damped Least Squares / Levenberg-Marquardt Method)...
- 力扣-1925 统计平方和三元组的数目
- 睡眠排序、面条排序、猴子排序...........................
- iOS 小项目--小费计算器
- 三次Hermite插值
- 计算机查看图片的打开方式,win7系统图片打开方式没有windows照片查看器的解决步骤...
- windows2008server实现端口映射代理
- [译]第一章:什么是管理
- 用frp开源工具,实现内网穿透(详细教程)
- 蓝牙电子产品加拿大IC认证周期
- 蚂蚁IPO有人欢呼,也有前员工建群,​群名“错失几千万的人”
- Android中字母大小写切换的快捷键
- 最近瞎忙,比较懒撒,所以要收收心,该学习的学习。
- OpenCASCADE 获取面中心点法向