词集模型:单词构成的集合,每个单词只出现一次。

词袋模型:把每一个单词都进行统计,同时计算每个单词出现的次数。

在train_x中,总共有6篇文档,每一行代表一个样本即一篇文档。我们的目标是将train_x转化为可训练矩阵,即生成每个样本的词向量。可以对train_x分别建立词集模型,词袋模型来解决。

train_x = [["my", "dog", "has", "flea", "problems", "help", "please"],
               ["maybe", "not", "take", "him", "to", "dog", "park", "stupid"],
               ["my", "dalmation", "is", "so", "cute", "I", "love", "him"],
               ["stop", "posting", "stupid", "worthless", "garbage"],
               ["him", "licks", "ate", "my", "steak", "how", "to", "stop", "him"],
               ["quit", "buying", "worthless", "dog", "food", "stupid"]]

1. 词集模型

算法步骤:

1)整合所有的单词到一个集合中,假设最终生成的集合长度为wordSetLen = 31。

2)假设文档/样本数为sampleCnt = 6,则建立一个sampleCnt * wordSetLen = 6 * 31的矩阵,这个矩阵被填入有效值之后,就是最终的可训练矩阵m。

3)遍历矩阵m,填入0,1有效值。0代表当前列的单词没有出现在当前行的样本/文档中,1代表当前列的单词出现在当前行的样本/文档中。

4)最终生成一个6 * 31的可训练矩阵。

2. 词袋模型

词袋模型中,训练矩阵不仅仅只出现0,1还会出现其他数字,这些数字代表的是当前样本中单词出现的次数。

    1. # -*- coding: utf-8 -*-
    2. import numpy as np
    3. def load_data():
    4. """ 1. 导入train_x, train_y """
    5. train_x = [["my", "dog", "has", "flea", "problems", "help", "please"],
    6. ["maybe", "not", "take", "him", "to", "dog", "park", "stupid"],
    7. ["my", "dalmation", "is", "so", "cute", "I", "love", "him"],
    8. ["stop", "posting", "stupid", "worthless", "garbage"],
    9. ["him", "licks", "ate", "my", "steak", "how", "to", "stop", "him"],
    10. ["quit", "buying", "worthless", "dog", "food", "stupid"]]
    11. label = [0, 1, 0, 1, 0, 1]
    12. return train_x, label
    13. def setOfWord(train_x):
    14. """ 2. 所有单词不重复的汇总到一个列表
    15. train_x: 文档合集, 一个样本构成一个文档
    16. wordSet: 所有单词生成的集合的列表
    17. """
    18. wordList = []
    19. length = len(train_x)
    20. for sample in range(length):
    21. wordList.extend(train_x[sample])
    22. wordSet = list(set(wordList))
    23. return wordSet
    24. def create_wordVec(sample, wordSet, mode="wordSet"):
    25. """ 3. 将一个样本生成一个词向量 """
    26. length = len(wordSet)
    27. wordVec = [0] * length
    28. if mode == "wordSet":
    29. for i in range(length):
    30. if wordSet[i] in sample:
    31. wordVec[i] = 1
    32. elif mode == "wordBag":
    33. for i in range(length):
    34. for j in range(len(sample)):
    35. if sample[j] == wordSet[i]:
    36. wordVec[i] += 1
    37. else:
    38. raise(Exception("The mode must be wordSet or wordBag."))
    39. return wordVec
    40. def main(mode="wordSet"):
    41. train_x, label = load_data()
    42. wordSet = setOfWord(train_x)
    43. sampleCnt = len(train_x)
    44. train_matrix = []
    45. for i in range(sampleCnt):
    46. train_matrix.append(create_wordVec(train_x[i], wordSet, "wordBag"))
    47. return train_matrix
    48. if __name__ == "__main__":
    49. train_x, label = load_data()
    50. wordSet = setOfWord(train_x)
    51. train_matrix = main("wordSet")

词袋模型的提出是为了解决文档分类,主要应用在 NLP(Natural Language Process), IR(Information Retrival),CV(Computer Vision)等领域。

以计算机视觉领域为例进行讲解。

模型假设

一个文本或文档可以看做是一袋子单词,不考虑其语法和词序关系,每个词都是独立的。(这里要尤其注意,BoW不考虑词序的时间和空间上的信息)

示例

这样两个文本

John likes to watch movies. Mary likes too. 
John also likes to watch football games. 
对以上构造词典:

