词袋模型和词向量模型

词袋模型和词向量模型本文简要介绍了词袋模型、词向量模型的原理和应用。

大家好,又见面了,我是你们的朋友全栈君。

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

所谓BOW,就是将文本/Query看作是一系列词的集合。由于词很多,所以咱们就用袋子把它们装起来,简称词袋。至于为什么用袋子而不用筐(basket)或者桶(bucket),这咱就不知道了。举个例子:

                   文本1:苏宁易购/是/国内/著名/的/B2C/电商/之一

这是一个短文本。“/”作为词与词之间的分割。从中我们可以看到这个文本包含“苏宁易购”,“B2C”,“电商”等词。换句话说,该文本的的词袋由“苏宁易购”,“电商”等词构成。就像这样:

词袋模型和词向量模型

但计算机不认识字,只认识数字,那在计算机中怎么表示词袋模型呢?其实很简单,给每个词一个位置/索引就可以了。例如,我们令“苏宁易购”的索引为0,“电商”的索引为1,其他以此类推。则该文本的词袋就变成了:

词袋模型和词向量模型

是的,词袋变成了一串数字的(索引)的集合。这样计算机就能读懂了。如果用程序来描述的话,就会像:Set<int>(0,1,2…)。当然,刚才的例子中像“苏宁易购”等词只出现了一次,如果出现多次,可能就需要支持重复元素的容器了,如Java/C++中的MultiSet。

可是,在实际的应用中(如:文本的相似度计算),用刚才说的容器是非常不方便的(如果要用,需要额外用Map容器来存储一本字典来表征词和索引的映射关系)。因此我们考虑用更简单的数据结构来组织词袋模型。既然刚才说词是用数字(索引)来表示的,那自然我们会想到数组。例如:

         Intwords[10000] = {1,20,500,0,……}

                                     索引:{0,1,2,3,……}

                                     词:   {苏宁易购,是,国内,B2C,……}

数组的下标表示不同的词,数组中的元素表示词的权重(如:TF,TF-IDF)。更为一般的,词的索引可以用词的HashCode来计算,即:Index(苏宁易购) = HashCode(苏宁易购)。将词散列到数组的某个位置,并且是固定的(理论上会有冲突,需要考虑冲突的问题)。因此,HashCode这个函数起到了字典的作用。转化成了数组,接下来计算余弦相似度啥的就好办多了。这就是词袋模型。

下面讲讲词向量模型。实际上,单个词的词向量不足以表示整个文本,能表示的仅仅是这个词本身。往往,这个词向量是个高维的向量(几万甚至几十万)。先不说它是如何得到的,单说它的应用应该是很广泛的。再举文本相似度的例子,既然词可以用一串数字表示,那么自然可以用余弦相似度或欧式距离计算与之相近的词。这样,词的聚类什么的都可以做了。那长文本怎么办呢?一个简单的办法是把这个文本中包含的词的词向量相加。这样长文本也就表示成了一串数字。可是这种处理方法总让我们觉得怪怪的。看到过有同学做的测试,当文本只有十几个字的时候,这种处理方法还算凑合,字多了,结果就很难看了。至于词向量是怎么获得,咱下回再说。目前word2vec有多种版本可供大家使用。至于像doc2vec,sentence2vec的效果还有待评估。

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

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

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 2020最新版MySQL数据库面试题(一)

    2020最新版MySQL数据库面试题(一)

    2022年2月14日
    40
  • URL过滤技术

    URL过滤技术

    2021年4月15日
    148
  • 电脑中恶意插件后自动安装软件一般有哪些?(软件及安装路径整理中,持续更新)

    电脑中恶意插件后自动安装软件一般有哪些?(软件及安装路径整理中,持续更新)使用windows系统的小伙伴经常会下载安装各种软件,可能非官网途径获取的软件中带有恶意插件导致系统各种弹窗并伴随着各种垃圾软件的自动安装。下面就常见的恶意软件安装路径整理,持续更新C盘 ProgramFiles EXEDOWN servicewin.exe ProgramFiles(x86) AppInsghtesly W…

    2022年4月30日
    74
  • Jetty 与 Tomcat

    Jetty 与 TomcatJetty也是一个“HTTP服务器+Servlet容器Jetty整体架构简单来说,JettyServer就是由多个Connector(连接器)、多个Handler(处理器),以及一个线程池组成。整体结构请看下面这张图。JettyServer可以有多个Connector在不同的端口上监听客户请求。对比一下Tomcat的整体架构,两者非常的相像。区别:第一个区别是Jetty中没有Service的概念,Tomcat中的Service包装了多个连接器和.

    2025年7月6日
    1
  • pycharm安装教程2021.2_pycharm2021.2安装教程

    pycharm安装教程2021.2_pycharm2021.2安装教程前言Python的编辑器有很多比如VisualStudioCode、SublimeText、Atom、jupyternotebook等等但是功能最强使用最多的还是PyCharm,同时也是我使用的最顺手的一款IDE。它是由JetBrains打造的一款功能强大的PythonIDE。比如代码调试、项目管理、代码跳转、智能提示、单元测试、版本控制等等。具有跨平台性,无论Windows、Mac、Linux都可以使用。一款好的IDE能够帮我们快速入门一个新的语言,对于初次使用PyCharm的同学,可能无

    2022年8月26日
    7
  • java 函数式编程(java自定义函数)

    以前写过一篇java8的流操作,人们都说流操作是函数式编程,但函数式编程是什么呢?什么是函数式编程什么是函数式编程?它是一种编程范式,即一切都是数学函数。函数式编程语言里也可以有对象,但通常这些对象都是恒定不变的——要么是函数参数,要什么是函数返回值。函数式编程语言里没有for/next循环,因为这些逻辑意味着有状态的改变。相替代的是,这种循环逻辑在函数式编程语言里是通过递归、把函…

    2022年4月18日
    56

发表回复

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

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