添加测试类

dev_2.1.0
xueqingkun 11 months ago
parent 75ce71bc37
commit da52d5ced4

@ -13,6 +13,7 @@ import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil;
import cn.hutool.poi.excel.ExcelReader;
import cn.hutool.poi.excel.ExcelUtil;
import cn.hutool.poi.excel.ExcelWriter;
import com.supervision.model.AskTemplateQuestionLibrary;
import com.supervision.model.CommonDic;
import com.supervision.service.AskTemplateQuestionLibraryService;
@ -24,9 +25,7 @@ import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.*;
import java.util.stream.Collectors;
@Slf4j
@ -42,9 +41,9 @@ public class VecTest {
private CommonDicService commonDicService;
private static final String BASE_URL = "http://192.168.10.137:8711";
private static final String BASE_URL = "http://192.168.10.137:8719";
@Test
public void mainTest() throws Exception {
public void questionCompareGenerateTest() {
String filePath = "F:\\tmp\\1\\副本医生临床问诊问题收集v1.xlsx";
ExcelReader reader = ExcelUtil.getReader(filePath,1);
@ -94,11 +93,340 @@ public class VecTest {
}
log.info("开始把结果数据写入表格");
ExcelUtil.getWriter(filePath,"结果对比").write(dataList).flush() ;
ExcelUtil.getWriter(filePath,"结果对比-2").write(dataList).flush() ;
log.info("结束把结果数据写入表格");
}
@Test
public void questionEqualGenerateTest() {
List<AskTemplateQuestionLibrary> libraries = askTemplateQuestionLibraryService.list()
.stream().peek(library -> library.getQuestion().forEach(StrUtil::trim))
.collect(Collectors.toList());
List<CommonDic> commonDics = commonDicService.lambdaQuery().eq(CommonDic::getGroupCode, "AQT").list();
Map<Long, CommonDic> dicMap = commonDics.stream().collect(Collectors.toMap(CommonDic::getId, v -> v));
// 构建问题map id -->> question --->> library
Map<String, Map<String,AskTemplateQuestionLibrary>> questionMap = new HashMap<>();
for (AskTemplateQuestionLibrary library : libraries) {
Map<String, AskTemplateQuestionLibrary> map = library.getQuestion().stream().collect(Collectors.toMap(v -> v, v -> library));
questionMap.put(library.getId(), map);
}
// 循环处理数据
List<Map<String,Object>> result = new ArrayList<>();
for (AskTemplateQuestionLibrary library : libraries) {
List<String> questionList = library.getQuestion();
for (String sourceQuestion : questionList) {
//确认同组数据中是否存在相同的问题
long count = questionList.stream().filter(v -> StrUtil.equals(sourceQuestion, v)).count();
if (count > 1 ){
Map<String, Object> map = new HashMap<>();
map.put("sourceId",library.getId());
map.put("sourceDesc",library.getDescription());
map.put("sourceQuestion",sourceQuestion);
map.put("sourceQuestionCode",library.getCode());
map.put("sourceDicPath",dicMap.get(library.getDictId()).getNameZhPath());
map.put("targetId",library.getId());
map.put("targetDesc",library.getDescription());
map.put("targetQuestion",sourceQuestion);
map.put("sameSource","是");
map.put("targetDicPath",dicMap.get(library.getDictId()).getNameZhPath());
result.add(map);
}
// 确认是否存在重复的问题数据
for (Map.Entry<String, Map<String, AskTemplateQuestionLibrary>> firstEntry : questionMap.entrySet()) {
if (StrUtil.equals(library.getId(), firstEntry.getKey())){
continue;
}
Map<String, AskTemplateQuestionLibrary> questionLibraryMap = firstEntry.getValue();
for (Map.Entry<String, AskTemplateQuestionLibrary> secondEntry : questionLibraryMap.entrySet()) {
String targetQuestion = secondEntry.getKey();
AskTemplateQuestionLibrary targetLibrary = secondEntry.getValue();
if (StrUtil.equals(sourceQuestion, targetQuestion)){
HashMap<String, Object> map = new HashMap<>();
map.put("sourceId",library.getId());
map.put("sourceDesc",library.getDescription());
map.put("sourceQuestion",sourceQuestion);
map.put("sourceDicPath",dicMap.get(library.getDictId()).getNameZhPath());
map.put("targetId",targetLibrary.getId());
map.put("targetDesc",targetLibrary.getDescription());
map.put("targetQuestion",targetQuestion);
// 如果id相等则是同源数据
map.put("sameSource","否");
map.put("targetDicPath",dicMap.get(targetLibrary.getDictId()).getNameZhPath());
result.add(map);
}
}
}
}
}
// 写出数据
String filePath = "F:\\tmp\\1\\问题库问题对比.xlsx";
ExcelWriter writer = ExcelUtil.getWriter(filePath, "完全相等对比");
writer.addHeaderAlias("sourceId", "源问题库id");
writer.addHeaderAlias("sourceDesc", "源问题库描述");
writer.addHeaderAlias("sourceQuestion", "源问题");
writer.addHeaderAlias("sourceDicPath", "源分类");
writer.addHeaderAlias("targetId", "目标问题库id");
writer.addHeaderAlias("targetDesc", "目标问题库描述");
writer.addHeaderAlias("targetQuestion", "目标问题");
writer.addHeaderAlias("sameSource", "是否同源");
writer.addHeaderAlias("targetDicPath", "目标分类");
writer.write(result).flush();
}
@Test
public void questionSimilarityGenerateTest() {
List<AskTemplateQuestionLibrary> questionLibraries = askTemplateQuestionLibraryService.list();
List<CommonDic> commonDics = commonDicService.lambdaQuery().eq(CommonDic::getGroupCode, "AQT").list();
Map<Long, CommonDic> dicMap = commonDics.stream().collect(Collectors.toMap(CommonDic::getId, v -> v));
Map<String, AskTemplateQuestionLibrary> libraryMap = questionLibraries.stream().collect(Collectors.toMap(AskTemplateQuestionLibrary::getId, library -> library));
// compare
List<Map<String, Object>> result = new ArrayList<>();
for (AskTemplateQuestionLibrary questionLibrary : questionLibraries) {
List<String> questionList = questionLibrary.getQuestion();
for (String question : questionList) {
List<Map<String, Object>> maps = questionMatch(question);
if (CollUtil.isEmpty(maps)){
log.warn("questionMatch:问题:{}没有匹配到结果", question);
continue;
}
for (Map<String, Object> map : maps) {
String targetId = MapUtil.getStr(map, "matchQuestionCode");
if (!StrUtil.equals(questionLibrary.getId(),targetId)){
HashMap<String, Object> map1 = new HashMap<>();
map1.put("sourceId",questionLibrary.getId());
map1.put("sourceDesc",questionLibrary.getDescription());
map1.put("sourceQuestion",question);
CommonDic commonDic = dicMap.get(questionLibrary.getDictId());
map1.put("sourceDicPath", commonDic.getNameZhPath());
map1.put("targetId",targetId);
AskTemplateQuestionLibrary targetLibrary = libraryMap.get(targetId);
map1.put("targetDesc",targetLibrary.getDescription());
map1.put("targetQuestion",MapUtil.getStr(map, "matchQuestion"));
map1.put("matchScore",MapUtil.getStr(map, "matchScore"));
map1.put("targetDicPath",dicMap.get(targetLibrary.getDictId()).getNameZhPath());
result.add(map1);
}
}
}
}
String filePath = "F:\\tmp\\1\\问题库问题对比.xlsx";
ExcelWriter writer = ExcelUtil.getWriter(filePath, "向量相似度对比");
writer.addHeaderAlias("sourceId", "源问题id");
writer.addHeaderAlias("sourceDesc", "源问题描述");
writer.addHeaderAlias("sourceQuestion", "源问题");
writer.addHeaderAlias("sourceDicPath", "源分类");
writer.addHeaderAlias("targetId", "目标问题");
writer.addHeaderAlias("targetDesc", "目标问题描述");
writer.addHeaderAlias("targetQuestion", "目标问题");
writer.addHeaderAlias("matchScore", "相似度");
writer.addHeaderAlias("targetDicPath", "目标分类");
writer.write(result,true);
writer.close();
}
@Test
public void questionSimilarityTopGenerateTest() {
List<AskTemplateQuestionLibrary> questionLibraries = askTemplateQuestionLibraryService.list();
List<CommonDic> commonDics = commonDicService.lambdaQuery().eq(CommonDic::getGroupCode, "AQT").list();
Map<Long, CommonDic> dicMap = commonDics.stream().collect(Collectors.toMap(CommonDic::getId, v -> v));
Map<String, AskTemplateQuestionLibrary> libraryMap = questionLibraries.stream().collect(Collectors.toMap(AskTemplateQuestionLibrary::getId, library -> library));
List<Map<String, Object>> result = new ArrayList<>();
for (AskTemplateQuestionLibrary questionLibrary : questionLibraries) {
for (String question : questionLibrary.getQuestion()) {
List<Map<String, Object>> maps = questionMatch(question);
// 只获取前四条数据
if (CollUtil.isEmpty(maps)){
log.warn("questionMatch:问题:{}没有匹配到结果", question);
continue;
}
if (maps.size() > 3){
// 截取前四条数据
maps = maps.subList(0, 4);
}
int groupRank = 1;
for (Map<String, Object> matchMap : maps) {
Map<String, Object> map = new HashMap<>();
String targetId = MapUtil.getStr(matchMap, "matchQuestionCode");
String matchQuestion = MapUtil.getStr(matchMap, "matchQuestion");
String matchScore = MapUtil.getStr(matchMap, "matchScore");
map.put("sourceId", questionLibrary.getId());
map.put("sourceDesc", questionLibrary.getDescription());
map.put("sourceQuestion",question);
String sourceNamePath = dicMap.get(questionLibrary.getDictId()).getNameZhPath();
map.put("sourceDicPath", sourceNamePath);
map.put("targetId",targetId);
AskTemplateQuestionLibrary targetLibrary = libraryMap.get(targetId);
map.put("targetDesc",targetLibrary.getDescription());
map.put("targetQuestion",matchQuestion);
String targetNamePath = dicMap.get(targetLibrary.getDictId()).getNameZhPath();
map.put("targetDicPath",targetNamePath);
map.put("matchScore",matchScore);
// 问题是否相等
map.put("questionEq",StrUtil.equals(question,matchQuestion) ? "是" : "否");
// 分类是否相等
map.put("questionDicEq",StrUtil.equals(sourceNamePath,targetNamePath) ? "是" : "否");
map.put("groupRank",groupRank);
groupRank ++;
result.add(map);
}
}
String filePath = "F:\\tmp\\1\\问题库问题对比.xlsx";
ExcelWriter writer = ExcelUtil.getWriter(filePath, "多维度向量相似度对比");
writer.addHeaderAlias("sourceId", "源问题id");
writer.addHeaderAlias("sourceDesc", "源问题描述");
writer.addHeaderAlias("sourceQuestion", "源问题");
writer.addHeaderAlias("sourceDicPath", "源分类");
writer.addHeaderAlias("targetId", "目标问题");
writer.addHeaderAlias("targetDesc", "目标问题描述");
writer.addHeaderAlias("targetQuestion", "目标问题");
writer.addHeaderAlias("matchScore", "相似度");
writer.addHeaderAlias("targetDicPath", "目标分类");
writer.addHeaderAlias("questionEq", "同一语句");
writer.addHeaderAlias("questionDicEq", "同一分类");
writer.addHeaderAlias("groupRank", "排序");
writer.write(result,true);
writer.close();
}
}
@Test
public void questionCaseGenerateTest() {
List<AskTemplateQuestionLibrary> questionLibraries = askTemplateQuestionLibraryService.list();
List<CommonDic> commonDics = commonDicService.lambdaQuery().eq(CommonDic::getGroupCode, "AQT").list();
Map<Long, CommonDic> dicMap = commonDics.stream().collect(Collectors.toMap(CommonDic::getId, v -> v));
Map<String, AskTemplateQuestionLibrary> libraryMap = questionLibraries.stream().collect(Collectors.toMap(AskTemplateQuestionLibrary::getId, library -> library));
String path = "F:\\tmp\\1\\门诊收集0524.xlsx";
ExcelReader reader = ExcelUtil.getReader(path);
List<Map<String, Object>> maps = reader.readAll();
for (Map<String, Object> map : maps) {
String question = MapUtil.getStr(map, "日常问诊");
List<Map<String, Object>> matchMapList = questionMatch(question);
if (CollUtil.isEmpty(matchMapList)) {
log.warn("questionMatch:问题:{}没有匹配到结果", question);
continue;
}
Map<String, Object> first = CollUtil.getFirst(matchMapList);
String matchQuestion = MapUtil.getStr(first, "matchQuestion");
String score = MapUtil.getStr(first, "matchScore");
String targetId = MapUtil.getStr(first, "matchQuestionCode");
map.put("targetId", targetId);
map.put("targetQuestion", matchQuestion);
AskTemplateQuestionLibrary targetLibrary = libraryMap.get(targetId);
map.put("targetDesc", targetLibrary.getDescription());
Long dictId = targetLibrary.getDictId();
map.put("targetDicPath", dicMap.get(dictId).getNameZhPath());
map.put("matchScore", score);
}
ExcelWriter writer = ExcelUtil.getWriter(path, "问询结果");
writer.addHeaderAlias("病例", "病例");
writer.addHeaderAlias("日常问诊", "日常问诊");
writer.addHeaderAlias("targetId", "目标问题");
writer.addHeaderAlias("targetDesc", "目标问题描述");
writer.addHeaderAlias("targetQuestion", "目标问题");
writer.addHeaderAlias("matchScore", "相似度");
writer.addHeaderAlias("targetDicPath", "目标分类");
writer.write(maps,true);
writer.close();
}
private List<Map<String,Object>> questionMatch(String question){
Assert.notEmpty(question, "问题不能为空");
Map<String, Object> params = new HashMap<>();
params.put("question",question);
HttpRequest request = HttpRequest.post(BASE_URL + "/matchQuestion")
.body(JSONUtil.toJsonStr(params));
log.info("askMatch:question{}", question);
try (HttpResponse response = request.execute()){
String body = response.body();
log.info("askMatch:响应结果:{}", body);
JSONObject entries = JSONUtil.parseObj(body);
if (entries.get("code",Integer.class) != 200){
log.warn("askMatch:匹配失败");
return null;
}
JSONArray jsonArray = JSONUtil.parseArray(entries.get("data"));
if (CollUtil.isNotEmpty(jsonArray)){
ArrayList<Map<String,Object>> maps = new ArrayList<>();
for (Object o : jsonArray) {
maps.add(JSONUtil.toBean(JSONUtil.toJsonStr(o), Map.class));
}
return maps;
}
}catch (Exception e){
log.error("chat:请求失败", e);
}
log.warn("askMatch:匹配失败");
return null;
}
@Test
public void initVecData() {
List<AskTemplateQuestionLibrary> questionLibraries = askTemplateQuestionLibraryService.list();
// load vec data
List<Map<String, Object>> vecData = questionLibraries.stream().map(library -> {
Map<String, Object> map = new HashMap<>();
map.put("questionCode", library.getId());
map.put("questionList", library.getQuestion());
return map;
}).collect(Collectors.toList());
saveVec(vecData);
}
private void saveVec(List<Map<String, Object>> List){
HttpRequest request = HttpRequest.post(BASE_URL + "/updateDatabase")
.body(JSONUtil.toJsonStr(List));
log.info("saveVec:请求参数:{}", JSONUtil.toJsonStr(List));
try (HttpResponse response = request.execute()){
String body = response.body();
log.info("saveVec:响应结果:{}", body);
JSONObject entries = JSONUtil.parseObj(body);
if (!"success".equals(entries.get("status",String.class))){
log.warn("saveVec:保存失败");
throw new RuntimeException("saveVec:保存失败");
}
}catch (Exception e){
log.error("saveVec:保存失败", e);
throw new RuntimeException("saveVec:保存失败");
}
}
private String askMatch(String question){
Assert.notEmpty(question, "问题不能为空");

Loading…
Cancel
Save