之前写过 知到自动答题 和 四史 自动答题,在这两个答题里,题库里的问题和题目是几乎完全一样的,只有某些括号和引号需要处理,不需要模糊匹配,所以一直没写。
有位小伙伴就遇到了这个问题,私信我,这我肯定要帮忙想一想了。
模糊模糊模模糊糊
前言
本章 模糊匹配 主要基于 题库答题需要,所以默认 题库里的问题 与 题目 大部分文字基本相同,如下:
《zggcd支部工作条例(试行)》第四条规定,d支部设置一般以单位、区域为主,以单独组建为主要方式。企业、农村、机关、学校、科研院所、社区、社会组织、人民jf军和武警部队连(中)队以及其他基层单位,凡是有正式d员3人以上的,都应当成立d支部。
根据《zggcd支部工作条例(试行)》,d支部设置一般以单位、区域为主,以单独组建为主要方式。企业、农村、机关、学校、科研院所、社区、社会组织、人民jf军和武警部队连(中)队以及其他基层单位,凡是有正式d员3人以上的,都应当成立
一、思路
主要思路是将题目的长文字通过字符,个数等条件进行切割,然后与题库里的问题进行比较,如果包含率超过一定程度,就认为两者相同
包含率计算:题库问题 包含 切割后字符串 的个数 / 切割后字符串 的总数
1.通过符号进行切割
《zggcd支部工作条例(试行)》第四条规定,d支部设置一般以单位、区域为主,以单独组建为主要方式。企业、农村、机关、学校、科研院所、社区、社会组织、人民jf军和武警部队连(中)队以及其他基层单位,凡是有正式党员3人以上的,都应当成立d支部。
根据 | zggcd支部工作条例 | 试行 | | | d支部设置一般以单位 | 区域为主 | 以单独组建为主要方式 | 企业 | 农村 | 机关 | 学校 | 科研院所 | 社区 | 社会组织 | 人民jf军和武警部队连 | 中 | 队以及其他基层单位 | 凡是有正式d员3人以上的 | 都应当成立
// 过滤掉数组中的空字符串
arr= arr.filter((x) => x !== ‘’);
// 删除数组中的指定元素
arr= arr.filter((x) => x !== ‘待删除元素’);
参考https://www.cnblogs.com/jingsupo/p/13181193.html
var key = "根据《zggcd支部工作条例(试行)》,d支部设置一般以单位、区域为主,以单独组建为主要方式。企业、农村、机关、学校、科研院所、社区、社会组织、人民jf军和武警部队连(中)队以及其他基层单位,凡是有正式d员3人以上的,都应当成立"
pattern=/[<>《》`~!@#$^&*()=|';'“”\\\[\]\.<>\/?~!@#¥……&*()——|【】';:'。,、?\s]/g;
console.log(key.split(pattern))
// 过滤掉数组中的空字符串
arr = arr.filter((x) => x !== '');
num=0
for(i = 0;i < arr.length;i++){
if(题库题目.indexOf(arr[i]) != -1){
num++
}
}
p = num / arr.length
console.log("包含率:" + p)
2.通过长度进行切割
在答题时,也经常会遇到很少标点符号的长句子,如下:
当今世界正处于百年未有 的大变局,这是我国d的十八大以来xjp主席科学分析世界形势的变化后 ,提出并反复强调的一个重大战略判断。
当今世界正处于百年未有之大变局,这是d的 ( )以来xjp同志科学分析世界形势的变化而提出并反复强调的一个重大战略判断。
如果按照符号分割的话,效果就不是很好:
所以,对进行符号分割后的字符串做进一步处理:
如果符号分割后的字符串个数太少,那么就将每个字符串切割成小短句。
newarr = []
if(arr.length < 5){
for(i = 0;i < arr.length;i++){
//将每个 字符串 都切割
while(arr[i] != ''){
截取字符 = arr[i].substr(0,5); //第二个参数是切割的长度
newarr[sum++] = 截取字符
arr[i] = arr[i].replace(截取字符,'');
}
}
}
console.log(newarr);
切割的长度为5时:
切割的长度为4时:
切割的长度为3时:
二、完整代码
var 题库题目 = "《zggcd支部工作条例(试行)》第四条规定,d支部设置一般以单位、区域为主,以单独组建为主要方式。企业、农村、机关、学校、科研院所、社区、社会组织、人民jf军和武警部队连中队以及其他基层单位,凡是有正式d员3人以上的,都应当成立d支部。"
var key = "根据《zggcd支部工作条例(试行)》,d支部设置一般以单位、区域为主,以单独组建为主要方式。企业、农村、机关、学校、科研院所、社区、社会组织、人民jf军和武警部队连(中)队以及其他基层单位,凡是有正式d员3人以上的,都应当成立"
//var 题库题目 = "当今世界正处于百年未有的大变局,这是我国党的( )以来xjp主席科学分析世界形势的变化后,提出并反复强调的一个重大战略判断。"
//var key ="当今世界正处于百年未有之大变局,这是党的( )以来xjp同志科学分析世界形势的变化而提出并反复强调的一个重大战略判断。"
pattern=/[<>《》`~!@#$^&*()=|';'“”\\\[\]\.<>\/?~!@#¥……&*()——|【】';:'。,、?\s]/g;
arr = key.split(pattern)
// 过滤掉数组中的空字符串
arr = arr.filter((x) => x !== '');
console.log(arr)
console.log(arr.length)
sum = 0 //切割后的字符串总数
newarr = []
if(arr.length < 5){
for(i = 0;i < arr.length;i++){
//将每个 长度大于5的字符串 都切割
while(arr[i] != ''){
截取字符 = arr[i].substr(0,3);
newarr[sum++] = 截取字符
arr[i] = arr[i].replace(截取字符,'');
}
}
}
else{
newarr = arr
}
console.log(newarr);
num=0
for(i = 0;i < newarr.length;i++){
if(题库题目.indexOf(newarr[i]) != -1){
num++
}
}
p = num / newarr.length
console.log("包含率:" + p)
三、封装:直接调用即可
function mohuMatch(题库题目, 题目, 最小字符串个数, 切割长度) {
pattern = /[<>《》`~!@#$^&*()=|';'“”\\\[\]\.<>\/?~!@#¥……&*()——|【】';:'。,、?\s]/g;
arr = 题目.split(pattern) //根据字符切割
arr = arr.filter((x) => x !== '');// 过滤掉数组中的空字符串
sum = 0 //长度切割后的字符串总数
newarr = [] //长度切割后的字符串数组
if (arr.length < 最小字符串个数) {
//字符切割后的字符串个数太少
for (i = 0; i < arr.length; i++) {
//将每个字符串都切割
while (arr[i] != '') {
//还有内容
截取字符 = arr[i].substr(0, 切割长度); //切割长度
newarr[sum++] = 截取字符 //放入 长度切割后的字符串数组
arr[i] = arr[i].replace(截取字符, ''); //将该部分 从原数组中删除
}
}
}
else {
//字符切割后的字符串个数不少
newarr = arr
}
//console.log(newarr); //打印新字符串数组
num = 0
for (i = 0; i < newarr.length; i++) {
if (题库题目.indexOf(newarr[i]) != -1) {
num++
}
}
p = num / newarr.length
//console.log("包含率:" + p)
return p
}
a="( )任务实现了我国首次月面样与封装、月面起飞、月球轨道交会对接、携带品再入返回等多项重大突破其成功实施标志着我国探月工程“绕、、回”三步走规划如期完成。"
b="( )任务实现了我国首次月面采样与封装、月面起飞、月球轨道交会对接、携带样品再入返回等多项重大突破,其成功实施标志着我国探月工程“绕、落、回”三步走规划如期完成。"
console.log(mohuMatch(a, b, 4, 3))
console.log(mohuMatch(a, b, 10, 3))
建议把最小字符串个数写的大点
总结
这种模糊处理只能尽可能的提高准确率,所以要根据实际情况做相应的处理。
本程序也只是很简单的处理,还有很大的进步空间,欢迎交流讨论。