我正在用BERT执行文本分类任务。我基本上是在使用run_classifier.py。 此代码使用train.tsv和dev.tsv(带有标签)微调BERT,并使用test.tsv(不带有标签)进行预测。但是,我需要使用train-dev-test拆分来训练模型(训练集),计算超参数和损失函数(开发集)并评估性能(测试集)。作为常规的train-dev-test拆分,所有标签都包括在内。 我也有第四个未标记的数据集以进行预测。您是否知道任何以4种模式(train-dev-test-prediction)实现BERT的存储库?
答案 0 :(得分:0)
我们可以定义一个方法,该方法可以获取到不同数据集的路径,并返回转换后的数据集,可用于培训,测试和验证目的。关键是transformation
方法。
以下是为IMDB情绪分析生成测试和培训的代码段(使用keras-bert
)。请注意load_data
进行转换。
dataset = tf.keras.utils.get_file(
fname="aclImdb.tar.gz",
origin="http://ai.stanford.edu/~amaas/data/sentiment/aclImdb_v1.tar.gz",
extract=True,
)
token_dict = {}
with codecs.open(vocab_path, 'r', 'utf8') as reader:
for line in reader:
token = line.strip()
token_dict[token] = len(token_dict)
tokenizer = Tokenizer(token_dict)
def load_data(path, tagset):
global tokenizer
indices, sentiments = [], []
for folder, sentiment in tagset:
folder = os.path.join(path, folder)
for name in tqdm(os.listdir(folder)):
with open(os.path.join(folder, name), 'r') as reader:
text = reader.read()
ids, segments = tokenizer.encode(text, max_len=SEQ_LEN)
indices.append(ids)
sentiments.append(sentiment)
items = list(zip(indices, sentiments))
np.random.shuffle(items)
indices, sentiments = zip(*items)
indices = np.array(indices)
mod = indices.shape[0] % BATCH_SIZE
if mod > 0:
indices, sentiments = indices[:-mod], sentiments[:-mod]
return [indices, np.zeros_like(indices)], np.array(sentiments)
train_path = os.path.join(os.path.dirname(dataset), 'aclImdb', 'train')
test_path = os.path.join(os.path.dirname(dataset), 'aclImdb', 'test')
tagset = [('neg', 0), ('pos', 1)]
id_to_labels = {0: 'negative', 1: 'positive'}
train_x, train_y = load_data(train_path, tagset)
test_x, test_y = load_data(test_path, tagset)
有关输入和输出以及完整实现(以及通常使用BERT微调的文本分类)的详细信息,请参见: Text Classification Using BERT Fine Tuning: Understandinginput to keras-bert 。它具有适用于20个新闻组的二进制,多类和多标签文本分类,IMDB情绪分析和有毒评论分类的有效的Google Colab GPU实施,并使用单独的训练和测试集。