首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >语义相似度的spaCy模型训练

语义相似度的spaCy模型训练
EN

Data Science用户
提问于 2021-11-24 19:56:24
回答 2查看 499关注 0票数 1

为了计算语义相似性,我试图训练一个spaCy模型,但我没有得到我预期的结果。

我创建了两个文本文件,其中包含了许多使用新术语"PROJ123456“的句子。例如,"PROJ123456已走上正轨“。

我已经将每一个添加到一个DocBin中,并将它们保存到磁盘中,作为train.spacy和dev.spacy。

然后我开始运行:python -m spacy train config.cfg --output ./output --paths.train ./train.spacy --paths.dev ./dev.spacy

config.cfg文件包含:

代码语言:javascript
运行
复制
[paths]
train = null
dev = null
vectors = null
init_tok2vec = null

[system]
gpu_allocator = null
seed = 0

[nlp]
lang = "en"
pipeline = ["tok2vec","parser"]
batch_size = 1000
disabled = []
before_creation = null
after_creation = null
after_pipeline_creation = null
tokenizer = {"@tokenizers":"spacy.Tokenizer.v1"}

[components]

[components.parser]
factory = "parser"
learn_tokens = false
min_action_freq = 30
moves = null
scorer = {"@scorers":"spacy.parser_scorer.v1"}
update_with_oracle_cut_size = 100

[components.parser.model]
@architectures = "spacy.TransitionBasedParser.v2"
state_type = "parser"
extra_state_tokens = false
hidden_width = 128
maxout_pieces = 3
use_upper = true
nO = null

[components.parser.model.tok2vec]
@architectures = "spacy.Tok2VecListener.v1"
width = ${components.tok2vec.model.encode.width}
upstream = "*"

[components.tok2vec]
factory = "tok2vec"

[components.tok2vec.model]
@architectures = "spacy.Tok2Vec.v2"

[components.tok2vec.model.embed]
@architectures = "spacy.MultiHashEmbed.v2"
width = ${components.tok2vec.model.encode.width}
attrs = ["ORTH","SHAPE"]
rows = [5000,2500]
include_static_vectors = true

[components.tok2vec.model.encode]
@architectures = "spacy.MaxoutWindowEncoder.v2"
width = 256
depth = 8
window_size = 1
maxout_pieces = 3

[corpora]

[corpora.dev]
@readers = "spacy.Corpus.v1"
path = ${paths.dev}
max_length = 0
gold_preproc = false
limit = 0
augmenter = null

[corpora.train]
@readers = "spacy.Corpus.v1"
path = ${paths.train}
max_length = 0
gold_preproc = false
limit = 0
augmenter = null

[training]
dev_corpus = "corpora.dev"
train_corpus = "corpora.train"
seed = {system.seed}
gpu_allocator = #qcStackCode#{system.gpu_allocator}
dropout = 0.1
accumulate_gradient = 1
patience = 1600
max_epochs = 0
max_steps = 20000
eval_frequency = 200
frozen_components = []
annotating_components = []
before_to_disk = null

[training.batcher]
@batchers = "spacy.batch_by_words.v1"
discard_oversize = false
tolerance = 0.2
get_length = null

[training.batcher.size]
@schedules = "compounding.v1"
start = 100
stop = 1000
compound = 1.001
t = 0.0

[training.logger]
@loggers = "spacy.ConsoleLogger.v1"
progress_bar = false

[training.optimizer]
@optimizers = "Adam.v1"
beta1 = 0.9
beta2 = 0.999
L2_is_weight_decay = true
L2 = 0.01
grad_clip = 1.0
use_averages = false
eps = 0.00000001
learn_rate = 0.001

[training.score_weights]
dep_uas = 0.5
dep_las = 0.5
dep_las_per_type = null
sents_p = null
sents_r = null
sents_f = 0.0

[pretraining]

[initialize]
vectors = "en_core_web_lg"
init_tok2vec = ${paths.init_tok2vec}
vocab_data = null
lookups = null
before_init = null
after_init = null

[initialize.components]

[initialize.tokenizer]

我在output/model-last上得到了一个新的型号。

然后运行以下文件:

代码语言:javascript
运行
复制
import spacy
nlp = spacy.load("./output/model-last")
print(nlp('PROJ123456').vector)

我希望看到一个有一些非零值的向量,但我看到的是300个零值的向量。我认为这是为了表明它没有在词汇中添加"PROJ123456“。但我不知道为什么。

EN

回答 2

Data Science用户

发布于 2021-11-27 16:18:16

在对自定义文本进行矢量化之后,您需要在spaCy中完成以下两件事中的一件:

  1. 用类似于nlp.vocab的东西将这些二进制向量加载到nlp.vocab.load_rep_vectors中。
  2. 或者简单地替换"data/vocab/ vec.bin“中的vec.bin文件。

详细信息在这里:https://stackoverflow.com/questions/43524301/update-spacy-vocabulary

票数 0
EN

Data Science用户

发布于 2021-12-26 05:21:12

如果有单词向量,则.vectors属性将使用它们来计算值。训练模型不会修改单词向量。看起来你只是在重复使用大型英语模型中的单词向量,这个模型不包含你的特殊术语,所以修复方法是训练你自己的单词向量,并将它们添加到模型中。

票数 0
EN
页面原文内容由Data Science提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://datascience.stackexchange.com/questions/104455

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档