|
@@ -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;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
/**
|
|
|
* 判断分词后的特征中是否含有数字
|
|
|
*
|