文本预处理:词袋模型(bag of words,BOW)、TF-IDF

文本预处理:词袋模型(bag of words,BOW)、TF-IDF

这篇博客主要整理介绍文本预处理中的词袋模型(bag of words,BOW)和TF-IDF。

一、词袋模型(bag of words,BOW)

词袋模型能够把一个句子转化为向量表示,是比较简单直白的一种方法,它不考虑句子中单词的顺序,只考虑词表(vocabulary)中单词在这个句子中的出现次数。下面直接来看一个例子吧(例子直接用wiki上的例子):

"John likes to watch movies, Mary likes movies too"

"John also likes to watch football games"

对于这两个句子,我们要用词袋模型把它转化为向量表示,这两个句子形成的词表(不去停用词)为:

[‘also’, ‘football’, ‘games’, ‘john’, ‘likes’, ‘mary’, ‘movies’, ‘to’, ‘too’, ‘watch’]

因此,它们的向量表示为:
BOW词向量

scikit-learn中的CountVectorizer()函数实现了BOW模型,下面来看看用法:

from sklearn.feature_extraction.text import CountVectorizer
corpus = [
    "John likes to watch movies, Mary likes movies too",
    "John also likes to watch football games",
]
vectorizer = CountVectorizer()
X = vectorizer.fit_transform(corpus)
print(vectorizer.get_feature_names())
print(X.toarray())

#输出结果:
#['also', 'football', 'games', 'john', 'likes', 'mary', 'movies', 'to', 'too', 'watch']
#[[0 0 0 1 2 1 2 1 1 1]
# [1 1 1 1 1 0 0 1 0 1]]
二、TF-IDF(Term Frequency / Inverse Document Frequency,词频-逆文本频率)

BOW模型有很多缺点,首先它没有考虑单词之间的顺序,其次它无法反应出一个句子的关键词,比如下面这个句子:

"John likes to play football, Mary likes too"

这个句子若用BOW模型,它的词表为:[‘football’, ‘john’, ‘likes’, ‘mary’, ‘play’, ‘to’, ‘too’],则词向量表示为:[1 1 2 1 1 1 1]。若根据BOW模型提取这个句子的关键词,则为 “like”,但是显然这个句子的关键词应该为 “football”。而TF-IDF则可以解决这个问题。TF-IDF看名字也知道包括两部分TF和IDF,TF(Term Frequency,词频)的公式为:
T F ( w ) = 单 词 w 在 文 章 中 出 现 的 次 数 文 章 的 单 词 总 数 TF(w) = \frac{单词w在文章中出现的次数}{文章的单词总数} TF(w)=w
而IDF(inverse document frequency,逆文本频率)的公式为:
I D F ( w ) = l o g ( 语 料 库 中 文 档 的 总 数 包 含 词 w 的 文 档 数 + 1 ) IDF(w) =log( \frac{语料库中文档的总数}{包含词w的文档数 + 1}) IDF(w)=log(w+1)
其中,分母之所以加1是为了防止分母为0。所以,TF-IDF的公式为:
T F − I D F ( w ) = T F ( w ) ∗ I D F ( w ) TF-IDF(w) = TF(w)*IDF(w) TFIDF(w)=TF(w)IDF(w)
TF-IDF值越大说明这个词越重要,也可以说这个词是关键词。关于关键词的判断示例,可以参考TF-IDF与余弦相似性的应用(一):自动提取关键词
下面来看看实际使用,sklearn中封装TF-IDF方法,并且也提供了示例:

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

print(X)
print(X.toarray())

"""
['and', 'document', 'first', 'is', 'one', 'second', 'the', 'third', 'this']
  (0, 8)	0.38408524091481483
  (0, 3)	0.38408524091481483
  (0, 6)	0.38408524091481483
  (0, 2)	0.5802858236844359
  (0, 1)	0.46979138557992045
  (1, 8)	0.281088674033753
  (1, 3)	0.281088674033753
  (1, 6)	0.281088674033753
  (1, 1)	0.6876235979836938
  (1, 5)	0.5386476208856763
  (2, 8)	0.267103787642168
  (2, 3)	0.267103787642168
  (2, 6)	0.267103787642168
  (2, 0)	0.511848512707169
  (2, 7)	0.511848512707169
  (2, 4)	0.511848512707169
  (3, 8)	0.38408524091481483
  (3, 3)	0.38408524091481483
  (3, 6)	0.38408524091481483
  (3, 2)	0.5802858236844359
  (3, 1)	0.46979138557992045
[[0.         0.46979139 0.58028582 0.38408524 0.         0.
  0.38408524 0.         0.38408524]
 [0.         0.6876236  0.         0.28108867 0.         0.53864762
  0.28108867 0.         0.28108867]
 [0.51184851 0.         0.         0.26710379 0.51184851 0.
  0.26710379 0.51184851 0.26710379]
 [0.         0.46979139 0.58028582 0.38408524 0.         0.
  0.38408524 0.         0.38408524]]
"""
本文主要介绍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表示中每个单词的权重不同。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值