February 2, 2020

让 BERT 做选词填空题

让 BERT 做选词填空题

Qordoba 发布了一个好玩的库,叫 FitBert,代表 "Fill the Blanks, BERT",顾名思义,就是拿 BERT 来做填空,我们知道训练 BERT 的两个任务之一就是随机 mask 掉一句话中的单词,让 BERT 去猜测(另一个是判断下一句话是不是相关,NSP,后来的部分研究表明好像这个 NSP 任务并不是主要的)。所以 BERT 天生就擅长做选词填空的活儿。

具体讲 FitBert 是做了一件类似输入法预测下一个候选单词的事情,只不过它预测的不仅仅是最后一个词而是随机那个词都行。如果你是程序员的话可以想象“格式字符串”或者 web 开发中的模板语言。先不说环境配置,直接看一个小例子:


from fitbert import FitBert

fb = FitBert()

masked_string="Why BERT, you're looking ***mask*** today!"
options = ['buff', 'handsome', 'strong']
ranked_options = fb.rank(masked_string, options=options)
print(ranked_options)
filled_in = fb.fitb(masked_string, options=options)
print(filled_in)

输出:

>>> 
['handsome', 'strong', 'buff']
"Why BERT, you're looking handsome today!"

可以看到 FitBert 帮我们从候选词里面选出了最符合当前上下文的词。稍微扩展下,我们就可以拿它来做一些文章自动纠错的事情,比如 has/have 或者单数/复数的判断这样的,当然,拿它来搞一个输入法,用在候选词排序上也是妥妥的,何况 FitBert 还贴心的封装了了一个 service 。

安装也很简单: pip install fitbert, 用到了 transformers,通过 transformers 来下载、调用对应的 bert model,所以第一次使用可能会有些慢,如何加速之前有说。