【Python机器学习】NLP词中的数学——向量化

我们将文本转换为基本的数值,虽然只是把它们存储在字典中。我们不使用频率字典来描述文档,而是构建词频向量。在Python中,这可以使用列表来实现,但通常它是一个有序的集合或数组:

python">document_vector=[]
doc_length=len(tokens)
for key,value in kite_counts.most_common():document_vector.append(value/doc_length)
print(document_vector)

对于上述列表或者向量,我们可以直接对它们进行数学运算。

如果只处理一个元素,那么在数学上没有什么意思。只有一篇文档对应一个向量是不够的,我们可以获取更多的文档,并为每篇文档创建其对应的向量。但是每个向量内部的值必须都要相对于某个在所有向量上的一致性结果进行计算(即所有文档上有个同样的东西,大家都要对它来计算)。如果要对这些向量进行计算,那么需要相对于一些一致的东西,在公共空间中表示一个位置。向量之间需要有相同的原点,在每个维度上都有相同的表示尺度或者“单位”。这个过程的第一步是计算归一化词项频率,而不是计算文档中的原始词频。第二步是将所有向量都转换到标准长度或维度上去。

此外,我们还希望每个文档向量同一维上的元素值代表同一个词。如果允许向量子啊不同位置上都包含0,也是可以的。我们会在每篇文档中找到独立的词,然后将这些词集合求并集后从中找到每个独立的词。词汇表中的这些词集合通常称为词库

python">from nltk.tokenize import TreebankWordTokenizer
tokenizer=TreebankWordTokenizer()docs=["""
The faster Harry got to the store, the faster and faster Harry would get home.
"""]
docs.append("""
Harry is hairy and faster than Jill
""")
docs.append("""
Jill is not as hairy as Harry
""")
doc_tokens=[]
for doc in docs:doc_tokens=doc_tokens+[sorted(tokenizer.tokenize(doc.lower()))]
print(len(doc_tokens[0]))
all_doc_tokens=sum(doc_tokens,[])
print(len(all_doc_tokens))
lexicon=sorted(set(all_doc_tokens))
print(len(lexicon))
print(lexicon)

尽管有些文档并不包含词库中所有的18个词,但是上面3篇文档的每个文档向量都会包含18个值。每个词条都会被分配向量中的一个槽位(slot),对应的是它在词库中的位置。正如我们所能想到的,向量中某些词条的频率为0:

python">from collections import OrderedDict
zero_vector=OrderedDict((token,0) for token in lexicon)
print(zero_vector)

接下来可以对上述基本向量进行复制,更新每篇文档的向量值,然后将它们存储到数组中:

python">import copy
from collections import Counter
doc_vector=[]
for doc in docs:vec=copy.copy(zero_vector)tokens=tokenizer.tokenize(doc.lower())token_counts=Counter(tokens)for key,value in token_counts.items():vec[key]=value/len(lexicon)doc_vector.append(vec)

现在每篇文档对应一个向量 ,我们有3个向量。实际上,这里的文档词频向量能够做任意向量能做的所有有趣的事情。

下面是一些有关向量和向量空间的知识:

向量空间

向量是线性代数或向量代数的主要组成部分。它是一个有序的数值列表,或者说这些数值是向量空间中的坐标。它描述了空间中的一个位置,或者它也可以用来确定空间中一个特定的方向和大小或距离。空间是所有可能出现在这个空间中的向量的集合。因此,两个值组成的向量在二维向量空间中,而3个值组成的向量在三维向量空间中,以此类推。

一张作图纸或者图像中的像素网格都是很好的二维空间向量。我们可以看到这些坐标顺序的重要性。如果把作图纸上表示位置的x坐标和y坐标倒转,而不倒转所有的向量计算,那么线性代数问题的所有答案都会翻转。由于x坐标和y坐标互相正交,因此作图纸和图像是直线空间或者欧几里得空间的例子。

类似地图和地球仪上的经纬度也是一个二维空间,但是经纬度坐标不是精确正交,所以经纬度构成的向量空间并不是直线空间,这意味着我们计算像二维经纬度向量一样的向量或者非欧几里得空间下的向量锁表示的两点之间举例或相似度时,必须十分小心。

