在spaCy中合并(重新标记)自定义名词块时如何平均向量?
How to average the vector when merging (with retokenize) custom noun chunks in spaCy?
我正在使用 spaCy 的统计模型(例如,基于词性标签和依赖项的名词块)和基于规则的匹配来生成名词块以捕获(用户提供的)上下文特定的名词块。
对于其他下游任务,我正在重新标记这些名词块 (spans),这在大多数情况下都可以正常工作。但是,令牌的向量表示 (token.vector) 被设置为全零。有没有办法保留矢量信息,例如通过对单个标记向量进行平均并将其分配给重新标记化的标记?
我用代码试过了...
def tokenise_noun_chunks(doc)
if not doc.has_annotation("DEP"):
return doc
all_noun_chunks = list(doc.noun_chunks) + doc._.custom_noun_chunks
with doc.retokenize() as retokenizer:
for span in all_noun_chunks:
# if I print(span.vector) here, I get the correctly averaged vector
attrs = {"tag": span.root.tag, "dep": span.root.dep}
retokenizer.merge(np, attrs=attrs)
return doc
...但是当我检查名词块的返回向量时,我得到一个零数组。我已经在内置 merge_noun_chunks 组件(只是修改为包含我自己的自定义名词块)上对此(上面的代码)进行了建模,因此我可以确认内置组件给出了相同的结果。
有没有办法保留词向量信息?我需要将 term/average 矢量添加到矢量存储吗?
重新标记器应将 span.vector
设置为新合并标记的向量。 spacy==3.0.3
和 en_core_web_md==3.0.0
:
import spacy
nlp = spacy.load("en_core_web_md")
doc = nlp("This is a sentence.")
with doc.retokenize() as retokenizer:
for chunk in doc.noun_chunks:
retokenizer.merge(chunk)
for token in doc:
print(token, token.vector[:5])
输出:
This [-0.087595 0.35502 0.063868 0.29292 -0.23635 ]
is [-0.084961 0.502 0.0023823 -0.16755 0.30721 ]
a sentence [-0.093156 0.1371495 -0.307255 0.2993 0.1383735]
. [ 0.012001 0.20751 -0.12578 -0.59325 0.12525 ]
tag
和 dep
等属性也默认设置为 span.root
的属性,因此您只需在想要覆盖默认值时指定它们。
我正在使用 spaCy 的统计模型(例如,基于词性标签和依赖项的名词块)和基于规则的匹配来生成名词块以捕获(用户提供的)上下文特定的名词块。
对于其他下游任务,我正在重新标记这些名词块 (spans),这在大多数情况下都可以正常工作。但是,令牌的向量表示 (token.vector) 被设置为全零。有没有办法保留矢量信息,例如通过对单个标记向量进行平均并将其分配给重新标记化的标记?
我用代码试过了...
def tokenise_noun_chunks(doc)
if not doc.has_annotation("DEP"):
return doc
all_noun_chunks = list(doc.noun_chunks) + doc._.custom_noun_chunks
with doc.retokenize() as retokenizer:
for span in all_noun_chunks:
# if I print(span.vector) here, I get the correctly averaged vector
attrs = {"tag": span.root.tag, "dep": span.root.dep}
retokenizer.merge(np, attrs=attrs)
return doc
...但是当我检查名词块的返回向量时,我得到一个零数组。我已经在内置 merge_noun_chunks 组件(只是修改为包含我自己的自定义名词块)上对此(上面的代码)进行了建模,因此我可以确认内置组件给出了相同的结果。
有没有办法保留词向量信息?我需要将 term/average 矢量添加到矢量存储吗?
重新标记器应将 span.vector
设置为新合并标记的向量。 spacy==3.0.3
和 en_core_web_md==3.0.0
:
import spacy
nlp = spacy.load("en_core_web_md")
doc = nlp("This is a sentence.")
with doc.retokenize() as retokenizer:
for chunk in doc.noun_chunks:
retokenizer.merge(chunk)
for token in doc:
print(token, token.vector[:5])
输出:
This [-0.087595 0.35502 0.063868 0.29292 -0.23635 ]
is [-0.084961 0.502 0.0023823 -0.16755 0.30721 ]
a sentence [-0.093156 0.1371495 -0.307255 0.2993 0.1383735]
. [ 0.012001 0.20751 -0.12578 -0.59325 0.12525 ]
tag
和 dep
等属性也默认设置为 span.root
的属性,因此您只需在想要覆盖默认值时指定它们。