Przeglądaj źródła

症状特征词提取

Zhaops 6 lat temu
rodzic
commit
c59b689ebc

+ 15 - 0
aipt-service/src/main/java/com/diagbot/dto/FeatureConceptDTO.java

@@ -0,0 +1,15 @@
+package com.diagbot.dto;
+
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * @Description:
+ * @Author:zhaops
+ * @time: 2019/5/13 15:41
+ */
+@Getter
+@Setter
+public class FeatureConceptDTO extends ConceptBaseDTO {
+    private Integer libType;
+}

+ 65 - 0
aipt-service/src/main/java/com/diagbot/facade/FeatureFacade.java

@@ -0,0 +1,65 @@
+package com.diagbot.facade;
+
+import com.diagbot.dto.FeatureConceptDTO;
+import com.diagbot.entity.Concept;
+import com.diagbot.enums.ConceptTypeEnum;
+import com.diagbot.enums.LexiconTypeEnum;
+import com.diagbot.exception.CommonErrorCode;
+import com.diagbot.exception.CommonException;
+import com.diagbot.util.EntityUtil;
+import com.diagbot.util.ListUtil;
+import com.google.common.collect.Lists;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @Description:
+ * @Author:zhaops
+ * @time: 2019/5/13 15:38
+ */
+@Component
+public class FeatureFacade {
+    @Autowired
+    private NLPFacade nlpFacade;
+    @Autowired
+    private ConceptFacade conceptFacade;
+
+    /**
+     * 症状关键词提取
+     *
+     * @param text
+     * @return
+     */
+    public List<FeatureConceptDTO> getSymptomFeature(String text) {
+        List<FeatureConceptDTO> symptomFeatureDTOList = Lists.newLinkedList();
+        List<Map<String, Object>> symptomFeatureList = nlpFacade.symptomFeaturePageData(text);
+        List<String> symptomNameList = Lists.newLinkedList();
+        for (Map<String, Object> symptomFeature : symptomFeatureList) {
+            if (symptomFeature != null) {
+                String symptomName = symptomFeature.get("feature_name").toString();
+                if (!symptomNameList.contains(symptomName) && symptomFeature.get("feature_type").toString().equals("1")) {
+                    symptomNameList.add(symptomName);
+                }
+            }
+        }
+        if (!ListUtil.isNotEmpty(symptomFeatureList)) {
+            throw new CommonException(CommonErrorCode.NOT_EXISTS, "未提取到特征词");
+        }
+        List<Concept> concepts = conceptFacade.getListByNamesAndType(symptomNameList, LexiconTypeEnum.SYMPTOM.getKey());
+        Map<String, Concept> conceptMap = EntityUtil.makeEntityMap(concepts, "libName");
+        for (String name : symptomNameList) {
+            FeatureConceptDTO featureConceptDTO = new FeatureConceptDTO();
+            featureConceptDTO.setName(name);
+            featureConceptDTO.setLibType(ConceptTypeEnum.Symptom.getKey());
+            if (conceptMap.containsKey(name) && conceptMap.get(name) != null) {
+                Concept concept = conceptMap.get(name);
+                featureConceptDTO.setConceptId(concept.getId());
+            }
+            symptomFeatureDTOList.add(featureConceptDTO);
+        }
+        return symptomFeatureDTOList;
+    }
+}

+ 36 - 0
aipt-service/src/main/java/com/diagbot/web/FeatureController.java

@@ -0,0 +1,36 @@
+package com.diagbot.web;
+
+import com.diagbot.annotation.SysLogger;
+import com.diagbot.dto.FeatureConceptDTO;
+import com.diagbot.dto.RespDTO;
+import com.diagbot.facade.FeatureFacade;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.List;
+
+/**
+ * @Description:
+ * @Author:zhaops
+ * @time: 2019/5/13 15:53
+ */
+@RestController
+@RequestMapping("/feature")
+@Api(value = "文本特征词提取相关API", tags = { "文本特征词提取相关API" })
+public class FeatureController {
+    @Autowired
+    private FeatureFacade featureFacade;
+
+    @ApiOperation(value = "症状特征词提取", notes = "")
+    @PostMapping("/symptomFeature")
+    @SysLogger("symptomFeature")
+    public RespDTO<List<FeatureConceptDTO>> getSymptomFeature(@RequestParam("text") String text) {
+        List<FeatureConceptDTO> data = featureFacade.getSymptomFeature(text);
+        return RespDTO.onSuc(data);
+    }
+}

+ 15 - 18
icss-service/src/main/java/com/diagbot/client/AiptServiceClient.java

@@ -1,15 +1,5 @@
 package com.diagbot.client;
 