下图是二维向量(5,5)、(3,2)、(-1,1)的图示方法,向量头部用于表示向量空间中的一个位置,所以,图中的3个向量的头部对应了3组坐标。位置向量的尾部总是在坐标原点。

如果在三维空间,可以用三维向量的坐标x、y、z来表示。或者,由所有经度、维度、高度三元组组成的曲面空间可以描述近地球表面的位置。

但是,我们不仅仅局限于三维空间,我们可以有5维、10维、甚至5000维等各种维度的空间。线性代数对它们的处理方式都是一样的。随着维度的增加,我们可能需要更加强大的算力。

对于自然语言文档向量空间,向量空间的维数是整个语料库中出现的不同词的数量。对于TF,有时我们会用一个大写字母K,称它为K维空间。上述语料库中不同的词的数量也正好是语料库的词汇量的规模,因此在学术论文中,它通常被称为|V|。然后可以用这个K维空间中的一个K维向量来描述每篇文档。在前面3篇Harry和Jill的文档语料库中,K=18。因为人类无法轻易对三维以上的空间进行可视化,所以我们先看二维空间,这样我们就能在当前正在阅读的平面上看到向量的可视化表示。下图汇总,就是18维Harry和Jill文档向量空间的二维视图,此时K被简化为2:

K维向量和一般向量的工作方式是完全一样的,只是不太容易地对其进行可视化而已。既然现在已经有了每个文档的表现形式,并且知道它们共享公共空间,那么接下来就可以对它们进行比较。我们可以通过向量相减,然后计算结果向量的大小来得到两个向量之间的欧几里得距离,也称为2范数距离。

如果两个向量的方向相似,他们就“相似”。他们可能具有相似的大小(长度),这意味着这两个词频(词项频率)向量所对应的文档长度基本相等。但是,当对文档中词的向量表示进行相似度估算时,我们可能不会关心文档长度。我们在对文档相似度进行估算时希望能够找到相同词的相似使用比例。准确估计相似度会让我们确信,两篇文档可能涉及相似的主题。

余弦相似度仅仅是两个向量夹角的余弦值,可以用欧几里得点积来计算:

A\cdot B=\left | A \right |\left | B \right |\times cos\Theta

余弦相似度的计算很高效,因为点积不需要任何对三角函数求值。此外,余弦相似度的取值范围十分便于处理大多数机器学习问题:-1到+1。

在Python中,可以使用 a.dot(b)==np.linalg.norm(a)*np.linalg.norm(b)/np.cos(theta)求解cos(theta)的关系,得到如下余弦相似度的计算公式:

cos\Theta =\frac{A\cdot B}{\left | A \right |\left | B \right |}

还可以采用纯Python中的计算方法:

python">import mathdef cosine_sim(vec1,vec2):vec1=[val for val in vec1.values()]vec2=[val for val in vec2.values()]dot_prod=0for i,v in enumerate(vec1):dot_prod=dot_prod+v*vec2[i]mag_1=math.sqrt(sum([x**2 for x in vec1]))mag_2=math.sqrt(sum([x**2 for x in vec2]))return dot_prod/(mag_1*mag_2)

所以我们需要将两个向量中的元素成对相乘,然后再把这些乘积加起来,这样就可以得到两个向量的点积。再将得到的点积除以每个向量的模(大小或长度),向量的模等于向量的头部到尾部的欧几里得距离,也就是它的各元素平方和的平方根。上述归一化的点积的输出就像余弦函数一样取-1到+1之间的值,它也是这一两个向量夹角的余弦值。这个值等于短向量在长向量上的投影长度占长向量长度的臂力,它给出的是两个向量指向同一方向的程度。

余弦相似度为1表示两个归一化向量完全相同,它们在所有维度上都指向完全相同的方向。此外,两个向量的长度和大小可能不一样,但是他们指向的方向相同。要记住在计算上述余弦相似度时,两个向量的点积除以每个向量的模的计算可以在点积之前或之后进行。因此,归一化向量在计算点积时他们的长度都已经是1。余弦相似度的值越接近1,两个向量之间的夹角就越小。对于余弦相似度接近于1的NLP文档向量,我们知道这些文档应该使用了比例相同的相似词。因此,那些表示向量彼此接近的文档很可能涉及的是同一主题。

