Преглед на файлове

Merge branch 'push-dev' of http://192.168.2.236:10080/louhr/push into push-dev

louhr преди 5 години
родител
ревизия
d04dfc046e

+ 10 - 4
bigdata-web/src/main/java/org/diagbot/bigdata/common/ApplicationCacheUtil.java

@@ -182,17 +182,19 @@ public class ApplicationCacheUtil {
                     NegativeEnum lexemeNegativeEnum = NegativeEnum.parseOfValue(lexeme.getProperty());
                     if (lexemeNegativeEnum == NegativeEnum.SYMPTOM || lexemeNegativeEnum == NegativeEnum.CAUSE
                             || lexemeNegativeEnum == NegativeEnum.VITAL_INDEX
-                            || lexemeNegativeEnum == NegativeEnum.OTHER
                             || lexemeNegativeEnum == NegativeEnum.DIAG_STAND) {
                         if (!kl_result_mapping_standword_map.containsKey(lexeme.getText())) {
                             kl_result_mapping_standword_map.put(lexeme.getText(), standWordObjValList);
                         } else {
                             standWordObjKey = lexeme.getText();
                         }
-                    } else if (lexemeNegativeEnum == NegativeEnum.DIGITS) {
+                    }
+                    if (lexemeNegativeEnum == NegativeEnum.DIGITS) {
                         standWordObjVal.put("value", lexeme.getText());
-                    } else if (lexemeNegativeEnum == NegativeEnum.UNIT
-                            || lexemeNegativeEnum == NegativeEnum.EVENT_TIME) {
+                    }
+                    if (lexemeNegativeEnum == NegativeEnum.UNIT
+                            || lexemeNegativeEnum == NegativeEnum.EVENT_TIME
+                            || lexemeNegativeEnum == NegativeEnum.OTHER) {
                         standWordObjVal.put("unit", lexeme.getText().toLowerCase());
                     }
                     if (lexemes.size() == i) {
@@ -221,6 +223,10 @@ public class ApplicationCacheUtil {
                 case "33":
                     lexeme.setProperty("33");
                     break;
+                case "70":
+                    lexeme.setProperty("70");
+                    break;
+
             }
         }
     }

+ 162 - 47
bigdata-web/src/main/java/org/diagbot/bigdata/work/ParamsDataProxy.java

