使用user_hooks进行NER训练的FastText向量

时间:2019-08-01 17:22:32

标签: spacy fasttext

我想用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()

我的问题是:

  1. 在第一种方法中,使用向量加载向量是否正确? nlp.vocab.set_vector()函数?由此加载的所有向量 培训时,NER将使用此功能吗?
  2. 在第二种方法中, NER将利用FastTextModel的“向量”功能获取单词 在训练时将其喂入CNN的载体?在训练期间, NER学习单词的新表示形式吗?如果是这样,如果我加载单词向量 训练结束后使用以下代码,将模型返回 新学习的单词表示形式或 FastTextModel的“矢量”功能

    for d in doc:
        print(d.vector)```
    
  3. 如果NER在训练期间不使用user_token_hooks,那么唯一的方法是使用npl.vocab.set_vector()函数使用FastText嵌入将其作为静态嵌入表加载?

  4. 在训练或测试时,是否有某种方法可以记录哪些向量被馈送到NER的嵌入部分?

  5. 我对spaCy的文档了解的是,训练模型总是学习新的嵌入,但是它也学习面向OOV单词的嵌入吗?以及如何知道哪个OOV单词模型学习了嵌入

环境 平台:Linux-4.15.0-55-generic-x86_64-with-Ubuntu-16.04-xenial 空间版本:2.1.6 Python版本:3.5.2

0 个答案:

没有答案