|
@@ -16,7 +16,11 @@ import org.slf4j.LoggerFactory;
|
|
|
import org.springframework.util.StringUtils;
|
|
|
|
|
|
import javax.servlet.http.HttpServletRequest;
|
|
|
-import java.util.*;
|
|
|
+import java.util.ArrayList;
|
|
|
+import java.util.HashMap;
|
|
|
+import java.util.List;
|
|
|
+import java.util.Map;
|
|
|
+import java.util.regex.Pattern;
|
|
|
|
|
|
/**
|
|
|
* @ClassName org.diagbot.bigdata.work.ParamsDataProxy
|
|
@@ -79,9 +83,6 @@ public class ParamsDataProxy {
|
|
|
List<Map<String, Object>> featuresList = fa.start(searchData.getSymptom(), FeatureType.FEATURE);
|
|
|
paramFeatureInit(searchData, featuresList);
|
|
|
|
|
|
- // 清洗特征词,去除词性不匹配的词
|
|
|
- searchData = cleanFeature(featuresList, fa, searchData);
|
|
|
-
|
|
|
//如果既往史中诊断信息,需要提取这个特征
|
|
|
featuresList = fa.start(searchData.getOther(), FeatureType.DIAG);
|
|
|
paramFeatureInit(searchData, featuresList);
|
|
@@ -240,8 +241,11 @@ public class ParamsDataProxy {
|
|
|
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.DIGITS
|
|
|
+ if (lexemeNegativeEnum == NegativeEnum.VITAL_INDEX || lexemeNegativeEnum == NegativeEnum.SYMPTOM || lexemeNegativeEnum == NegativeEnum.DIGITS
|
|
|
|| lexemeNegativeEnum == NegativeEnum.EVENT_TIME || lexemeNegativeEnum == NegativeEnum.UNIT
|
|
|
) {
|
|
|
feature.add(lexeme);
|
|
@@ -254,19 +258,30 @@ public class ParamsDataProxy {
|
|
|
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.EVENT_TIME)
|
|
|
+ && 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.UNIT)) {
|
|
|
+ && 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)) {
|
|
|
featureType.add(feature.get(i).getText() + "\t" + feature.get(i + 1).getText() + "\t"
|
|
|
+ feature.get(i + 2).getText());
|
|
|
featureTypeState = false;
|
|
|
}
|
|
|
}
|
|
|
- if (i < feature.size() - 1 && featureTypeState) {
|
|
|
- if (NegativeEnum.parseOfValue(feature.get(i).getProperty()) == NegativeEnum.VITAL_INDEX
|
|
|
- && NegativeEnum.parseOfValue(feature.get(i + 1).getProperty()) == NegativeEnum.DIGITS) {
|
|
|
+ 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());
|
|
|
}
|
|
|
}
|
|
@@ -298,56 +313,66 @@ public class ParamsDataProxy {
|
|
|
|
|
|
//将标准词中体征指标值(数字)与分词结果中体征指标值(数字)比较
|
|
|
private void judgment(SearchData sData, String[] features, Map<String, String> standWordMap) {
|
|
|
- if (">".equals(standWordMap.get("op"))) {
|
|
|
- //单独处理 血压≥140/90mmHg 类似情况
|
|
|
- if (features[1].contains("/")) {
|
|
|
- if (standWordMap.get("value").contains("/")) {
|
|
|
- String[] feature = features[1].split("/");
|
|
|
- Integer featuresSBP = Integer.valueOf(feature[0]); //分词特征收缩压
|
|
|
- Integer featuresDBP = Integer.valueOf(feature[1]); //分词特征舒张压
|
|
|
+ if (hasDigit(features[1])) {
|
|
|
+ if (">".equals(standWordMap.get("op"))) {
|
|
|
+ //单独处理 血压≥140/90mmHg 类似情况
|
|
|
+ if (features[1].contains("/")) {
|
|
|
+ if (standWordMap.get("value").contains("/")) {
|
|
|
+ String[] feature = features[1].split("/");
|
|
|
+ Integer featuresSBP = Integer.valueOf(feature[0]); //分词特征收缩压
|
|
|
+ Integer featuresDBP = Integer.valueOf(feature[1]); //分词特征舒张压
|
|
|
|
|
|
- String[] values = standWordMap.get("value").split("/");
|
|
|
- Integer standWordSBP = Integer.valueOf(values[0]); //标准词收缩压
|
|
|
- Integer standWordDBP = Integer.valueOf(values[1]); //标准词舒张压
|
|
|
- if (featuresSBP > standWordSBP && featuresDBP > standWordDBP) {
|
|
|
+ String[] values = standWordMap.get("value").split("/");
|
|
|
+ Integer standWordSBP = Integer.valueOf(values[0]); //标准词收缩压
|
|
|
+ Integer standWordDBP = Integer.valueOf(values[1]); //标准词舒张压
|
|
|
+ if (featuresSBP > standWordSBP && featuresDBP > standWordDBP) {
|
|
|
+ sData.setSymptom(sData.getSymptom() + "," + standWordMap.get("standword"));
|
|
|
+ System.out.println(sData.getSymptom());
|
|
|
+ }
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ String num = getNum(standWordMap.get("value"));
|
|
|
+ if (Double.valueOf(getNum(features[1])) > Double.valueOf(num)) {
|
|
|
sData.setSymptom(sData.getSymptom() + "," + standWordMap.get("standword"));
|
|
|
System.out.println(sData.getSymptom());
|
|
|
- }
|
|
|
- }
|
|
|
- } else {
|
|
|
- String num = getNum(standWordMap.get("value"));
|
|
|
- if (Double.valueOf(getNum(features[1])) > Double.valueOf(num)) {
|
|
|
- sData.setSymptom(sData.getSymptom() + "," + standWordMap.get("standword"));
|
|
|
- System.out.println(sData.getSymptom());
|
|
|
|
|
|
+ }
|
|
|
}
|
|
|
- }
|
|
|
- } else if ("<".equals(standWordMap.get("op"))) {
|
|
|
- //单独处理 血压小于90/60mmHg 类似情况
|
|
|
- if (standWordMap.get("value").contains("/")) {
|
|
|
- if (features[1].contains("/")) {
|
|
|
- String[] feature = features[1].split("/");
|
|
|
- Integer featuresSBP = Integer.valueOf(feature[0]); //收缩压
|
|
|
- Integer featuresDBP = Integer.valueOf(feature[1]); //舒张压
|
|
|
+ } else if ("<".equals(standWordMap.get("op"))) {
|
|
|
+ //单独处理 血压小于90/60mmHg 类似情况
|
|
|
+ if (standWordMap.get("value").contains("/")) {
|
|
|
+ if (features[1].contains("/")) {
|
|
|
+ String[] feature = features[1].split("/");
|
|
|
+ Integer featuresSBP = Integer.valueOf(feature[0]); //收缩压
|
|
|
+ Integer featuresDBP = Integer.valueOf(feature[1]); //舒张压
|
|
|
|
|
|
- String[] values = standWordMap.get("value").split("/");
|
|
|
- Integer standWordSBP = Integer.valueOf(values[0]); //收缩压
|
|
|
- Integer standWordDBP = Integer.valueOf(values[1]); //舒张压
|
|
|
- if (featuresSBP < standWordSBP && featuresDBP < standWordDBP) {
|
|
|
+ String[] values = standWordMap.get("value").split("/");
|
|
|
+ Integer standWordSBP = Integer.valueOf(values[0]); //收缩压
|
|
|
+ Integer standWordDBP = Integer.valueOf(values[1]); //舒张压
|
|
|
+ if (featuresSBP < standWordSBP && featuresDBP < standWordDBP) {
|
|
|
+ sData.setSymptom(sData.getSymptom() + "," + standWordMap.get("standword"));
|
|
|
+ System.out.println(sData.getSymptom());
|
|
|
+ }
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ String num = getNum(standWordMap.get("value"));
|
|
|
+ if (Double.valueOf(getNum(features[1])) < Double.valueOf(num)) {
|
|
|
sData.setSymptom(sData.getSymptom() + "," + standWordMap.get("standword"));
|
|
|
System.out.println(sData.getSymptom());
|
|
|
}
|
|
|
}
|
|
|
- } else {
|
|
|
- String num = getNum(standWordMap.get("value"));
|
|
|
- if (Double.valueOf(getNum(features[1])) < Double.valueOf(num)) {
|
|
|
- sData.setSymptom(sData.getSymptom() + "," + standWordMap.get("standword"));
|
|
|
- System.out.println(sData.getSymptom());
|
|
|
- }
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+ private boolean hasDigit(String content) {
|
|
|
+ boolean flag = false;
|
|
|
+ if (Pattern.compile(".*\\d+.*").matcher(content).matches()) {
|
|
|
+ flag = true;
|
|
|
+ }
|
|
|
+ return flag;
|
|
|
+ }
|
|
|
+
|
|
|
private String getNum(String standWord) {
|
|
|
StringBuffer sb = new StringBuffer();
|
|
|
for (String num : standWord.replaceAll("[^0-9]", ",").split(",")) {
|
|
@@ -359,48 +384,4 @@ public class ParamsDataProxy {
|
|
|
}
|
|
|
|
|
|
|
|
|
- private SearchData cleanFeature(List<Map<String, Object>> featuresList, FeatureAnalyze fa,
|
|
|
- SearchData searchData) {
|
|
|
- // 在输入的辅检文本中,只提取辅检信息
|
|
|
- String[] PACS_Feature = {Constants.word_property_PACS,
|
|
|
- Constants.word_property_PACS_Detail, Constants.word_property_PACS_Result};
|
|
|
- searchData = removeFeature(featuresList, fa, searchData, PACS_Feature);
|
|
|
-
|
|
|
- // 在输入的化验文本中,只提取化验信息
|
|
|
- String[] LIS_Feature = {Constants.word_property_LIS,
|
|
|
- Constants.word_property_LIS_Detail, Constants.word_property_LIS_Result};
|
|
|
- searchData = removeFeature(featuresList, fa, searchData, LIS_Feature);
|
|
|
-
|
|
|
- return searchData;
|
|
|
- }
|
|
|
-
|
|
|
- private SearchData removeFeature(List<Map<String, Object>> featureList, FeatureAnalyze fa,
|
|
|
- SearchData searchData, String[] Feature) {
|
|
|
- String name = "";
|
|
|
- Boolean related = false;
|
|
|
-
|
|
|
- try {
|
|
|
- // 在输入的辅检文本中,只提取辅检信息
|
|
|
- featureList = fa.start(searchData.getPacs(), FeatureType.FEATURE);
|
|
|
- for (Map<String, Object> item: featureList) {
|
|
|
- name = item.get("feature_name").toString();
|
|
|
- String[] property = item.get("property").toString().split(",");
|
|
|
- for (String prop:property) {
|
|
|
- if (Arrays.asList(Feature).indexOf(prop) >= 0) {
|
|
|
- related = true;
|
|
|
- break;
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- if (!related) {
|
|
|
- searchData.getInputs().remove(name);
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- } catch (Exception ex) {
|
|
|
- ex.printStackTrace();
|
|
|
- } finally {
|
|
|
- return searchData;
|
|
|
- }
|
|
|
- }
|
|
|
}
|