spacy 正在为出现在两个不同位置的唯一单词创建两个单独的标记

问题描述 投票:0回答:1

我不清楚 spacy 如何标记文档中再次出现的单词。在下面的示例中,有两个句子,并且以单词“He”开头。这个词应该产生一个标记吗? spacy 是否会标记文档中的每个单词(甚至更多),即使这些单词是重复的?如果使用 token 来创建嵌入,这会导致单词“he”有 2 个向量吗???感谢任何帮助。

代码:

from spacy.tokens import Doc
import json
s = "He didn't want to pay $20 for this book. He didn't want to eat pizza also!"
doc = nlp(s)
doc_json = doc.to_json()
json_formatted_str = json.dumps(doc_json, indent=2)


mytokens = json.loads(json_formatted_str)['tokens']
for token in mytokens:
  if(token['lemma']=='he'):
    print(token)
Output:
{'id': 0, 'start': 0, 'end': 2, 'tag': 'PRP', 'pos': 'PRON', 'morph': 'Case=Nom|Gender=Masc|Number=Sing|Person=3|PronType=Prs', 'lemma': 'he', 'dep': 'nsubj', 'head': 3}
{'id': 12, 'start': 41, 'end': 43, 'tag': 'PRP', 'pos': 'PRON', 'morph': 'Case=Nom|Gender=Masc|Number=Sing|Person=3|PronType=Prs', 'lemma': 'he', 'dep': 'nsubj', 'head': 15}

问:这两个标记会产生“he”这个词的两个嵌入/向量吗?这似乎不对——所以我的理解有些差距。

谢谢!

我查阅了spacy文档,在此处和谷歌上查看了几个问题,但找不到任何说明。

spacy tokenize
1个回答
0
投票

根据文档,“spaCy 的标记化是非破坏性的,这意味着您始终能够从标记化输出重建原始输入”。换句话说,每个单词都会产生一个单独的标记,无论该单词之前是否出现过。如果不是这种情况,您将无法重建原始输入,因为您会丢失单词。

代币和嵌入不是一回事:

  • A token 是文本的一部分,在本例中是单词或标点符号。 “标记化”是将文本分割成片段的过程。从技术上讲,这样的段(=令牌)可以是单个字符或由多个单词组成的短语。然而,为每个单词创建一个标记是最常见的方法。

  • 嵌入是向量空间中标记的表示。这意味着嵌入是令牌的数字表示。这个想法是相似的单词将有相似的嵌入。

想象一种仅由四个单词组成的语言:“猫”、“狗”、“跑”、“走”。如果您想为这些单词创建嵌入,它可能看起来像这样:

"cat" --> [9, 0]
"dog" --> [8, 0]
"run" --> [0, 4]
"walk" --> [0, 5]

如果您将其映射为图表上的坐标,您会看到“猫”和“狗”彼此靠近,“跑”和“走”靠近,但“猫”和“狗”很远远离“跑”和“走”。

看看你的例子,“He”的两个标记的嵌入将完全相同,因为它是同一个单词:

import spacy

nlp = spacy.load('en_core_web_sm')
text = "He bought a book. He eats pizza. She is there."
doc = nlp(text)

he1 = doc[0]
he2 = doc[5]
she = doc[9]
pizza = doc[7]


print(he1.similarity(he2)) # Prints 1.0
print(he1.similarity(she)) # Prints 0.805
print(he1.similarity(pizza)) # Prints -0.101

“He”和“She”也有非常相似的嵌入,但“He”与“pizza”非常不同。

总之,每个单词都会获得一个标记,但相同的标记只有一个嵌入(即每个不同的标记一个嵌入)。

编辑:

nlp = spacy.load('en_core_web_sm')
行加载包含预先训练的词嵌入的语言模型。这意味着词嵌入是在语言模型的创建(=训练)过程中创建的,并且在加载语言模型时已经存在。当您使用语言模型对文本进行标记时,它会将标记与其匹配的嵌入相关联。

您加载的语言模型越大,包含文本中所有单词的嵌入的可能性就越大。您的文本仍然可能包含语言模型的训练语料库(=文本集合)中不存在的单词,特别是如果您的文本包含大量技术术语、名称或缩写。这些被称为词汇外 (OOV) 单词。

处理 OOV 单词有不同的方法:最简单的方法是将零向量表示分配给未知单词(即仅包含零的嵌入)。这不是很有用,因为它没有捕获有关该单词的任何信息。我认为默认情况下 SpaCy 使用文本中单词的上下文及其语言特征来创建 OOV 单词的嵌入。这是自动为您完成的,因此如果您刚刚开始,通常不需要担心它。这是很好地描述了 SpaCy 如何处理 OOV 单词以及如何更改该行为以最好地满足您的需求。

© www.soinside.com 2019 - 2024. All rights reserved.