热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

计算文本相似度_智能测试平台之文本相似度校验

起源我们都知道(不知道也没关系),接口测试就是验证接口响应结果符不符合预期的一个验证过程。其中接口测试又分为人工测试和自动化测试。人工测试是使用工具程序先去发送接口请

起源

我们都知道 (不知道也没关系),接口测试就是验证接口响应结果符不符合预期的一个验证过程。其中接口测试又分为人工测试和自动化测试。人工测试是使用工具/程序先去发送接口请求,然后用肉眼去验证接口的返回结果。而自动化测试则是完全由程序去执行并验证结果。

d061eeda78ba7aba9a56fb0367ec1162.png

笔者在自动化测试的实践中发现,当接口返回数据因业务实际需求变动时 (一般是业务初期,啥都不确定),测试工程师需要花大量时间去修改接口响应结果的验证数据。而当返回数据频繁变动时,这就让人比较崩溃了。

举个极端栗子:

确定的需求:

接口1-1返回: {'greeting': '你好,欢迎你来到智能测试平台,希望你过得开心!'}
接口1-1校验: assert_true(greeting == '你好,欢迎你来到智能测试平台,希望你过得开心!')

这时候需求变了:

接口1-2返回: {'greeting': '您好,欢迎你来到智能测试平台,希望你过得开心!'}
(于是)接口1-2校验: assert_true(greeting == '您好,欢迎你来到智能测试平台,希望你过得开心!')

这时候需求又变了:

接口1-3返回: {'greeting': '您好,欢迎您来到智能测试平台,希望您过得开心!'}
接口1-3校验(os:谁知道他什么时候又要改回去,那么是时候上正则了):
regex = re.compile('你|您好,欢迎你|您来到智能测试平台,希望你|您过得开心!')
assert_not_none(re.match(regex, greeting))

这时候需求再次变更:

接口1-4返回: {'greeting': 'XXX先生/女士,欢迎您来到我的智能测试平台,希望您今天过得开心!'}
接口1-4校验: ???

9045545f968e06e21840b4a2e04771ee.png

这时候,一个想法闪过了我的脑海,既然接口微调前和微调后的返回结果很可能在表达上是相似的,那么有没有可能使用 文本相似度 去校验结果是否符合预期呢?

这有什么不可能的?于是笔者开始了行动。

实现

模型选择

这还用问,当然是选择开源的模型啦,笔者选择了谷歌最强NLP模型BERT

下载地址

https://storage.googleapis.com/bert_models/2018_11_03/chinese_L-12_H-768_A-12.zip

下载server&client:

pip install bert-serving-server # server
pip install bert-serving-client # client, independent of bert-serving-server

启动模型:

bert-serving-start -model_dir C://Users/Admin/Downloads/chinese_L-12_H-768_A-12/ -num_worker=4

最佳实践:

运行代码:

from bert_serving.client import BertClient
bc = BertClient()
test = bc.encode(['你好', '您好'])
print(test)

控制台输出:

[[ 0.28940186 -0.13572685 0.07591164 ... -0.14091228 0.5463005
-0.3011805 ]
[ 0.22952817 0.15336302 -0.18656345 ... -0.40034887 0.12984493
-0.34498438]]

Process finished with exit code 0

相似度算法

好的,既然我们已经能够成功将中文文本转化成了 向量 ,那么我们接下来可以使用 余弦夹角 来求得文本之间的相似度。

笔者作为数学爱好者,当然得 从头证明且实现一遍 给读者看。

首先我们先利用三角形得出一个关于三角形三边与夹角的关系式:

9ae1df88f3cc717cda92825e3bc0be2b.png

然后根据上式求得两个向量间的夹角与向量之间的关系式:

e08341301186145aab4fd2be2c430ebd.png

然后我们就可以通过这个公式求得两个向量之间的 余弦夹角 啦

4fa9b89a67801323a3045209739cdbc7.png

简易代码实现

import numpy as np
class Nlper:

def __init__(self, bert_client):
self.bert_client = bert_client

