NLP中有不少任务涉及比较两段文本的关系,比如词义相似度、语义相似度、字面相似度、文本蕴含、信息检索、FAQ问答等。在不断的学习、探索和实践过程中,尽力尝试把有有关两段文本关系的一些功能实现出来,方便后续的使用。
初步设计的流程包含以下四个部分:
- 预处理
- NLP分析
- NLU
- 关系模型
预处理主要负责对原始文本进行一些诸如繁简转化、数字转文本一类的处理,输入是原始文本,输出是处理过的文本。
对与处理过的文本进行词法、语法相关的分析。输入是预处理过的文本,输出是NLP分析的结果,比如分词,POS,语法树等。
基于NLP分析的结果进行自然语言理解,其实就是向量化或者特征提取
基于NLP分析的结果或者向量化的结果,预测两段文本之间的关系。
-
文本预处理的模块:保留中英文和数字,字符小写,繁体变简体,详见
textpair/single/common.py
中的TextNormalizer
-
分词模块
- 对jieba进行了封装
- 支持加载用户词表、停用词表和同义词表
- 支持在jieba分词的结果上进行同义词转换
-
支持的模型
- 基于预训练的中文bert模型+余弦相似度实现了简单的中文语义相似度比较,demo请参见
- 不做预处理:
notebooks/bert_sim_test_[single | pair].ipynb
- 预处理版本:
notebooks/bert_sim_2_test_single.ipynb
- 不做预处理:
- 对百度预训练的语义相似度模型进行了封装,demo请参见
notebooks/paddle_sim_test.ipynb
- 基于bert编码器 + 全连接层构建的siamese network进行语义相似度比较
- 这是一种表示型的语义相似度模型,不同于bert官方提供的交互式的相似度模型
- 该模型是基于0.6.2版本的pytorch_bert_pretrained经过fine tune得到的
- 模型安装及使用参考我的另外一个仓库 bert_fine_tune
预训练的模型: 预训练的模型可以从该 链接 处下载,提取码:xcqr。下载后,把压缩包内的data文件夹解压到当前目录即可。
- 基于预训练的中文bert模型+余弦相似度实现了简单的中文语义相似度比较,demo请参见
-
文本相似度 web demo,在项目根目录下运行
python run.py
,在浏览器访问http://127.0.0.1:5000
-
语义相似度接口 /sim,目前使用POST方法调用
- request header:
Content-Type:application/json
- request body, 示例如下
{ "text1": "大家好才是真的好", "text2": "新闻联播每天播放", "model": "paddle_bow" # 目前支持 simple_bert、paddle_bow和ft_bert,默认为 simple_bert }
- response, 示例如下:
{ "model": "paddle_bow", "msg": "successful", "score": 0.6761486232280731, "status": 0, "words1": [ "大家", "好", "才", "是", "真的", "好" ], "words2": [ "新闻联播", "每天", "播放" ] }
- request header: