codecamp

AI人工智能 词袋(Bag of Word, BoW)模型

词袋(BoW)是自然语言处理中的一种模型,主要用于从文本中提取特征,以便文本可以用于机器学习算法的建模。

现在出现了一个问题,为什么我们需要从文本中提取特征。这是因为机器学习算法无法处理原始数据,它们需要数值数据才能从中提取有意义的信息。将文本数据转换为数值数据的过程称为特征提取或特征编码。

工作原理

这是一种非常简单的从文本中提取特征的方法。假设我们有一个文本文档,并且我们想将其转换为数值数据,或者说想从中提取特征,那么首先这个模型会从文档中的所有单词中提取词汇表。然后,它将使用文档 - 词矩阵来构建模型。通过这种方式,词袋仅将文档表示为单词的集合。文档中单词的顺序或结构信息将被丢弃。

文档 - 词矩阵的概念

词袋算法使用文档 - 词矩阵来构建模型。顾名思义,文档 - 词矩阵是文档中出现的各种单词计数的矩阵。通过这个矩阵,文本文档可以表示为各种单词的加权组合。通过设置阈值并选择更有意义的单词,我们可以构建文档中所有单词的直方图,将其用作特征向量。以下是一个理解文档 - 词矩阵概念的示例:

示例 假设我们有以下两个句子:

  • 句子 1 - 我们正在使用词袋模型。
  • 句子 2 - 词袋模型用于提取特征。

现在,考虑这两个句子,我们有以下 13 个不同的单词:

  • we(我们)
  • are(是)
  • using(使用)
  • the(这)
  • bag(袋)
  • of(的)
  • words(单词)
  • model(模型)
  • is(是)
  • used(被使用)
  • for(用于)
  • extracting(提取)
  • features(特征)

现在,我们需要使用每个句子中的单词计数为每个句子构建一个直方图:

  • 句子 1 - [1,1,1,1,1,1,1,1,0,0,0,0,0]
  • 句子 2 - [0,0,0,1,1,1,1,1,1,1,1,1,1]

通过这种方式,我们已经提取了特征向量。每个特征向量是 13 维的,因为我们有 13 个不同的单词。

统计概念

这个统计概念称为词频 - 逆文档频率(tf-idf)。文档中的每个单词都很重要。统计数据帮助我们理解每个单词的重要性。

词频(tf)

它是衡量每个单词在文档中出现频率的指标。可以通过将每个单词的计数除以给定文档中的总单词数来获得。

逆文档频率(idf)

它是衡量一个单词在给定文档集中对该文档的独特性的指标。为了计算 idf 并制定独特的特征向量,我们需要降低常见单词(如 the)的权重,并提高稀有单词的权重。

在 NLTK 中构建词袋模型

在本节中,我们将定义一组字符串,使用 CountVectorizer 从这些句子中创建向量。

让我们导入必要的包:

from sklearn.feature_extraction.text import CountVectorizer

现在定义这组句子。

sentences = ["We are using the Bag of Words model", "Bag of Words model is used for extracting the features"]
vectorizer = CountVectorizer()
vectorizer.fit_transform(sentences)
print(vectorizer.vocabulary_)

上面的程序生成如下输出。它显示在上面的两个句子中我们有 13 个不同的单词:

{'we': 11, 'are': 0, 'using': 10, 'the': 8, 'bag': 1, 'of': 7,
'word': 12, 'model': 6, 'is': 5, 'used': 9, 'for': 4, 'extracting': 2, 'features': 3}

这些是可以用于机器学习的特征向量(文本到数值形式)。

AI人工智能 分块(Chunking):将数据分成块
AI人工智能 解决问题
温馨提示
下载编程狮App,免费阅读超1000+编程语言教程
取消
确定
目录

AI人工智能监督学习(回归)

关闭

MIP.setData({ 'pageTheme' : getCookie('pageTheme') || {'day':true, 'night':false}, 'pageFontSize' : getCookie('pageFontSize') || 20 }); MIP.watch('pageTheme', function(newValue){ setCookie('pageTheme', JSON.stringify(newValue)) }); MIP.watch('pageFontSize', function(newValue){ setCookie('pageFontSize', newValue) }); function setCookie(name, value){ var days = 1; var exp = new Date(); exp.setTime(exp.getTime() + days*24*60*60*1000); document.cookie = name + '=' + value + ';expires=' + exp.toUTCString(); } function getCookie(name){ var reg = new RegExp('(^| )' + name + '=([^;]*)(;|$)'); return document.cookie.match(reg) ? JSON.parse(document.cookie.match(reg)[2]) : null; }