From f0d542574d1a667b5d0386a9bf08064cf50d6b5f Mon Sep 17 00:00:00 2001 From: wangguojim <862876363@qq.com> Date: Sun, 22 May 2022 10:57:11 +0000 Subject: [PATCH 1/3] add t5_kbqa task --- examples/t5_kbqa/RADEME.md | 9 + examples/t5_kbqa/finetune_t5_ner.py | 138 ++++++++++ .../t5_kbqa/finetune_t5_triple2question.py | 210 +++++++++++++++ examples/t5_kbqa/valid_t5_triple2question.py | 250 ++++++++++++++++++ examples/t5_kgclue/RADEME.md | 12 + flagai/data/tokenizer/t5/t5_tokenizer.py | 2 +- flagai/model/glm_model.py | 4 +- flagai/model/t5_model.py | 10 +- 8 files changed, 630 insertions(+), 5 deletions(-) create mode 100644 examples/t5_kbqa/RADEME.md create mode 100644 examples/t5_kbqa/finetune_t5_ner.py create mode 100644 examples/t5_kbqa/finetune_t5_triple2question.py create mode 100644 examples/t5_kbqa/valid_t5_triple2question.py create mode 100644 examples/t5_kgclue/RADEME.md diff --git a/examples/t5_kbqa/RADEME.md b/examples/t5_kbqa/RADEME.md new file mode 100644 index 00000000..2f639629 --- /dev/null +++ b/examples/t5_kbqa/RADEME.md @@ -0,0 +1,9 @@ +Knowledge Base Question Answering (KBQA) aims to answer natural language questions with +the help of an external knowledge base. The core idea is to find the link between the internal +knowledge behind questions and known triples of the knowledge base. Traditional KBQA task +pipelines contain several steps, including entity recognition, entity linking, answering selection, +etc. In this kind of pipeline methods, errors in any procedure will inevitably propagate to the +final prediction. To address this challenge, the Corpus Generation - Retrieve +Method (CGRM) with Pre-training Language Model (PLM) for the KBQA task aims to generate natural language QA pairs based on Knowledge Graph triples +and directly solve the QA by retrieving the synthetic dataset. The new method can extract more +information about the entities from PLM to improve accuracy and simplify the processes. \ No newline at end of file diff --git a/examples/t5_kbqa/finetune_t5_ner.py b/examples/t5_kbqa/finetune_t5_ner.py new file mode 100644 index 00000000..320005a9 --- /dev/null +++ b/examples/t5_kbqa/finetune_t5_ner.py @@ -0,0 +1,138 @@ +import sys +sys.path.append('/data/wang/models/FlagAI') + + +import re +import torch +import argparse +import time +from tqdm import tqdm +import random +import numpy as np +from torch import cuda +from loguru import logger +from torch.utils.data import DataLoader, Dataset +from flagai.model.t5_model import T5UERModel +from flagai.data.tokenizer.t5.t5_tokenizer import T5JiebaTokenizer, load_chinese_base_vocab +import torch.nn.functional as F +import json +import html +import pandas as pd +from flagai.trainer import Trainer + + +def train_data_process_kgclue(file): + source, target = [], [] + f = pd.read_csv(file) + for question, entity in zip(f['question'], f['entity']): + source.append(question) + target.append(entity) + return (source, target) + + +class SeqDataset(Dataset): + """ + 针对特定数据集,定义一个相关的取数据的方式 + """ + + def __init__(self, sents_src, sents_tgt): + super(SeqDataset, self).__init__() + # 读原始数据 + self.sents_src = sents_src + self.sents_tgt = sents_tgt + + self.idx2word = {k: v for v, k in word2idx.items()} + + def __getitem__(self, i): + src = self.sents_src[i] + tgt = self.sents_tgt[i] + token_ids_src, _ = tokenizer.encode(src, max_length=256) + token_ids_tgt, _ = tokenizer.encode(tgt, max_length=256) + output = { + "token_ids_src": token_ids_src, + "token_ids_tgt": token_ids_tgt, + } + return output + + def __len__(self): + return len(self.sents_src) + + +def collate_fn(batch): + """ + 动态padding, batch为一部分sample + """ + + def padding(indice, max_length, pad_idx=0): + """ + pad 函数 + """ + pad_indice = [ + item + [pad_idx] * max(0, max_length - len(item)) + for item in indice + ] + return torch.tensor(pad_indice) + + token_ids_src = [data["token_ids_src"] for data in batch] + max_length_src = max([len(t) for t in token_ids_src]) + token_ids_tgt = [data["token_ids_tgt"] for data in batch] + max_length_tgt = max([len(t) for t in token_ids_tgt]) + + token_ids_padded = padding(token_ids_src, max_length_src) + target_ids_padded = padding(token_ids_tgt, max_length_tgt) + labels_ids = target_ids_padded.clone() + labels_ids[labels_ids == 0] = -100 + target_ids_padded = target_ids_padded[:, :-1].contiguous() + labels_ids = labels_ids[:, 1:].contiguous() + + return { + 'input_ids': token_ids_padded, + 'decoder_input_ids': target_ids_padded, + 'labels': labels_ids + } + + +if __name__ == '__main__': + data_name = 'kgclue' + train_path = '/mnt/T5_JIEBA/input/train.csv' + test_path = '/mnt/T5_JIEBA//input/dev.csv' + model_name = 'T5' + vocab_path = '/mnt/T5_JIEBA/vocab.txt' + model_path = '/mnt/T5_JIEBA/pytorch_model.bin' + logger.add('log/log_' + data_name + '_' + model_name + + '_{time}.log') # 加载日志 + torch.cuda.empty_cache() # torch自动回收缓存 + # 加载模型 + word2idx = load_chinese_base_vocab(vocab_path) + tokenizer = T5JiebaTokenizer(token_dict=word2idx) + model = T5UERModel(word2idx) + model.load_pretrain_params(model_path) + # put model to GPU:rank, one process corresponding to one gpu. this is different model.cuda() in nn.DataParallel() + + T5Trainer = Trainer( + env_type="pytorch", + experiment_name="roberta_ner", + batch_size=64, + lr=2e-4, + weight_decay=1e-3, + epochs=10, + load_dir=None, + save_dir="kgclue", + save_epoch=1, + eval_interval=False, + seed=0, + ) + + train_data = train_data_process_kgclue(train_path) + ttest_data = train_data_process_kgclue(test_path) + trainset = SeqDataset(train_data[0], train_data[1]) + train_params = { + "batch_size": T5Trainer.batch_size, + "shuffle": True, + "num_workers": 4, + "collate_fn": collate_fn + } + training_loader = DataLoader(trainset, **train_params) + iter_training_loader = iter(training_loader) + data = next(iter_training_loader) + T5Trainer.train(model, train_dataset=training_loader) diff --git a/examples/t5_kbqa/finetune_t5_triple2question.py b/examples/t5_kbqa/finetune_t5_triple2question.py new file mode 100644 index 00000000..a358daf8 --- /dev/null +++ b/examples/t5_kbqa/finetune_t5_triple2question.py @@ -0,0 +1,210 @@ +import sys +sys.path.append('/data/wang/models/FlagAI') + +import os +import argparse +import torch +from flagai.data.tokenizer.t5.t5_pegasus_tokenizer import T5BatchPegasusTokenizer +from torch.utils.data import DataLoader +from transformers import T5ForConditionalGeneration +from torch.utils.data.distributed import DistributedSampler +# from utils.tool_utils import set_random_seed +import re +import json +import pandas as pd +from torch.utils.data import Dataset +from rouge import Rouge +from sklearn import metrics +from nltk.translate.bleu_score import sentence_bleu, SmoothingFunction +from flagai.trainer import Trainer + + +def get_rouge(pred, target): + scores = Rouge().get_scores(hyps=pred, refs=target) + rouge_1 = scores[0]['rouge-1']['f'] + rouge_2 = scores[0]['rouge-2']['f'] + rouge_l = scores[0]['rouge-l']['f'] + return rouge_1, rouge_2, rouge_l + + +def get_bleu(pred, target): + return sentence_bleu(references=[target.split(' ')], + hypothesis=pred.split(' '), + smoothing_function=SmoothingFunction().method1) + + +class DataSet(Dataset): + + def __init__(self, dataframe, tokenizer, source_len, target_len, + source_text, target_text): + self.tokenizer = tokenizer + self.data = dataframe + self.source_len = source_len + self.summ_len = target_len + self.target_text = self.data[target_text] + self.source_text = self.data[source_text] + + def __len__(self): + return len(self.target_text) + + def __getitem__(self, index): + source_text = str(self.source_text[index]) + target_text = str(self.target_text[index]) + source = self.tokenizer.batch_encode_plus( + [source_text], + max_length=self.source_len, + pad_to_max_length=True, + truncation=True, + padding="max_length", + return_tensors="pt", + ) + target = self.tokenizer.batch_encode_plus( + [target_text], + max_length=self.summ_len, + pad_to_max_length=True, + truncation=True, + padding="max_length", + return_tensors="pt", + ) + + input_ids = source["input_ids"].squeeze() + attention_mask = source["attention_mask"].squeeze() + target_ids = target["input_ids"].squeeze() + decoder_input_ids = target_ids[:-1] + labels = target_ids[1:].clone().detach() + labels[target_ids[1:] == tokenizer.pad_token_id] + + return { + "input_ids": input_ids.to(dtype=torch.long), + "attention_mask": attention_mask.to(dtype=torch.long), + "decoder_input_ids": decoder_input_ids.to(dtype=torch.long), + "labels": labels.to(dtype=torch.long), + "target_ids": target_ids.to(dtype=torch.long), + } + + +def collate_fn(batch): + """ + batch should be a list of (sequence, target, length) tuples... + Returns a padded tensor of sequences sorted from longest to shortest, + """ + batch_tuple = tuple(map(torch.stack, zip(*batch))) + batch_lens = torch.sum(batch_tuple[1], dim=-1, keepdim=False) + max_len = batch_lens.max().item() + results = () + for item in batch_tuple: + if item.dim() >= 2: + results += (item[:, :max_len], ) + else: + results += (item, ) + return results + + +def train_data_process_kgclue_cgrm_seq2seq(file): + + def question_clean(text): + text = re.sub(r'你能告诉我', '', text) + text = re.sub(r'能够告诉我', '', text) + text = re.sub(r'告诉我一下', '', text) + text = re.sub(r'大家知道', '', text) + text = re.sub(r'我想知道', '', text) + text = re.sub(r'请告诉我', '', text) + text = re.sub(r'有人知道', '', text) + text = re.sub(r'大家了解', '', text) + text = re.sub(r'我很疑惑', '', text) + text = re.sub(r'我很好奇', '', text) + text = re.sub(r'查一下', '', text) + text = re.sub(r'你知道', '', text) + text = re.sub(r'谁知道', '', text) + text = re.sub(r'请问', '', text) + text = re.sub(r'告诉我', '', text) + text = re.sub(r'你了解', '', text) + text = re.sub(r'谁了解', '', text) + text = re.sub(r'你记得', '', text) + text = re.sub(r'你觉得', '', text) + text = re.sub(r'谁是', '', text) + return text + + triplet, question = [], [] + with open(file) as f: + for line in f.readlines(): + line = json.loads(line) + qus = line['question'].strip() + question.append(question_clean(qus)) + entity1, relation, entity2 = line['answer'].split('|||') + entity1 = re.sub(r'(.*?(.*?).*?)', '', entity1) + entity1 = re.sub(r'(.*?)', '', entity1) + entity1 = re.sub(r'\(.*?\)', '', entity1).strip() + triplet.append(entity1 + ' ' + relation + ' ' + '[MASK]') + return pd.DataFrame(data={'seq1': triplet, 'seq2': question}) + + +class T5CG(T5ForConditionalGeneration): + def __init__(self,config): + super().__init__(config) + def forward(self,*args,**kwargs): + model_input_keys = [ + "input_ids", "attention_mask", "decoder_input_ids", "labels" + ] + for key in list(kwargs.keys()): + if key not in model_input_keys: + del kwargs[key] + return T5ForConditionalGeneration.forward(self,*args,**kwargs) + + + + + + + +if __name__ == '__main__': + + train_path = '/mnt/datasets/t5_triple2ques_data/train.json' + test_path = '/mnt/datasets/t5_triple2ques_data/dev.json' + model_name = 'T5' + batch_size = 64 + max_length_source = 64 + max_length_target = 64 + model_path = '/mnt/T5_JIEBA/' + + T5Trainer = Trainer( + env_type="pytorch", + experiment_name="roberta_ner", + batch_size=64, + lr=2e-4, + weight_decay=1e-3, + epochs=10, + load_dir=None, + save_dir="kgclue", + save_epoch=1, + eval_interval=False, + hostfile='./hostfile', + seed=0, + ) + + train_data = train_data_process_kgclue_cgrm_seq2seq(train_path) + ttest_data = train_data_process_kgclue_cgrm_seq2seq(test_path) + tokenizer = T5BatchPegasusTokenizer.from_pretrained(model_path) + model = T5CG.from_pretrained(model_path) + # model = model.to(args.device) + train_dataset = DataSet(train_data[["seq1", + "seq2"]], tokenizer, max_length_source, + max_length_target, "seq1", "seq2") + valid_dataset = DataSet(ttest_data[["seq1", + "seq2"]], tokenizer, max_length_source, + max_length_target, "seq1", "seq2") + + train_dataloader = DataLoader( + train_dataset, + batch_size=batch_size, + num_workers=4, + ) + valid_dataloader = DataLoader( + valid_dataset, + batch_size=batch_size, + num_workers=4, + ) + + + T5Trainer.train(model=model, + train_dataset=train_dataloader) diff --git a/examples/t5_kbqa/valid_t5_triple2question.py b/examples/t5_kbqa/valid_t5_triple2question.py new file mode 100644 index 00000000..4826b51f --- /dev/null +++ b/examples/t5_kbqa/valid_t5_triple2question.py @@ -0,0 +1,250 @@ +import sys +sys.path.append('/data/wang/models/FlagAI') + +import os +import argparse +import torch +from flagai.data.tokenizer.t5.t5_pegasus_tokenizer import T5BatchPegasusTokenizer +from torch.utils.data import DataLoader +from transformers import T5ForConditionalGeneration +from torch.utils.data.distributed import DistributedSampler +# from utils.tool_utils import set_random_seed +import re +import json +import pandas as pd +from torch.utils.data import Dataset +from rouge import Rouge +from sklearn import metrics +from nltk.translate.bleu_score import sentence_bleu, SmoothingFunction +from flagai.trainer import Trainer + + +def get_rouge(pred, target): + scores = Rouge().get_scores(hyps=pred, refs=target) + rouge_1 = scores[0]['rouge-1']['f'] + rouge_2 = scores[0]['rouge-2']['f'] + rouge_l = scores[0]['rouge-l']['f'] + return rouge_1, rouge_2, rouge_l + + +def get_bleu(pred, target): + return sentence_bleu(references=[target.split(' ')], + hypothesis=pred.split(' '), + smoothing_function=SmoothingFunction().method1) + + +class DataSet(Dataset): + + def __init__(self, dataframe, tokenizer, source_len, target_len, + source_text, target_text): + self.tokenizer = tokenizer + self.data = dataframe + self.source_len = source_len + self.summ_len = target_len + self.target_text = self.data[target_text] + self.source_text = self.data[source_text] + + def __len__(self): + return len(self.target_text) + + def __getitem__(self, index): + source_text = str(self.source_text[index]) + target_text = str(self.target_text[index]) + source = self.tokenizer.batch_encode_plus( + [source_text], + max_length=self.source_len, + pad_to_max_length=True, + truncation=True, + padding="max_length", + return_tensors="pt", + ) + target = self.tokenizer.batch_encode_plus( + [target_text], + max_length=self.summ_len, + pad_to_max_length=True, + truncation=True, + padding="max_length", + return_tensors="pt", + ) + + input_ids = source["input_ids"].squeeze() + attention_mask = source["attention_mask"].squeeze() + target_ids = target["input_ids"].squeeze() + decoder_input_ids = target_ids[:-1] + labels = target_ids[1:].clone().detach() + labels[target_ids[1:] == tokenizer.pad_token_id] + + return { + "input_ids": input_ids.to(dtype=torch.long), + "attention_mask": attention_mask.to(dtype=torch.long), + "decoder_input_ids": decoder_input_ids.to(dtype=torch.long), + "labels": labels.to(dtype=torch.long), + "target_ids": target_ids.to(dtype=torch.long), + } + + +def collate_fn(batch): + """ + batch should be a list of (sequence, target, length) tuples... + Returns a padded tensor of sequences sorted from longest to shortest, + """ + batch_tuple = tuple(map(torch.stack, zip(*batch))) + batch_lens = torch.sum(batch_tuple[1], dim=-1, keepdim=False) + max_len = batch_lens.max().item() + results = () + for item in batch_tuple: + if item.dim() >= 2: + results += (item[:, :max_len], ) + else: + results += (item, ) + return results + + +def train_data_process_kgclue_cgrm_seq2seq(file): + + def question_clean(text): + text = re.sub(r'你能告诉我', '', text) + text = re.sub(r'能够告诉我', '', text) + text = re.sub(r'告诉我一下', '', text) + text = re.sub(r'大家知道', '', text) + text = re.sub(r'我想知道', '', text) + text = re.sub(r'请告诉我', '', text) + text = re.sub(r'有人知道', '', text) + text = re.sub(r'大家了解', '', text) + text = re.sub(r'我很疑惑', '', text) + text = re.sub(r'我很好奇', '', text) + text = re.sub(r'查一下', '', text) + text = re.sub(r'你知道', '', text) + text = re.sub(r'谁知道', '', text) + text = re.sub(r'请问', '', text) + text = re.sub(r'告诉我', '', text) + text = re.sub(r'你了解', '', text) + text = re.sub(r'谁了解', '', text) + text = re.sub(r'你记得', '', text) + text = re.sub(r'你觉得', '', text) + text = re.sub(r'谁是', '', text) + return text + + triplet, question = [], [] + with open(file) as f: + for line in f.readlines(): + line = json.loads(line) + qus = line['question'].strip() + question.append(question_clean(qus)) + entity1, relation, entity2 = line['answer'].split('|||') + entity1 = re.sub(r'(.*?(.*?).*?)', '', entity1) + entity1 = re.sub(r'(.*?)', '', entity1) + entity1 = re.sub(r'\(.*?\)', '', entity1).strip() + triplet.append(entity1 + ' ' + relation + ' ' + '[MASK]') + return pd.DataFrame(data={'seq1': triplet, 'seq2': question}) + + +def validate(tokenizer, model, loader, max_length_target): + if isinstance(model, torch.nn.DataParallel): + model = model.module + model.eval() + + + total = 0 + Rouge_1, Rouge_2, Rouge_l, Bleu = 0, 0, 0, 0 + device = torch.device(0) + model.to(device) + with torch.no_grad(): + for n, data in enumerate(loader, 0): + y = data['target_ids'].to(device, dtype=torch.long) + ids = data['input_ids'].to(device, dtype=torch.long) + generated_ids = model.generate( + ids, + decoder_start_token_id=tokenizer.cls_token_id, + eos_token_id=tokenizer.sep_token_id, + top_k=1, + num_beams=1, # num_returned_sequences=1, + max_length=max_length_target).cpu().numpy() + + targets = [ + tokenizer.decode(item.cpu().numpy(), + skip_special_tokens=True, + clean_up_tokenization_spaces=True) + for item in y + ] + preds = [ + tokenizer.decode(generated_id, + skip_special_tokens=True, + clean_up_tokenization_spaces=True) + for generated_id in generated_ids + ] + + assert len(preds) == len( + targets), "len(x)=%d, len(y)=%d, " % (len(preds), len(targets)) + for pred, target in zip(preds, targets): + total += 1 + if pred: + tem = get_rouge(pred, target) + Rouge_1 += tem[0] + Rouge_2 += tem[1] + Rouge_l += tem[2] + Bleu += get_bleu(pred, target) + if total % 200 == 0: + print(pred) + print(target) + print('++++++++++++++++++++++') + Rouge_1 /= total + Rouge_2 /= total + Rouge_l /= total + Bleu /= total + res = (Rouge_l + Bleu) / 2.0 + + return res + + + + +if __name__ == '__main__': + + train_path = '/mnt/datasets/t5_triple2ques_data/train.json' + valid_path = '/mnt/datasets/t5_triple2ques_data/dev.json' + model_name = 'T5' + batch_size = 64 + max_length_source = 64 + max_length_target = 64 + model_path = '/mnt/T5_JIEBA/' + + T5Trainer = Trainer( + env_type="pytorch", + experiment_name="roberta_ner", + batch_size=64, + lr=2e-4, + weight_decay=1e-3, + epochs=10, + load_dir=None, + save_dir="kgclue", + save_epoch=1, + eval_interval=False, + hostfile='./hostfile', + seed=0, + ) + + # train_data = train_data_process_kgclue_cgrm_seq2seq(train_path) + valid_data = train_data_process_kgclue_cgrm_seq2seq(valid_path) + tokenizer = T5BatchPegasusTokenizer.from_pretrained(model_path) + model = T5ForConditionalGeneration.from_pretrained(model_path) + # model = model.to(args.device) + # train_dataset = DataSet(train_data[["seq1", + # "seq2"]], tokenizer, max_length_source, + # max_length_target, "seq1", "seq2") + valid_dataset = DataSet(valid_data[["seq1", + "seq2"]], tokenizer, max_length_source, + max_length_target, "seq1", "seq2") + + # train_dataloader = DataLoader( + # train_dataset, + # batch_size=batch_size, + # num_workers=4, + # ) + valid_dataloader = DataLoader( + valid_dataset, + batch_size=batch_size, + num_workers=4, + ) + + validate(tokenizer, model, valid_dataloader, max_length_target) diff --git a/examples/t5_kgclue/RADEME.md b/examples/t5_kgclue/RADEME.md new file mode 100644 index 00000000..33996954 --- /dev/null +++ b/examples/t5_kgclue/RADEME.md @@ -0,0 +1,12 @@ +Knowledge Base Question Answering (KBQA) aims to answer natural language questions with +the help of an external knowledge base. The core idea is to find the link between the internal +knowledge behind questions and known triples of the knowledge base. Traditional KBQA task +pipelines contain several steps, including entity recognition, entity linking, answering selection, +etc. In this kind of pipeline methods, errors in any procedure will inevitably propagate to the +final prediction. To address this challenge, the Corpus Generation - Retrieve +Method (CGRM) with Pre-training Language Model (PLM) for the KBQA task aims to generate natural language QA pairs based on Knowledge Graph triples +and directly solve the QA by retrieving the synthetic dataset. The new method can extract more +information about the entities from PLM to improve accuracy and simplify the processes. + +The major procedure of CGRM is to generate QA pairs, in which, it needs to do two tasks: +The first task is a [NER](finetune_t5_ner.py) downstream task. The second one is a downstram task for [generating natural language QA pairs based on Knowledge Graph triples](finetune_t5_triple2question.py). \ No newline at end of file diff --git a/flagai/data/tokenizer/t5/t5_tokenizer.py b/flagai/data/tokenizer/t5/t5_tokenizer.py index 97ac7d4c..0eecff9b 100644 --- a/flagai/data/tokenizer/t5/t5_tokenizer.py +++ b/flagai/data/tokenizer/t5/t5_tokenizer.py @@ -183,7 +183,7 @@ def _tokenize(self, text): raise NotImplementedError -class T5JiebaTokenizer(T5BPETokenizer): +class T5JiebaTokenizer(T5KGBPETokenizer): def __init__(self, token_dict, pre_tokenizer=lambda x: jieba.cut(x, HMM=False)): diff --git a/flagai/model/glm_model.py b/flagai/model/glm_model.py index 9884fb81..8c966e81 100755 --- a/flagai/model/glm_model.py +++ b/flagai/model/glm_model.py @@ -180,8 +180,8 @@ def forward(self, detach_memory=True, checkpoint=None): batch_size, query_length = hidden_states.size()[:2] - memory_length = 0 - memory_states[0].size(1) if memory_states and memory_states[0] else 0 + + memory_length=memory_states[0].size(1) if memory_states else 0 key_length = query_length + memory_length # attention mask is the beginning postion of B region, \in [0, query_len) is_scalar = torch.numel(attention_mask) == 1 diff --git a/flagai/model/t5_model.py b/flagai/model/t5_model.py index d4a18949..32d2f3e3 100644 --- a/flagai/model/t5_model.py +++ b/flagai/model/t5_model.py @@ -132,6 +132,9 @@ def _shift_right(self, input_ids): class T5Stack(nn.Module): def __init__(self, config, embed_tokens=None): + + + super().__init__() self.config = config self.embed_tokens = embed_tokens @@ -732,13 +735,14 @@ def __init__(self, config): encoder_config.is_decoder = False encoder_config.use_cache = False encoder_config.is_encoder_decoder = False - self.encoder = T5Stack(encoder_config, self.shared) + + self.encoder = T5Stack(encoder_config.__dict__, self.shared) decoder_config = copy.deepcopy(config) decoder_config.is_decoder = True decoder_config.is_encoder_decoder = False decoder_config.num_layers = config.num_decoder_layers - self.decoder = T5Stack(decoder_config, self.shared) + self.decoder = T5Stack(decoder_config.__dict__, self.shared) self.lm_head = nn.Linear(config.d_model, config.vocab_size, bias=False) self.init_weights() @@ -1190,6 +1194,7 @@ def __init__(self, self.only_hidden_states = True self.return_logist_only = True self.tie_word_embeddings = False + self.is_decoder = True @property def hidden_size(self): @@ -1252,6 +1257,7 @@ def __init__(self, self.only_hidden_states = True self.return_logist_only = True self.tie_word_embeddings = False + self.is_decoder=True @property def hidden_size(self): From 8687fbea940e01d58b80cc0ddb245ac18492748c Mon Sep 17 00:00:00 2001 From: wangguojim <862876363@qq.com> Date: Sun, 22 May 2022 11:01:35 +0000 Subject: [PATCH 2/3] update t5_kbqa readme --- examples/t5_kbqa/RADEME.md | 5 ++++- examples/t5_kgclue/RADEME.md | 12 ------------ 2 files changed, 4 insertions(+), 13 deletions(-) delete mode 100644 examples/t5_kgclue/RADEME.md diff --git a/examples/t5_kbqa/RADEME.md b/examples/t5_kbqa/RADEME.md index 2f639629..33996954 100644 --- a/examples/t5_kbqa/RADEME.md +++ b/examples/t5_kbqa/RADEME.md @@ -6,4 +6,7 @@ etc. In this kind of pipeline methods, errors in any procedure will inevitably p final prediction. To address this challenge, the Corpus Generation - Retrieve Method (CGRM) with Pre-training Language Model (PLM) for the KBQA task aims to generate natural language QA pairs based on Knowledge Graph triples and directly solve the QA by retrieving the synthetic dataset. The new method can extract more -information about the entities from PLM to improve accuracy and simplify the processes. \ No newline at end of file +information about the entities from PLM to improve accuracy and simplify the processes. + +The major procedure of CGRM is to generate QA pairs, in which, it needs to do two tasks: +The first task is a [NER](finetune_t5_ner.py) downstream task. The second one is a downstram task for [generating natural language QA pairs based on Knowledge Graph triples](finetune_t5_triple2question.py). \ No newline at end of file diff --git a/examples/t5_kgclue/RADEME.md b/examples/t5_kgclue/RADEME.md deleted file mode 100644 index 33996954..00000000 --- a/examples/t5_kgclue/RADEME.md +++ /dev/null @@ -1,12 +0,0 @@ -Knowledge Base Question Answering (KBQA) aims to answer natural language questions with -the help of an external knowledge base. The core idea is to find the link between the internal -knowledge behind questions and known triples of the knowledge base. Traditional KBQA task -pipelines contain several steps, including entity recognition, entity linking, answering selection, -etc. In this kind of pipeline methods, errors in any procedure will inevitably propagate to the -final prediction. To address this challenge, the Corpus Generation - Retrieve -Method (CGRM) with Pre-training Language Model (PLM) for the KBQA task aims to generate natural language QA pairs based on Knowledge Graph triples -and directly solve the QA by retrieving the synthetic dataset. The new method can extract more -information about the entities from PLM to improve accuracy and simplify the processes. - -The major procedure of CGRM is to generate QA pairs, in which, it needs to do two tasks: -The first task is a [NER](finetune_t5_ner.py) downstream task. The second one is a downstram task for [generating natural language QA pairs based on Knowledge Graph triples](finetune_t5_triple2question.py). \ No newline at end of file From ff5605736511bc51d90fda3ef9f83205d546a1f2 Mon Sep 17 00:00:00 2001 From: wangguojim <862876363@qq.com> Date: Tue, 24 May 2022 00:09:22 +0000 Subject: [PATCH 3/3] fix according to comments --- examples/t5_kbqa/data/dev.csv | 100 ++++++++++++++++++++++++++++ examples/t5_kbqa/data/train.csv | 100 ++++++++++++++++++++++++++++ examples/t5_kbqa/finetune_t5_ner.py | 22 +++--- 3 files changed, 209 insertions(+), 13 deletions(-) create mode 100644 examples/t5_kbqa/data/dev.csv create mode 100644 examples/t5_kbqa/data/train.csv diff --git a/examples/t5_kbqa/data/dev.csv b/examples/t5_kbqa/data/dev.csv new file mode 100644 index 00000000..904866ee --- /dev/null +++ b/examples/t5_kbqa/data/dev.csv @@ -0,0 +1,100 @@ +,question,entity,triplet +1,巫山县疾病预防控制中心的机构职能是什么?,巫山县疾病预防控制中心,巫山县疾病预防控制中心 ||| 机构职能 ||| 疾病预防控制工作 +2,我很好奇龙编站的坐标是什么啊?,龙编站,龙编站 ||| 坐标 ||| 21°2′22.9″N105°51′1.1″E +3,rio是谁代言的?,rio,rio(BACCHUS公司推出的RIO酒) ||| 代言人 ||| 周迅2013,杨洋、郭采洁2015 +4,你知道Metasploit的开发时间是什么时候吗?,Metasploit,Metasploit ||| 开发时间 ||| 2004年8月 +5,有谁知道喜蛋如何制作吗?,喜蛋,喜蛋(庆贺喜事的馈赠食物) ||| 制作方法 ||| 水煮染色(传统)、烘焙(西点) +6,国际先生是什么时候举行?,国际先生,国际先生 ||| 会期 ||| 12月9日 +7,元胡止痛软胶囊通常叫什么?,元胡止痛软胶囊,元胡止痛软胶囊 ||| 通用名 ||| 元胡止痛软胶囊 +8,石光荣的儿女叫什么?,石光荣,石光荣 ||| 儿女 ||| 石林、石晶、石海 +9,你知道九九式步枪是什么时间生产的吗?,九九式步枪,九九式步枪 ||| 生产时间 ||| 1939年 +10,大屏幕处理器是由什么支持的?,大屏幕处理器,大屏幕处理器 ||| 支持 ||| 高清电视(HDTV)输入、输出 +11,扬州大学化学化工学院的专职院士是多少啊?,扬州大学化学化工学院,扬州大学化学化工学院 ||| 专职院士 ||| 无人 +12,唇焦是属于什么类别的疾病?,唇焦,唇焦 ||| 疾病分类 ||| 口腔科疾病 +13,全球防卫组织又译作什么?,全球防卫组织,全球防卫组织 ||| 又译 ||| 全球防御组织 +14,股票厦门金龙汽车集团股份有限公司的代码是什么?,厦门金龙汽车集团股份有限公司,厦门金龙汽车集团股份有限公司 ||| 证券代码 ||| 600686 +15,哈药的员工有多少人啊?,哈药,哈药 ||| 职工 ||| 2.01万人 +16,请问Lphant支持哪些东西?,Lphant,Lphant ||| 支持 ||| eDonkey网络 +17,牛脑有什么气味?,牛脑,牛脑(可药用食物) ||| 气味 ||| 甘、温、微毒 +18,你知道S.I.N.从属于哪里吗?,S.I.N.,S.I.N. ||| 从属 ||| 罪恶组织Shadaloo +19,济河的发源地是哪里?,济河,济河(豫鲁的河流) ||| 发源于 ||| 河南省济源市 +20,仁川的市鸟是什么鸟?,仁川,仁川(大韩民国六大广域市之一) ||| 市鸟 ||| 白鹤 +21,很好奇海王龙吃什么啊?,海王龙,海王龙 ||| 食物 ||| 大型鱼类及海洋爬行动物 +22,超声波测试仪是什么时候工作的?,超声波测试仪,超声波测试仪 ||| 工作时间 ||| 100小时 +23,广西壮族自治区人民政府宗教事务局属于什么辖区?,广西壮族自治区人民政府宗教事务局,广西壮族自治区人民政府宗教事务局 ||| 辖区 ||| 广西壮族自治区 +24,清水塘村有哪些资源?,清水塘村,清水塘村(湖北省武汉市新洲区旧街街清水塘村委会) ||| 资源 ||| 铁,铂金红石 +25,新华报业传媒这个应用现在是什么版本?,新华报业传媒,新华报业传媒 ||| 应用版本 ||| 1.2 +26,《出卖影子的人》是什么时候出版的?,出卖影子的人,出卖影子的人 ||| 出版年 ||| 1987 +27,马西奥·塞纳曾效力哪支队伍?,马西奥·塞纳,马西奥·塞纳 ||| 曾效力 ||| 尤文图德队 +28,红萝卜具有怎样的性味?,红萝卜,红萝卜 ||| 性味 ||| 味甘、性平 +29,熙笃会又译作什么?,熙笃会,熙笃会 ||| 又译 ||| 西多会 +30,请问叶儿粑的主要出产地是在哪里啊?,叶儿粑,叶儿粑 ||| 主要产地 ||| 川西、川南 +31,周恩来纪念馆总占地面积是多少?,周恩来纪念馆,周恩来纪念馆 ||| 总占地面积 ||| 40万平方米 +32,你知道科雷泽以前为谁工作吗?,科雷泽,科雷泽 ||| 曾效力 ||| 阿尔勒 +33,你觉得干香菇的口感如何?,干香菇,干香菇 ||| 口感 ||| 口味鲜美,口感细嫩。 +34,你知道狩猎美男之古旅总推荐什么啊?,狩猎美男之古旅,狩猎美男之古旅 ||| 总推荐 ||| 0 +35,谁知道库·丘林是哪个书里的角色呢?,库·丘林,库·丘林(凯尔特神话中的英雄) ||| 人物出处 ||| 凯尔特神话 +36,青州镇的山林有多少面积?,青州镇,青州镇(福建三明市沙县区辖镇) ||| 山林面积 ||| 144743亩 +37,你知道辛安镇东经多少度吗?,辛安镇,辛安镇(黄岛区下辖乡镇) ||| 东经 ||| 120°06′至120°12′ +38,你知道鲤鱼山的名字是怎么来的吗?,鲤鱼山,鲤鱼山(台湾台东山峰) ||| 得名 ||| 因山形似鱼而得名 +39,你知道青岛经济职业学校是哪个省的吗?,青岛经济职业学校,青岛经济职业学校 ||| 所属省份 ||| 山东省 +40,你知道西南野生动植物资源保护教育部重点实验室的批准日期是什么吗?,西南野生动植物资源保护教育部重点实验室,西南野生动植物资源保护教育部重点实验室 ||| 批准日期 ||| 2008年 +41,上海浦东香格里拉大酒店离火车站有多远?,上海浦东香格里拉大酒店,上海浦东香格里拉大酒店 ||| 火车站距离 ||| 20公里 +42,你知道斑鳍光鳃鱼是谁起的名吗?,斑鳍光鳃鱼,斑鳍光鳃鱼 ||| 命名人 ||| Temminck et Schlegel +43,远日行星的自转周期是什么?,远日行星,远日行星 ||| 自转周期 ||| 17小时14分和15小时57分 +44,急性再障的病因是什么?,急性再障,急性再障 ||| 病因 ||| 感染(细菌、病毒)尤肝炎病毒 +45,复旦大学科学技术研究院的机构职能是什么?,复旦大学科学技术研究院,复旦大学科学技术研究院 ||| 机构职能 ||| 主管学校科学技术研究工作 +46,有谁知道天津利顺德大饭店到火车站的距离吗?,天津利顺德大饭店,天津利顺德大饭店 ||| 火车站距离 ||| 15km +47,迪罗伯托的球衣号是几号?,迪罗伯托,迪罗伯托 ||| 球衣号 ||| 9号 +48,我想知道大专生的学制是什么?,大专生,大专生 ||| 学制 ||| 三年 +49,你知道真矢美纪组织过什么活动吗?,真矢美纪,真矢美纪 ||| 活动 ||| 1981年 – 2013年音乐演唱会 +50,心脏磁共振成像的适应症是什么?,心脏磁共振成像,心脏磁共振成像 ||| 适应症 ||| 心肌病变、心包疾病、心脏肿瘤等 +51,广播心理战具有哪些特征?,广播心理战,广播心理战 ||| 具有 ||| 跨越国界等特点 +52,科沃斯地宝适合什么人群?,科沃斯地宝,科沃斯地宝 ||| 适合人群 ||| 为事业奋斗的年轻白领,为家庭付出的美满之家,享健康晚年生活的老人,宠物之家 +53,札幌的市鸟是什么?,札幌,札幌 ||| 市鸟 ||| 杜鹃鸟 +54,5·13土耳其索玛矿难的坐标是什么?,5·13土耳其索玛矿难,5·13土耳其索玛矿难 ||| 坐标 ||| 39°4′37.90″N27°31′30.93″E +55,你知道申克是什么时候创办的吗?,申克,申克(德国申克集团) ||| 创办 ||| 1881年 +56,你了解半坡村的平均气温吗?,半坡村,半坡村(云南省曲靖富源县后所镇半坡村) ||| 平均气温 ||| 18 ℃ +57,谁知道赵戬老师是哪里毕业的?,赵戬,赵戬(中国医科大学讲师) ||| 毕业于 ||| 中国医科大学 +58,镁带是如何储存的?,镁带,镁带 ||| 储存 ||| 密封阴凉干燥保存 +59,请问大麦哲伦星系自转一圈需要多久?,大麦哲伦星系,大麦哲伦星系 ||| 自转周期 ||| 约 250 Myr +60,中天娱乐台是从哪天开播的?,中天娱乐台,中天娱乐台 ||| 开播日期 ||| 1997年1月30日 +61,慕容德从什么时候开始继位的?,慕容德,慕容德 ||| 在位 ||| 398年~405年 +62,直肠指检适用哪些症状?,直肠指检,直肠指检 ||| 适应症 ||| 检查肛管、直肠等肠道疾病 +63,东马格拉哨所位于我国哪个省?,东马格拉哨所,东马格拉哨所 ||| 所属省份 ||| 内蒙古 +64,国民革命军第17军什么时候改的名字啊?,国民革命军第17军,国民革命军第17军(闽军李凤翔部组成的第17军) ||| 改名时间 ||| 1926年9月 +65,请问北京大唐圣殿影视文化有限公司属于哪个集团啊?,北京大唐圣殿影视文化有限公司,北京大唐圣殿影视文化有限公司 ||| 所属集团 ||| 北京大唐圣殿影视文化有限公司 +66,有谁知道布洛夫是几号球衣吗?,布洛夫,布洛夫 ||| 球衣号 ||| 4 +67,大家了解熊本市的市鸟吗?,熊本市,熊本市 ||| 市鸟 ||| 大山雀 +68,你知道鲤鱼头怎么制作吗?,鲤鱼头,鲤鱼头 ||| 制作方法 ||| 简单 +69,请问护墙板的主要出产地是在哪里啊?,护墙板,护墙板 ||| 主要产地 ||| 欧洲 美洲 亚洲等地 +70,小官人的解释是什么?,小官人,小官人(词义典故) ||| 解释1 ||| 富贵人家子弟 +71,邹忌讽齐王纳谏的编者是谁有人知道吗?,邹忌讽齐王纳谏,邹忌讽齐王纳谏 ||| 编者 ||| 西汉刘向 +72,中国科学院长春应用化学研究所有多少个专职院士?,中国科学院长春应用化学研究所,中国科学院长春应用化学研究所 ||| 专职院士 ||| 6人 +73,谁知道金海国际社区这个项目在哪?,金海国际社区,金海国际社区 ||| 项目位置 ||| 明月路88号 +74,莲花洞的由来是什么?,莲花洞,莲花洞(龙门石窟里的洞窟) ||| 名字由来 ||| 窟顶刻有一朵巨大的莲花 +75,诺基亚Lumia 510的上市时间是什么时候?,诺基亚Lumia 510,诺基亚Lumia 510 ||| 上市日期 ||| 2013年 +76,高士村的北纬是多少?,高士村,高士村 ||| 北纬 ||| N26°0′8.81″ +77,2011年武汉亚洲男子篮球锦标赛是在哪里举办的?,2011年武汉亚洲男子篮球锦标赛,2011年武汉亚洲男子篮球锦标赛 ||| 举办城市 ||| 湖北武汉 +78,北岭是哪个省的?,北岭,北岭 ||| 所属省份 ||| 福建省 +79,请问大连市中山区春海小学是什么时候改名的?,大连市中山区春海小学,大连市中山区春海小学 ||| 改名时间 ||| 1952年 +80,我很好奇开关二极管有什么用处?,开关二极管,开关二极管 ||| 主要用于 ||| 电子计算机、脉冲和开关电路 +81,中国国际高新技术成果交易会在什么城市举办的?,中国国际高新技术成果交易会,中国国际高新技术成果交易会 ||| 举办城市 ||| 中国广东深圳市 +82,惠州亿纬锂能股份有限公司的法人代表是谁啊?,惠州亿纬锂能股份有限公司,惠州亿纬锂能股份有限公司 ||| 法人代表 ||| 刘金成 +83,你知道酞酸酯偶联剂怎么用吗?,酞酸酯偶联剂,酞酸酯偶联剂 ||| 使用方法 ||| 在填料等处理物中均匀地分散 +84,东方宾馆的证券代码是多少啊?,东方宾馆,东方宾馆 ||| 证券代码 ||| 000524 +85,我想知道贫瘠之地都包括哪些装备和训练?,贫瘠之地,贫瘠之地(魔兽世界游戏地点) ||| 资源 ||| 黄金,狩猎,木材。 +86,请问别克英朗XT的发动机是什么?,别克英朗XT,别克英朗XT ||| 发动机 ||| 1.6T涡轮增压 +87,赣州市中医院的院训是什么?,赣州市中医院,赣州市中医院 ||| 医院院训 ||| 仁心仁术 传承进取 +88,你知道中共绍兴市委宣传部是什么职能吗?,中共绍兴市委宣传部,中共绍兴市委宣传部 ||| 机构职能 ||| 负责指导全市理论学习、理论宣传 +89,放爆竹是什么日子?,放爆竹,放爆竹 ||| 节日 ||| 春节、元宵节等 +90,你知道万佛宫的开发日期吗?,万佛宫,万佛宫 ||| 开发时间 ||| 1991年5月 +91,请问完颜宗隽的儿女叫什么名字?,完颜宗隽,完颜宗隽 ||| 儿女 ||| 完颜氏、完颜师姑儿 +92,张紫淇现在住在哪?,张紫淇,张紫淇 ||| 现住地 ||| 北京 +93,你知道Act like You know是谁作词的吗?,Act like You know,Act like You know ||| 词 ||| 陈奂仁/陈冠希 +94,InterVideo坐落于什么地方?,InterVideo,InterVideo ||| 坐落于 ||| 美国加州硅谷 +95,波音737-700是哪家公司生产的?,波音737-700,波音737-700 ||| 生产公司 ||| 波音公司 +96,你知道比喻句属于什么科目吗?,比喻句,比喻句 ||| 科目 ||| 语文 +97,驭风波莫有多少攻击力?,驭风波莫,驭风波莫 ||| 攻击力 ||| 320 +98,史迹名胜天然纪念物保存法是什么时候施行的?,史迹名胜天然纪念物保存法,史迹名胜天然纪念物保存法 ||| 施行日期 ||| 1919年6月1日 +99,Sonoma是由什么支持的?,Sonoma,Sonoma(Sonoma平台) ||| 支持 ||| Azalia音频 diff --git a/examples/t5_kbqa/data/train.csv b/examples/t5_kbqa/data/train.csv new file mode 100644 index 00000000..05ebfcab --- /dev/null +++ b/examples/t5_kbqa/data/train.csv @@ -0,0 +1,100 @@ +,question,entity,triplet +1,武汉交通职业学院计算机协会有哪些学校?,武汉交通职业学院计算机协会,武汉交通职业学院计算机协会 ||| 学校 ||| 武汉交通职业学院 +2,你知道龙晶用繁体字怎么写吗?,龙晶,龙晶(游戏) ||| 繁体 ||| 龍晶 +3,无罪无我的和声是什么?,无罪无我,无罪无我 ||| 和声 ||| 章韵、徐晨辰 +4,你知道影舞者的车身有多重吗?,影舞者,影舞者(《QQ飞车》中的赛车) ||| 车身重量 ||| 1232kg +5,冯慧专业是什么方向?,冯慧,冯慧(武汉大学教授) ||| 专业方向 ||| 偏微分方程数值解 +6,你知道戴姆勒股份公司有多少员工吗?,戴姆勒股份公司,戴姆勒股份公司 ||| 员工数 ||| 298655 人(2020年) +7,谁知道魔力w.i.t.c.h.系列有哪些丛书?,魔力w.i.t.c.h.,魔力w.i.t.c.h. ||| 丛书系列 ||| 魔力w.i.t.c.h.100少女完全手册、魔力w.i.t.c.h.故事集、魔力w.i.t.c.h.小说《破碎的魔球》 +8,谁知道端午节有什么重要意义?,端午节,端午节(中国四大传统节日之一) ||| 节日意义 ||| 传承与弘扬非物质文化 +9,谁唱的风不息?,风不息,风不息(1995年郭富城发行的音乐专辑) ||| 歌手 ||| 郭富城 +10,指点杆有什么组成?,指点杆,指点杆 ||| 组成部分 ||| 指点杆和鼠标键 +11,请问李臻的新浪微博名称叫什么呢?,李臻,李臻(影视演员) ||| 新浪微博 ||| 李臻Jennifer +12,宁夏网是哪个组织主办的?,宁夏网,宁夏网 ||| 主办方 ||| 宁夏日报社 +13,申时行是什么官职?,申时行,申时行 ||| 官职 ||| 礼部尚书兼文渊阁大学士 +14,请问秦国大长公主的兄弟是谁?,秦国大长公主,秦国大长公主 ||| 兄弟 ||| 赵光济,宋太祖,宋太宗,赵光赞 +15,陈氏祖祠何时修建?,陈氏祖祠,陈氏祖祠(广东省普宁市陈氏祖祠) ||| 修建时间 ||| 1925—1926年 +16,美洲蜥蜴科是属于什么亚门的,美洲蜥蜴科,美洲蜥蜴科 ||| 亚门 ||| 脊椎动物亚门 +17,熊猫看书这个游戏有多大?,熊猫看书,熊猫看书 ||| 软件大小 ||| 6.8MB +18,克努特是处于哪个朝代的?,克努特,克努特(欧洲中世纪历史人物) ||| 所处时代 ||| 中世纪 +19,你知道中国古代的恶霸的定价是多少吗?,中国古代的恶霸,中国古代的恶霸 ||| 定价 ||| 12.5 元 +20,六合村的方言是什么?,六合村,六合村(山西省太原市清徐县清源镇下辖村) ||| 方言 ||| 清徐方言 +21,Adobe Photoshop是付费软件吗?,Adobe Photoshop,Adobe Photoshop ||| 软件授权 ||| 共享(盒装单许可售价 5000 元人民币) +22,孛儿只斤·拙赤合撒儿有什么特长?,孛儿只斤·拙赤合撒儿,孛儿只斤·拙赤合撒儿 ||| 特长 ||| 勇敢善射,矢无虚发,应弦而倒 +23,请问武汉汉正街是什么时候修建的?,武汉汉正街,武汉汉正街 ||| 修建时间 ||| 乾隆四年(1739年) +24,你知道磨憨镇的代码吗?,磨憨镇,磨憨镇 ||| 代码 ||| 532823105 +25,异鼠李素的分子量是多少?,异鼠李素,异鼠李素 ||| 分子量 ||| 316.2623 +26,龙青高速公路哪里是起点?,龙青高速公路,龙青高速公路 ||| 起点 ||| 荣乌高速公路龙港南互通立交 +27,请问谢芳是什么时候参加工作的?,谢芳,谢芳(园林高级工程师) ||| 参加工作 ||| 1989年8月 +28,宋诗别裁集是出自哪个朝代?,宋诗别裁集,宋诗别裁集 ||| 年代 ||| 清 +29,谁知道延福寺再次修建时什么时候?,延福寺,延福寺(广东省汕头市澄海区莲下镇渡亭乡延福寺) ||| 重建时间 ||| 清乾隆壬申十七年 +30,Mozilla Sunbird是什么时候发布的你知道吗?,Mozilla Sunbird,Mozilla Sunbird ||| 发布日期 ||| 2003年7月 +31,请问麻杏苡甘汤主要适用于什么病症?,麻杏苡甘汤,麻杏苡甘汤 ||| 主要适用症 ||| 解表祛湿 +32,大家知道DP-12的编号吗?,DP-12,DP-12(游戏《少女前线》中的角色) ||| 编号 ||| No.282 +33,二十二根特指什么?,二十二根,二十二根 ||| 特指 ||| 于事特有增上义之二十二种法 +34,谁知道陶瓷的主编是谁?,陶瓷,陶瓷(专业技术期刊) ||| 主编 ||| 苑克兴 +35,完美的法人代表人是谁?,完美有限公司,完美(中国)有限公司 ||| 法定代表人 ||| 古润金 +36,奔跑吧兄弟第四季有哪个频道播出?,奔跑吧兄弟第四季,奔跑吧兄弟第四季 ||| 播出频道 ||| 浙江卫视 +37,你知道中印边境自卫反击战的战绩如何吗?,中印边境自卫反击战,中印边境自卫反击战 ||| 结果 ||| 中国获胜,印度惨败 +38,萌宠属于什么?,萌宠,萌宠 ||| 种类 ||| 现实世界和文学作品的动物 +39,请问漕河泾实业大厦属于什么类型的产权?,漕河泾实业大厦,漕河泾实业大厦 ||| 产权类型 ||| 商品房 +40,你知道私立广东国民大学是属于什么时间的吗?,私立广东国民大学,私立广东国民大学 ||| 创办时间 ||| 1925年9月 +41,花椒毒素的毒性如何?,花椒毒素,花椒毒素 ||| 毒性 ||| 小鼠 LD50为468mg/kg +42,帕西法厄是哪国的神话?,帕西法厄,帕西法厄 ||| 神话体系 ||| 希腊神话 +43,我想知道成都地铁14号线是以什么颜色为代表的?,成都地铁14号线,成都地铁14号线 ||| 代表色 ||| 浅绿色 +44,斯柯达速派的油箱容积是多少?,斯柯达速派,斯柯达速派 ||| 油箱容积 ||| 68.5L +45,颚口动物门的数量有多少啊?,颚口动物门,颚口动物门 ||| 数量 ||| 18个属,大约有100种 +46,请问F-22战斗机是哪个国家的?,F-22战斗机,F-22战斗机 ||| 国家 ||| 美国 +47,MINI COUPE的车身重量是多少?,MINI COUPE,MINI COUPE ||| 车身重量 ||| 1135~1250kg +48,紫色的频率是多啊?,紫色,紫色(一种颜色) ||| 频率 ||| 700~790THz(对应空气中波长430~380nm) +49,西扬威胡同的全长是多少?,西扬威胡同,西扬威胡同 ||| 全长 ||| 226米 +50,你知道枡山宪三的中文名是什么吗?,枡山宪三,枡山宪三 ||| 中文名 ||| 枡山宪三 +51,我想请问一下影片生化奇兵:无限是哪个公司发行的?,生化奇兵:无限,生化奇兵:无限 ||| 发行公司 ||| 2K Games +52,马莱的主要民族是什么你知道吗?,马莱,马莱(日本漫画《进击的巨人》中的国家) ||| 主要民族 ||| 艾尔迪亚,马莱 +53,请问英雄传奇是什么操作系统的?,英雄传奇,英雄传奇(1989年Dos系统下的单机游戏) ||| 操作系统 ||| DOS +54,请问任安是什么时候出生的?,任安,任安(北宋历史人物) ||| 出生时间 ||| 1119 +55,布灵顿俱乐部啥时候建立的呀?,布灵顿俱乐部,布灵顿俱乐部 ||| 创建时间 ||| 1780年 +56,你知道佐贺偶像是传奇 Revenge有什么音乐吗?,佐贺偶像是传奇 Revenge,佐贺偶像是传奇 Revenge ||| 音乐 ||| 高梨康治、Funta7 +57,我想知道湿毒清胶囊还有多久过期?,湿毒清胶囊,湿毒清胶囊 ||| 有效期 ||| 36个月 +58,请问胶州湾的南北有多长?,胶州湾,胶州湾 ||| 南北长 ||| 40公里左右 +59,鞋底成本是谁提出的?,鞋底成本,鞋底成本 ||| 提出者 ||| 格里高利·曼昆 +60,你知道榎木实的哥哥是谁吗?,榎木实,榎木实 ||| 哥哥 ||| 榎木拓也 +61,美咲美优是哪个运动队的?,美咲美优,美咲美优(广州亚运会日本代表团成员) ||| 所属运动队 ||| 2010年广州亚运会日本代表团成员 +62,超现实主义宣言的出版时间是什么时候?,超现实主义宣言,超现实主义宣言(2010年12月重庆大学出版社出版的图书) ||| 出版日期 ||| 2010年12月 +63,请问沃尔沃C30的座位是什么材质的啊?,沃尔沃C30,沃尔沃C30 ||| 座位材质 ||| 真皮 +64,你知道武汉大学简帛研究中心是什么时候创办的吗?,武汉大学简帛研究中心,武汉大学简帛研究中心 ||| 创立 ||| 2003年 +65,古神道的作品名字是什么啊?,古神道,古神道 ||| 作品别名 ||| 太古神道 +66,你知道普鲁卡因的不良反应是什么?,普鲁卡因,普鲁卡因 ||| 不良反应 ||| 可引起不安、飘浮感、口周感觉异常 +67,你知道厨子戏子痞子票房是多少吗?,厨子戏子痞子,厨子戏子痞子 ||| 票房 ||| 2.7亿 +68,我想知道MIXION签了哪家经纪公司?,MIXION,MIXION ||| 经纪公司 ||| 齐石传播 +69,农村人民公社工作条例何时通过的?,农村人民公社工作条例,农村人民公社工作条例 ||| 通过时间 ||| 1962年9月27日 +70,你知道油鱼在二名法里叫什么吗?,油鱼,油鱼(鲤科泉水鱼属动物) ||| 二名法 ||| Semilabeo prochilus Sauvage et Dabry +71,请问游乐代表着什么颜色?,游乐,游乐(《巴啦啦小魔仙》系列的角色) ||| 代表色 ||| 深蓝色 +72,你知道闪电狼职业电竞队是什么时候解散的吗,闪电狼职业电竞队,闪电狼职业电竞队 ||| 解散时间 ||| 2019年12月14日 +73,约拿·马科维茨是做什么的?,约拿·马科维茨,约拿·马科维茨 ||| 职业 ||| 导演 +74,我想知道大同组原来叫什么啊?,大同组,大同组 ||| 原称 ||| 大同煤系 +75,请问信阳师范学院学报的主办方是谁?,信阳师范学院学报,信阳师范学院学报 ||| 主办 ||| 信阳师范学院 +76,告诉我谱代家臣的制度?,谱代家臣,谱代家臣(日本古代制度) ||| 制度 ||| 御家人和非御家人 +77,音波有哪些品质?,音波,音波(游戏《第五人格》中的时装) ||| 品质 ||| 奇珍 +78,魔术师饰演的角色名字叫什么?,魔术师,魔术师(美国漫威漫画旗下超级反派) ||| 饰演 ||| 邪恶魔法师 +79,重庆三峡学院有多少个专业?,重庆三峡学院,重庆三峡学院 ||| 本科专业 ||| 62个 +80,我想知道王化东是哪个运动队的?,王化东,王化东(中国篮球运动员) ||| 所属运动队 ||| 辽宁沈阳三生飞豹篮球俱乐部 +81,大白鲨获得的奖项主要有什么来着?,大白鲨,大白鲨(Sheamus) ||| 主要奖项 ||| WWE冠军×2世界重量级冠军×1美国冠军×2 +82,水果星球获得过什么奖项?,水果星球,水果星球 ||| 获得奖项 ||| 2020年星光大赏年度潜质乐团 +83,德雷利在哪里出生的?,德雷利,德雷利 ||| 出生地 ||| 特拉布松(土耳其) +84,你知道治淮的国际刊号是多少吗?,治淮,治淮 ||| 国际刊号 ||| 1001-9243 +85,庞德需要多少费用?,庞德,庞德(《阵面对决》中的卡牌) ||| 费用 ||| 6 +86,南京理工大学学报多长时间出版一期?,南京理工大学学报,南京理工大学学报 ||| 出版周期 ||| 双月 +87,北土城站是什么样的站厅?,北土城站,北土城站 ||| 站厅形式 ||| 整体式站厅(两线共用) +88,小乔属于哪种难度程度?,小乔,小乔(MOBA端游《英魂之刃》里的一名法师类的英雄) ||| 难度 ||| 偏难 +89,谁知道丁公路北站隶属于哪里?,丁公路北站,丁公路北站 ||| 隶属 ||| 南昌地铁1号线、南昌地铁4号线 +90,你知道葛城忍人今年多大了吗?,葛城忍人,葛城忍人 ||| 年龄 ||| 21岁 +91,台上台下在什么网站上播出啊?,台上台下,台上台下(2002年崔砚君、冯巩、李艺创作的相声) ||| 播出平台 ||| 中央电视台综合频道等 +92,注册信贷分析师是哪个机构出台的?,注册信贷分析师,注册信贷分析师 ||| 机构 ||| 银行 +93,请问哥伦比亚是在哪一天建立的?,哥伦比亚,哥伦比亚(哥伦比亚共和国) ||| 国庆日 ||| 7月20日(独立日) +94,洛湛铁路的通车时间是什么时候?,洛湛铁路,洛湛铁路 ||| 通车时间 ||| 2011年7月18日 +95,破镜重圆是由谁作画的?,破镜重圆,破镜重圆(ほしの瑞希著作漫画) ||| 作画 ||| ほしの瑞希 +96,向瑛文化程度怎样?,向瑛,向瑛 ||| 文化 ||| 大专文化 +97,你知道叶月渚擅长什么吗?,叶月渚,叶月渚 ||| 擅长 ||| 蛙泳 +98,你知道玛丽的性别吗?,玛丽,玛丽(游戏《第五人格》中的监管者角色) ||| 性别 ||| 女 +99,请问中共太原支部旧址的建筑面积有多大?,中共太原支部旧址,中共太原支部旧址 ||| 建筑面积 ||| 5820 m² diff --git a/examples/t5_kbqa/finetune_t5_ner.py b/examples/t5_kbqa/finetune_t5_ner.py index 320005a9..c238d666 100644 --- a/examples/t5_kbqa/finetune_t5_ner.py +++ b/examples/t5_kbqa/finetune_t5_ner.py @@ -1,7 +1,3 @@ -import sys -sys.path.append('/data/wang/models/FlagAI') - - import re import torch import argparse @@ -32,12 +28,12 @@ def train_data_process_kgclue(file): class SeqDataset(Dataset): """ - 针对特定数据集,定义一个相关的取数据的方式 + Dataset function """ def __init__(self, sents_src, sents_tgt): super(SeqDataset, self).__init__() - # 读原始数据 + self.sents_src = sents_src self.sents_tgt = sents_tgt @@ -60,12 +56,12 @@ def __len__(self): def collate_fn(batch): """ - 动态padding, batch为一部分sample + dynamic padding, """ def padding(indice, max_length, pad_idx=0): """ - pad 函数 + paddiing function """ pad_indice = [ item + [pad_idx] * max(0, max_length - len(item)) @@ -94,15 +90,15 @@ def padding(indice, max_length, pad_idx=0): if __name__ == '__main__': data_name = 'kgclue' - train_path = '/mnt/T5_JIEBA/input/train.csv' - test_path = '/mnt/T5_JIEBA//input/dev.csv' + train_path = './data/train.csv' + test_path = './data/dev.csv' model_name = 'T5' vocab_path = '/mnt/T5_JIEBA/vocab.txt' model_path = '/mnt/T5_JIEBA/pytorch_model.bin' logger.add('log/log_' + data_name + '_' + model_name + - '_{time}.log') # 加载日志 - torch.cuda.empty_cache() # torch自动回收缓存 - # 加载模型 + '_{time}.log') # + torch.cuda.empty_cache() + # load model word2idx = load_chinese_base_vocab(vocab_path) tokenizer = T5JiebaTokenizer(token_dict=word2idx) model = T5UERModel(word2idx)