Parcourir la source

统一处理症状和体征的规则

MarkHuang il y a 5 ans
Parent
commit
e10debbb1d
1 fichiers modifiés avec 103 ajouts et 8 suppressions
  1. 103 8
      push-web/src/main/java/org/diagbot/push/transform/PreProcess.java

+ 103 - 8
push-web/src/main/java/org/diagbot/push/transform/PreProcess.java

@@ -9,11 +9,10 @@ import org.diagbot.common.work.SearchData;
 import org.diagbot.nlp.participle.ParticipleUtil;
 import org.diagbot.nlp.participle.word.Lexeme;
 import org.diagbot.nlp.participle.word.LexemePath;
+import org.diagbot.nlp.util.Constants;
 import org.diagbot.push.controller.ParticipleController;
 
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Map;
+import java.util.*;
 import java.util.stream.Collectors;
 
 public class PreProcess {
@@ -25,6 +24,10 @@ public class PreProcess {
     private static String pos = "阳性";
     private static String neg = "阴性";
 
+    private List<Map<String, Object>> vitlist = new ArrayList<>();
+    private String[] vitkeyset = {"index", "value", "unit"};
+    private String[] bptype = {"血压","收缩压","舒张压","/"};
+
     /**
      * 处理临床数据
      *
@@ -49,6 +52,9 @@ public class PreProcess {
 
             reminder = applytolis(sData, rule);
 
+            String ClinicFind = sData.getSymptom() + " " + sData.getVital();
+            reminder.addAll(applytovital(ClinicFind, rule));
+
             ruleResponse.setMedicalIndications(reminder);
 
         } catch (Exception ex) {
@@ -71,7 +77,7 @@ public class PreProcess {
 //                name = lis.getName();
                 String key = detail;
                 if (rule.get(key) != null) {
-                    reminder.addAll(compare(rule.get(key), lis));
+                    reminder.addAll(comparelis(rule.get(key), lis));
                 }
             }
 
@@ -82,11 +88,66 @@ public class PreProcess {
         }
     }
 
-    private List<MedicalIndication> compare(List<Rule> rules, LisDetail lis) {
+
+    private List<MedicalIndication> applytovital(String vital, Map<String, List<Rule>> rule) {
+
+        List<MedicalIndication> reminder = new ArrayList<>();
+
+        try {
+            Map<String, Object> vitobj = new HashMap<>();
+            Lexeme lexeme;
+            LexemePath<Lexeme> lexemes = ParticipleUtil.participle(vital);
+            for (int i=0; i<lexemes.size(); i++) {
+                lexeme = lexemes.get(i);
+                if (lexeme.getText().trim().length() > 0) {
+                    if (lexeme.getProperty().equals(Constants.word_property_vital_idx)) {
+                        vitobj = new HashMap<>();
+                        vitobj.put(vitkeyset[0], lexeme.getText());
+                    } else if (lexeme.getProperty().equals(Constants.word_property_number) &&
+                            vitobj.get(vitkeyset[0]) != null) {
+                        vitobj.put(vitkeyset[1], lexeme.getText());
+                    } else if (lexeme.getProperty().equals(Constants.word_property_unit) &&
+                            vitobj.get(vitkeyset[1]) != null) {
+                        vitobj.put(vitkeyset[2], lexeme.getText());
+
+                        if (vitobj.get(vitkeyset[0]).toString().equals(bptype[0]) &&
+                                vitobj.get(vitkeyset[1]).toString().contains(bptype[3])) {
+                            String[] idx = Arrays.asList(bptype).subList(1,3).toArray(new String[2]);
+                            String[] vals = vitobj.get(vitkeyset[1]).toString().split(bptype[3]);
+                            String unit = vitobj.get(vitkeyset[2]).toString();
+
+                            if (idx.length == vals.length) {
+                                for (int j=0; j<idx.length; j++) {
+                                    vitobj = new HashMap<>();
+                                    vitobj.put(vitkeyset[0], idx[j]);
+                                    vitobj.put(vitkeyset[1], vals[j]);
+                                    vitobj.put(vitkeyset[2], unit);
+                                    vitlist.add(vitobj);
+                                }
+                            }
+                        } else {
+                            vitlist.add(vitobj);
+                        }
+                    }
+                }
+//                System.out.println(lexeme.getText() + ": " + lexeme.getProperty());
+            }
+
+            for (Map<String, Object> obj : vitlist) {
+                String idx = obj.get(vitkeyset[0]).toString();
+                if (rule.get(idx) != null) {
+                    reminder.addAll(comparevit(rule.get(idx), obj));
+                } else { System.out.println(idx + ":\t 不存在");}
+            }
+            System.out.println("\n");
+        } catch (Exception ex) {
+            ex.printStackTrace();
+        } finally {
+            return reminder;
+        }
+    }
+    private List<MedicalIndication> comparelis(List<Rule> rules, LisDetail lis) {
         List<MedicalIndication> reminder = new ArrayList<>();
-        boolean minmatch, maxmatch;
-        Double minval, maxval;
-        String minop, maxop, minunit, maxunit;
 
         try {
             String detailname = lis.getDetailName();
@@ -94,6 +155,40 @@ public class PreProcess {
             String unit = lis.getUnits();
             String otherval = lis.getOtherValue();
 
+            reminder = compare(rules, reminder, detailname, numval, unit, otherval);
+        } catch (Exception ex) {
+            ex.printStackTrace();
+        } finally {
+            return reminder;
+        }
+    }
+
+
+
+    private List<MedicalIndication> comparevit(List<Rule> rules, Map<String, Object> vit) {
+        List<MedicalIndication> reminder = new ArrayList<>();
+
+        try {
+            String detailname = vit.get(vitkeyset[0]).toString();
+            Double numval = Double.valueOf(vit.get(vitkeyset[1]).toString());
+            String unit = vit.get(vitkeyset[2]).toString();
+            String otherval = "";
+
+            reminder = compare(rules, reminder, detailname, numval, unit, otherval);
+        } catch (Exception ex) {
+            ex.printStackTrace();
+        } finally {
+            return reminder;
+        }
+    }
+
+    private List<MedicalIndication> compare(List<Rule> rules, List<MedicalIndication> reminder,
+                                            String detailname, Double numval, String unit, String otherval) {
+        boolean minmatch, maxmatch;
+        Double minval, maxval;
+        String minop, maxop, minunit, maxunit;
+
+        try {
             if (null == numval && otherval.trim().length() > 0) {
                 for (Rule rule : rules) {
                     if (rule.getMin_operator().equals("=") && otherval.contains(rule.getMin_value())) {