@@ -28,6 +28,25 @@ import java.util.regex.Pattern;
  **/
 public class ParamsDataProxy {
     Logger logger = LoggerFactory.getLogger(ParamsDataProxy.class);
+    //标准词只处理的词性
+    public static NegativeEnum[] negativeEnums = new NegativeEnum[] { NegativeEnum.VITAL_INDEX, NegativeEnum.SYMPTOM
+            , NegativeEnum.DIGITS, NegativeEnum.EVENT_TIME, NegativeEnum.UNIT, NegativeEnum.DIAG_STAND
+            , NegativeEnum.OTHER};
+    //标准词处理的三元组
+    public static NegativeEnum[][] negativeEnumTriple = {
+            { NegativeEnum.VITAL_INDEX, NegativeEnum.DIGITS, NegativeEnum.UNIT },
+            { NegativeEnum.VITAL_INDEX, NegativeEnum.DIGITS, NegativeEnum.EVENT_TIME },
+            { NegativeEnum.SYMPTOM, NegativeEnum.DIGITS, NegativeEnum.UNIT },
+            { NegativeEnum.SYMPTOM, NegativeEnum.DIGITS, NegativeEnum.EVENT_TIME },
+            { NegativeEnum.DIAG_STAND, NegativeEnum.DIGITS, NegativeEnum.UNIT },
+            { NegativeEnum.DIAG_STAND, NegativeEnum.DIGITS, NegativeEnum.EVENT_TIME },
+            { NegativeEnum.DIAG_STAND, NegativeEnum.DIGITS, NegativeEnum.OTHER }
+    };
+    //标准词处理的二元组
+    public static NegativeEnum[][] negativeEnumTwoTuple = {
+            { NegativeEnum.VITAL_INDEX, NegativeEnum.DIGITS },
+            { NegativeEnum.SYMPTOM, NegativeEnum.DIGITS }
+    };
 
     public void createSearchData(HttpServletRequest request, SearchData searchData) throws Exception {
         //消除空格
@@ -59,10 +78,15 @@ public class ParamsDataProxy {
             searchData.setResourceType(BigDataConstants.resource_type_o);
         }
         //给症状末尾添加诊断依据标准词
-        if (searchData.getSymptom() != null) {
-            LexemePath<Lexeme> featureData = ParticipleUtil.participle(searchData.getSymptom());
-            if (featureData != null) {
-                addStandWord(featureData, ApplicationCacheUtil.getKl_result_mapping_standword_map(), searchData);
+        String[] items = { searchData.getSymptom(), searchData.getOther(), searchData.getVital()
+                , searchData.getLis(), searchData.getPacs(), searchData.getDiag() };
+        String[] itemsType = { "symptom", "other", "vital", "lis", "pacs", "diag" };
+        for (int i = 0; i < items.length; i++) {
+            if (items[i] != null) {
+                LexemePath<Lexeme> featureData = ParticipleUtil.participle(items[i]);
+                if (featureData != null) {
+                    addStandWord(featureData, ApplicationCacheUtil.getKl_result_mapping_standword_map(), searchData, itemsType[i]);
+                }
             }
         }
         //所有信息参与推送
@@ -289,77 +313,82 @@ public class ParamsDataProxy {
      * @param sData
      * @return
      */
-    public SearchData addStandWord(List<Lexeme> lexemes, Map<String, List<Map<String, String>>> standWords, SearchData sData) {
+    public SearchData addStandWord(List<Lexeme> lexemes, Map<String, List<Map<String, String>>> standWords, SearchData sData, String itemType) {
         List<Lexeme> feature = new ArrayList<>();
+
         //收集分词结果中体征指标或体征指标值(数字)
         for (Lexeme lexeme : lexemes) {
             if (lexeme.getProperty().contains(",")) {
                 ApplicationCacheUtil.setProterty(lexeme); //如果分词后词性有多个,只选一个(暂时只处理症状,体征)
             }
             NegativeEnum lexemeNegativeEnum = NegativeEnum.parseOfValue(lexeme.getProperty());
-            if (lexemeNegativeEnum == NegativeEnum.VITAL_INDEX || lexemeNegativeEnum == NegativeEnum.SYMPTOM || lexemeNegativeEnum == NegativeEnum.DIGITS
-                    || lexemeNegativeEnum == NegativeEnum.EVENT_TIME || lexemeNegativeEnum == NegativeEnum.UNIT
-                    || lexemeNegativeEnum == NegativeEnum.DIAG_STAND) {
-                feature.add(lexeme);
+            for (int i = 0; i < negativeEnums.length; i++) {
+                if (lexemeNegativeEnum == negativeEnums[i]) {
+                    feature.add(lexeme);
+                    break;
+                }
             }
         }
         //根据收集到的分词结果把体征指标和对应体征指标值(数字)拼接
         List<String> featureType = new ArrayList<>();
+
         for (int i = 0; i < feature.size(); i++) {
             boolean featureTypeState = true;
+            boolean featureTypeStatus = false;
             if (i < feature.size() - 2) {
-                if ((NegativeEnum.parseOfValue(feature.get(i).getProperty()) == NegativeEnum.VITAL_INDEX
-                        && NegativeEnum.parseOfValue(feature.get(i + 1).getProperty()) == NegativeEnum.DIGITS
-                        && NegativeEnum.parseOfValue(feature.get(i + 2).getProperty()) == NegativeEnum.UNIT)
-                        ||
-                        (NegativeEnum.parseOfValue(feature.get(i).getProperty()) == NegativeEnum.VITAL_INDEX
-                                && NegativeEnum.parseOfValue(feature.get(i + 1).getProperty()) == NegativeEnum.DIGITS
-                                && NegativeEnum.parseOfValue(feature.get(i + 2).getProperty()) == NegativeEnum.EVENT_TIME)
-                        ||
-                        (NegativeEnum.parseOfValue(feature.get(i).getProperty()) == NegativeEnum.SYMPTOM
-                                && NegativeEnum.parseOfValue(feature.get(i + 1).getProperty()) == NegativeEnum.DIGITS
-                                && NegativeEnum.parseOfValue(feature.get(i + 2).getProperty()) == NegativeEnum.UNIT)
-                        ||
-                        (NegativeEnum.parseOfValue(feature.get(i).getProperty()) == NegativeEnum.SYMPTOM
-                                && NegativeEnum.parseOfValue(feature.get(i + 1).getProperty()) == NegativeEnum.DIGITS
-                                && NegativeEnum.parseOfValue(feature.get(i + 2).getProperty()) == NegativeEnum.EVENT_TIME)
-                        ||
-                        (NegativeEnum.parseOfValue(feature.get(i).getProperty()) == NegativeEnum.DIAG_STAND
-                                && NegativeEnum.parseOfValue(feature.get(i + 1).getProperty()) == NegativeEnum.DIGITS
-                                && NegativeEnum.parseOfValue(feature.get(i + 2).getProperty()) == NegativeEnum.EVENT_TIME)) {
-                    featureType.add(feature.get(i).getText() + "\t" + feature.get(i + 1).getText() + "\t"
-                            + feature.get(i + 2).getText());
-                    featureTypeState = false;
+                for (int j = 0; j < negativeEnumTriple.length; j++) {
+                    String featureText = "";
+                    for (int k = 0; k < negativeEnumTriple[j].length; k++) {
+                        if (NegativeEnum.parseOfValue(feature.get(i + k).getProperty()) == negativeEnumTriple[j][k]) {
+                            featureTypeStatus = true;
+                            featureText += "\t" + feature.get(i + k).getText();
+                        } else {
+                            featureTypeStatus = false;
+                            break;
+                        }
+                    }
+                    if (featureTypeStatus) {
+                        featureType.add(featureText);
+                        featureTypeState = false;
+                    }
                 }
             }
             if (featureTypeState && i < feature.size() - 1) {
-                if ((NegativeEnum.parseOfValue(feature.get(i).getProperty()) == NegativeEnum.VITAL_INDEX
-                        && NegativeEnum.parseOfValue(feature.get(i + 1).getProperty()) == NegativeEnum.DIGITS)
-                        ||
-                        (NegativeEnum.parseOfValue(feature.get(i).getProperty()) == NegativeEnum.SYMPTOM
-                                && NegativeEnum.parseOfValue(feature.get(i + 1).getProperty()) == NegativeEnum.DIGITS)) {
-                    featureType.add(feature.get(i).getText() + "\t" + feature.get(i + 1).getText());
+                for (int j = 0; j < negativeEnumTwoTuple.length; j++) {
+                    String featureText = "";
+                    for (int k = 0; k < negativeEnumTwoTuple[j].length; k++) {
+                        if (NegativeEnum.parseOfValue(feature.get(i + k).getProperty()) == negativeEnumTwoTuple[j][k]) {
+                            featureTypeStatus = true;
+                            featureText += "\t" + feature.get(i + k).getText();
+                        } else {
+                            featureTypeStatus = false;
+                            break;
+                        }
+                    }
+                    if (featureTypeStatus) {
+                        featureType.add(featureText);
+                    }
                 }
             }
         }
         //将标准词中体征指标值(数字)与分词结果中体征指标值(数字)比较
         String newStandWord = "";
         for (String f : featureType) {
-            String[] features = f.split("\t");
+            String[] features = f.trim().split("\t");
             if (standWords.containsKey(features[0])) {
                 List<Map<String, String>> standWordList = standWords.get(features[0]);
                 for (Map<String, String> standWordMap : standWordList) {
                     if (standWordMap.containsKey("unit") && standWordMap.containsKey("value")) {
                         if (features.length == 2) {
-                            newStandWord = judgment(features, standWordMap, newStandWord, sData);
+                            newStandWord = judgment(features, standWordMap, newStandWord, sData, itemType);
                         } else {
                             if (standWordMap.get("unit").equals(features[2].toLowerCase())) {
-                                newStandWord = judgment(features, standWordMap, newStandWord, sData);
+                                newStandWord = judgment(features, standWordMap, newStandWord, sData, itemType);
                             }
                         }
                     } else if (standWordMap.containsKey("value")) {
                         if (features.length == 2) {
-                            newStandWord = judgment(features, standWordMap, newStandWord, sData);
+                            newStandWord = judgment(features, standWordMap, newStandWord, sData, itemType);
                         }
                     }
                 }
@@ -382,10 +411,11 @@ public class ParamsDataProxy {
         if (flag) {
             addStandWords += smallerStandWord;
         }
-        sData.setSymptom(sData.getSymptom() + "," + addStandWords);
+        addbloodPressure(sData, itemType, addStandWords);
         return sData;
     }
 
+
     /**
      * 将标准词中体征指标值(数字)与分词结果中体征指标值(数字)比较
      * 除了血压>140/90mmHg类似标准词,其他标准词直接添加在症状后面
@@ -396,7 +426,7 @@ public class ParamsDataProxy {
      * @param sData
      * @return 血压>140/90mmHg或血压小于90/60mmHg或同时返回,在addStandWord()中进一步处理
      */
-    private String judgment(String[] features, Map<String, String> standWordMap, String standWord, SearchData sData) {
+    private String judgment(String[] features, Map<String, String> standWordMap, String standWord, SearchData sData, String itemType) {
         if (hasDigit(features[1])) {
             try {
                 if (">".equals(standWordMap.get("op"))) {
@@ -415,9 +445,10 @@ public class ParamsDataProxy {
                             }
                         }
                     } else {
+                        //"symptom","other","vital","lis","pacs","diag"
                         String num = getNum(standWordMap.get("value"));
                         if (Double.valueOf(getNum(features[1])) > Double.valueOf(num)) {
-                            sData.setSymptom(sData.getSymptom() + "," + proxy(standWordMap.get("standword")));
+                            setStandword(standWordMap, sData, itemType);
                         }
                     }
                 } else if ("<".equals(standWordMap.get("op"))) {
@@ -438,7 +469,7 @@ public class ParamsDataProxy {
                     } else {
                         String num = getNum(standWordMap.get("value"));
                         if (Double.valueOf(getNum(features[1])) < Double.valueOf(num)) {
-                            sData.setSymptom(sData.getSymptom() + "," + standWordMap.get("standword"));
+                            setStandword(standWordMap, sData, itemType);
                         }
                     }
                 } else if (">=".equals(standWordMap.get("op"))) {
@@ -459,7 +490,7 @@ public class ParamsDataProxy {
                     } else {
                         String num = getNum(standWordMap.get("value"));
                         if (Double.valueOf(getNum(features[1])) >= Double.valueOf(num)) {
-                            sData.setSymptom(sData.getSymptom() + "," + proxy(standWordMap.get("standword")));
+                            setStandword(standWordMap, sData, itemType);
                         }
                     }
                 } else if ("<=".equals(standWordMap.get("op"))) {
@@ -480,7 +511,7 @@ public class ParamsDataProxy {
                     } else {
                         String num = getNum(standWordMap.get("value"));
                         if (Double.valueOf(getNum(features[1])) <= Double.valueOf(num)) {
-                            sData.setSymptom(sData.getSymptom() + "," + standWordMap.get("standword"));
+                            setStandword(standWordMap, sData, itemType);
                         }
                     }
                 }
@@ -491,6 +522,90 @@ public class ParamsDataProxy {
         return standWord;
     }
 
+    /**
+     * 根据不同项目添加标准词
+     *
+     * @param standWordMap
+     * @param sData
+     * @param itemType
+     */
+    private void setStandword(Map<String, String> standWordMap, SearchData sData, String itemType) {
+        switch (itemType) {
+            case "symptom":
+                if (sData.getSymptom().indexOf(proxy(standWordMap.get("standword"))) == -1) {
+                    sData.setSymptom(sData.getSymptom() + "," + proxy(standWordMap.get("standword")));
+                }
+                break;
+            case "other":
+                if (sData.getOther().indexOf(proxy(standWordMap.get("standword"))) == -1) {
+                    sData.setOther(sData.getOther() + "," + proxy(standWordMap.get("standword")));
+                }
+                break;
+            case "vital":
+                if (sData.getVital().indexOf(proxy(standWordMap.get("standword"))) == -1) {
+                    sData.setVital(sData.getVital() + "," + proxy(standWordMap.get("standword")));
+                }
+                break;
+            case "lis":
+                if (sData.getLis().indexOf(proxy(standWordMap.get("standword"))) == -1) {
+                    sData.setLis(sData.getLis() + "," + proxy(standWordMap.get("standword")));
+                }
+                break;
+            case "pacs":
+                if (sData.getPacs().indexOf(proxy(standWordMap.get("standword"))) == -1) {
+                    sData.setPacs(sData.getPacs() + "," + proxy(standWordMap.get("standword")));
+                }
+                break;
+            case "diag":
+                if (sData.getDiag().indexOf(proxy(standWordMap.get("standword"))) == -1) {
+                    sData.setDiag(sData.getDiag() + "," + proxy(standWordMap.get("standword")));
+                }
+                break;
+        }
+    }
+
+    /**
+     * 添加血压(血压既满足血压≥140/90mmHg,又满足血压小于90/60mmHg时,只取前者)
+     *
+     * @param sData
+     * @param itemType
+     * @param addStandWords
+     */
+    private void addbloodPressure(SearchData sData, String itemType, String addStandWords) {
+        switch (itemType) {
+            case "symptom":
+                if (sData.getSymptom().indexOf(addStandWords) == -1) {
+                    sData.setSymptom(sData.getSymptom() + "," + addStandWords);
+                }
+                break;
+            case "other":
+                if (sData.getOther().indexOf(addStandWords) == -1) {
+                    sData.setOther(sData.getOther() + "," + addStandWords);
+                }
+                break;
+            case "vital":
+                if (sData.getVital().indexOf(addStandWords) == -1) {
+                    sData.setVital(sData.getVital() + "," + addStandWords);
+                }
+                break;
+            case "lis":
+                if (sData.getLis().indexOf(addStandWords) == -1) {
+                    sData.setLis(sData.getLis() + "," + addStandWords);
+                }
+                break;
+            case "pacs":
+                if (sData.getPacs().indexOf(addStandWords) == -1) {
+                    sData.setPacs(sData.getPacs() + "," + addStandWords);
+                }
+                break;
+            case "diag":
+                if (sData.getDiag().indexOf(addStandWords) == -1) {
+                    sData.setDiag(sData.getDiag() + "," + addStandWords);
+                }
+                break;
+        }
+    }
+
     /**
      * 判断分词后的特征中是否含有数字
      *

+ 44 - 7
bigdata-web/src/test/java/org/diagbot/AddStandWordTest.java

@@ -28,25 +28,62 @@ public class AddStandWordTest {
         //        for (Map.Entry<String, List<Map<String, String>>> entry:entries) {
         //            System.out.println(entry.getKey() + "\t"+ entry.getValue());
         //        }
-//        getStandWordFeatureType();
-//        ApplicationCacheUtil.getKl_result_mapping_standword_map();
-        long startTime = System.currentTimeMillis();
+        //        getStandWordFeatureType();
+        //        ApplicationCacheUtil.getKl_result_mapping_standword_map();
+        /*long startTime = System.currentTimeMillis();
         ApplicationCacheUtil.getKl_result_mapping_standword_map();
         long endCacheTime = System.currentTimeMillis();
         long cacheTime = endCacheTime - startTime;
         System.out.println("处理标准词最终用了:" + cacheTime + "毫秒.");
         SearchData searchData = new SearchData();
 //        searchData.setSymptom("血压14/43mmhg,收缩压140mmhg,血压149/43mmhg");
-        searchData.setSymptom("血压140/?");
+        searchData.setSymptom("病程6月");
         long splitStartTime = System.currentTimeMillis();
         LexemePath<Lexeme> data = ParticipleUtil.participle(searchData.getSymptom());
         ParamsDataProxy paramsDataProxy = new ParamsDataProxy();
-        paramsDataProxy.addStandWord(data, ApplicationCacheUtil.kl_result_mapping_standword_map, searchData);
+        paramsDataProxy.addStandWord(data, ApplicationCacheUtil.kl_result_mapping_standword_map, searchData,"symptom");
         long endTime = System.currentTimeMillis();
         long splitSeconds = endTime - splitStartTime;
         long seconds = endTime - startTime;
         System.out.println("添加标准词使用了:"+splitSeconds + "毫秒.");
-        System.out.println("处理文本总共使用了:"+seconds + "毫秒.");
+        System.out.println("处理文本总共使用了:"+seconds + "毫秒.");*/
+        for (int j = 1; j < 11; j++) {
+
+
+            SearchData searchData = new SearchData();
+            ParamsDataProxy paramsDataProxy = new ParamsDataProxy();
+            searchData.setSymptom("安静时心率98次/分");
+            searchData.setOther("心率156次/分");
+            searchData.setVital("男性43岁");
+            searchData.setLis("Hachinski缺血积分2分");
+            searchData.setPacs("病程9个月");
+            searchData.setDiag("BMI12");
+            String[] items = { searchData.getSymptom(), searchData.getOther(), searchData.getVital()
+                    , searchData.getLis(), searchData.getPacs(), searchData.getDiag() };
+            String[] itemsType = { "symptom", "other", "vital", "lis", "pacs", "diag" };
+            long startTime = System.currentTimeMillis();
+            for (int i = 0; i < items.length; i++) {
+                if (items[i] != null) {
+                    LexemePath<Lexeme> featureData = ParticipleUtil.participle(items[i]);
+                    if (featureData != null) {
+                        paramsDataProxy.addStandWord(featureData, ApplicationCacheUtil.getKl_result_mapping_standword_map(), searchData, itemsType[i]);
+                    }
+                }
+            }
+            System.out.println(searchData.getSymptom());
+            System.out.println(searchData.getOther());
+            System.out.println(searchData.getVital());
+            System.out.println(searchData.getLis());
+            System.out.println(searchData.getPacs());
+            System.out.println(searchData.getDiag());
+            long endTime = System.currentTimeMillis();
+            System.out.println("处理文本总共使用了:" + (endTime - startTime) + "毫秒.");
+            System.out.println("---------------------------第" + j + "次处理---------------------------------");
+        }
+        //        String s = "\tsafGG\tAFASSADG";
+        //        System.out.println(s);
+        //        System.out.println(s.trim());
+
     }
 
     public static void getStandWordFeatureType() throws IOException {
@@ -83,7 +120,7 @@ public class AddStandWordTest {
                 }
             }
             int i = 1;
-            for (Lexeme lexeme:lexemes) {
+            for (Lexeme lexeme : lexemes) {
                 if (lexeme.getProperty().contains(",")) {
                     ApplicationCacheUtil.setProterty(lexeme);
                 }