spaCy能够比较两个对象,并预测它们的相似程度。 预测相似性对于构建推荐系统或标记重复项很有用。 例如,您可以建议与当前正在查看的用户内容相似的用户内容,或者将支持凭单标记为与现有内容非常相似的副本。

每个Doc、Span和Token都有一个.similarity()方法,它允许您将其与另一个对象进行比较,并确定相似度。当然,相似性总是主观的——“狗”和“猫”是否相似取决于你如何看待它。spaCy的相似模型通常假定一个相当通用的相似性定义。

tokens = nlp(u'dog cat banana')

for token1 in tokens:
for token2 in tokens:
print(token1.similarity(token2))

在这种情况下,模型的预测是很准确的。狗和猫非常相似,而香蕉却不是很相似。相同的标记显然是100%相似的(并不总是精确的1.0,因为向量数学和浮点数的不精确)。

相似性是通过比较词向量或“词嵌入”来确定的,即一个词的多维意思表示。单词向量可以通过像word2vec这样的算法生成,通常是这样的:

important note

为了使比较算法简洁和快速,spaCy的小模型(所有以sm结尾的包)都不使用单词向量,而且这些sm包只包含上下文相关的向量。这意味着您仍然可以使用similarity()方法来比较文档、span和token,但是结果不会很好,单个token不会有任何指定的向量。所以为了使用真正的词向量,你需要下载一个更大的模型:

python -m spacy download en_core_web_lg

内置单词向量的模型使它们成为可用的标记。Token.vector, Doc.vector, Span.vector。文本向量将默认为它们的token向量的平均值。您还可以检查一个token是否有分配的向量,并得到L2规范,它可以用来使向量标准化。

nlp = spacy.load('en_core_web_lg')
tokens = nlp(u'dog cat banana sasquatch') for token in tokens:
print(token.text, token.has_vector, token.vector_norm, token.is_oov)

“dog”、“cat”和“banana”在英语中都很常见,所以它们是模型词汇的一部分,并且带有一个向量。另一方面,“sasquatch”这个词不太常见,也不太常见——所以它的向量表示包含了300个0的维度,这意味着它实际上是不存在的。如果您的应用程序需要包含更多向量的大型词汇表,那么您应该考虑使用一个较大的模型或装入一个完整的向量包,例如,en_vectors_web_lg,其中包含超过100万个唯一的向量。

基于上下文的相似度

除了spaCy内置的单词向量,还有一些根据上下文词汇训练的一些向量,解析、标记和NER模型也依赖于这种上下文中的单词含义的向量表示。当处理管道被应用时,spaCy将文档的内部含义表示为浮点数组,也称为张量。这使得spaCy可以根据周围的单词对单词的意思做出合理的猜测。即使spaCy以前没有见过这个单词,它也会有所了解。因为spaCy使用一个4层的卷积网络,所以张量对一个单词的任意一边的四个单词都很敏感。

例如,这里有三个句子,在不同的语境中包含了“labrador”的单词。

doc1 = nlp(u"The labrador barked.")
doc2 = nlp(u"The labrador swam.")
doc3 = nlp(u"the labrador people live in canada.")
#这边需要注意的是,导入模型不能是md,lg模型,这两个模型计算出来的三个结果是一样 for doc in [doc1, doc2, doc3]:
labrador = doc[1]
dog = nlp(u"dog")
print(labrador.similarity(dog))

尽管模型从来没有见过“labrador”这个词,但它可以很准确地预测它在不同情况下与“dog”的相似性。

整个文档也一样。 在这里,相似性的差异较小,因为所有单词及其顺序都被考虑在内。 但是,特定于上下文的相似性通常仍然非常准确地反映出来。

doc1 = nlp(u"Paris is the largest city in France.")
doc2 = nlp(u"Vilnius is the capital of Lithuania.")
doc3 = nlp(u"An emu is a large bird.") for doc in [doc1, doc2, doc3]:
for other_doc in [doc1, doc2, doc3]:
print(doc.similarity(other_doc))

即使关于巴黎和维尔纽斯的句子由不同的词汇和实体组成,它们都描述了相同的概念,并被认为比关于ems的句子更相似。 在这种情况下,即使拼写错误的“维尔纽斯”版本仍然会产生非常相似的结果。

由相同单词组成的句子可能会被认为是非常相似的,但永远不会完全相同。

docs = [nlp(u"dog bites man"), nlp(u"man bites dog"),
nlp(u"man dog bites"), nlp(u"dog man bites")] for doc in docs:
for other_doc in docs:
print(doc.similarity(other_doc))

有趣的是,“人咬狗”和“狗咬人”被认为比“人咬狗”和“狗咬人”更相似。这可能是一个巧合——或者是“人”被解释为两个句子的主语的结果。

 
链接:https://www.jianshu.com/p/c10c597a528f

