词向量之词袋模型(BOW)详解

词向量之词袋模型(BOW)详解目录前言 numpy 实现前言词袋模型 Bag of Wordsmodel BOW 从最初被用在信息检索领域 该模型忽略文本的语法和语序 将其仅仅看作是若干个词汇的集合 文档中每个单词的出现都是独立的 BoW 使用一组无序的单词 words 来表达一段文字或一个文档 例如三个句子如下 句子 1 小孩喜欢吃零食 句子 2 小孩喜欢玩游戏 不喜欢运动 句子 3 大人不喜欢吃零食 喜欢运动 首先

前言

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

词袋模型

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

例如三个句子如下:

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

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

{“小孩”:1,“喜欢”:2,“吃”:3,“零食”:4,“玩”:5,“游戏”:6,“大人”:7,“不”:8,“运动”:9} 
句子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] 

词袋模型的作用

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

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数组的索引 
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/226474.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月16日 下午10:49
下一篇 2026年3月16日 下午10:49


相关推荐

  • chgrp命令

    chgrp命令在 lunix 系统里 文件或目录的权限的掌控以拥有者及所诉群组来管理 可以使用 chgrp 指令取变更文件与目录所属群组 这种方式采用群组名称或群组识别码都可以 Chgrp 命令就是 change nbsp group 的缩写 要被改变的组名必须要在 etc group 文件内存在才行 1 命令格式 chgrp nbsp 选项 nbsp 组 nbsp 文件 2 命令功能 chgrp 命令可采用群组名称或群组识别

    2026年3月18日
    2
  • HDU3577 线段树(区间更新)

    HDU3577 线段树(区间更新)

    2021年9月4日
    67
  • oracle11g安装完成如何打开界面

    oracle11g安装完成如何打开界面找到oracle11g的安装路径下的tnsnames.ora复制该文件到下面对应的文件替换即可(该文件(压缩包名instantclient_11_2可以自己下载,也可以向我要qq1406697403,下载后任意建一个文件夹如本文oracle11,将该压缩包解压后放到其中)然后做替换(看图)准备好plsql打开如下设置如:现在可以登录了!

    2022年7月25日
    76
  • C语言中u8 u16 u32含义,有关stm32的问题,程序里面的u8、u16这些是什么意思啊「建议收藏」

    C语言中u8 u16 u32含义,有关stm32的问题,程序里面的u8、u16这些是什么意思啊「建议收藏」u8是unsignedchar,u16是unsignedshort,u32是unsignedlong。u8,u16,u32都是C语言数据类型,分别代表8位,16位,32位长度的数据类型,一个字节是8位,所以u8是1个字节,u16是2个字节,u32是4个字节。可以在stm32库头文件中找到数据类型的声明在stdint.h中:typedefunsignedcharuint8_t;typed…

    2022年10月9日
    6
  • 寄存器与七种寻址方式

    寄存器与七种寻址方式

    2021年12月4日
    46
  • java和 javaw 以及 javaws的区别

    java ,javaw 和 javaws的区别:首先,所有的这些都是java的启动装置,java.exe经常使用,当使用命令行输出到window的时候,会有java.exe进程,通过任务管理器可以看到。通常我们执行一些小的java程序的时候会有java.exe进程在运行。javaw.exe对于我们也比较特殊,我们也能够通过任务管理器看到javaw.exe进程的运行。javaws通

    2022年4月4日
    68

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号