def get_text_similarity(self, base_text, compaired_text, algorithm='cosine'):
if isinstance(algorithm, str) and algorithm.lower() == 'cosine':
arrays = self.bert_client.encode([base_text, compaired_text])
norm_1 = np.linalg.norm(arrays[0])
norm_2 = np.linalg.norm(arrays[1])
dot_product = np.dot(arrays[0], arrays[1])
similarity = round(0.5 + 0.5 * (dot_product / (norm_1 * norm_2)), 2)
return similarity

这里实现了一个简单的Nlper类,初始化Nlper对象时传入bert模型,然后通过get_text_similarity方法即可求得两个文本之间的相似度。方法内部实现使用了非常方便的numpy库,最后返回结果前将余弦区间 [-1,1] 映射至了 [0,1] 。

最佳实践

运行代码

if __name__ == '__main__':
from bert_serving.client import BertClient
bc = BertClient()
nlper = Nlper(bert_client=bc)
similarity = nlper.get_text_similarity('你好', '您好')
print(similarity)

控制台输出

0.83

Process finished with exit code 0

c00e7842755223fcfafa83500d6e1eb7.png

平台集成

后面的工作就是将这套算法集成到测试平台上咯。过程就不在这赘述了,我们直接演示一下具体使用。

9b04b63736846816e47d10008daa4c28.png

我们直接拿本机的登录接口进行一次演示,首先我们得创建一条用例:

bea93362a417daa0fed625bddb234452.png

然后输入错误的用户名以及密码进行一次测试,于是成功获取到了接口返回的数据结构:

26bfc894d1d61af29e36d1cd94a5d671.png

然后我们再次进入用例修改页面,将接口返回中的data抽取为全局变量,然后点击 『智能相似度校验』,在文本一中填入 \${data}1,文本二中填入 \${data} , 目标相似度中填入: 1(强行把他变成了一个永远无法通过的用例)

c421a64242cd7ff4c548072fd021bf3f.png

然后我们点击测试,可以发现测试并没有通过 (能通过就有鬼了哦) ,可以在下图看到算法计算出来的文本相似度为 0.94。嗯,合理。

91bafdd0fedf9dce2680dc8b12e16c5a.png

我们再次修改用例,(已知接口正确返回的数据为 「用户名/密码错误!」),将文本二改为 「用户名或密码错误!」、目标相似度调整为 0.95

e954a7ff29073c9a1256efdfb5292513.png

执行测试后我们可以看到测试已通过,说明两个文本的相似度达到了0.95以上。

6afe7775308cdbfd9723db73328d7440.png

至此目前的一个小成果就演示完毕啦。

虽然说这不一定真的能够给测试带来特别显著的提升,但是至少在不断尝试创新的过程中笔者慢慢感受到人工智能是能够影响测试、给予测试更多可能性的。

f0901f4b7fbedb6b813f24276d35c824.png




