Prechádzať zdrojové kódy

疾病增加映射,重寫疾病后結構化

louhr 5 rokov pred
rodič
commit
15616b0a68

+ 48 - 2
kernel/src/main/java/com/lantone/qc/kernel/structure/ai/BeHospitalizedAI.java

@@ -9,6 +9,8 @@ import com.lantone.qc.kernel.structure.ai.model.EntityEnum;
 import com.lantone.qc.kernel.structure.ai.model.Lemma;
 import com.lantone.qc.kernel.structure.ai.process.*;
 import com.lantone.qc.kernel.util.CatalogueUtil;
+import com.lantone.qc.kernel.util.KernelConstants;
+import com.lantone.qc.kernel.util.RedisUtil;
 import com.lantone.qc.pub.Content;
 import com.lantone.qc.pub.model.InputInfo;
 import com.lantone.qc.pub.model.doc.BeHospitalizedDoc;
@@ -16,6 +18,9 @@ import com.lantone.qc.pub.model.entity.*;
 import com.lantone.qc.pub.model.label.*;
 import com.lantone.qc.pub.model.vo.CRFVo;
 import com.lantone.qc.pub.util.StringUtil;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
 
 import java.util.*;
 
@@ -25,6 +30,7 @@ import java.util.*;
  * @Author : 楼辉荣
  * @Date: 2020-03-03 18:58
  */
