如果有遇到这个问题的欢迎和我交流讨论,我真的不懂了。。。
qq:1410497065
----------------------------------------------------------------------
2022-3-31更新
给作者发邮件了,人家回复我了,应该是我的问题,但是我使用的也是这个评估函数啊。。
我发现了一个可能导致结果出错的问题,已经发给作者,不过我再也不想回来看这个模型了。。。
-----------------------------------------------------------------------
2022.3.29更新,发现问题了。
我下载下来后
我下载下来处理好之后和作者的数量是一样的。
可以看到,负样本占了大多数。
如果把负样本加入最后的分数计算的话,达到论文中提出的80多分是正常的,实验结果显示确实是80多分。
(下面图中每个都是分数都是一样的,不过不影响,是代码里操作有点小失误,总的来说就是加入了Neg评分才达到这么高)
但是作者给出的代码是没有把负样本算在里面的。我将数据打印出来如下图所示,Mechanism和effect的值为0,advice 和int也很低,如果不算negative的话,可能确实是0.00x分。
('negative', 'Mechanism', 'Effect', 'Advise', 'Int.')
P [0.83127413, 0. , 0. , 0.08695652, 0.01639344]),
R [0.98288062, 0. , 0. , 0.00934579, 0.0106383 ]
F [0.9007426 , 0. , 0 . 0.01687764, 0.01290323]
S [4381, 278, 298, 214, 94]
作者给出的每一种类型都有这么高的分数,是我操作失误吗。。。有复现过的遇到同样的问题了吗?
1.首先就是下载语料库数据集
GitHub - isegura/DDICorpus
找到DDICorpus-2013.zip,下载下来,如果不了解格式的可以花2分钟看一下下面的链接,先看数据集格式再看代码
DDICorpus 2013 内容介绍_未空blog的博客-CSDN博客
我当时是LINUX命令不熟悉在这里兜了一会儿圈,遇到的奇怪LINUX命令总结_未空blog的博客-CSDN博客
主要任务是将xml格式语料转成BRAT格式再存进tsv文件
xml2brat.py:
'''
将某个xml文件处理成brat格式,
例如: somefile.xml
-> somefile.txt
-> somefile.ann
-> somefile.map
'''
我是用训练集和测试集分别单独操作然后得到train.tsv 和dev.tsv
DrugBank...DrugBank我发邮件给他们了,要来回拉扯几天吧。。。因为人家都是两三点给我发消息,我看到的时候回复人家人家已经下班了,
如果是学术使用的话,是可以得到别人的许可的,估计明天就会给我回复了。我看到别人公开的代码也有drugbank,比如Sum GNN,不过好像都是txt文件,我一直想从官方那里下载一次,自己处理,毕竟实践也是很重要的。https://go.drugbank.com/releases/latest,如果想要的话也可以自己申请一下。第三步fingerprint需要用到drugbank,等明天拿到许可了再弄。
续更:下载下来了,继续操作,老规矩首先要知道数据基本格式
DrugBank总结_未空blog的博客-CSDN博客
下载下来之后执行readme,我放在shell里面了
我不知道TSV_FILE是不是刚才生成的train.tsv,dev.tsv还是别的(但是似乎没有别的了呀)。
按部就班操作得到新的TSV
fingerprint:这是对新的TSV操作,生成npy文件
BERT模型部分:
按照github给出地址下载即可
config_class, model_class, tokenizer_class = MODEL_CLASSES[args.model_type]
config = config_class.from_pretrained(args.config_name if args.config_name else args.model_name_or_path, num_labels=num_labels, finetuning_task=args.task_name) #task_name = MRPC
tokenizer = tokenizer_class.from_pretrained(args.tokenizer_name if args.tokenizer_name else args.model_name_or_path, do_lower_case=args.do_lower_case)
desc_tokenizer = tokenizer_class.from_pretrained(args.tokenizer_name if args.tokenizer_name else args.model_name_or_path, do_lower_case=args.do_lower_case)
用到模型的代码在上面三行,config_class = BertConfig
model_class = BertForSequenceClassification
tokenizer = BertTokenizer
args那里都改成/scibert_scivocab_uncased应该就能访问到了,tokenizer引用的时候报了个小错如下所示,就是说模型不是括号里的那些模型(括号里那些模型是常用的如果没有地址直接可以下载那种),默认包含提示的三个json配置文件
03/28/2022 09:25:41 - INFO - transformers.tokenization_utils - Model name '../scibert_scivocab_uncased/vocab.txt' not found in model shortcut name list (bert-base-uncased, bert-large-uncased, bert-base-cased, bert-large-cased, bert-base-multilingual-uncased, bert-base-multilingual-cased, bert-base-chinese, bert-base-german-cased, bert-large-uncased-whole-word-masking, bert-large-cased-whole-word-masking, bert-large-uncased-whole-word-masking-finetuned-squad, bert-large-cased-whole-word-masking-finetuned-squad, bert-base-cased-finetuned-mrpc). Assuming '../scibert_scivocab_uncased/vocab.txt' is a path or url to a directory containing tokenizer files.
03/28/2022 09:25:41 - INFO - transformers.tokenization_utils - Didn't find file ../scibert_scivocab_uncased/added_tokens.json. We won't load it.
03/28/2022 09:25:41 - INFO - transformers.tokenization_utils - Didn't find file ../scibert_scivocab_uncased/special_tokens_map.json. We won't load it.
03/28/2022 09:25:41 - INFO - transformers.tokenization_utils - Didn't find file ../scibert_scivocab_uncased/tokenizer_config.json. We won't load it.
03/28/2022 09:25:41 - INFO - transformers.tokenization_utils - loading file ../scibert_scivocab_uncased/vocab.txt
03/28/2022 09:25:41 - INFO - transformers.tokenization_utils - loading file None
03/28/2022 09:25:41 - INFO - transformers.tokenization_utils - loading file None
03/28/2022 09:25:41 - INFO - transformers.tokenization_utils - loading file None
但是打开这个transformer.tokenization_utils可以看到这段文字:
# We can't instantiate directly the base class `PreTrainedTokenizer` so let's show our examples on a derived class: BertTokenizer
# Download vocabulary from S3 and cache.
tokenizer = BertTokenizer.from_pretrained('bert-base-uncased')
# If vocabulary files are in a directory (e.g. tokenizer was saved using `save_pretrained('./test/saved_model/')`)
tokenizer = BertTokenizer.from_pretrained('./test/saved_model/')
# If the tokenizer uses a single vocabulary file, you can point directly to this file
tokenizer = BertTokenizer.from_pretrained('./test/saved_model/my_vocab.txt')
# You can link tokens to special vocabulary when instantiating
tokenizer = BertTokenizer.from_pretrained('bert-base-uncased', unk_token='')
# You should be sure '' is in the vocabulary when doing that.
# Otherwise use tokenizer.add_special_tokens({'unk_token': ''}) instead)
assert tokenizer.unk_token == ''
说明vocab.txt应该也是可以的。
开始训练
03/28/2022 09:59:10 - INFO - __main__ - ***** Eval results *****
03/28/2022 09:59:10 - INFO - __main__ - Precision = 0.020754716981132074
03/28/2022 09:59:10 - INFO - __main__ - Recall = 0.011235955056179775
03/28/2022 09:59:10 - INFO - __main__ - microF = 0.014579191517561301
大爷的。。。数据集操作部分肯定有问题,但是我还不知道问题在哪里
猜测原因:我把medline和drugbank的训练集合在一起算作train.tsv,测试集也是,在database那个步骤里有一个代码是mention2dbid.py,而medline在drugbank里是找不到id的。这里可能会出问题,改了之后,嗯,解决了这个问题。。。产生了新的问题