spacy词向量的更多相关文章

  1. NLP︱词向量经验总结(功能作用、高维可视化、R语言实现、大规模语料、延伸拓展)

    R语言由于效率问题,实现自然语言处理的分析会受到一定的影响,如何提高效率以及提升词向量的精度是在当前软件环境下,比较需要解决的问题. 笔者认为还存在的问题有: 1.如何在R语言环境下,大规模语料提高运 ...

  2. [Algorithm & NLP] 文本深度表示模型——word2vec&doc2vec词向量模型

    深度学习掀开了机器学习的新篇章,目前深度学习应用于图像和语音已经产生了突破性的研究进展.深度学习一直被人们推崇为一种类似于人脑结构的人工智能算法,那为什么深度学习在语义分析领域仍然没有实质性的进展呢? ...

  3. 开源共享一个训练好的中文词向量(语料是维基百科的内容,大概1G多一点)

    使用gensim的word2vec训练了一个词向量. 语料是1G多的维基百科,感觉词向量的质量还不错,共享出来,希望对大家有用. 下载地址是: http://pan.baidu.com/s/1boPm ...

  4. Deep Learning In NLP 神经网络与词向量

    0. 词向量是什么 自然语言理解的问题要转化为机器学习的问题,第一步肯定是要找一种方法把这些符号数学化. NLP 中最直观,也是到目前为止最常用的词表示方法是 One-hot Representati ...

  5. word2vec生成词向量原理

    假设每个词对应一个词向量,假设: 1)两个词的相似度正比于对应词向量的乘积.即:$sim(v_1,v_2)=v_1\cdot v_2$.即点乘原则: 2)多个词$v_1\sim v_n$组成的一个上下 ...

  6. 学习笔记TF018:词向量、维基百科语料库训练词向量模型

    词向量嵌入需要高效率处理大规模文本语料库.word2vec.简单方式,词送入独热编码(one-hot encoding)学习系统,长度为词汇表长度的向量,词语对应位置元素为1,其余元素为0.向量维数很 ...

  7. 词向量-LRWE模型

    上一节,我们介绍利用文本和知识库融合训练词向量的方法,如何更好的融合这些结构化知识呢?使得训练得到的词向量更具有泛化能力,能有效识别同义词反义词,又能学习到上下文信息还有不同级别的语义信息. 基于上述 ...

  8. NLP︱高级词向量表达(三)——WordRank(简述)

    如果说FastText的词向量在表达句子时候很在行的话,GloVe在多义词方面表现出色,那么wordRank在相似词寻找方面表现地不错. 其是通过Robust Ranking来进行词向量定义. 相关p ...

  9. NLP︱高级词向量表达(二)——FastText(简述、学习笔记)

    FastText是Facebook开发的一款快速文本分类器,提供简单而高效的文本分类和表征学习的方法,不过这个项目其实是有两部分组成的,一部分是这篇文章介绍的 fastText 文本分类(paper: ...

  10. NLP︱高级词向量表达(一)——GloVe(理论、相关测评结果、R&python实现、相关应用)

    有很多改进版的word2vec,但是目前还是word2vec最流行,但是Glove也有很多在提及,笔者在自己实验的时候,发现Glove也还是有很多优点以及可以深入研究对比的地方的,所以对其进行了一定的 ...

随机推荐

  1. 使用Swagger和OpenAPI 3规范定义API接口并集成到SpringBoot

    1. OpenAPI 3 规范介绍及属性定义 参考官方定义:https://swagger.io/specification/ 2. 使用OpenAPI 3规范定义API接口 官方样例参考:https ...

  2. Unit mysqld.service could not be found.

    具体命令 service mysqld status systemctl status mysqld 结果 Unit mysqld.service could not be found. 查看mysq ...

  3. Flink Application Development DataStream API Operators Overview-- Flink应用程序开发DataStream API操作符概览

    目录 概览 DataStream转换 物理分区 任务链和资源组 翻译原文- Application Development DataStream API Operators 概览 操作符将一个或多个D ...

  4. 【ESP32学习】CMake学习

    在之前的博客中提到,ESP-IDF采用的是CMake来构建项目,因此需要学习一下CMake,以对ESP32的开发有更好的把握 参考: Windows下CMake安装教程 从零开始详细介绍CMake C ...

  5. XJTUOJ #1193. 表象[弹幕偏执症]

    题目 https://oj.xjtuicpc.com/problem/1193 恋恋天下第一!(然而本菜鸡总是被阿空锤死而根本开不了normal)TAT 思路 挺吓人的一道题,看起来很像是要匹配加字符 ...

  6. createrepo 命令详解

    createrepo 命令用于创建yum源(软件仓库),即为存放于本地特定位置的众多rpm包建立索引,描述各包所需依赖信息,并形成元数据. 语法: createrepo [option] <di ...

  7. Word10 个人简历office真题

    1.新键Microsoft Word 文档,命名为Word,再打开Word文档,选择[布局],打开[页面设置]右下角的箭头,弹出[页面设置]的窗口,根据题目要求调整[页边距].   2.根据案例题目二 ...

  8. pgsql临时表

    with ete as ( SELECT * from table_name ) SELECT * from ete

  9. Stream操作

    public static void main(String[] args) { List<Parking> parkings = Arrays.asList(Parking.builde ...

  10. C++ OnlineJudge

    基本输入输出 1.接收多行数据,直到文件末尾 1 #include <iostream> 2 //#include <bits/stdc++.h> 3 #include < ...