+@Component
 public class BeHospitalizedAI {
     /**
      * FirstCourseRecord_cx[病历首程]
@@ -39,6 +45,9 @@ public class BeHospitalizedAI {
     public static String entityRelationObject = "entity_relation_object";
     public static String outputs = "outputs";
 
+    @Autowired
+    RedisUtil redisUtil;
+
     public void medrec(InputInfo inputInfo, CRFServiceClient crfServiceClient) {
         JSONArray crfContent = new JSONArray();
         BeHospitalizedDoc beHospitalizedDoc = inputInfo.getBeHospitalizedDoc();
@@ -93,8 +102,8 @@ public class BeHospitalizedAI {
         putFamilyCrfData(midData.getJSONObject(Content.family), inputInfo);
         //处理婚育史
         putMaritalCrfData(midData.getJSONObject(Content.marriage), inputInfo);
-
-
+        //初步诊断
+        putInitialDiagCrfData(midData.getJSONObject(Content.pridiag), inputInfo);
         //        //存放CRF模型既往史、家族史返回数据
         //        putAllCrfData(midData.getJSONObject(Content.past), crfOut);
         //        putAllCrfData(midData.getJSONObject(Content.family), crfOut);
@@ -228,6 +237,43 @@ public class BeHospitalizedAI {
         inputInfo.getBeHospitalizedDoc().setMenstrualLabel(menstrualLabel);
     }
 
+    /**
+     * 初步诊断信息提取
+     *
+     * @param jsonObject
+     * @param inputInfo
+     */
+    public void putInitialDiagCrfData(JSONObject jsonObject, InputInfo inputInfo) {
+        if (jsonObject == null) {
+            return;
+        }
+        JSONObject aiOut = jsonObject.getJSONObject(entityRelationObject).getJSONObject(BeHospitalizedAI.outputs);
+        //诊断信息
+        EntityProcessDiag entityProcessDiag = new EntityProcessDiag();
+//        List<Diag> diags = entityProcessDiag.extractEntity(aiOut);
+//
+//        InitialDiagLabel initialDiagLabel = new InitialDiagLabel();
+//        initialDiagLabel.setText(inputInfo.getBeHospitalizedDoc().getInitialDiagLabel().getText());
+//        initialDiagLabel.setDiags(diags);
+//        inputInfo.getBeHospitalizedDoc().setInitialDiagLabel(initialDiagLabel);
+
+        //因为关系抽取未标注完成,先用规则
+        String diagString = inputInfo.getBeHospitalizedDoc().getInitialDiagLabel().getText();
+        if (StringUtils.isNotEmpty(diagString)) {
+            String[] diagArray = diagString.split(",");
+            Map<String, String> diagRedisMap = (Map<String, String>)redisUtil.get(KernelConstants.CONCEPT_DIAG_HOSPITAL_REFLECT);
+            List<Diag> diags = new ArrayList<>();
+            for (String d : diagArray) {
+                Diag diag = new Diag();
+                diag.setHospitalDiagName(d);  //存放医院原始疾病名称
+                diag.setName(diagRedisMap.get(d) == null ? "" : diagRedisMap.get(d));//映射到我们的标准疾病名称
+                diags.add(diag);
+            }
+            InitialDiagLabel initialDiagLabel = new InitialDiagLabel();
+            initialDiagLabel.setDiags(diags);
+        }
+    }
+
     /**
      * 关系抽取临床表现信息
      *

+ 19 - 1
kernel/src/main/java/com/lantone/qc/kernel/structure/ai/process/EntityProcess.java

@@ -7,11 +7,16 @@ import com.lantone.qc.kernel.structure.ai.model.EntityEnum;
 import com.lantone.qc.kernel.structure.ai.model.Lemma;
 import com.lantone.qc.kernel.util.CatalogueUtil;
 import com.lantone.qc.kernel.structure.ai.model.Relation;
+import com.lantone.qc.kernel.util.KernelConstants;
+import com.lantone.qc.kernel.util.RedisUtil;
+import com.lantone.qc.pub.model.entity.Diag;
 import com.lantone.qc.pub.model.entity.DiagInfectious;
 import com.lantone.qc.pub.model.entity.Negative;
 import com.lantone.qc.pub.model.entity.PD;
 import org.apache.commons.beanutils.BeanUtils;
 import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
 
 import java.util.ArrayList;
 import java.util.HashMap;
@@ -25,8 +30,10 @@ import java.util.regex.Pattern;
  * @Author: HUJING
  * @Date: 2020/2/2 10:07
  */
+@Component
 public class EntityProcess {
-
+    @Autowired
+    RedisUtil redisUtil;
     /**
      * 树形结构存储三元组关系,返回传入实体类型为节点的所有关联实体对象
      * @param aiOut
@@ -216,6 +223,17 @@ public class EntityProcess {
         return null;
     }
 
+    /**
+     * 疾病名称需要映射操作
+     * @param lemma
+     * @param diag
+     */
+    protected void setDiag(Lemma lemma, Diag diag) {
+        Map<String, String> diagRedisMap = (Map<String, String>)redisUtil.get(KernelConstants.CONCEPT_DIAG_HOSPITAL_REFLECT);
+        diag.setHospitalDiagName(lemma.getText());  //存放医院原始疾病名称
+        diag.setName(diagRedisMap.get(lemma.getText()) == null ? "" : diagRedisMap.get(lemma.getText()));//映射到我们的标准疾病名称
+    }
+
     /**
      * 查找时间
      * @param detailLemma

+ 19 - 26
kernel/src/main/java/com/lantone/qc/kernel/structure/ai/process/EntityProcessDiag.java

@@ -2,42 +2,35 @@ package com.lantone.qc.kernel.structure.ai.process;
 
 import com.alibaba.fastjson.JSONObject;
 import com.lantone.qc.kernel.structure.ai.model.EntityEnum;
+import com.lantone.qc.kernel.structure.ai.model.Lemma;
 import com.lantone.qc.pub.model.entity.Diag;
-import com.lantone.qc.pub.model.entity.Negative;
 import com.lantone.qc.pub.model.entity.Possible;
-import org.apache.commons.lang3.StringUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.stereotype.Component;
 
 import java.util.ArrayList;
 import java.util.List;
-import java.util.Map;
 
+@Component
 public class EntityProcessDiag extends EntityProcess {
-    public List<Diag> extractEntity(JSONObject outputs) {
+    private Logger logger = LoggerFactory.getLogger(EntityProcessDiag.class);
+    public List<Diag> extractEntity(JSONObject aiOut) {
         List<Diag> diags = new ArrayList<>();
-        List<Map<String, String>> diagEntityList = processJson(outputs, EntityEnum.DIEASE.toString());
-        for (Map<String, String> diagEntityMap : diagEntityList) {
-            if (StringUtils.isEmpty(diagEntityMap.get(EntityEnum.DIEASE.toString()))) {
-                continue;
-            }
-            Diag diag = new Diag();
-            for (String key : diagEntityMap.keySet()) {
-                String value = StringUtils.isEmpty(diagEntityMap.get(key)) ? "" : diagEntityMap.get(key);
-                switch (EntityEnum.parseOfValue(key)) {
-                    case DIEASE:
-                        diag.setName(value);
-                        break;
-                    case POSSIBLE:
-                        Possible possible = new Possible();
-                        possible.setName(value);
-                        diag.setPossible(possible);
-                        break;
-                    case NEGATIVE:
-                        Negative negative = new Negative();
-                        negative.setName(value);
-                        diag.setNegative(negative);
+        try {
+            //读取疾病信息
+            List<Lemma> diagLemmas = createEntityTree(aiOut, EntityEnum.DIEASE.toString());
+            for (Lemma lemma : diagLemmas) {
+                Diag diag = new Diag();
+                super.setDiag(lemma, diag);
+                if (lemma.isHaveChildren()) {
+                    diag.setNegative(findNegative(lemma));//阴性
+                    diag.setPossible(findT(lemma, new Possible(), EntityEnum.POSSIBLE.toString()));//可能的
                 }
+                diags.add(diag);
             }
-            diags.add(diag);
+        } catch (Exception e) {
+            logger.error(e.getMessage(), e);
         }
         return diags;
     }

+ 6 - 1
kernel/src/main/java/com/lantone/qc/kernel/structure/ai/process/EntityProcessPast.java

@@ -4,12 +4,16 @@ import com.alibaba.fastjson.JSONObject;
 import com.lantone.qc.kernel.structure.ai.model.CrfOut;
 import com.lantone.qc.kernel.structure.ai.model.EntityEnum;
 import com.lantone.qc.kernel.structure.ai.model.Lemma;
+import com.lantone.qc.kernel.util.KernelConstants;
+import com.lantone.qc.kernel.util.RedisUtil;
 import com.lantone.qc.pub.model.entity.*;
 import com.lantone.qc.pub.model.label.PastLabel;
 import org.apache.commons.beanutils.BeanUtils;
 import org.apache.commons.lang3.StringUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
 
 import java.util.ArrayList;
 import java.util.List;
@@ -21,6 +25,7 @@ import java.util.Map;
  * @Author : 楼辉荣
  * @Date: 2020-03-10 10:20
  */
+@Component
 public class EntityProcessPast extends EntityProcess {
     private Logger logger = LoggerFactory.getLogger(EntityProcessPast.class);
 
@@ -31,7 +36,7 @@ public class EntityProcessPast extends EntityProcess {
             List<Lemma> diagLemmas = createEntityTree(aiOut, EntityEnum.DIEASE.toString());
             for (Lemma lemma : diagLemmas) {
                 Diag diag = new Diag();
-                diag.setName(lemma.getText());
+                super.setDiag(lemma, diag);
                 if (lemma.isHaveChildren()) {
                     //阴性
                     diag.setNegative(findNegative(lemma));

+ 10 - 0
public/src/main/java/com/lantone/qc/pub/model/label/InitialDiagLabel.java

@@ -1,10 +1,20 @@
 package com.lantone.qc.pub.model.label;
 
+import com.lantone.qc.pub.model.entity.Diag;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.util.ArrayList;
+import java.util.List;
+
 /**
  * @ClassName : InitialDiagLabel
  * @Description : 初步诊断
  * @Author : 楼辉荣
  * @Date: 2020-03-03 18:52
  */
+@Getter
+@Setter
 public class InitialDiagLabel extends GeneralLabel {
+    List<Diag> diags = new ArrayList<>();
 }