目录

  • 前言
  • 词袋模型
  • 词袋模型的作用
  • 词袋模型的实现

前言

  自然语言处理面临的文本数据往往是非结构化杂乱无章的文本数据,而机器学习算法处理的数据往往是固定长度的输入和输出。因而机器学习并不能直接处理原始的文本数据。必须把文本数据转换成数字,比如向量。

在Neural Network Methods in Natural Language Processing, 2017一书65页有一句话:
在语言处理中,往往使用向量x来表示文本的大量语言学特性。
这个过程就叫做特征提取或者特征编码。一种流行并且简单的特征提取方法就是词袋模型。
  在自然语言处理和文本分析的问题中,词袋模型和词向量(Word Embedding)是两种最常用的模型。更准确地说,词向量只能表征单个词,如果要表示文本,需要做一些额外的处理。下面详细聊一聊词袋模型。

词袋模型

  词袋模型(Bag-of-Words model,BOW)BoW(Bag of Words)词袋模型最初被用在文本分类中,将文档表示成特征矢量。它的基本思想是假定对于一个文本,忽略其词序和语法、句法,仅仅将其看做是一些词汇的集合,而文本中的每个词汇都是独立的。简单说就是讲每篇文档都看成一个袋子(因为里面装的都是词汇,所以称为词袋,Bag of words即因此而来),然后看这个袋子里装的都是些什么词汇,将其分类。如果文档中猪、马、牛、羊、山谷、土地、拖拉机这样的词汇多些,而银行、大厦、汽车、公园这样的词汇少些,我们就倾向于判断它是一篇描绘乡村的文档,而不是描述城镇的。

例如三个句子如下:

句子1:小孩喜欢吃零食。
句子2:小孩喜欢玩游戏,不喜欢运动。
句子3 :大人不喜欢吃零食,喜欢运动。

  首先根据语料中出现的句子分词,然后构建词袋(每一个出现的词都加进来)。计算机不认识字,只认识数字,那在计算机中怎么表示词袋模型呢?其实很简单,给每个词一个位置索引就可以了。小孩放在第一个位置,喜欢放在第二个位置,以此类推。

{“小孩”:1,“喜欢”:2,“吃”:3,“零食”:4,“玩”:5,“游戏”:6,“大人”:7,“不”:8,“运动”:9}

其中key为词,value为词的索引,预料中共有9个单词, 那么每个文本我们就可以使用一个9维的向量来表示。
如果文本中含有的一个词出现了一次,就让那个词的位置置为1,词出现几次就置为几,那么上述文本可以表示为:

句子1:[1,1,1,1,0,0,0,0,0]
句子2:[1,2,0,0,1,1,0,1,1]
句子3:[0,2,1,1,0,0,1,1,1]

该向量与原来文本中单词出现的顺序没有关系,仅仅是词典中每个单词在文本中出现的频率。
  与词袋模型非常类似的一个模型是词集模型(Set of Words,简称SoW),和词袋模型唯一的不同是它仅仅考虑词是否在文本中出现,而不考虑词频。也就是一个词在文本在文本中出现1次和多次特征处理是一样的。在大多数时候,我们使用词袋模型。

词袋模型的作用

  将两篇文本通过词袋模型变为向量模型,通过计算向量的余弦距离来计算两个文本间的相似度。
词袋模型的缺点:

  • 词袋模型最重要的是构造词库,需要维护一个很大的词库。
  • 词袋模型严重缺乏相似词之间的表达。
    • “我喜欢北京”“我不喜欢北京”其实这两个文本是严重不相似的。但词袋模型会判为高度相似。
    • “我喜欢北京”与“我爱北京”其实表达的意思是非常非常的接近的,但词袋模型不能表示“喜欢”和“爱”之间严重的相似关系。(当然词袋模型也能给这两句话很高的相似度,但是注意我想表达的含义)
  • 向量稀疏

为了让词袋模型能够表达更多语义,尝试使用n元语法来构建词袋模型。n表示聚合的词个数,比如2就表示2个2个聚合在一起,叫做2元模型。
例如:

“我,喜欢”
“喜欢,北京”
...

n元模型比词袋模型在某些任务上表现得更好,比如文档分类,但也会带来麻烦。

词袋模型的实现

  对于中文来说,词袋模型首先会进行分词,在分词之后,通过统计每个词在文本中出现的次数,我们就可以得到该文本基于词的特征,如果将各个文本样本的这些词与对应的词频放在一起,就是我们常说的向量化。向量化完毕后一般也会使用TF-IDF进行特征的权重修正,再将特征进行标准化。 再进行一些其他的特征工程后,就可以将数据带入机器学习算法进行分类聚类了。

为了实现方便,本文使用英文来介绍怎么实现。

#  操作词袋模型:
# CountVectorizer:对语料库中出现的词汇进行词频统计,相当于词袋模型。
# 操作方式:将语料库当中出现的词汇作为特征,将词汇在当前文档中出现的频率(次数)作为特征值。
import numpy as np
from sklearn.feature_extraction.text import CountVectorizer
count = CountVectorizer()# 语料库
docs = np.array(["Where there is a will, there is a way.","There is no royal road to learning.",
])
# bag是一个稀疏的矩阵。因为词袋模型就是一种稀疏的表示。
bag = count.fit_transform(docs)
# 输出单词与编号的映射关系。
print(count.vocabulary_)
# 调用稀疏矩阵的toarray方法,将稀疏矩阵转换为ndarray对象。
print(bag)
print(bag.toarray())# where映射为编号8  there映射为编号5······
# 编号也是bag.toarray转换来的ndarray数组的索引