-import java.util.List;
-import java.util.Map;
-
-import javax.validation.Valid;
-
-import org.springframework.cloud.openfeign.FeignClient;
-import org.springframework.web.bind.annotation.PostMapping;
-import org.springframework.web.bind.annotation.RequestBody;
-import org.springframework.web.bind.annotation.RequestParam;
-
 import com.diagbot.client.bean.CalculateData;
 import com.diagbot.client.bean.ConceptBaseVO;
 import com.diagbot.client.bean.ConceptExistVO;
@@ -26,10 +16,10 @@ import com.diagbot.dto.DisScaleDTO;
 import com.diagbot.dto.DisTypeDTO;
 import com.diagbot.dto.DiseaseIcdDTO;
 import com.diagbot.dto.EvaluationDTO;
+import com.diagbot.dto.FeatureConceptDTO;
 import com.diagbot.dto.GetTopPatientInfoDTO;
 import com.diagbot.dto.IndexConfigAndDataDTO;
 import com.diagbot.dto.IndexConfigDTO;
-import com.diagbot.dto.IndexDataDTO;
 import com.diagbot.dto.PushDTO;
 import com.diagbot.dto.RespDTO;
 import com.diagbot.entity.ScaleContent;
@@ -44,6 +34,14 @@ import com.diagbot.vo.IndexConfigdiseaseNameVO;
 import com.diagbot.vo.IndexDataFindVO;
 import com.diagbot.vo.IndexDataSaveVO;
 import com.diagbot.vo.RetrievalVO;
+import org.springframework.cloud.openfeign.FeignClient;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestParam;
+
+import javax.validation.Valid;
+import java.util.List;
+import java.util.Map;
 
 /**
  * @Description:调用中间层服务
@@ -58,8 +56,8 @@ public interface AiptServiceClient {
     @PostMapping(value = "/clinicaldata/scale")
     RespDTO<Map<String, Object>> scale(@RequestBody SearchData searchData);
 
-    @PostMapping(value = "/nlpService/symptomFeature")
-    RespDTO<List<Map<String, Object>>> symptomFeaturePageData(@RequestParam("text") String text);
+    @PostMapping(value = "/feature/symptomFeature")
+    RespDTO<List<FeatureConceptDTO>> symptomFeature(@RequestParam("text") String text);
 
     @PostMapping("/clinicaldata/highRisk")
     RespDTO<GdbResponse> highRisk(@RequestBody SearchData searchData);
@@ -186,19 +184,18 @@ public interface AiptServiceClient {
      */
     @PostMapping("/concept/retrivelConceptInfo")
     RespDTO<List<ConceptRetrievalDTO>> retrivelConceptInfo(@RequestBody @Valid RetrievalVO retrievalVO);
+
     /**
-     * 
      * @param indexDataFindVO
      * @return
      */
     @PostMapping(value = "/indexData/getIndexDatas")
-	RespDTO<IndexConfigAndDataDTO> getIndexDatas(@RequestBody IndexDataFindVO indexDataFindVO);
-	 
+    RespDTO<IndexConfigAndDataDTO> getIndexDatas(@RequestBody IndexDataFindVO indexDataFindVO);
+
     /**
-     * 
      * @param indexDataSaveVO
      * @return
      */
-	@PostMapping(value = "/indexData/saveIndexDatas")
+    @PostMapping(value = "/indexData/saveIndexDatas")
     RespDTO<Boolean> saveIndexDatas(@RequestBody IndexDataSaveVO indexDataSaveVO);
 }

+ 21 - 20
icss-service/src/main/java/com/diagbot/client/hystrix/AiptServiceHystrix.java

@@ -1,14 +1,5 @@
 package com.diagbot.client.hystrix;
 
-import java.util.List;
-import java.util.Map;
-
-import javax.validation.Valid;
-
-import org.springframework.stereotype.Component;
-import org.springframework.web.bind.annotation.RequestBody;
-import org.springframework.web.bind.annotation.RequestParam;
-
 import com.diagbot.client.AiptServiceClient;
 import com.diagbot.client.bean.CalculateData;
 import com.diagbot.client.bean.ConceptBaseVO;
@@ -25,6 +16,7 @@ import com.diagbot.dto.DisScaleDTO;
 import com.diagbot.dto.DisTypeDTO;
 import com.diagbot.dto.DiseaseIcdDTO;
 import com.diagbot.dto.EvaluationDTO;
+import com.diagbot.dto.FeatureConceptDTO;
 import com.diagbot.dto.GetTopPatientInfoDTO;
 import com.diagbot.dto.IndexConfigAndDataDTO;
 import com.diagbot.dto.IndexConfigDTO;
