实战是学习一门技术最好的方式,也是深入了解一门技术唯一的方式。因此,NLP专栏推出了实战专栏,让有兴趣的同学在看文章之余也可以自己动手试一试。 ALBERT是一个比BERT要轻量,效果更好的模型,本篇实践介绍如何用ALBERT计算两个文本的相似度。 作者&编辑 | 小Dream哥 1 ALBERT介绍 ALBERT利用词嵌入参数因式分解和隐藏层间参数共享两种手段,显著减少了模型的参数量的同时,基本没有损失模型的性能。笔者在下面的文章中详细介绍了ALBERT的理论,感兴趣的同学可以戳进去了解: albert_tiny模型,能够显著提高模型的推理速度,但是效果依然很棒,这里介绍如何基于albert_tiny模型进行文本相似度计算。 2 BERT4KERAS 本来自己写了个基于tensorflow的ALBERT模型,后来看到苏剑林老师的bert4keras,觉得确实实现简洁,易懂。遂决定分享给大家。 感兴趣的同学可以看看苏剑林老师的网站: https:///archives/6915 BERT4KERAS是苏老师基于kears实现的几个BERT模型,包括BERT,ALBERT和ROBERTA,基于BERT4KERAS可以快速的使用这些模型,也能够快速的实现对BERT改进的想法。 快速安装: pip install git+https://www.github.com/bojone/bert4keras.git 3 如何获取ALBERT-zh 从如下的github中能够获取训练好的ALBERT-zh 模型: https://github.com/brightmart/albert_zh 4 开始实战 ALBERT输出的第一个向量,可以用来表征整体的输入文本,在本篇实战中,利用这个向量来计算文本之间的相似度。 相似度的计算大致可以分为这么几个步骤: 1. 构建模型,加载ALBERT预训练模型。 2. 构建分词器,处理输入。 3. 利用模型,计算输入文本的向量表征。 4. 利用文本向量,计算两个文本之间距离或者相似度。 1)构建模型,加载ALBERT预训练模型 # 加载预训练模型 这里直接调用bert4keras的build_bert_model接口,构建albert模型,并直接加载albert的中文模型的权重。 config_path用来指定模型的配置文件路径; checkpoint_path用来指定模型权重文件的路径; albert表示指定用albert模型; 2) 构建分词器,处理输入 #构建分词器 tokenizer = Tokenizer(dict_path) #格式化输入 token_ids1, segment_ids1 = tokenizer.encode(u'我想去北京') 首先构建分词器这里直接用了bert4keras定义的分词器Tokenizer。 然后用分词器处理输入,获得输入文本在词典中的序号表示及分段信息表示。这里解释下为什么要将输入文本转化成这两个表示: 1.albert模型的输入与bert类似,需要接受词、分段以及位置三个输入,位置信息由模型内的代码处理; 2.将词转化为词在词典中的序号便于后续的词嵌入操作。 3) 利用模型,计算输入文本的向量表征 #计算文本的向量表征,获取albert的第一个位置的输出 sentence_vec1 = model.predict([np.array([token_ids1]), np.array([segment_ids1])])[0] 因为我们本次是直接利用预训练模型的知识,直接计算文本的向量表征,因此没有训练过程,直接predict即可获得文本的向量表征。这里,获取albert的第一个位置的输出作为输入文本的向量表征。 4) 计算文本相似度 # 引入两个相似度计算包,欧氏距离和余弦距离 from sklearn.metrics.pairwise import euclidean_distances #相似度计算 #余弦距离 similarity_count(sentence_vec1, sentence_vec2) #欧式距离 这里引入sklearn中的两个计算欧氏距离和余弦距离的包来计算文本之间的距离。具体过程相对简单,直接看上面的代码吧。 5 结果展示 如上图所示,计算了“我想去北京”和“我想去香港”两句话的余弦距离和欧式距离;计算了“我想去北京”和“目前的局势,止暴制乱,刻不容缓”两句话的余弦距离和欧式距离。两句表达意思相近的话,相似度较高,距离较短。但是区隔度不是特别大,所以,在生产中,在一些特别的领域,需要用特别的语料,进行fintune,会有更好的效果。 至此,介绍了如何利用bert4keras搭建albert模型进行文本相似度计算,代码在我们有三AI的github可以下载:https://github.com/longpeng2008/yousan.ai/tree/master/natural_language_processing 找到albert文件夹,执行python3 similarity.py就可以运行了。 ALBERT利用词嵌入参数因式分解和隐藏层间参数共享两种手段,显著减少了模型的参数量的同时,基本没有损失模型的性能,是一个不错的工作。 除了使用它,更关键的是albert模型的实现和理论。我们会在知识星球讨论相关的内容,感兴趣的话可以扫描下面的二维码了解。 |
|