package edu.stanford.nlp.simple;
import edu.stanford.nlp.ling.CoreLabel;
import edu.stanford.nlp.naturalli.*;
import edu.stanford.nlp.semgraph.SemanticGraphCoreAnnotations;
import edu.stanford.nlp.trees.TreeCoreAnnotations;
import org.junit.Test;
import java.io.*;
import java.util.ArrayList;
import java.util.List;
import java.util.Optional;
import static org.junit.Assert.*;
/**
* A test for {@link edu.stanford.nlp.simple.Sentence}, using the NLP models.
*
* @author Gabor Angeli
*/
@SuppressWarnings("unchecked")
public class SentenceITest {
@Test
public void testPOSTag() {
assertEquals(
new ArrayList <String>(){{ add("DT"); add("NN"); add("VBZ"); add("JJ"); add("."); }},
new Sentence("The cat is blue.").posTags());
}
@Test
public void testLemma() {
assertEquals(
new ArrayList <String>(){{ add("the"); add("cat"); add("be"); add("blue"); add("."); }},
new Sentence("The cats are blue.").lemmas());
}
@Test
public void testNER() {
assertEquals(
new ArrayList <String>(){{ add("PERSON"); add("PERSON"); add("O"); add("O"); add("O"); add("LOCATION"); add("LOCATION"); add("O"); }},
new Sentence("George Bush lives in the United States.").nerTags());
}
@Test
public void testMentions() {
assertEquals(
new ArrayList <String>(){{ add("George Bush"); }},
new Sentence("George Bush lives in the United States.").mentions("PERSON"));
assertEquals(
new ArrayList <String>(){{ add("George Bush"); add("Bill Clinton"); }},
new Sentence("George Bush and Bill Clinton").mentions("PERSON"));
assertEquals(
new ArrayList <String>(){{ add("George Bush"); add("United States"); }},
new Sentence("George Bush lives in the United States.").mentions());
assertEquals(
new ArrayList <String>(){{ add("George Bush"); add("Bill Clinton"); }},
new Sentence("George Bush and Bill Clinton").mentions());
assertEquals(
new ArrayList <String>(){{ add("George Bush"); add("27"); }},
new Sentence("George Bush 27").mentions());
}
@Test
public void testParse() {
assertEquals("(ROOT (S (NP (DT The) (NN cat)) (VP (VBZ is) (ADJP (JJ blue))) (. .)))",
new Sentence("The cat is blue.").parse().pennString().replaceAll("\n", " ").replaceAll("\\s+", " ").trim());
}
@Test
public void testNatlogOperators() {
Sentence sentence = new Sentence("All cats have tails.");
List<Optional<OperatorSpec>> operators = sentence.operators();
assertTrue(operators.get(0).isPresent());
assertTrue(sentence.operatorAt(0).isPresent());
assertFalse(operators.get(1).isPresent());
assertFalse(sentence.operatorAt(1).isPresent());
assertEquals(1, sentence.operatorsNonempty().size());
assertEquals(Operator.ALL, sentence.operatorsNonempty().get(0).instance);
}
@Test
public void testNatlogPolarities() {
Sentence sentence = new Sentence("All cats have tails.");
List<Polarity> polarities = sentence.natlogPolarities();
assertTrue(polarities.get(0).isUpwards());
assertTrue(polarities.get(1).isDownwards());
assertTrue(polarities.get(2).isUpwards());
assertTrue(polarities.get(3).isUpwards());
assertTrue(polarities.get(4).isUpwards());
assertTrue(sentence.natlogPolarity(0).isUpwards());
assertTrue(sentence.natlogPolarity(1).isDownwards());
assertTrue(sentence.natlogPolarity(2).isUpwards());
assertTrue(sentence.natlogPolarity(3).isUpwards());
assertTrue(sentence.natlogPolarity(4).isUpwards());
}
@Test
public void testDependencyParse() {
Sentence sentence = new Sentence("The cat is blue.");
assertEquals(new Integer(1), sentence.governor(0).orElse(-42));
assertEquals(new Integer(3), sentence.governor(1).orElse(-42));
assertEquals(new Integer(3), sentence.governor(2).orElse(-42));
assertEquals(new Integer(-1), sentence.governor(3).orElse(-42));
assertEquals(new Integer(3), sentence.governor(4).orElse(-42));
assertEquals("det", sentence.incomingDependencyLabel(0).orElse("???"));
assertEquals("nsubj", sentence.incomingDependencyLabel(1).orElse("???"));
assertEquals("cop", sentence.incomingDependencyLabel(2).orElse("???"));
assertEquals("root", sentence.incomingDependencyLabel(3).orElse("???"));
assertEquals("punct", sentence.incomingDependencyLabel(4).orElse("???"));
// Make sure we called the right annotator
assertNotNull(sentence.asCoreMap().get(SemanticGraphCoreAnnotations.BasicDependenciesAnnotation.class));
assertNotNull(sentence.asCoreMap().get(SemanticGraphCoreAnnotations.CollapsedDependenciesAnnotation.class));
assertNotNull(sentence.asCoreMap().get(SemanticGraphCoreAnnotations.CollapsedCCProcessedDependenciesAnnotation.class));
assertNull(sentence.asCoreMap().get(TreeCoreAnnotations.TreeAnnotation.class));
for (int i = 0; i < sentence.length(); ++i) {
assertEquals(sentence.governor(i), sentence.governors().get(i));
assertEquals(sentence.incomingDependencyLabel(i), sentence.incomingDependencyLabels().get(i));
}
}
@Test
public void testDependencyParseWithParseAnnotator() {
Sentence sentence = new Sentence("The cat is blue.");
sentence.parse();
assertEquals(new Integer(1), sentence.governor(0).orElse(-42));
assertEquals(new Integer(3), sentence.governor(1).orElse(-42));
assertEquals(new Integer(3), sentence.governor(2).orElse(-42));
assertEquals(new Integer(-1), sentence.governor(3).orElse(-42));
// assertEquals(new Integer(3), sentence.governor(4).orElse(-42));
assertEquals("det", sentence.incomingDependencyLabel(0).orElse("???"));
assertEquals("nsubj", sentence.incomingDependencyLabel(1).orElse("???"));
assertEquals("cop", sentence.incomingDependencyLabel(2).orElse("???"));
assertEquals("root", sentence.incomingDependencyLabel(3).orElse("???"));
// assertEquals("punct", sentence.incomingDependencyLabel(4).orElse("???"));
// Make sure we called the right annotator
assertNotNull(sentence.asCoreMap().get(SemanticGraphCoreAnnotations.BasicDependenciesAnnotation.class));
assertNotNull(sentence.asCoreMap().get(SemanticGraphCoreAnnotations.CollapsedDependenciesAnnotation.class));
assertNotNull(sentence.asCoreMap().get(SemanticGraphCoreAnnotations.CollapsedCCProcessedDependenciesAnnotation.class));
assertNotNull(sentence.asCoreMap().get(TreeCoreAnnotations.TreeAnnotation.class));
for (int i = 0; i < sentence.length(); ++i) {
assertEquals(sentence.governor(i), sentence.governors().get(i));
assertEquals(sentence.incomingDependencyLabel(i), sentence.incomingDependencyLabels().get(i));
}
}
@Test
public void testToCoreLabels() {
Sentence sent = new Sentence("the quick brown fox jumped over the lazy dog");
List<CoreLabel> tokens = sent.asCoreLabels(Sentence::posTags);
assertEquals(9, tokens.size());
assertEquals("the", tokens.get(0).word());
assertEquals("dog", tokens.get(8).word());
assertEquals("DT", tokens.get(0).tag());
assertEquals("NN", tokens.get(8).tag());
}
@Test
public void testWriteRead() throws IOException {
File tmp = File.createTempFile("sentenceITest", ".ser");
tmp.deleteOnExit();
FileOutputStream out = new FileOutputStream(tmp);
Sentence orig = new Sentence("Cats have tails");
orig.serialize(out);
out.close();
InputStream in = new FileInputStream(tmp);
Sentence loaded = Sentence.deserialize(in);
assertEquals(orig, loaded);
in.close();
}
/*
@Test
public void testFragmentConstructor() {
StanfordCoreNLP pipeline = new StanfordCoreNLP(new Properties(){{
setProperty("annotators", "tokenize,ssplit,pos,depparse,natlog,openie");
}});
Annotation ann = new Annotation("The blue cat eats mice.");
pipeline.annotate(ann);
CoreMap map = ann.get(CoreAnnotations.SentencesAnnotation.class).get(0);
for (SentenceFragment fragment : map.get(NaturalLogicAnnotations.EntailedSentencesAnnotation.class)) {
Sentence s = new Sentence(fragment);
assertEquals(
StringUtils.join(fragment.words.stream().map(CoreLabel::word), " "),
StringUtils.join(s.words(), " "));
}
}
*/
}