要Python37的环境,为了避免不同环境下的依赖相互影响,所以创建一个新的py环境,我用的是conda,命令如下:
conda create -n casrel python=3.7
下载项目运行需要的代码,预训练模型,数据集
可以直接使用git命令下载
git https://github.com/weizhepei/CasRel.git
我是在网站上直接下载的源码
https://github.com/weizhepei/CasRel
链接: NYT数据集下载地址.
下载后解压,将其放到项目路径data/NYT/raw_NYT下
然后运行data/NYT/raw_NYT/generate.py将数字编码形式的nyt数据集转换为字符形式的数据集,并根据三元组将数据集分类为normal,epo,spo几种类型。这里要将generate.py的main方法改成:
for file_type in ['train', 'valid', 'test']:
file_name = f'{file_type}.json'
output = f'new_{file_type}.json'
output_normal = f'new_{file_type}_normal.json'
output_epo = f'new_{file_type}_epo.json'
output_seo = f'new_{file_type}_seo.json'
with open('relations2id.json', 'r') as f1, open('words2id.json', 'r') as f2:
rel2id = json.load(f1)
words2id = json.load(f2)
rel_dict = {j: i for i, j in rel2id.items()}
word_dict = {j: i for i, j in words2id.items()}
load_data(file_name, word_dict, rel_dict, output, output_normal, output_epo, output_seo)
如果不改的话只会生成valid的json
1、运行结果为CasRel/data/NYT/raw_NYT/new_train.json,new_train_epo.json,new_train_normal.json,new_train_seo.json等。
2、将产生的新文件new_train.json、new_test.json和new_valid.json移至NYT/目录下,并分别将文件名改成traim.json、test.json、dev.json。并运行CasRel/data/NYT/build_data.py
3、将1生成的new_test.json复制到CasRel/data/NYT/test_split_by_num下,改名成test.json,并运行test_split_by_num.py
4、将1生成的new_test_epo.json、 new_test_normal.json、new_test_seo.json复制到CasRel/data/NYT/test_split_by_type下,改名成去掉前面的new,并运行test_split_by_type.py
下载BERT预训练模型,本文用的是BERT-Base, Cased(12-layer, 768-hidden, 12-heads , 110M parameters): 下载地址.。解压后放项目下的pretrained_bert_models中。
其中Cased表示保留真实的大小写和重音标记符,uncased表示文本在单词标记之前就已经变为小写,也去掉了任何重音标记例如,John Smith变成john smith。通常,Uncased模型会更好,除非大小写信息对于我们的任务很重要,如命名实体识别或词性标记。
python run.py --train=True --dataset=NYT