@@ -42,8 +34,14 @@ import com.diagbot.vo.IndexConfigdiseaseNameVO;
 import com.diagbot.vo.IndexDataFindVO;
 import com.diagbot.vo.IndexDataSaveVO;
 import com.diagbot.vo.RetrievalVO;
-
 import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Component;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestParam;
+
+import javax.validation.Valid;
+import java.util.List;
+import java.util.Map;
 
 /**
  * @Description:调用中间层服务
@@ -66,7 +64,7 @@ public class AiptServiceHystrix implements AiptServiceClient {
     }
 
     @Override
-    public RespDTO<List<Map<String, Object>>> symptomFeaturePageData(@RequestParam("text") String text) {
+    public RespDTO<List<FeatureConceptDTO>> symptomFeature(@RequestParam("text") String text) {
         log.error("【hystrix】调用{}异常", "symptomFeaturePageData");
         return null;
     }
@@ -238,25 +236,28 @@ public class AiptServiceHystrix implements AiptServiceClient {
         log.error("【hystrix】调用{}异常", "retrivelConceptInfo");
         return null;
     }
+
     /**
      * 指标获取
+     *
      * @param indexDataFindVO
      * @return
      */
     @Override
-	public RespDTO<IndexConfigAndDataDTO> getIndexDatas(@Valid IndexDataFindVO indexDataFindVO) {
-		log.error("【hystrix】调用{}异常", "getIndexDatas");
-		return null;
-	}
+    public RespDTO<IndexConfigAndDataDTO> getIndexDatas(@Valid IndexDataFindVO indexDataFindVO) {
+        log.error("【hystrix】调用{}异常", "getIndexDatas");
+        return null;
+    }
 
     /**
      * 指标保存
+     *
      * @param indexDataSaveVO
      * @return
      */
-	@Override
-	public RespDTO<Boolean> saveIndexDatas(@Valid IndexDataSaveVO indexDataSaveVO) {
-		log.error("【hystrix】调用{}异常", "saveIndexDatas");
-		return null;
-	}
+    @Override
+    public RespDTO<Boolean> saveIndexDatas(@Valid IndexDataSaveVO indexDataSaveVO) {
+        log.error("【hystrix】调用{}异常", "saveIndexDatas");
+        return null;
+    }
 }

+ 16 - 0
icss-service/src/main/java/com/diagbot/dto/FeatureConceptDTO.java

@@ -0,0 +1,16 @@
+package com.diagbot.dto;
+
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * @Description:
+ * @Author:zhaops
+ * @time: 2019/5/13 15:41
+ */
+@Getter
+@Setter
+public class FeatureConceptDTO extends ConceptBaseDTO {
+    private Integer libType;
+    private Long id;
+}

+ 27 - 45
icss-service/src/main/java/com/diagbot/facade/FeatureFacade.java

@@ -2,22 +2,20 @@ package com.diagbot.facade;
 
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.diagbot.client.AiptServiceClient;
+import com.diagbot.dto.FeatureConceptDTO;
 import com.diagbot.dto.RespDTO;
-import com.diagbot.dto.SymptomFeatureDTO;
 import com.diagbot.entity.QuestionInfo;
-import com.diagbot.enums.DisTypeEnum;
+import com.diagbot.enums.ConceptTypeEnum;
 import com.diagbot.enums.IsDeleteEnum;
-import com.diagbot.enums.QuestionTypeEnum;
-import com.diagbot.exception.CommonErrorCode;
-import com.diagbot.exception.CommonException;
+import com.diagbot.util.EntityUtil;
 import com.diagbot.util.ListUtil;
 import com.diagbot.util.RespDTOUtil;
-import com.google.common.collect.Lists;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
 
 import java.util.List;
 import java.util.Map;
+import java.util.stream.Collectors;
 
 /**
  * @Description:
@@ -30,8 +28,6 @@ public class FeatureFacade {
     private AiptServiceClient aiptServiceClient;
     @Autowired
     private QuestionFacade questionFacade;
-    @Autowired
-    private DisTypeFacade disTypeFacade;
 
     /**
      * 症状关键词提取
@@ -39,48 +35,34 @@ public class FeatureFacade {
      * @param text
      * @return
      */
