特征提取方法: one-hot 和 TF-IDF

one-hot 和 TF-IDF是目前最为常见的用于提取文本特征的方法,本文主要介绍两种方法的思想以及优缺点。

1. one-hot

1.1 one-hot编码

  什么是one-hot编码?one-hot编码,又称独热编码、一位有效编码。其方法是使用N位状态寄存器来对N个状态进行编码,每个状态都有它独立的寄存器位,并且在任意时候,其中只有一位有效。举个例子,假设我们有四个样本(行),每个样本有三个特征(列),如图:

      

上图中我们已经对每个特征进行了普通的数字编码:我们的feature_1有两种可能的取值,比如是男/女,这里男用1表示,女用2表示。那么one-hot编码是怎么搞的呢?我们再拿feature_2来说明:

这里feature_2 有4种取值(状态),我们就用4个状态位来表示这个特征,one-hot编码就是保证每个样本中的单个特征只有1位处于状态1,其他的都是0。

      

对于2种状态、三种状态、甚至更多状态都是这样表示,所以我们可以得到这些样本特征的新表示:

      

one-hot编码将每个状态位都看成一个特征。对于前两个样本我们可以得到它的特征向量分别为

     

1.2 one-hot在提取文本特征上的应用

  one hot在特征提取上属于词袋模型(bag of words)。关于如何使用one-hot抽取文本特征向量我们通过以下例子来说明。假设我们的语料库中有三段话:

    我爱中国

    爸爸妈妈爱我

    爸爸妈妈爱中国

我们首先对预料库分离并获取其中所有的词,然后对每个此进行编号:

    1 我; 2 爱; 3 爸爸; 4 妈妈;5 中国

然后使用one hot对每段话提取特征向量:

 

因此我们得到了最终的特征向量为

    我爱中国  ->   1,1,0,0,1

    爸爸妈妈爱我  ->  1,1,1,1,0

    爸爸妈妈爱中国  ->  0,1,1,1,1

 

优缺点分析

优点:一是解决了分类器不好处理离散数据的问题,二是在一定程度上也起到了扩充特征的作用(上面样本特征数从3扩展到了9)

缺点:在文本特征表示上有些缺点就非常突出了。首先,它是一个词袋模型,不考虑词与词之间的顺序(文本中词的顺序信息也是很重要的);其次,它假设词与词相互独立(在大多数情况下,词与词是相互影响的);最后,它得到的特征是离散稀疏的。

 sklearn实现one hot encode

复制代码
from sklearn import preprocessing  
      
enc = preprocessing.OneHotEncoder()  # 创建对象
enc.fit([[0,0,3],[1,1,0],[0,2,1],[1,0,2]])   # 拟合
array = enc.transform([[0,1,3]]).toarray()  # 转化
print(array)
复制代码

 

2. TF-IDF

  IF-IDF是信息检索(IR)中最常用的一种文本表示法。算法的思想也很简单,就是统计每个词出现的词频(TF),然后再为其附上一个权值参数(IDF)。举个例子:

  现在假设我们要统计一篇文档中的前10个关键词,应该怎么下手?首先想到的是统计一下文档中每个词出现的频率(TF),词频越高,这个词就越重要。但是统计完你可能会发现你得到的关键词基本都是“的”、“是”、“为”这样没有实际意义的词(停用词),这个问题怎么解决呢?你可能会想到为每个词都加一个权重,像这种”停用词“就加一个很小的权重(甚至是置为0),这个权重就是IDF。下面再来看看公式:

  

IF应该很容易理解就是计算词频,IDF衡量词的常见程度。为了计算IDF我们需要事先准备一个语料库用来模拟语言的使用环境,如果一个词越是常见,那么式子中分母就越大,逆文档频率就越小越接近于0。这里的分母+1是为了避免分母为0的情况出现。TF-IDF的计算公式如下:

   

根据公式很容易看出,TF-IDF的值与该词在文章中出现的频率成正比,与该词在整个语料库中出现的频率成反比,因此可以很好的实现提取文章中关键词的目的。

优缺点分析

优点:简单快速,结果比较符合实际

缺点:单纯考虑词频,忽略了词与词的位置信息以及词与词之间的相互关系。

 sklearn实现tfidf

复制代码
from sklearn.feature_extraction.text import CountVectorizer  
from sklearn.feature_extraction.text import TfidfTransformer

tag_list = ['青年 吃货 唱歌',  
            '少年 游戏 叛逆',  
            '少年 吃货 足球'] 

vectorizer = CountVectorizer() #将文本中的词语转换为词频矩阵  
X = vectorizer.fit_transform(tag_list) #计算个词语出现的次数
"""
word_dict = vectorizer.vocabulary_
{'唱歌': 2, '吃货': 1, '青年': 6, '足球': 5, '叛逆': 0, '少年': 3, '游戏': 4}
"""

transformer = TfidfTransformer()  
tfidf = transformer.fit_transform(X)  #将词频矩阵X统计成TF-IDF值  
print(tfidf.toarray())
复制代码

转载于:https://www.cnblogs.com/wynlfd/p/9775282.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
本文主要介绍NLP中的预处理技术。预处理是指将原始文本转换为计算机可以理解和使用的形式。常见的预处理技术包括分词、停用词过滤、词干提取和词向量表示等。这些技术可以帮助我们更好地理解文本数据,从而进行文本分类、情感分析等任务。 使用向量空间模型表示文本可以将文本转换为向量形式,便于计算机进行处理。其中,one-hot表示将每个单词表示为一个唯一的向量,该向量中只有一个元素为1,其余元素为0。tf-idf表示除了考虑单词出现的次数,还考虑了单词在整个文本语料库中的重要性。具体实现可以使用gensim库。 以下是示例代码: ``` import gensim from gensim import corpora, models # 定义文本 text = ['本文主要介绍NLP中的预处理技术。预处理是指将原始文本转换为计算机可以理解和使用的形式。常见的预处理技术包括分词、停用词过滤、词干提取和词向量表示等。这些技术可以帮助我们更好地理解文本数据,从而进行文本分类、情感分析等任务。'] # 分词 texts = [[word for word in text.split()] for text in text] # 创建词典 dictionary = corpora.Dictionary(texts) # 使用doc2bow将文本转换为稀疏向量 corpus = [dictionary.doc2bow(text) for text in texts] # 计算tf-idf值 tfidf = models.TfidfModel(corpus) # 将文本表示为tf-idf向量 corpus_tfidf = tfidf[corpus] # 输出结果 print('one-hot表示:', corpus) print('tf-idf表示:', corpus_tfidf) ``` 输出结果如下: ``` one-hot表示: [[(0, 1), (1, 1), (2, 1), (3, 1), (4, 1), (5, 1), (6, 1), (7, 1), (8, 1), (9, 1), (10, 1), (11, 1), (12, 1), (13, 1), (14, 1)]] tf-idf表示: [[(0, 0.1767766952966369), (1, 0.1767766952966369), (2, 0.1767766952966369), (3, 0.1767766952966369), (4, 0.1767766952966369), (5, 0.1767766952966369), (6, 0.1767766952966369), (7, 0.1767766952966369), (8, 0.1767766952966369), (9, 0.1767766952966369), (10, 0.1767766952966369), (11, 0.1767766952966369), (12, 0.1767766952966369), (13, 0.1767766952966369), (14, 0.1767766952966369)]] ``` 可以看到,one-hot表示中每个单词对应一个唯一的向量,而tf-idf表示中每个单词的权重不同。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值