余弦相似度为0表示两个向量之间没有共享任何分量。他们是正交的,在所有维度上都互相垂直。对于NLP种的词频向量,只有想两篇文档没有公共词时才会出现这种情况。因为这些文档使用完全不同的词,所以它们一定在讨论完全不同的东西。当然这并不意味着它们就一定有不同的含义或主题,只表明它们使用完全不同的词。

余弦相似度为-1表示两个向量是反相似的,即完全相反,也就是两个向量指向完全相反的方向。碎玉简单的词频向量,甚至是归一化的词频(词项频率)向量,都不可能会发生这种情况。因为词的数目永远不会是负数,所以词频向量总是处于向量空间的同一象限中。


http://www.ppmy.cn/news/1519306.html

相关文章

MATLAB智能优化算法-学习笔记(2)——变邻域搜索算法求解旅行商问题【过程+代码】

旅行商问题 (TSP) 旅行商问题(Traveling Salesman Problem, TSP)是经典的组合优化问题之一。问题的描述是:给定若干个城市以及每对城市之间的距离,一个旅行商需要从某个城市出发,访问每个城市恰好一次,最后回到出发城市,目标是找到一条总距离最短的环路。TSP 是 NP-har…

SQL 注入之 sqlmap 实战

在网络安全领域,SQL 注入攻击一直是一个严重的威胁。为了检测和利用 SQL 注入漏洞,安全人员通常会使用各种工具,其中 sqlmap 是一款非常强大且广泛使用的开源 SQL 注入工具。本文将详细介绍 sqlmap 的实战用法。 一、sqlmap 简介 sqlmap 是一…

安装vmtools管理虚拟机教程

目录 1.什么是vmtools 2.安装教程 2.1删除和安装 2.2文件的复制和粘贴 2.3指令操作 3.检验效果 4.小结 1.什么是vmtools vmtools就是安装之后可以让我们更好的管理我们的虚拟机; 我们可以设置windows和centos共享的文件夹,让该文件夹实现共享&am…

win11,vscode上用docker环境跑项目

1.首先用dockerfile创建docker镜像 以下是dockerfile文件的内容: FROM pytorch/pytorch:1.11.0-cuda11.3-cudnn8-devel LABEL Service"SparseInstanceActivation"ENV TZEurope/Moscow ENV DETECTRON_TAGv0.6 ARG DEBIAN_FRONTENDnoninteractiveRUN apt-…

milvus多个Querynode,资源消耗都打在一个节点上

milvus 查询时的原理 当读取数据时,MsgStream对象在以下场景中创建: 在 Milvus 中,数据必须先加载后才能读取。当代理收到数据加载请求时,会将请求发送给查询协调器,查询协调器决定如何将分片分配到不同的查询节点。…

【原型设计工具评测】Axure、Figma、Sketch三强争霸

在当今的数字化设计领域,选择合适的原型设计工具对于项目的成功至关重要。Axure、Figma 和 Sketch 是目前市场上最受欢迎的三款原型设计工具,它们各具特色,满足了不同用户的需求。本文将对这三款工具进行详细的对比评测,帮助设计师…

苹果笔记本电脑能不能玩游戏?苹果电脑玩游戏咋样?

过去Mac玩不了游戏最大的问题,就是图形API自成一体,苹果既不支持微软的DirectX,同时为了推广自家的Metal图形API,又对OpenGL和Vulkan两大主流的通用API敬而远之。游戏生态、硬件瓶颈让苹果电脑不适合玩游戏。 不过说到底&#xf…

Qt详解QHostInfo

文章目录 前言QHostInfo简介QHostInfo的优势使用流程概述QHostInfo主要函数1. `QHostInfo::lookupHost()`2. `QHostInfo::fromName()`3. `QHostInfo::addresses()`4. `QHostInfo::error()`5. `QHostInfo::errorString()`使用示例更多用法总结前言 QHostInfo 是 Qt 网络模块中的…

支付平台一般采取哪些措施来保护我的个人信息

支付平台个人信息保护措施概览 支付平台为了保护用户的个人信息,采取了多种安全措施。这些措施主要包括数据加密传输、多重身份验证、实时监测与风险预警系统、安全支付环境的建立等。支付平台通常采用SSL/TLS等加密技术来保障用户信息在传输过程中的安全&#xff…

