package edu.stanford.nlp.dcoref.sievepasses;
import edu.stanford.nlp.dcoref.*;
import edu.stanford.nlp.util.Generics;
import edu.stanford.nlp.util.ReflectionLoading;
import java.util.Properties;
import java.util.Set;
/**
* Use name matcher - match full names only
*
* @author Angel Chang
*/
public class NameMatch extends DeterministicCorefSieve {
protected MentionMatcher mentionMatcher = null;
protected int minTokens = 0; // Minimum number of tokens in name before attempting match
protected boolean ignoreGender = true;
private Set<String> supportedNerTypes = Generics.newHashSet();
public NameMatch() {
super();
flags.USE_iwithini = true;
flags.USE_NAME_MATCH = true;
// Stick with mainly person and organizations
supportedNerTypes.add("ORG");
supportedNerTypes.add("ORGANIZATION");
supportedNerTypes.add("PER");
supportedNerTypes.add("PERSON");
supportedNerTypes.add("MISC");
}
@Override
public void init(Properties props) {
// TODO: Can get custom mention matcher
mentionMatcher = ReflectionLoading.loadByReflection("edu.stanford.nlp.kbp.entitylinking.classify.namematcher.RuleBasedNameMatcher",
"dcoref.mentionMatcher", props);
}
private static boolean isNamedMention(Mention m, Dictionaries dict, Set<Mention> roleSet) {
return m.mentionType == Dictionaries.MentionType.PROPER;
}
@Override
public boolean checkEntityMatch(
Document document,
CorefCluster mentionCluster,
CorefCluster potentialAntecedent,
Dictionaries dict,
Set<Mention> roleSet)
{
Boolean matched = false;
Mention mainMention = mentionCluster.getRepresentativeMention();
Mention antMention = potentialAntecedent.getRepresentativeMention();
// Check if the representative mentions are compatible
if (isNamedMention(mainMention, dict, roleSet) && isNamedMention(antMention, dict, roleSet)) {
if (mainMention.originalSpan.size() > minTokens || antMention.originalSpan.size() > minTokens) {
if (Rules.entityAttributesAgree(mentionCluster, potentialAntecedent, ignoreGender)) {
if (supportedNerTypes.contains(mainMention.nerString) || supportedNerTypes.contains(antMention.nerString)) {
matched = mentionMatcher.isCompatible(mainMention, antMention);
if (matched != null) {
//Redwood.log("Match '" + mainMention + "' with '" + antMention + "' => " + matched);
if (!matched) {
document.addIncompatible(mainMention, antMention);
}
} else {
matched = false;
}
}
}
}
}
return matched;
}
}