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

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

在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. Head First Servlets & JSP 学习笔记 第二章 —— Web应用体系结构

    Servlet没有main()方法,所以Servlet受其他人控制,这个其他人就是容器!而Tomcat就是一种容器. 容器向Servlet提供Http请求和Http响应:容器来调用Servlet的do ...

  2. illegal multibyte sequence python3

    错误信息如下: page_data = m.decode('gbk') UnicodeDecodeError: 'gbk' codec can't decode byte 0xa7 in positi ...

  3. oracle数据库冷恢复

    场       景:客户的服务器是在虚拟机上,结果虚拟机的服务器的硬盘坏掉了.硬盘换掉后,系统成功恢复出来,但是登录虚拟机后,数据库无法启动. 解决方案:通过冷恢复将数据库还原.在自己的电脑上搭建一个 ...

  4. 详解Cookie纪要

    参考文档链接:http://mp.weixin.qq.com/s?__biz=MzAxODE2MjM1MA==&mid=2651552892&idx=1&sn=126a1d32 ...

  5. background 和渐变 总结

    一,background-position:(图片定位) 三种写法: 1):按%比,左上角最小(0%,0%),右下角最大(100%,%100): 2):(x,y)左上角最小(0,0),右下角最大(ma ...

  6. PHP 文件操作代码

    <?php //echo filetype("./1.jpg"); //判断文件类型 文件:file //echo filetype("./code"); ...

  7. Android.Tools.Summary

    Android平台上工具的总结 每个工具的详细使用和深入理解参考每个工具相关的blog. 1. Android SDK中提供的工具 http://developer.android.com/tools ...

  8. libjpeg安装和使用

    转自: http://blog.csdn.net/ice__snow/article/details/52563944 ,有几处做了一部分修改 一. 编译 下载地址 http://www.ijg.or ...

  9. PreparedStatement批量处理和事务

    PreparedStatement批量处理和事务代码如下: /* * PreparedStatement: 1.addBatch() 将一组参数添加到 PreparedStatement对象内部 2. ...

  10. VSFTPD虚拟用户配置

    转载:http://www.cnblogs.com/allenjin/archive/2011/12/03/2274542.html 以下操作验证OK!!!! VSFTPD虚拟用户配置 VSFTP = ...