-    public List<SymptomFeatureDTO> getSymptomFeature(String text) {
-        List<SymptomFeatureDTO> symptomFeatureDTOList = Lists.newLinkedList();
-        RespDTO<List<Map<String, Object>>> res = aiptServiceClient.symptomFeaturePageData(text);
+    public List<FeatureConceptDTO> getSymptomFeature(String text) {
+        RespDTO<List<FeatureConceptDTO>> res = aiptServiceClient.symptomFeature(text);
         RespDTOUtil.respNGDealCover(res, "AI没有返回结果");
-        List<Map<String, Object>> symptomFeatureList = res.data;
-        List<String> symptomNameList = Lists.newLinkedList();
-        for (Map<String, Object> symptomFeature : symptomFeatureList) {
-            if (symptomFeature != null) {
-                symptomNameList.add(symptomFeature.get("feature_name").toString());
-            }
-        }
-        if (!ListUtil.isNotEmpty(symptomFeatureList)) {
-            throw new CommonException(CommonErrorCode.NOT_EXISTS, "未提取到特征词");
-        }
+        List<FeatureConceptDTO> symptomFeatureList = res.data;
+        symptomFeatureList = addQuestionId(symptomFeatureList, ConceptTypeEnum.Symptom.getKey());
+        return symptomFeatureList;
+    }
+
+    /**
+     * 概念关联标签,添加标签id
+     *
+     * @param concepts
+     * @param type
+     * @return
+     */
+    public List<FeatureConceptDTO> addQuestionId(List<FeatureConceptDTO> concepts, Integer type) {
         QueryWrapper<QuestionInfo> questionInfoQueryWrapper = new QueryWrapper<>();
-        questionInfoQueryWrapper.eq("is_deleted", IsDeleteEnum.N.getKey()).
-                in("tag_name", symptomNameList).
-                and(i -> i.eq("type", QuestionTypeEnum.Symptom.getKey()).or().eq("type", QuestionTypeEnum.Disease.getKey())).
-                eq("item_type", 0);
+        List<String> nameList = concepts.stream().map(concept -> concept.getName()).collect(Collectors.toList());
+        questionInfoQueryWrapper.eq("is_deleted", IsDeleteEnum.N.getKey()).in("tag_name", nameList).eq("type", type);
         List<QuestionInfo> questionInfoList = questionFacade.list(questionInfoQueryWrapper);
-        for (QuestionInfo questionInfo : questionInfoList) {
-            SymptomFeatureDTO symptomFeatureDTO = new SymptomFeatureDTO();
-            //特征提取出诊断
-            if (questionInfo.getType().equals(QuestionTypeEnum.Disease.getKey())) {
-                //判断是否有“复诊”关键字
-                if (symptomNameList.contains("复诊")) {
-                    //判断是否为慢病
-                    Boolean isChronic = disTypeFacade.judgeByDisName(questionInfo.getTagName(), DisTypeEnum.CHRONIC.getKey());
-                    if (isChronic) {
-                        symptomFeatureDTO.setDisType(DisTypeEnum.CHRONIC.getKey());
-                    }
-                } else {
-                    //没有提取到“复诊”这个特征,诊断不处理
-                    continue;
+        if (ListUtil.isNotEmpty(questionInfoList)) {
+            Map<String, QuestionInfo> questionInfoMap = EntityUtil.makeEntityMap(questionInfoList, "tagName");
+            for (FeatureConceptDTO concept : concepts) {
+                if (questionInfoMap.containsKey(concept.getName())) {
+                    concept.setId(questionInfoMap.get(concept.getName()).getId());
                 }
             }
-            symptomFeatureDTO.setId(questionInfo.getId());
-            symptomFeatureDTO.setTagName(questionInfo.getTagName());
-            symptomFeatureDTO.setName(questionInfo.getName());
-            symptomFeatureDTO.setType(questionInfo.getType());
-            symptomFeatureDTOList.add(symptomFeatureDTO);
         }
-        return symptomFeatureDTOList;
+        return concepts;
     }
 }

+ 3 - 3
icss-service/src/main/java/com/diagbot/web/FeatureController.java

@@ -1,8 +1,8 @@
 package com.diagbot.web;
 
 import com.diagbot.annotation.SysLogger;
+import com.diagbot.dto.FeatureConceptDTO;
 import com.diagbot.dto.RespDTO;
-import com.diagbot.dto.SymptomFeatureDTO;
 import com.diagbot.facade.FeatureFacade;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
@@ -22,7 +22,7 @@ import java.util.List;
 @RestController
 @RequestMapping("/feature")
 @SuppressWarnings("unchecked")
-@Api(value = "特征词提取相关API", tags = { "特征词提取相关API" })
+@Api(value = "特征词提取相关API", tags = { "知识库标准化-特征词提取相关API" })
 public class FeatureController {
 
     @Autowired
@@ -32,7 +32,7 @@ public class FeatureController {
             notes = "text: 症状文本描述(必填)<br>")
     @PostMapping("/getSymptomFeature")
     @SysLogger("getSymptomFeature")
-    public RespDTO<List<SymptomFeatureDTO>> getSymptomFeature(@RequestParam("text") String text) {
+    public RespDTO<List<FeatureConceptDTO>> getSymptomFeature(@RequestParam("text") String text) {
         return RespDTO.onSuc(featureFacade.getSymptomFeature(text));
     }
 }