package org.opensextant.extractors.geo.rules;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import org.opensextant.data.Place;
import org.opensextant.extractors.geo.PlaceCandidate;
public class ContextualOrganizationRule extends GeocodeRule {
Set<String> reEval = new HashSet<>();
@Override
public void reset() {
reEval.clear();
}
@Override
public void evaluate(List<PlaceCandidate> names) {
if (!isRelevant()) {
return;
}
for (PlaceCandidate name : names) {
if (!name.hasRule(PersonNameFilter.NAME_IN_ORG_RULE)) {
continue;
}
log.debug(" City Name in Org Name? {}", name);
if (!name.isFilteredOut()) {
continue;
}
// X-reference this city name that occurs in an organization name,
// with any state or division "ADM2" or "ADM1" references.
// E.g., "Xyz City Council" where city "Xyz City" may reside in a state "S"
// mentioned elsewhere in document.
for (Place geo : name.getPlaces()) {
if (boundaryObserver.placeMentionCount().containsKey(geo.getHierarchicalPath())) {
name.setFilteredOut(false);
name.addRule("ContextualOrg");
reEval.add(name.getTextnorm());
continue;
}
}
}
/* Re-evaluate items that may have been filtered because the name appeared in an organization
* name where the org name was not necessarily geographically relevant until now.
*
*/
for (PlaceCandidate name : names) {
if (name.isFilteredOut() && reEval.contains(name.getTextnorm())) {
name.setFilteredOut(false);
name.addRule("ContextualOrg.Relation");
}
}
}
@Override
public void evaluate(PlaceCandidate name, Place geo) {
}
}