词向量之词袋模型(BOW)详解相关推荐

  1. 词向量系列之One-Hot编码详解

    目录 0.前言 1. 独热编码 1.1 独热编码例子 1.2 独热编码的优点 1.3 独热编码的缺点 1.4 独热编码适用的情况 2. 独热编码的实现 2.1 python简单实现one-hot编码 ...

  2. 词向量技术原理及应用详解(四)——词向量训练

    前文理论介绍完毕,接下来进入实战环节.实践中向量化应用的场景常有不同,但向量文本化的训练和使用方式大同小异.在这里我将采用两种方法:gensim库以及tensorflow来完成词向量实战训练. 一.w ...

  3. 作为SLAM中最常用的闭环检测方法,视觉词袋模型技术详解来了

    摘自:https://mp.weixin.qq.com/s/OZnnuA31tEaVt0vnDOy5hQ 作为SLAM中最常用的闭环检测方法,视觉词袋模型技术详解来了 原创 小翼 飞思实验室 今天 基 ...

  4. bert获得词向量_词向量详解:从word2vec、glove、ELMo到BERT

    目前,词向量(又叫词嵌入)已经成为NLP领域各种任务的必备一步,而且随着bert elmo,gpt等预训练模型的发展,词向量演变为知识表示方法,但其本质思想不变.学习各种词向量训练原理可以很好地掌握N ...

  5. 词向量与词向量拼接_nlp中的词向量对比:word2vec/glove/fastText/elmo/GPT/bert

    本文以QA形式对自然语言处理中的词向量进行总结:包含word2vec/glove/fastText/elmo/bert. 2020年更新:NLP预训练模型的全面总结JayLou娄杰:史上最全!PTMs ...

  6. python 读取图片转换为一维向量_对Python中一维向量和一维向量转置相乘的方法详解...

    对Python中一维向量和一维向量转置相乘的方法详解 在Python中有时会碰到需要一个一维列向量(n*1)与另一个一维列向量(n*1)的转置(1*n)相乘,得到一个n*n的矩阵的情况.但是在pyth ...

  7. python生成词向量_词向量是如何生成的

    终于开了NLP的坑了(`・д・´),这次聊聊词向量是怎样生成的.现在有很多现成的模型,cbow,skip-gram,glove等,在python不同的库里面就可以调用(比如fasttext,genis ...

  8. java词云生成,kumo项目详解

    0. 前言 需要在后端生成一个词云图给小程序. 使用kumo项目实现. 1. demo 首先新建maven项目,prom.xml中加入以下依赖.加完之后记得reload. 要确保自己电脑或者服务器安装 ...

  9. 词向量构造 - 词袋模型

    对于机器学习任务而言,不管是什么类型的数据(语言,声音,图像,视频),都必须转化为数值型数据,一般均为向量或者矩阵.自然语言处理,经过了一个长期的发展过程,近几年取得了重大的突破.自然语言处理的突破主 ...

最新文章

  1. 20162325 金立清 S2 W8 C17
  2. Apache反向代理设置【转载】
  3. java contions_Java基础---数组总结
  4. 03-Arm SiP Services
  5. jmeter学习笔记(十三)debug调试工具
  6. hibernate关联映射:多对一、一对一
  7. SweetAlert – 替代 Alert 的漂亮的提示效果
  8. PHP设计模式——策略模式
  9. javascript函数式_如何以及为什么在现代JavaScript中使用函数式编程
  10. c#语言float转换int,C#Float表达式:将结果float转换为int时的奇怪行为
  11. 如何将电子海图的航线导到gps上_电子海图(ECDIS)使用总结
  12. python用scrapy爬虫豆瓣_Python-用Scrapy爬取豆瓣电影
  13. Aspose.Words操作Word.PDF,让图片和文本垂直居中,水平居中解决方案
  14. configure: error: xml2-config not found. Please check your libxml2 installation
  15. ASP.NET缓存 Cache
  16. matlab在神经网络中的应用,应用matlab实现神经网络
  17. 算法笔记(23)网格搜索及Python代码实现
  18. RQNOJ 341 星门跳跃【解题报告】
  19. Typo Forum
  20. python 进阶案例_Python 进阶内容整理

热门文章

  1. 博文视点译者招募令!
  2. 蓄电池测量原理——TFN DC36060A 高精度充电机 蓄电池放电容量测试仪
  3. openssl之C++实现私(公)钥生成、转换
  4. RPG游戏人物视角控制,相机跟随
  5. php 微信支付 退款接口,php实现微信支付之退款功能
  6. 音视频开发成长之路与音视频知识总结
  7. r语言 siar 代码_sair方法及R操作入门——稳定同位素之食物来源比例分析
  8. 原生JS 实现投掷骰子效果
  9. DSP PWM 模块原理及使用
  10. u盘为什么被写保护?u盘数据写保护如何恢复