文本预处理:词袋模型与向量化

一般对文本预处理或者叫做特征提取,首先是要分词,分词之后就是向量化,也就是训练词向量(其实就是将词和词频对应起来,做成矩阵向量的形式)。下面我们要讲的就是向量化。

1 词袋模型

讲向量化之前,先讲一下词袋模型(Bag of Words,BoW)。词袋模型假设我们不考虑文本中词与词之间的上下文关系,仅仅考虑所有词的权重,而权重与词在文本中出现的频率有关。
词袋模型首先会进行分词,之后,通过统计每个词在文本中出现的次数就可以得到该文本基于词的特征,再将各个文本的词和对应的词频放在一起,就是我们所说的向量化。向量化之后,一般也会使用TF-IDF进行特征的权重修正,再将特征进行标准化等等一些的特征工程手段,就可以将数据带入机器学习算法中进行分类和聚类了。
总结起来,词袋模型就是三板斧:

  • 分词(tokenizing)
  • 统计修订词特征值(counting,或者就记住TF-IDF)
  • 标准化(normalizing)

当然,词袋模型有很大的局限,仅仅考虑了词频,忽略了上下文关系,丢失一部分语义。但是在大多数时候,如果我们的目的是分类聚类,词袋模型的表现还是很好的。

2 向量化

在词袋模型的统计词频这一步,我们会得到该文本所有词的词频,有了词频,我们就能用词向量来表示该文本了。我们直接用 s k l e a r n . f e a t u r e e x t r a c t i o n . t e x t {sklearn.feature_extraction.text} sklearn.featureextraction.text中的 C o u n t V e c t o r i z e r {CountVectorizer} CountVectorizer类做演示,这个类可以帮我们完成文本的词频统计和向量化。且看代码:

from sklearn.feature_extraction.text import CountVectorizer
vectorizer = CountVectorizer()
corpus = [
    'This is the first document.',
    'This is the second second document.',
    'And the third one.',
    'Is this the first document?',
]

print(vectorizer.fit_transform(corpus))

输出如下: 4 {4} 4个文本的词频已经统计出来了,左边括号里第 1 {1} 1个数字代表文本的序号,第 2 {2} 2个数字代表这个词在词表中的序号,注意词的序号是基于所有文档的。第 3 {3} 3个数字就是这个词的词频了。

  (0, 1)	1
  (0, 2)	1
  (0, 6)	1
  (0, 3)	1
  (0, 8)	1
  (1, 5)	2
  (1, 1)	1
  (1, 6)	1
  (1, 3)	1
  (1, 8)	1
  (2, 4)	1
  (2, 7)	1
  (2, 0)	1
  (2, 6)	1
  (3, 1)	1
  (3, 2)	1
  (3, 6)	1
  (3, 3)	1
  (3, 8)	1

这里面有些东西还是需要再详细解释一下的。
我们进一步看看每个文本的词向量和各个特征代表的词:

print(vectorizer.get_feature_names())
print(vectorizer.fit_transform(corpus).toarray())

"""
['and', 'document', 'first', 'is', 'one', 'second', 'the', 'third', 'this']
[[0 1 1 1 0 0 1 0 1]
 [0 1 0 1 0 2 1 0 1]
 [1 0 0 0 1 0 1 1 0]
 [0 1 1 1 0 0 1 0 1]]
"""

我们可以看到一共有 9 {9} 9个词,也就是说每个文本都被表示成了 19 {19} 19维的特征向量,每一维的向量依次对应这个 9 {9} 9个词。另外需要注意一点:英文文本在经过 C o u n t V e c t o r i z e r {CountVectorizer} CountVectorizer处理的时候会有去除停用词的操作,比如 I {I} I这个单词代表“我”,是英文的停用词,不参与词频的统计。
将文本做了词频统计后,我们通常会通过TF-IDF进行词特征值权重修正,这个下一篇博客再写。
向量化方法很好用,也很直接,但是在有些场景下很难使用。比如分词后的词汇表非常大,达到 1000 {1000} 1000万以上,此时如果直接使用向量化的方法,将对应的样本的特征矩阵载入内存,内存就有可能爆掉。这种情况我们应该怎么办呢?第一反应自然就是对特征进行降维,Hash Trick就是非常常用的文本特征降维方法。

3 Hash Trick

在特征处理中,经常利用笛卡尔乘积的方法来构造组合特征,这个方法简单,会使特征数量爆炸式增长。比如一个可以取 N {N} N个不同值的类别特征与一个可以取 M {M} M个不同值的类别特征做笛卡尔乘积,就能构造出 N ∗ M {N*M} NM个组合特征。在大规模文本中,特征的维度对应着分词后词表的大小,所以维度自然而然地爆炸了,这时候就需要降维了。
Hash Trick是一种简单地降维方法,它的目标是把原始的高维特征向量压缩成较低维的特征向量,且尽量不损失原始特征的表达能力。

=====================================================

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
显象: 文本预处理自然语言处理中的重要步骤,它可以帮助我们将自然语言文本转化为计算机可以理解和处理的形式。在文本预处理过程中,我们常常会进行分词、词性标注、停用词去除、词干化与词形还原等操作。 真象: 在文本预处理中,我们需要处理的是自然语言文本。自然语言文本可以包含不同的场景和需求,比如新闻文章、社交媒体评论、电子邮件等。这些文本可能涉及到不同的实体、概念和术语。 特征: 分词是将连续的文本划分成一个个独立的词语或标记的过程。词性标注是为每个词语标注其在句子中的词性,比如名词、动词、形容词等。停用词指那些在文本中频繁出现但通常不携带太多信息的词语,如“的”、“是”、“在”等。去除停用词可以减少噪音,提高后续处理的效果。词干化和词形还原是将单词还原为其原始形式或词干的过程,减少不同形式的单词对模型造成的干扰。 现象: 文本预处理的功能包括提取关键词、构建词袋模型、计算词频、构建词向量等。通过文本预处理,我们可以更好地理解文本内容,从而进行下一步的文本分析和处理。对于分词、词性标注、去除停用词等操作,其评价标准可以是准确性、速度和适用性等。 变化: 在实际应用中,我们可以根据具体需求和场景选择不同的文本预处理方法和工具进行组合。例如,可以使用分词工具库如jieba、NLTK等进行分词操作,使用词性标注工具库如NLTK、Stanford NLP等进行词性标注。停用词列表可以根据领域特定的需求进行定制,词干化和词形还原可以选择不同的方法和库进行实现。整个文本预处理过程可以形成一个流程,按照特定的顺序和规则进行处理。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值