package com.smtaiserver.smtaiserver.javaai.metrics.base; import java.util.ArrayList; import java.util.List; import org.apache.commons.text.similarity.JaccardSimilarity; import org.dom4j.Document; import org.dom4j.Element; import org.dom4j.Node; import com.smtaiserver.smtaiserver.core.SMTAIServerApp; import com.smtaiserver.smtaiserver.core.SMTAIServerRequest; import com.smtaiserver.smtaiserver.database.SMTDatabase.DBRecord; import com.smtaiserver.smtaiserver.javaai.ast.ASTDBMap; import com.smtservlet.util.Json; import com.smtservlet.util.SMTStatic; public abstract class SMTMetricsDefXml extends SMTMetricsDef { protected SMTMetricsSampleXml _sampleQuestionXml; public void initInstance(DBRecord rec) throws Exception { super.initInstance(rec); String sJsonMacro = rec.getString("metrics_macro"); Json jsonMacro = SMTStatic.isNullOrEmpty(sJsonMacro) ? null : Json.read(sJsonMacro); String sXml = SMTAIServerApp.getApp().convGlobalMacroString(rec.getString("metrics_config"), jsonMacro); Document doc = SMTStatic.convStrToXmlDoc("" + sXml + ""); Node nodeSampleQuestion = doc.selectSingleNode("ROOT/SAMPLE_QUESTIONS"); if(nodeSampleQuestion != null) { _sampleQuestionXml = new SMTMetricsSampleXml((Element)nodeSampleQuestion); } initInstanceByDoc(rec, doc); } protected void appendSampleQuestionToResponse(Json jsonAST, SMTAIServerRequest tranReq) throws Exception { List listSampleQuestion = new ArrayList<>(); querySampleQuestionToList(jsonAST, tranReq, listSampleQuestion); for(String sample : listSampleQuestion) { tranReq.addContentSampleQuestion(sample); } } protected void querySampleQuestionToList(Json jsonAST, SMTAIServerRequest tranReq, List r_list) throws Exception { if(_sampleQuestionXml == null) return; ASTDBMap dbMap = new ASTDBMap(); try { _sampleQuestionXml.createSampleQuestion(this, dbMap, jsonAST, tranReq, r_list); } finally { dbMap.close(); } } public void queryUnknowQuestionList(JaccardSimilarity jaccardSimilarity, String keyword, SMTAIServerRequest tranReq) throws Exception { for(String matchName : this._setMatch) { double curSim = jaccardSimilarity.apply(matchName, keyword); if(curSim > 0.3 || keyword.indexOf(matchName) >= 0 || matchName.indexOf(keyword) >= 0) { List listQuestion = new ArrayList<>(); querySampleQuestionToList(Json.object(), tranReq, listQuestion); for(String question : listQuestion) { tranReq.addContentSampleQuestion(question); } break; } } } protected abstract void initInstanceByDoc(DBRecord rec, Document doc) throws Exception; }