//Dstl (c) Crown Copyright 2017 package uk.gov.dstl.baleen.annotators.misc; import java.util.Arrays; import java.util.List; import org.apache.uima.jcas.JCas; import com.google.common.collect.ImmutableSet; import uk.gov.dstl.baleen.annotators.misc.helpers.AbstractRootWordAnnotator; import uk.gov.dstl.baleen.core.pipelines.orderers.AnalysisEngineAction; import uk.gov.dstl.baleen.types.language.Sentence; import uk.gov.dstl.baleen.types.language.WordToken; import uk.gov.dstl.baleen.types.military.Weapon; /** * This class attempts to identify generically described weapons by first looking for * a weapon type (e.g. rifle, grenade) and then extending the entity to * include descriptive words (e.g. assault) beforehand. */ public class GenericWeapon extends AbstractRootWordAnnotator<Weapon> { protected static final List<String> FIREARM = Arrays.asList("firearm", "gun", "handgun", "pistol", "revolver", "rifle", "sidearm", "shotgun"); protected static final List<String> AMMUNITION = Arrays.asList("ammo", "ammunition", "bullet", "cartridge", "magazine", "round", "shell"); protected static final List<String> EXPLOSIVE = Arrays.asList("airstrike", "artillery", "bomb", "explosive", "grenade", "ied", "missile", "mortar", "ordnance", "rocket", "rpg", "torpedo", "vbied"); protected static final List<String> BLADED = Arrays.asList("axe", "blade", "dagger", "knife", "knive", "machete", "sword"); protected static final List<String> OTHER = Arrays.asList("armament", "flamethrower", "munition", "weapon", "wmd"); protected static final List<String> DESCRIPTORS = Arrays.asList( "chemical", "biological", "nuclear", "atomic", "sonic", "laser", "rocket", "propelled", "rail", "air", "ground", "surface", "dirty", "improvised", "explosive", "unexploded", "lethal", "less-lethal", "non-lethal", "tactical", "combat", "commando", "recoilless", "silenced", "anti", "aircraft", "tank", "ship", "submarine", "antiaircraft", "anti-aircraft", "antitank", "anti-tank", "antiship", "anti-ship", "antisubmarine", "anti-submarine", "sniper", "machine", "assault", "submachine", "sub-machine" ); @Override protected String isEntity(String word) { String ret = null; String singular = word; if(word.endsWith("s")){ singular = singular.substring(0, singular.length() - 1); } if(FIREARM.contains(singular)){ ret = "FIREARM"; }else if(AMMUNITION.contains(singular)){ ret = "AMMUNITION"; }else if(EXPLOSIVE.contains(singular)){ ret = "EXPLOSIVE"; }else if(BLADED.contains(singular)){ ret = "BLADED"; }else if(OTHER.contains(singular)){ ret = "OTHER"; } return ret; } @Override protected boolean isDescriptiveWord(String word) { return DESCRIPTORS.contains(word); } @Override protected Weapon createEntity(JCas jCas) { return new Weapon(jCas); } @Override public AnalysisEngineAction getAction() { return new AnalysisEngineAction(ImmutableSet.of(Sentence.class, WordToken.class), ImmutableSet.of(Weapon.class)); } }