文本匹配,顾名思义,就是描述两段文本之间的关系,是否指向同一语义;比如两句话是否描述同一件事,或者两句话是否是上下文/问题与答案的关系。例:
小宝宝生病怎么办 | 狗宝宝生病怎么办 |
明天天气怎么样 | 明天预报有雨 |
先帝创业未半而中道崩殂 | 今天下三分,益州疲弊,此诚危急存亡之秋也 |
文本匹配任务在自然语言处理中是非常重要的基础任务之一,有很多应用场景;如信息检索、问答系统、智能对话、文本鉴别、智能推荐、文本数据去重等,但文本匹配或者说自然语言处理仍然存在很多难点。
如语言不规范,同一句话可以有多种表达方式;如“股市跳水、股市大跌、股市一片绿”
歧义,同一个词语或句子在不同语境可能表达不同意思;如“割韭菜”,“领盒饭”,“能穿多少穿多少”,在不同语境下语义完全不同
不规范或错误的输入;如 “ yyds”,“举个栗子”
需要知识依赖;如丰田supra绰号“牛魔王”等。
常见的文本匹配算法如下表,按传统模型和深度模型简单的分为两类:
算法 | 类型 |
---|---|
Jaccord | 传统模型 |
BM25 | 传统模型 |
VSM | 传统模型 |
SimHash | 传统模型 |
Levenshtein | 传统模型 |
cdssm | 深度模型 |
arc-ii | 深度模型 |
match_pyramid | 深度模型 |
mvlstm | 深度模型 |
bimpm | 深度模型 |
drcn | 深度模型 |
esim | 深度模型 |
textmatching | 深度模型 |
bert-base | 深度模型 |
albert-base | 深度模型 |
albert-large |
深度模型 |
raberta | 深度模型 |
sbert | 深度模型 |
接下来,让我们通过一个例子,来具体看一下各个算法的实现过程及匹配效果(其中并没有实现深度学习类算法)。
举个栗子:
序号 | 句1 | 句2 | 真实结果 |
---|---|---|---|
1 | 内蒙古锡林郭勒盟多伦县县医院 | 多伦县医院 | 1(匹配) |
2 | 绵阳市四零四医院 | 四川绵阳404医院 | 1(匹配) |
3 | 邓州市人民医院 | 南召县人民医院 | 0(不匹配) |
1.Jaccard杰卡德相似系数
jaccard相似度是一种非常直观的相似度计算方式,即两句子分词后词语的交集中词语数与并集中词语数之比。
def jaccard(list1, list2):
"""
jaccard相似系数
:param list1:第一句话的词列表
:param list2: 第二句话的词列表
:return:相似度,float值
"""
list1, list2 = set(list1), set(list2) #去重
intersection = list1.intersection(list2) # 交集
union = list1.union(list2) # 并集
Similarity = 1.0 * len(intersection) / len(union) #交集比并集
return Similarity
a.分词
内蒙古 锡林郭勒盟 多伦县 县医院 / 多伦县 医院
绵阳市 四 零 四 医院 / 四川 绵阳 404 医院
邓州市 人民 医院 / 南召县 人民 医院
b.去重求交集--并集
多伦县(交集) -- 内蒙古、锡林郭勒盟、多伦县、县医院、医院(并集)
医院(交集) -- 绵阳市、四、零、医院、四川、绵阳、404(并集)
人民、医院(交集) -- 邓州市、人民、医院、南召县(并集)
c.相似度