Java 在字符串中查找多个项目

Java 在字符串中查找多个项目,java,string,Java,String,我正在分析一堆员工事件报告,以供报告之用 事件报告本身是自由文本,我必须根据身体位置对受伤情况进行分类。我试图避免if{}elseif{}elseif{}….}else{} 事件报告示例: Employee slipped on wet stairs and injured her knee and right arm, and struck her head on the handrail. 应在受影响区域添加“膝盖”、“手臂”和“头部” Employee was lifting boxes

我正在分析一堆员工事件报告,以供报告之用

事件报告本身是自由文本,我必须根据身体位置对受伤情况进行分类。我试图避免
if{}elseif{}elseif{}….}else{}

事件报告示例:

Employee slipped on wet stairs and injured her knee and right arm, and struck her head on the handrail.
应在受影响区域添加“膝盖”、“手臂”和“头部”

Employee was lifting boxes without approved protective equipment resulting in a back strain.
While attempting to unjam copier, employee got right index finger caught in machinery resulting in a 1-inch cut.
应在受影响区域添加“返回”

Employee was lifting boxes without approved protective equipment resulting in a back strain.
While attempting to unjam copier, employee got right index finger caught in machinery resulting in a 1-inch cut.
应在受影响区域添加“手指”

Employee was lifting boxes without approved protective equipment resulting in a back strain.
While attempting to unjam copier, employee got right index finger caught in machinery resulting in a 1-inch cut.
现在,我有:

private static StaffInjuryData setAffectedAreas(String incident, StaffInjuryData sid){
   incident = incident.toUpperCase(); //eliminate case issues

   if(incident.contains("HEAD")){
       sid.addAffectedArea("HEAD");
   }else if(incident.contains("FACE")){
       sid.addAffectedArea("FACE");
   }else if(incident.contains("EYE")){
       sid.addAffectedArea("EYE");
   }else if(incident.contains("NOSE")){
       sid.addAffectedArea("NOSE");
   }
   //etc, etc, etc
   return sid;
}
是否有一种更简单/更有效的方法来完成此操作?

添加一个
设置
作为参数,在其中提供所有预期的关键字:

private static StaffInjuryData setAffectedAreas(String incident, StaffInjuryData sid,  Set<String> keywords){

   incident = incident.toUpperCase(); //eliminate case issues

   for (String keyword : keywords){        
     if(incident.contains(keyword)){
       sid.addAffectedArea(keyword);  
     }
   }

   return sid;
}
私有静态StaffInjuryData setAffectedAreas(字符串事件、StaffInjuryData sid、Set关键字){
incident=incident.toUpperCase();//消除案例问题
对于(字符串关键字:关键字){
if(事件包含(关键字)){
sid.addAffectedArea(关键字);
}
}
返回sid;
}

也许创建一个包含所有部分{颈部、肩部、背部等}的列表,然后检查条目是否包含这些值中的任何一个?

一种方法是从各个身体部位构造一个正则表达式,使用它搜索字符串,并将各个匹配项添加到列表中:

Pattern bodyParts = Pattern.compile("\\b(head|face|eye|nose)\\b", Pattern.CASE_INSENSITIVE);
在两端使用
\b
可防止部分匹配,例如在
眼睑内包含
“前额”
“眼睛”
的文本中找到
“头部”


您可以使用所有不同的部分(如头部、面部、眼睛、鼻子、手指等)创建某种容器(如列表或集合),使用.split()方法拆分字符串,然后将该字符串的每个部分与容器中的每个项目进行比较


这可能更容易,但效率可能更低。请注意,自然语言处理很难。一个简单的字典解决方案只会让你走到这一步(在你的例子中可能已经足够了)。除非考虑到词语的上下文,否则最终会出现一些来自同音词的误报。是的,“员工在后屋伤了膝盖”将在“背部”上出现误报,您必须手动检查。是的,误报是不可避免的。但是对于管理员来说,这仍然比手动处理每一个事件要快。