我想用FastText向量训练NER,我尝试了2种方法:
第一种方法: 加载空白的“ en”模型 使用nlp.vocab.set_vector()函数为2M词汇表加载快速文本向量 调用begin_training(),然后调用遍历批处理的代码并调用update函数。
第二种方法: 加载空白的“ en”模型 在管道中添加一个自定义组件,即“ FastTextModel”,它使用键“ vector”设置user_token_hooks,如以下代码所示 调用begin_training(),然后调用遍历批处理的代码并调用update函数。 LABEL = ['label_1','label_2']
def train_model(型号): nlp = spacy.load('en_core_web_sm')#加载现有的spacy模型
# Load Fasttext component
fasttext_component = FastTextModel(fasttext.load_model("cc.en.300.bin"))
nlp.add_pipe(fasttext_component, first=True)
if 'ner' not in nlp.pipe_names:
ner = nlp.create_pipe('ner')
nlp.add_pipe(ner)
else:
ner = nlp.get_pipe('ner')
# Add new entity labels to entity recognizer
for i in LABEL:
ner.add_label(i)
optimizer = nlp.resume_training()
#Get names of other pipes to disable them during training to train only NER
other_pipes = [pipe for pipe in nlp.pipe_names if pipe != 'ner' and pipe != 'FastTextModel']
with nlp.disable_pipes(*other_pipes): # only train NER
# Training code here
save_model(nlp, 'model_name', 'output_dir', 0)
class FastTextModel(object):
def __init__(self, model):
self._model = model
def __call__(self, doc):
doc.user_token_hooks["vector"] = self.vector
return doc;
def vector(self, obj1):
return self._model.get_word_vector(obj1.text)
if __name__ == '__main__':
train_model()
我的问题是:
在第二种方法中, NER将利用FastTextModel的“向量”功能获取单词 在训练时将其喂入CNN的载体?在训练期间, NER学习单词的新表示形式吗?如果是这样,如果我加载单词向量 训练结束后使用以下代码,将模型返回 新学习的单词表示形式或 FastTextModel的“矢量”功能
for d in doc:
print(d.vector)```
如果NER在训练期间不使用user_token_hooks,那么唯一的方法是使用npl.vocab.set_vector()函数使用FastText嵌入将其作为静态嵌入表加载?
在训练或测试时,是否有某种方法可以记录哪些向量被馈送到NER的嵌入部分?
我对spaCy的文档了解的是,训练模型总是学习新的嵌入,但是它也学习面向OOV单词的嵌入吗?以及如何知道哪个OOV单词模型学习了嵌入
环境 平台:Linux-4.15.0-55-generic-x86_64-with-Ubuntu-16.04-xenial 空间版本:2.1.6 Python版本:3.5.2