为了计算语义相似性,我试图训练一个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文件包含:
[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
上得到了一个新的型号。
然后运行以下文件:
import spacy
nlp = spacy.load("./output/model-last")
print(nlp('PROJ123456').vector)
我希望看到一个有一些非零值的向量,但我看到的是300个零值的向量。我认为这是为了表明它没有在词汇中添加"PROJ123456“。但我不知道为什么。
发布于 2021-11-27 16:18:16
在对自定义文本进行矢量化之后,您需要在spaCy中完成以下两件事中的一件:
详细信息在这里:https://stackoverflow.com/questions/43524301/update-spacy-vocabulary。
发布于 2021-12-26 05:21:12
如果有单词向量,则.vectors
属性将使用它们来计算值。训练模型不会修改单词向量。看起来你只是在重复使用大型英语模型中的单词向量,这个模型不包含你的特殊术语,所以修复方法是训练你自己的单词向量,并将它们添加到模型中。
https://datascience.stackexchange.com/questions/104455
复制相似问题