自然语言处理之词袋模型与TF-IDF指标

在自然语言处理中,词袋模型是一种常用的处理文本信息的模型。

我们拿到一段文本信号后,首先应该进行分词以得到一个个token,然后将这些token用向量表示出来再送入机器学习模型中进行训练。词袋模型和TF-IDF就是一种将token转变成向量的方法。

词袋模型:首先定义一些特殊的标记词,统计这些标记词在文本中出现的次数,将这些数字组成一个向量来代表文本。

词袋模型(图片来源:coursera上的Natural Language Processing课程)

如上图所示,有三个文本,分别是"good movie","not a good movie"和“did not like”,选择good,movie,not, a,did和like作为6个标记词,统计这6个词在文本中出现的次数,得到一个如右边表格所示的矩阵,每一行组成的向量代表一个文本。

这样得到了一个将文本转化成向量的模型,这样的模型有两个缺点:

  • 丢失了词的顺序特征
  • 产生的向量是非标准化的

在文本信息中,词的顺序会影响语义的判断,因此丢失了文本中词的顺序特征会造成识别的准确率下降。因此引入n-grams的概念。

在上面的模型中,选取的标记词都是一个单字,如果标记词中包含词组(比如包含两个、三个或者n个单字),那么这样的模型就可以在一定程度上弥补丢失的词的顺序这个缺点,这种方法我们成为n-grams。

n-grams

如图,标记词中加入了两个单词组成的词组,这样重新得到一个矩阵,同样每一行代表一条文本信息。

缺点:当文本过大时会导致过多的特征。

解决方法:剔除一些用处不大的n-grams。

  • 出现频率过高的n-grams。比如英语中的a, the这种对于识别没有用处的冠词,出现频率又极高,可以剔除
  • 出现频率过低的n-grams。比如错别字等,如果模型也考虑了这种词汇可能会导致过拟合。
  • 保留二者之间频率的n-grams。

接下来问题就变成了如何处理出现频率中等的n-grams:

思路:同样依据出现频率来进行筛选。比如出现频率比较低的往往对于不同的文本有较好的区分度。于是引入TF-IDF指标。

TF(Term Frequency,词频):tf ( t, d )表示n-grams在文本d中出现的频次。

计算方法有多种:

TF计算方法

IDF(Inverse document frequency,逆文本频率指数):

  • N = |D|,语料库中所有文本的总数
  • |{d∈D:t∈d}|,有n-gram t出现的所有文本的总和
  • idf(t,D) = log(N/|{d∈D:t∈d}|)

也就是说,如果n-grams在很多个文档中都出现,那么idf值计算出来就很小(最极端的情况,在所有文档中都出现,则idf值为0),这种情况下可以认为这个n-grams对不同文本的区分能力很差。

tfidf(t,d,D)=tf(t,d)·idf(t,D) ,为两个指标之积,那些在一个文本中出现频次高但是很少在其他文本中出现的词被认为对该文本具有很好的区分度,而这样的词就会有一个比较高的TF-IDF值。

总结:

  • 用TF-IDF值来替代词袋模型简单的计数值
  • 对每个向量进行标准化

词袋模型与TF-IDF指标得到的文本表示(进行了L2标准化)

最后是python 代码举例:

from sklearn.feature_extraction.text import TfidfVectorizer
import pandas as pd
text = {"good movie", "not a good movie", "did not like",
        "i like it", "good one"}
tfidf = TfidfVectorizer(min_df=2, max_df=0.5, ngram_range=(1, 2))
features = tfidf.fit_transform(texts)
pd.DataFrame(
    features.todense(),
    columns=tfidf.get_feature_names()
)
运行结果

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏企鹅号快讯

基础 Word2vec的原理介绍

一,词向量的概念 将 word映射到一个新的空间中,并以多维的连续实数向量进行表示叫做“Word Represention” 或 “Word Embedding...

250100
来自专栏机器之心

入门 | 奇异值分解简介:从原理到基础机器学习应用

选自machinelearningmastery 作者:Jason Brownlee 机器之心编译 参与:Panda 矩阵分解在机器学习应用中的重要性无需多言。...

37560
来自专栏深度学习自然语言处理

详解循环神经网络RNN(理论篇)

让我们从一个问题开始,你能理解下面这句英文的意思吗?“working love learning we on deep”,答案显然是无法理解。那么下面这个句子呢...

12130
来自专栏机器之心

专栏 | 云脑科技-实习僧文本匹配模型及基于百度PaddlePaddle的应用

22040
来自专栏闪电gogogo的专栏

IEEE Trans 2006 使用K-SVD构造超完备字典以进行稀疏表示(稀疏分解)

K-SVD可以看做K-means的一种泛化形式,K-means算法总每个信号量只能用一个原子来近似表示,而K-SVD中每个信号是用多个原子的线性组合来表示的。 ...

81690
来自专栏自学笔记

Hidden Markov ModelHMM隐马尔科夫模型

等等,这种序列叫可见状态序列,但在HMM里面,还存在一个隐含状态链,比如这个状态链可能是

32120
来自专栏CSDN技术头条

基于Keras/Python的深度学习模型Dropout正则项

dropout技术是神经网络和深度学习模型的一种简单而有效的正则化方式。 本文将向你介绍dropout正则化技术,并且教你如何在Keras中用Python将其应...

34090
来自专栏杨熹的专栏

CS224d-Day 5: RNN快速入门

---- CS224d-Day 5: 什么是RNN 本文结构: 1.什么是 RNN?和NN的区别? 2.RNN 能做什么?为什么要用 RNN? 3.RNN 怎么...

29050
来自专栏YoungGy

无监督学习之RBM和AutoEncoder

几种学习方式 半监督学习 Transfer Learning Self-talk Learning RBM RBM的类别 Boltzmann Machine R...

38170
来自专栏目标检测和深度学习

KNN算法虹膜图片识别(源码)

32020

扫码关注云+社区

领取腾讯云代金券