词袋模型(bag-of-words)--- python自然语言处理基础

本文介绍了词袋模型在Python中的应用,包括文本清理、大小写处理、停用词移除、特征维度构建以及TF-IDF的计算。通过使用sklearn库,可以方便地实现从原始文本到TF-IDF特征向量的转换,为自然语言处理任务提供特征表示。
摘要由CSDN通过智能技术生成

source: python machine learning 3rd

词袋模型是NLP的基础,理解掌握了词袋模型的处理方法和步骤是NLP必备的敲门砖。本文将着重介绍梳理使用python对词袋模型的构造和处理过程。

词袋模型的概念

什么是词袋模型?简而言之,词袋模型就是我们使用量化模拟的方式来表达文本的一种方式。

具体而言,词袋模型的构造思路如下:

  1. 使用独特的表征(一般都是字词)来构建词汇表,用于表达整个文本
  2. 建立包含特定文章中词语出现的频率次数的特征维度

由于每个文章中的关键词都不一样,因此词汇表中很多特征维度中的值都是0,因此我们称词袋模型的特征维度是稀疏

文本清理

词袋模型内心是严重排斥不干净的文本的,如果你想运用词袋模型进行NLP分析,首先你得把文本清理干净

清理文本的途径当然是多种多样的,且对不同种类的文本需要清理的对象不同,下面就简单援引一种较好用的常规方法

首先看这段文本:
‘is seven.<br /><br />Title (Brazil): Not Available 😃’
html标签,标点符号,表情符号啥都有,必须多次使用正则表达式来处理,直到文本干净为止:

import re
def preprocessor(text):
	# 去除html标签
    text = re.sub('<[^>]*>', '', text)
    # 简化复杂的emoji符号,如:-) --> :)
    emoticons = re.findall('(?::|;|=)(?:-)?(?:\)|\(|D|P)',
                           text)
    # 标点符号肯定也不能有
    text = (re.sub('[\W]+', ' ', text.lower()) +
            ' '.join(emoticons).replace('-', ''))
    return text

没错,正则表达式很重要(但事实上是不推荐使用正则表达式去除html标签的)

大小写

对于大小写的处理,还是要以具体情况为准。很多情况下,大小写不那么重要,同样使用正则表达式进行替换即可,如果你能够看懂之前代码中的正则表达式,那么这肯定也不是问题

典型的需要保留大小写区别的情况就比如学术文章的处理,此时大写字母可能会代表专门的术语而不是平常的词汇

停用词

词袋模型同样不欢迎停用词(比如like,is,has),因为它们对文本分类问题几乎没有帮助,当然,如果你的NLP问题不涉及文本分类,你可以选择不对停用词进行删除(即使是分类问题,也需要具体问题具体分析,比如说小学生的文章中停用词的使用频率会高于专业作家,此时停用词对于分析文章水平是有一定意义的)

直接上代码:

import nltk

# 下载一次后以后就不用下载了
nltk.download('stopwords')

from nltk.corpus import stopwords

stop = stopwords.words('english')
print([w for w in tokenizer_porter('a runner likes running and runs a lot')[-10:]
if w not in stop])
['runner', 'like', 'run', 'run', 'lot']

其中tokenizer_porter是之后文本特征化中的内容,负责将文本分割成单个字符然后存储在数组上,后文中我们会详细介绍

将词语转换为特征维度

使用python可以很简单就完成这个步骤:

import numpy as np
from sklearn.feature_extraction.text import CountVectorizer

count = CountVectorizer()
docs = np.array([
        'The sun is shining',
        'The weather is sweet',
        'The sun is shining, the weather is sweet, and one and one is two'])
bag = count.fit_transform(docs)

使用sklearn中地CountVectorizer可以一步到位地帮我们完成转换,稍加注意我们此时需要将文本内容存储到numpy一维数组中

查看获得的词汇表:

>>>print(count.vocabulary_)

{'and': 0,
'two': 7,
'shining': 3,
'one': 2,
'sun': 4,
'weather': 8,
'the': 6,
'sweet': 5,
'is': 1}

最后,再次一步到位使用toarray方法完成特征维度的构建:

>>> print(bag.toarray())
[[0 1 0 1 1 0 1 0 0]
[0 1 0 0 0 1 1 0 1]
[2 3 2 1 1 1 2 1 1]]

这三组特征维度分别为分别属于我们的原始文本

原始词频 - raw term frequency

得到了特征维度之后,我们引入一个新的概念 - 原始词频: t f ( t , d ) tf(t, d) tf(t,d)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值