Хотя ответ @ StanfordNLPHelp оказался полезным, я подумал, что хотел бы добавить еще несколько деталей в мое окончательное решение.
Вариант 1:
Добавить TokensRegex аннотатор , как указано в предыдущем ответе. Это добавляет в конвейер более настраиваемый аннотатор, и вы можете указать свои собственные правила в текстовом файле.
Вот как выглядит мой файл правил (extended_ner.rules):
# these Java classes will be used by the rules
ner = { type: "CLASS", value: "edu.stanford.nlp.ling.CoreAnnotations$NamedEntityTagAnnotation" }
tokens = { type: "CLASS", value: "edu.stanford.nlp.ling.CoreAnnotations$TokensAnnotation" }
# rule for recognizing compound names
{ ruleType: "tokens", pattern: ([{tag:"NN"}] [{tag:"IN"}] [{tag:"DT"}] [{tag:"NNP"}]), action: Annotate($0, ner, "COMPOUND"), result: "COMPOUND_RESULT" }
Вы можете увидеть разбивку правил синтаксиса здесь .
Примечание: После аннотатора NER необходимо добавить аннотатор TokensRegex . В противном случае результаты будут перезаписаны.
Вот как будет выглядеть код Java:
public NamedEntityRecognition() {
Properties props = new Properties();
props.setProperty("annotators", "tokenize,ssplit,pos,lemma,ner,tokensregex,entitylink");
props.setProperty("tokensregex.rules", "extended_ner.rules");
props.setProperty("tokenize.options", "untokenizable=noneDelete");
pipeline = new StanfordCoreNLP(props);
}
Вариант 2 (выбранный)
Вместо добавления другой аннотатор, файл правил может быть отправлен нер аннотатору через свойство de "ner.additional.tokensregex.rules"
. Здесь - документы.
Я выбрал эту опцию, потому что она кажется более простой, и добавление еще одного аннотатора в конвейер показалось мне немного излишним.
Файл правил точно такой же, как в варианте 1, код java теперь выглядит так:
public NamedEntityRecognition() {
Properties props = new Properties();
props.setProperty("annotators", "tokenize,ssplit,pos,lemma,ner,entitylink");
props.setProperty("ner.additional.tokensregex.rules", "extended_ner.rules");
props.setProperty("tokenize.options", "untokenizable=noneDelete");
pipeline = new StanfordCoreNLP(props);
}
Примечание: Чтобы это работало, свойство "ner.applyFineGrained"
должно быть истинным (значение по умолчанию ).