推荐阅读
  • 生成式对抗网络模型综述摘要生成式对抗网络模型(GAN)是基于深度学习的一种强大的生成模型,可以应用于计算机视觉、自然语言处理、半监督学习等重要领域。生成式对抗网络 ... [详细]
  • sklearn数据集库中的常用数据集类型介绍
    本文介绍了sklearn数据集库中常用的数据集类型,包括玩具数据集和样本生成器。其中详细介绍了波士顿房价数据集,包含了波士顿506处房屋的13种不同特征以及房屋价格,适用于回归任务。 ... [详细]
  • Python正则表达式学习记录及常用方法
    本文记录了学习Python正则表达式的过程,介绍了re模块的常用方法re.search,并解释了rawstring的作用。正则表达式是一种方便检查字符串匹配模式的工具,通过本文的学习可以掌握Python中使用正则表达式的基本方法。 ... [详细]
  • 关键词:Golang, Cookie, 跟踪位置, net/http/cookiejar, package main, golang.org/x/net/publicsuffix, io/ioutil, log, net/http, net/http/cookiejar ... [详细]
  • 个人学习使用:谨慎参考1Client类importcom.thoughtworks.gauge.Step;importcom.thoughtworks.gauge.T ... [详细]
  • 本文介绍了在处理不规则数据时如何使用Python自动提取文本中的时间日期,包括使用dateutil.parser模块统一日期字符串格式和使用datefinder模块提取日期。同时,还介绍了一段使用正则表达式的代码,可以支持中文日期和一些特殊的时间识别,例如'2012年12月12日'、'3小时前'、'在2012/12/13哈哈'等。 ... [详细]
  • 开源Keras Faster RCNN模型介绍及代码结构解析
    本文介绍了开源Keras Faster RCNN模型的环境需求和代码结构,包括FasterRCNN源码解析、RPN与classifier定义、data_generators.py文件的功能以及损失计算。同时提供了该模型的开源地址和安装所需的库。 ... [详细]
  • Python已成为全球最受欢迎的编程语言之一,然而Python程序的安全运行存在一定的风险。本文介绍了Python程序安全运行需要满足的三个条件,即系统路径上的每个条目都处于安全的位置、"主脚本"所在的目录始终位于系统路径中、若python命令使用-c和-m选项,调用程序的目录也必须是安全的。同时,文章还提出了一些预防措施,如避免将下载文件夹作为当前工作目录、使用pip所在路径而不是直接使用python命令等。对于初学Python的读者来说,这些内容将有所帮助。 ... [详细]
  • Python实现变声器功能(萝莉音御姐音)的方法及步骤
    本文介绍了使用Python实现变声器功能(萝莉音御姐音)的方法及步骤。首先登录百度AL开发平台,选择语音合成,创建应用并填写应用信息,获取Appid、API Key和Secret Key。然后安装pythonsdk,可以通过pip install baidu-aip或python setup.py install进行安装。最后,书写代码实现变声器功能,使用AipSpeech库进行语音合成,可以设置音量等参数。 ... [详细]
  • Linux重启网络命令实例及关机和重启示例教程
    本文介绍了Linux系统中重启网络命令的实例,以及使用不同方式关机和重启系统的示例教程。包括使用图形界面和控制台访问系统的方法,以及使用shutdown命令进行系统关机和重启的句法和用法。 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • 怀疑是每次都在新建文件,具体代码如下 ... [详细]
  • 本文探讨了C语言中指针的应用与价值,指针在C语言中具有灵活性和可变性,通过指针可以操作系统内存和控制外部I/O端口。文章介绍了指针变量和指针的指向变量的含义和用法,以及判断变量数据类型和指向变量或成员变量的类型的方法。还讨论了指针访问数组元素和下标法数组元素的等价关系,以及指针作为函数参数可以改变主调函数变量的值的特点。此外,文章还提到了指针在动态存储分配、链表创建和相关操作中的应用,以及类成员指针与外部变量的区分方法。通过本文的阐述,读者可以更好地理解和应用C语言中的指针。 ... [详细]
  • 本文介绍了机器学习手册中关于日期和时区操作的重要性以及其在实际应用中的作用。文章以一个故事为背景,描述了学童们面对老先生的教导时的反应,以及上官如在这个过程中的表现。同时,文章也提到了顾慎为对上官如的恨意以及他们之间的矛盾源于早年的结局。最后,文章强调了日期和时区操作在机器学习中的重要性,并指出了其在实际应用中的作用和意义。 ... [详细]
  • MATLAB函数重名问题解决方法及数据导入导出操作详解
    本文介绍了解决MATLAB函数重名的方法,并详细讲解了数据导入和导出的操作。包括使用菜单导入数据、在工作区直接新建变量、粘贴数据到.m文件或.txt文件并用load命令调用、使用save命令导出数据等方法。同时还介绍了使用dlmread函数调用数据的方法。通过本文的内容,读者可以更好地处理MATLAB中的函数重名问题,并掌握数据导入导出的各种操作。 ... [详细]
author-avatar
此女我很爱_484
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有