75.给定一个包含红色、白色和蓝色、共 n 个元素的数组 nums ,实现一个算法原地 对它们进行排序,使得相同颜色的元素相邻,并按照红色、白色、蓝色顺序排列

LeetCode 颜色分类问题详解 一、题目描述 给定一个包含红色、白色和蓝色,共 n 个元素的数组 nums,原地对它们进行排序,使得相同颜色的元素相邻,并按照红色、白色、蓝色顺序排列。 我们使用整数 0、1 和 2 分别表示红色、白色和蓝色。 必须在不使用库内置的 sort 函数的…

mysql查询慢除了索引问题还会是因为什么?

问题 作为一个程序员SQL查询慢的问题在工作和面试中都是会经常遇到的问题, 一般情况下我们都会联想到索引问题, 那么除了索引问题还有什么其他的场景会导致SQL查询慢呢? MySQL执行查询逻辑 例如我们使用可视化工具执行这样一条SQL: select * from user_info where age 10;…

基于ssm+vue+uniapp的农业电商服务系统小程序

开发语言:Java框架:ssmuniappJDK版本:JDK1.8服务器:tomcat7数据库:mysql 5.7(一定要5.7版本)数据库工具:Navicat11开发软件:eclipse/myeclipse/ideaMaven包:M…

网络模型及协议介绍

一.OSI七层模型 OSI Open System Interconnect 开放系统互连模型 以前不同厂家所生产的网络设备的标准是不同的,所以为了统一生产规范就制定了OSI这个生产模型。 作用:降低网络进行数据通信复杂度 这个模型的作用第一降低数据通信的复杂度&#xff…

World of Warcraft [CLASSIC][80][Grandel] Call to Arms: Warsong Gulch

Call to Arms: Warsong Gulch - Quest - 魔兽世界怀旧服CTM4.34《大地的裂变》数据库_大灾变85级魔兽数据库_ctm数据库 10人PVP战歌峡谷,该战场经常用来互刷军衔和荣誉,哈哈 wow plugin_魔兽世界挂机插件-CSDN博客

计算机网络端口

应用在通信过程中是通过端口来识别发送交付的。那么通信的一方是怎么知道对方的应用进程的端口号呢? 2017年12月25日,星期一, 简单点说这些信息都被封装在ip包内, 我个人觉得你现在不太明白的地方是不太清楚数据包在传递过程中…

Word中设置奇数页的页眉为一级标题内容;偶数页的页眉为文章题目

1.在Microsoft Word中设置奇数页和偶数页不同的页眉 可以通过以下步骤进行: 打开Word文档:首先,打开你想要设置页眉的Word文档。 进入页眉和页脚编辑模式: 双击文档顶部的页眉区域,或者在“插入”选项卡中点击“页眉…

Mysql面试专题

mysql学习图 慢查询 什么是慢查询:慢查询是指数据库中查询时间超过指定阈值(美团设置为100ms)的SQL,它是数据库的性能杀手,也是业务优化数据库访问的重要抓手。 其实也就是一些比较慢的查询语句,严重的影…

在Ubuntu 20.04上安装MySQL的方法

前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站。 简介 MySQL 是一个开源的数据库管理系统,通常作为流行的 LAMP(Linux、Apache、MySQL、PHP/Python/Perl&#xf…

【搜索引擎】ElasticSearch 7.x版本

1 Elasticsearch概述 1.1 Elasticsearch是什么 1.2 全文搜索引擎 1.3 Elasticsearch And Solr 1.4 Elasticsearch Or Solr 1.5 Elasticsearch应用案例 2 Elassticsearch入门 2.1 Elasticsearch 安装 2.1.1 下载软件 2.1.2 安装软件 2.1.3 问题解决 2.2 Elasticsearch基本操…

Python知识点:如何使用Elasticsearch与Elasticsearch-py进行全文检索

使用Elasticsearch与elasticsearch-py库进行全文检索可以分为以下几个步骤: 1. 安装elasticsearch-py 首先,确保你已经安装了elasticsearch-py库。你可以使用pip来安装它: pip install elasticsearch2. 连接到Elasticsearch实例 使用elas…