首页 > 解决方案 > 在不使用终端命令的情况下从 BioBERT 中提取固定向量?

问题描述

如果我们想使用预训练的BioBERT模型的权重,我们可以在下载所有必需的 BioBERT 文件后执行以下终端命令。

os.system('python3 extract_features.py \
      --input_file=trial.txt \
      --vocab_file=vocab.txt \
      --bert_config_file=bert_config.json \
      --init_checkpoint=biobert_model.ckpt \
      --output_file=output.json')

上面的命令实际上是读取包含文本的单个文件,从中读取文本内容,然后将提取的向量写入另一个文件。因此,问题在于,对于包含数千个句子/段落的非常大的数据集,它无法轻松扩展。

有没有一种方法可以随时随地提取这些特征(使用嵌入层),就像在 PyTorch 或 TF1.3 中对 word2vec 向量所做的那样?

注意:TF2.0 不存在 BioBERT 检查点,所以我想除非有人生成与 TF2.0 兼容的检查点文件,否则我认为 TF2.0 无法做到这一点。

我将不胜感激任何提示或帮助。

标签: python-3.xnlppytorch

解决方案


您可以即时获取上下文嵌入,但获取嵌入所花费的总时间将始终相同。有两种选择:1. 将 BioBERT 导入 Transformers 包并在 PyTorch 中使用它(我会这样做)或 2. 使用原始代码库。

1. 将 BioBERT 导入 Transformers 包

使用预训练的 BERT 模型最方便的方法是Transformers包。它主要是为 PyTorch 编写的,但也适用于 TensorFlow。它没有开箱即用的 BioBERT,因此您需要自己将其从 TensorFlow 格式转换。有convert_tf_checkpoint_to_pytorch.py脚本可以做到这一点。人们对此脚本和 BioBERT 有一些问题(似乎已解决)。

转换模型后,您可以像这样加载它。

import torch
from transformers import *

# Load dataset, tokenizer, model from pretrained model/vocabulary
tokenizer = BertTokenizer.from_pretrained('directory_with_converted_model')
model = BertModel.from_pretrained('directory_with_converted_model')

# Call the model in a standard PyTorch way
embeddings = model([tokenizer.encode("Cool biomedical tetra-hydro-sentence.", add_special_tokens=True)])

2.直接使用BioBERT代码库

您可以使用以下代码随时随地获取嵌入exctract_feautres.py。在第 346-382 行,他们初始化模型。您可以通过调用来获取嵌入estimator.predict(...)

为此,您需要格式化输入格式。首先,您需要格式化字符串(使用第 326-337 行的代码),然后应用并调用convert_examples_to_features它。


推荐阅读