Я только начинаю работать с Tokens Regex. Я действительно не нашел вступление или учебник, который дает мне то, что мне нужно. (Если я что-то пропустил, ссылки приветствуются!)
Сверхкорочая идея состоит в том, что я хочу сделать что-то вроде использования
pattern: ( ( [ { ner:PERSON } ]) /was/ /born/ /on/ ([ { ner:DATE } ]) )
(из https://nlp.stanford.edu/software/tokensregex.html)
, чтобы соответствовать «Джон Смит родился 1 марта 1999 года», а затем иметь возможность извлечь «Джон Смит» как личность и «1 марта 1999» как дату.
Я собрал следующее из нескольких поисковых запросов в Интернете. Я могу заставить простое регулярное выражение Java /John/
соответствовать, но ничто из того, что я пробовал (все скопировано с веб-поиска примеров и немного подправлено), не соответствует, когда я использую NER.
РЕДАКТИРОВАТЬ для ясности: (Успех / неудача на данный момент является истинным / ложным с matcher2.matches()
в коде ниже.)
Я не знаю, нужно ли мне явно упоминать какую-то модель или аннотацию или что-то, или я что-то упускаю, или я просто подхожу к этому совершенно неправильно.
Любые идеи очень ценятся! Спасибо!
import edu.stanford.nlp.ling.CoreAnnotations;
import edu.stanford.nlp.ling.CoreLabel;
import edu.stanford.nlp.ling.tokensregex.TokenSequenceMatcher;
import edu.stanford.nlp.ling.tokensregex.TokenSequencePattern;
import edu.stanford.nlp.pipeline.Annotation;
import edu.stanford.nlp.pipeline.StanfordCoreNLP;
import edu.stanford.nlp.util.CoreMap;
import java.util.ArrayList;
import java.util.List;
import java.util.Properties;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.junit.Test;
public class StanfordSandboxTest {
private static final Log log = LogFactory.getLog(StanfordSandboxTest.class);
@Test
public void testFirstAttempt() {
Properties props2;
StanfordCoreNLP pipeline2;
TokenSequencePattern pattern2;
Annotation document2;
List<CoreMap> sentences2;
TokenSequenceMatcher matcher2;
String text2;
props2 = new Properties();
props2.put("annotators", "tokenize, ssplit, pos, lemma, ner, regexner, parse, dcoref");
pipeline2 = new StanfordCoreNLP(props2);
text2 = "March 1, 1999";
pattern2 = TokenSequencePattern.compile("pattern: (([{ner:DATE}])");
document2 = new Annotation(text2);
pipeline2.annotate(document2);
sentences2 = document2.get(CoreAnnotations.SentencesAnnotation.class);
matcher2 = pattern2.getMatcher(sentences2);
log.info("testFirstAttempt: Matches2: " + matcher2.matches());
props2 = new Properties();
props2.put("annotators", "tokenize, ssplit, pos, lemma, ner, regexner, parse, dcoref");
pipeline2 = new StanfordCoreNLP(props2);
text2 = "John";
pattern2 = TokenSequencePattern.compile("/John/");
document2 = new Annotation(text2);
pipeline2.annotate(document2);
sentences2 = document2.get(CoreAnnotations.SentencesAnnotation.class);
matcher2 = pattern2.getMatcher(sentences2);
log.info("testFirstAttempt: Matches2: " + matcher2.matches());
}
}