sunyilgdx / SIFRank_zh

Keyphrase or Keyword Extraction 基于预训练模型的中文关键词抽取方法(论文SIFRank: A New Baseline for Unsupervised Keyphrase Extraction Based on Pre-trained Language Model 的中文版代码)
420 stars 78 forks source link

COMPARE WITH OTHER PRE-TRAINED LANGUAGE MODELS #9

Closed HC-2016 closed 4 years ago

HC-2016 commented 4 years ago

hi,感谢开源代码~ 在论文中有提到"We compare the effect of replacing ELMo with word embeddings of GloVe and BERT" 请问要如何修改代码将ELMo替换成其他预训练模型比如BERT呢?

sunyilgdx commented 4 years ago

这一段代码只在英文版里实现了(代码着实丑),实际上为了能够尽量多地实验更多的预训练模型,同时也为了实验更快,GloVe、BERT、RoBERTa和XLNet,对于BERT、RoBERTa和XLNet我们只用了他们的静态词向量,也就是将单个单词输入到模型中进行输出。总共分3步:

1.根据数据集构建单词表,用DUC2001、Inspec和SemEval2017构建一个单词表,这样就不会出现OOV

2.根据单词表求出各个模型的对应的词向量表 1)BERT、RoBERTa用的是bert-as-service分别加载谷歌的BERT和Facebook的RoBERTa(RoBERTa需要用huggingface的transforms由pytorch转为tensorflow),XLNet我们用的网上一个计算XLNet词向量的项目 2)GloVe有2种形式,一种像RVA算法里用的是本地词向量,也就是词向量仅由每篇文章计算而来,我们复现RVA时用的是C语言的代码包算的;另一种用的是斯坦福提供的用Wikipedia和Gigaword训练的词向量,只要加载就行了

3.将算法里的word_emb_elmo.py和sent_emb_sif.py改写,因为之前写的ELMo的代码兼容性太差了,所以直接重写了新的词向量和句向量的获取方法,但是没放在github上,因为用起来不方便

这样的话就可以对比几种预训练模型的编码效果,如果确实需要的话我可以把这些代码发给你,但是确实写的太乱了,比较分散,几乎每一步都是单独的一组代码,看起来用起来可能会比较费劲

这个实验复现了比较多的Baseline,有点心力憔悴了,如果能做成一个更加兼容,一键切换编码器的项目就完美了,但我自己没太有时间,也没有师弟接手,所以有可能烂尾了

如果感兴趣欢迎继续封装,相信算法也有进一步研究的价值^-^

HC-2016 commented 4 years ago

@sunyilgdx 非常感谢你的耐心回复,我会尝试一下的。 另外问一句,代码支持纯cpu环境运行么

sunyilgdx commented 4 years ago

支持的

HC-2016 commented 4 years ago

再请教一个问题。如何支持batch_size > 1?

sunyilgdx commented 4 years ago

这个没写,因为里面切分句子计算ELMo词向量用到了多Batch的并行,所以没在输入上写多Batch,最小的改动是通过再封装一层,不过肯定就是串行的,不然就要改一些代码了