【NLP实战】基于ALBERT的文本相似度计算
实战是学习一门技术最好的方式,也是深入了解一门技术唯一的方式。因此,NLP专栏推出了实战专栏,让有兴趣的同学在看文章之余也可以自己动手试一试。
ALBERT是一个比BERT要轻量,效果更好的模型,本篇实践介绍如何用ALBERT计算两个文本的相似度。
作者&编辑 | 小Dream哥
1 ALBERT介绍
ALBERT利用词嵌入参数因式分解和隐藏层间参数共享两种手段,显著减少了模型的参数量的同时,基本没有损失模型的性能。笔者在下面的文章中详细介绍了ALBERT的理论,感兴趣的同学可以戳进去了解:
【NLP】ALBERT:更轻更快的的预训练
albert_tiny模型,能够显著提高模型的推理速度,但是效果依然很棒,这里介绍如何基于albert_tiny模型进行文本相似度计算。
2 BERT4KERAS
本来自己写了个基于tensorflow的ALBERT模型,后来看到苏剑林老师的bert4keras,觉得确实实现简洁,易懂。遂决定分享给大家。
感兴趣的同学可以看看苏剑林老师的网站:
https://spaces.ac.cn/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预训练模型
# 加载预训练模型
bert = build_bert_model(
config_path=config_path,
checkpoint_path=checkpoint_path,
with_pool=True,
albert=True,
return_keras_model=False,
)
这里直接调用bert4keras的build_bert_model接口,构建albert模型,并直接加载albert的中文模型的权重。
config_path用来指定模型的配置文件路径;
checkpoint_path用来指定模型权重文件的路径;
albert表示指定用albert模型;
2) 构建分词器,处理输入
#构建分词器
tokenizer = Tokenizer(dict_path)
#格式化输入
token_ids1, segment_ids1 = tokenizer.encode(u'我想去北京')
token_ids2, segment_ids2 = tokenizer.encode(u'我想去香港')
token_ids3, segment_ids3 = tokenizer.encode(u'目前的局势,止暴制乱,刻不容缓')
首先构建分词器这里直接用了bert4keras定义的分词器Tokenizer。
然后用分词器处理输入,获得输入文本在词典中的序号表示及分段信息表示。这里解释下为什么要将输入文本转化成这两个表示:
1.albert模型的输入与bert类似,需要接受词、分段以及位置三个输入,位置信息由模型内的代码处理;
2.将词转化为词在词典中的序号便于后续的词嵌入操作。
3) 利用模型,计算输入文本的向量表征
#计算文本的向量表征,获取albert的第一个位置的输出
sentence_vec1 = model.predict([np.array([token_ids1]), np.array([segment_ids1])])[0]
sentence_vec2 = model.predict([np.array([token_ids2]), np.array([segment_ids2])])[0]
sentence_vec3 = model.predict([np.array([token_ids3]), np.array([segment_ids3])])[0]
因为我们本次是直接利用预训练模型的知识,直接计算文本的向量表征,因此没有训练过程,直接predict即可获得文本的向量表征。这里,获取albert的第一个位置的输出作为输入文本的向量表征。
4) 计算文本相似度
# 引入两个相似度计算包,欧氏距离和余弦距离
from sklearn.metrics.pairwise import euclidean_distances
from sklearn.metrics.pairwise import cosine_similarity
#定义相似度计算函数
def similarity_count(vec1, vec2, mode='cos'):
if mode == 'eu':
return euclidean_distances([vec1,vec2])[0][1]
if mode == 'cos':
return cosine_similarity([vec1, vec2])[0][1]
#相似度计算
#余弦距离
similarity_count(sentence_vec1, sentence_vec2)
#欧式距离
similarity_count(sentence_vec1, sentence_vec2, mode='eu')
这里引入sklearn中的两个计算欧氏距离和余弦距离的包来计算文本之间的距离。具体过程相对简单,直接看上面的代码吧。
5 结果展示
如上图所示,计算了“我想去北京”和“我想去香港”两句话的余弦距离和欧式距离;计算了“我想去北京”和“目前的局势,止暴制乱,刻不容缓”两句话的余弦距离和欧式距离。两句表达意思相近的话,相似度较高,距离较短。但是区隔度不是特别大,所以,在生产中,在一些特别的领域,需要用特别的语料,进行fintune,会有更好的效果。
至此,介绍了如何利用bert4keras搭建albert模型进行文本相似度计算,代码在我们有三AI的github可以下载:https://github.com/longpeng2008/yousan.ai/tree/master/natural_language_processing
找到albert文件夹,执行python3 similarity.py就可以运行了。
总结
ALBERT利用词嵌入参数因式分解和隐藏层间参数共享两种手段,显著减少了模型的参数量的同时,基本没有损失模型的性能,是一个不错的工作。
除了使用它,更关键的是albert模型的实现和理论。我们会在知识星球讨论相关的内容,感兴趣的话可以扫描下面的二维码了解。
读者们可以留言,或者加入我们的NLP群进行讨论。感兴趣的同学可以微信搜索jen104,备注"加入有三AI NLP群"。
下期预告:命名实体识别实践
知识星球推荐
扫描上面的二维码,就可以加入我们的星球,助你成长为一名合格的自然语言处理算法工程师。
知识星球主要有以下内容:
(1) 聊天机器人。考虑到聊天机器人是一个非常复杂的NLP应用场景,几乎涵盖了所有的NLP任务及应用。所以小Dream哥计划以聊天机器人作为切入点,通过介绍聊天机器人的原理和实践,逐步系统的更新到大部分NLP的知识,会包括语义匹配,文本分类,意图识别,语义匹配命名实体识别、对话管理以及分词等。
(2) 知识图谱。知识图谱对于NLP各项任务效果好坏的重要性,就好比基础知识对于一个学生成绩好坏的重要性。他是NLP最重要的基础设施,目前各大公司都在着力打造知识图谱,作为一个NLP工程师,必须要熟悉和了解他。
(3) NLP预训练模型。基于海量数据,进行超大规模网络的无监督预训练。具体的任务再通过少量的样本进行Fine-Tune。这样模式是目前NLP领域最火热的模式,很有可能引领NLP进入一个全新发展高度。你怎么不深入的了解?
转载文章请后台联系
侵权必究
往期精选
【完结】 12篇文章带你完全进入NLP领域,掌握核心技术
【NLP-词向量】词向量的由来及本质
【NLP-词向量】从模型结构到损失函数详解word2vec
【NLP-NER】什么是命名实体识别?
【NLP-NER】命名实体识别中最常用的两种深度学习模型
【NLP-NER】如何使用BERT来做命名实体识别
【NLP-ChatBot】我们熟悉的聊天机器人都有哪几类?
【NLP-ChatBot】搜索引擎的最终形态之问答系统(FAQ)详述
【NLP-ChatBot】能干活的聊天机器人-对话系统概述
【知识图谱】人工智能技术最重要基础设施之一,知识图谱你该学习的东西
【NLP实战】tensorflow词向量训练实战
【NLP实战系列】朴素贝叶斯文本分类实战
【NLP实战系列】Tensorflow命名实体识别实战
【NLP实战】如何基于Tensorflow搭建一个聊天机器人
【每周NLP论文推荐】从预训练模型掌握NLP的基本发展脉络
【每周NLP论文推荐】 NLP中命名实体识别从机器学习到深度学习的代表性研究
【每周NLP论文推荐】 介绍语义匹配中的经典文章
【每周NLP论文推荐】 对话管理中的标志性论文介绍
【每周NLP论文推荐】 开发聊天机器人必读的重要论文
【每周NLP论文推荐】 掌握实体关系抽取必读的文章
【每周NLP论文推荐】 生成式聊天机器人论文介绍
【每周NLP论文推荐】 知识图谱重要论文介绍
【NLP实战】基于ALBERT的文本相似度计算相关推荐
- 基于Java的文本相似度计算
目录 1. 前言 1.1 开发环境: 1.2 初步设想 1.3 参考资料 2. HanLP 2.1 在Java中使用HanLP库 2.2 分词函数 3. 双文本对比 3.1 步骤分解 3.2 完整代码 ...
- 余弦定理的应用:基于文字的文本相似度计算
最近由于工作项目,需要判断两个txt文本是否相似,于是开始在网上找资料研究,因为在程序中会把文本转换成String再做比较,所以最开始找到了这篇关于 距离编辑算法 Blog写的非常好,受益匪浅. 于是 ...
- nlp中文本相似度计算问题
文章的目的:文本相似度计算一直是nlp中常见的问题,本文的目标是总结并对比文本相似度计算方法.当然文本的相似度计算会有进一步的应用,比如文本的分类.聚类等. 文章结构:本文先介绍最直接的字面距离相似度 ...
- 基于词频的文本相似度
基于词频的文本相似度 文本 分词 统计词频 词频向量 相似度计算 应用 项目源码: https://github.com/zhang2172268/mygit/tree/master/textSimi ...
- 基于预训练词向量的文本相似度计算-word2vec, paddle
文章目录 0. 前言 1. 余弦相似度算子 2. 示例代码并验证 3. 基于词向量的文本相似度 3.1 读取word2vec文件 3.2 定义模型 3.3 运行模型 3.4 根据分数降序排列 3.5 ...
- 文本相似度计算(中英文)详解实战
使用tf_idf模型实现中英文文本相似度计算 1. 英文文本相似度计算 测试文本 documents = ["Is there anything good playing?",&q ...
- 最准的中文文本相似度计算工具
向AI转型的程序员都关注了这个号???????????? 机器学习AI算法工程 公众号:datayx text2vec, chinese text to vetor.(文本向量化表示工具,包括词向 ...
- 中文文本相似度计算工具集
欢迎大家关注我们的网站和系列教程:http://www.tensorflownews.com/,学习更多的机器学习.深度学习的知识! 一.基本工具集 1.分词工具 a.jieba 结巴中文分词 htt ...
- word2vec词向量训练及中文文本类似度计算
本文是讲述怎样使用word2vec的基础教程.文章比較基础,希望对你有所帮助! 官网C语言下载地址:http://word2vec.googlecode.com/svn/trunk/ 官网Python ...
最新文章
- 【论文阅读】A Gentle Introduction to Graph Neural Networks [图神经网络入门](5)
- 让Mootools的语法结构像Jquery那样
- oracle视图和索引,oracle视图和索引
- linux svn pacman,【图片】manjaro Linux 中的etc pacman.conf设置错误了,谁发个默认的我看看,谢谢大佬们了_manjaro吧_百度贴吧...
- LinkButton中添加删除确认框
- 摸清Linux日志处理的来龙去脉
- 【搜索入门】桐桐的组合
- 初级通信工程师考试教程:电信网的划分
- SSL ×××和IPSec的主要区别
- 17.3.13--pycharm2和3的常识问题
- java大转盘抽奖概率算法_大转盘抽奖概率算法
- camtasia2018-2019-2020下载安装激活码教程,永久免费版
- 每一代内存的读写速度大概是多少?
- [JavaScript] 模拟京东快递单号查询案例
- 复现 ASPCMS企业建站系统Cookies欺骗漏洞
- 随记(七):Jboss漏洞检测利用工具
- 计算机老师素质能力提升计划要求,教师2021个人素质提升计划范文
- [转载]Cairo 图形指南[转载]
- 通过Nginx搭建直播带货平台的直播服务器
- 被开了!!!!!!!!!!