{
"John": 1,
"likes": 2,
"to": 3,
"watch": 4,
"movies": 5,
"also": 6,
"football": 7,
"games": 8,
"Mary": 9,
"too": 10
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

则之前的两个文本可以表示为

[1, 2, 1, 1, 1, 0, 0, 0, 1, 1] 
[1, 1, 1, 1, 0, 1, 1, 1, 0, 0]

上面这种向量的表示方法,就是词袋模型了,其中每个分量表示该词在文本中出现的次数,可以看到词序信息已经丢失,每个文档看做一系列不相关的词的集合。

应用举例

在计算机视觉领域,图片分类是很典型的应用,在视觉分类系统中,由于图像的特征并非像文档中能够直接对单词进行赋值,一般直接对图像的像素进行特征表示,得到特征向量。因此需要四人步骤:特征检测-特征表示-词汇表生成-分类器设计,一般的特征表示大都采用局部不变特征表示方法(SIFT特征)进行特征表示。 
例如,一个图片可以由若干个local features(或者叫做patch)表示,用K-means方法把相似的patch聚类,每个聚类中心叫做 codeword,类比于 NLP 中的 word;同样的,图片就类比文本文档。用每个图片得到的 codeword 构建词典,叫做 codebook,得到真正无冗余的特征表示-视觉词袋,类比 NLP 中的词典。随后结合视觉词袋和词频概念得到每个待分类图像的词袋直方图模型对图像进行表示,如下图,之后依次训练分类器,对新输入的图像进行分类。 

词袋模型(BOW, bag of words)的更多相关文章

  1. 计算机视觉中的词袋模型(Bow,Bag-of-words)

    计算机视觉中的词袋模型(Bow,Bag-of-words) Bag-of-words 读 'xw20084898的专栏'的blogBag-of-words model in computer visi ...

  2. 第十九节、基于传统图像处理的目标检测与识别(词袋模型BOW+SVM附代码)

    在上一节.我们已经介绍了使用HOG和SVM实现目标检测和识别,这一节我们将介绍使用词袋模型BOW和SVM实现目标检测和识别. 一 词袋介绍 词袋模型(Bag-Of-Word)的概念最初不是针对计算机视 ...

  3. 词袋模型bow和词向量模型word2vec

    在自然语言处理和文本分析的问题中,词袋(Bag of Words, BOW)和词向量(Word Embedding)是两种最常用的模型.更准确地说,词向量只能表征单个词,如果要表示文本,需要做一些额外 ...

  4. 视觉单词模型、词袋模型BoW

    多用于图像检索.分类 3.2.1.4 视觉单词模型 视觉词袋(BoVW,Bag of Visual Words)模型,是“词袋”(BoW,Bag of Words)模型从自然语言处理与分析领域向图像处 ...

  5. 文本离散表示(一):词袋模型(bag of words)

    一.文本表示 文本表示的意思是把字词处理成向量或矩阵,以便计算机能进行处理.文本表示是自然语言处理的开始环节. 文本表示按照细粒度划分,一般可分为字级别.词语级别和句子级别的文本表示.字级别(char ...

  6. NLP基础——词集模型(SOW)和词袋模型(BOW)

    (1)词集模型(Set Of Words): 单词构成的集合,集合自然每个元素都只有一个,也即词集中的每个单词都只有一个. (2)词袋模型(Bag Of Words): 如果一个单词在文档中出现不止一 ...

  7. 机器学习---文本特征提取之词袋模型(Machine Learning Text Feature Extraction Bag of Words)

    假设有一段文本:"I have a cat, his name is Huzihu. Huzihu is really cute and friendly. We are good frie ...

  8. 文本特征提取---词袋模型,TF-IDF模型,N-gram模型(Text Feature Extraction Bag of Words TF-IDF N-gram )

    假设有一段文本:"I have a cat, his name is Huzihu. Huzihu is really cute and friendly. We are good frie ...

  9. NLP入门(一)词袋模型及句子相似度

      本文作为笔者NLP入门系列文章第一篇,以后我们就要步入NLP时代.   本文将会介绍NLP中常见的词袋模型(Bag of Words)以及如何利用词袋模型来计算句子间的相似度(余弦相似度,cosi ...

  10. 文本向量化及词袋模型 - NLP学习(3-1)

    分词(Tokenization) - NLP学习(1) N-grams模型.停顿词(stopwords)和标准化处理 - NLP学习(2)   之前我们都了解了如何对文本进行处理:(1)如用NLTK文 ...

随机推荐

  1. Asp.net Mvc之Action如何传多个参数

    最近,工作上有一个需要:用户查询日志文件信息,查看某一个具体日志信息,可能同时查看该日志所在日期的其他日志信息列表. 为完成此功能,我打算在URL中传入了两个参数,一个记录此日志时间,另外一个记录日志 ...

  2. DialogActivity

    <?xml version="1.0" encoding="utf-8"?> <resources> <style name=&q ...

  3. Python使用SMTP发送邮件(163,yeah等网易邮箱已测试可以)

    #! /usr/bin/env python# -*- coding: UTF-8 -*-import smtplibfrom email.mime.text import MIMETextmailt ...

  4. (四)创建ROS程序包(就是软件包)

    你的 ROS 程序包都放到下面这个目录里, 切换到这个目录: $ cd ~/catkin_ws/src 使用下面的命令: 创建一个 ROS 程序包 名字就叫:beginner_tutorials $ ...

  5. 20.Mysql锁机制

    20.锁问题锁是计算机协调多个进程或线程并发访问某一资源的机制. 20.1 Mysql锁概述锁类型分为表级锁.页面锁.行级锁.表级锁:一个线程对表进行DML时会锁住整张表,其它线程只能读该表,如果要写 ...

  6. (转)在WCF服务的ServiceReferences.ClientConfig中使用相对路径

    问题: Silverlight项目中添加服务引用后会在Silverlight项目中生成一个ServiceReferences.ClientConfig文件,这个文件中包含了引用服务的绑定(bindin ...

  7. Java.WeakReference-SoftReference-PhantomReference

    Weak Reference, Soft Reference, Phantom Reference 1. Introduction "Weak reference objects, whic ...

  8. Python代码运行应该注意哪些问题?

    Python作为近年来热度一度高涨的编程语言,非常受广大程序员的喜爱,用过之后发现这门语言有很多特点.比如作为一门动态语言它的变量是信手拈来就可以用的,甚至比js还简单,也没有编程语言常见的大括号包含 ...

  9. Linux命令大全完整版

      1. linux系统管理命令 adduser 功能说明:新增用户帐号.语 法:adduser补充说明:在Slackware中,adduser指令是个script程序,利用交谈的方式取得输入的用户帐 ...

  10. JSP 9个内置对象

    JSP内置对象(隐式对象)是JSP容器为每个页面自动实例化的一组对象,开发者可直接使用,也被称为预定义变量. JSP容器提供了9个内置对象 request // javax.servlet.http. ...