package edu.stanford.nlp.naturalli;
import edu.stanford.nlp.ling.CoreAnnotations;
import edu.stanford.nlp.ling.CoreLabel;
import edu.stanford.nlp.pipeline.Annotation;
import edu.stanford.nlp.pipeline.StanfordCoreNLP;
import edu.stanford.nlp.util.StringUtils;
import org.junit.*;
import java.util.*;
import static org.junit.Assert.*;
/**
* <p>A test for the {@link NaturalLogicAnnotator} setting the right
* {@link edu.stanford.nlp.naturalli.NaturalLogicAnnotations.OperatorAnnotation}s.</p>
*
* <p>
* Failures on tests which do not start with "fracas" should be looked into -- these are generally fairly toy
* sentences that should not be parsed incorrectly. Failures on the fracas examples can potentially arise just by virtue
* of the parser changing, and you should not feel too bad about commenting them. In addition, every so often the sentences
* commented out should be uncommented to see if they now work -- a better parser should fix some of these sentences.
* </p>
*
* @author Gabor Angeli
*/
public class OperatorScopeITest {
private static final StanfordCoreNLP pipeline = new StanfordCoreNLP(new Properties(){{
setProperty("annotators", "tokenize,ssplit,pos,lemma,parse,natlog");
setProperty("ssplit.isOneSentence", "true");
setProperty("tokenize.class", "PTBTokenizer");
setProperty("tokenize.language", "en");
setProperty("natlog.neQuantifiers", "true");
}});
@SuppressWarnings("unchecked")
private Optional<OperatorSpec>[] annotate(String text) {
Annotation ann = new Annotation(text);
pipeline.annotate(ann);
List<CoreLabel> tokens = ann.get(CoreAnnotations.SentencesAnnotation.class).get(0).get(CoreAnnotations.TokensAnnotation.class);
Optional<OperatorSpec>[] scopes = new Optional[tokens.size()];
Arrays.fill(scopes, Optional.empty());
for (int i = 0; i < tokens.size(); ++i) {
if (tokens.get(i).containsKey(NaturalLogicAnnotations.OperatorAnnotation.class)) {
scopes[i] = Optional.of(tokens.get(i).get(NaturalLogicAnnotations.OperatorAnnotation.class));
}
}
return scopes;
}
private void checkScope(int subjBegin, int subjEnd, int objBegin, int objEnd, Optional<OperatorSpec> guess) {
assertTrue("No quantifier found", guess.isPresent());
assertEquals("Bad subject begin " + guess.get(), subjBegin, guess.get().subjectBegin);
assertEquals("Bad subject end " + guess.get(), subjEnd, guess.get().subjectEnd);
assertEquals("Bad object begin " + guess.get(), objBegin, guess.get().objectBegin);
assertEquals("Bad object end " + guess.get(), objEnd, guess.get().objectEnd);
}
private void checkScope(int subjBegin, int subjEnd, Optional<OperatorSpec> guess) {
assertTrue("No quantifier found", guess.isPresent());
assertEquals("Bad subject begin " + guess.get(), subjBegin, guess.get().subjectBegin);
assertEquals("Bad subject end " + guess.get(), subjEnd, guess.get().subjectEnd);
assertEquals("Two-place quantifier matched", subjEnd, guess.get().objectBegin);
assertEquals("Two place quantifier matched", subjEnd, guess.get().objectEnd);
}
private void checkScope(String spec) {
String[] terms = spec.split("\\s+");
// int quantStart = -1;
int quantEnd = -1;
int subjBegin = -1;
int subjEnd = -1;
int objBegin = -1;
int objEnd = -1;
boolean seenSubj = false;
int tokenIndex = 0;
List<String> cleanSentence = new ArrayList<>();
for (String term : terms) {
switch (term) {
case "{":
// quantStart = tokenIndex;
break;
case "}":
quantEnd = tokenIndex;
break;
case "[":
if (!seenSubj) {
subjBegin = tokenIndex;
} else {
objBegin = tokenIndex;
}
break;
case "]":
if (!seenSubj) {
subjEnd = tokenIndex;
seenSubj = true;
} else {
objEnd = tokenIndex;
}
break;
default:
cleanSentence.add(term);
tokenIndex += 1;
break;
}
}
Optional<OperatorSpec>[] scopes = annotate(StringUtils.join(cleanSentence, " "));
System.err.println("Checking [@ " + (quantEnd - 1) + "]: " + spec);
if (objBegin >= 0 && objEnd >= 0) {
checkScope(subjBegin, subjEnd, objBegin, objEnd, scopes[quantEnd - 1]);
} else {
checkScope(subjBegin, subjEnd, scopes[quantEnd - 1]);
}
}
@Test
public void annotatorRuns() {
annotate("All green cats have tails.");
}
@Test
public void negationMidSentence() {
checkScope(3, 6, 6, 6, annotate("Obama was not born in Dallas")[2]);
}
@Test
public void all_X_verb_Y() {
checkScope(1, 2, 2, 4, annotate("All cats eat mice.")[0]);
checkScope(1, 2, 2, 4, annotate("All cats have tails.")[0]);
}
@Test
public void all_X_want_Y() {
checkScope(1, 2, 2, 4, annotate("All cats want milk.")[0]);
}
@Test
public void all_X_verb_prep_Y() {
checkScope(1, 2, 2, 5, annotate("All cats are in boxes.")[0]);
checkScope(1, 2, 2, 5, annotate("All cats voted for Roosevelt.")[0]);
checkScope(1, 5, 5, 8, annotate("All cats who like dogs voted for Teddy.")[0]);
checkScope(1, 2, 2, 6, annotate("All cats have spoken to Fido.")[0]);
}
@Test
public void all_X_be_Y() {
checkScope(1, 2, 2, 4, annotate("All cats are cute")[0]);
}
@Test
public void all_X_can_Y() {
checkScope(1, 2, 2, 4, annotate("All cats can purr")[0]);
}
@Test
public void all_X_relclause_verb_Y() {
checkScope(1, 5, 5, 7, annotate("All cats who like dogs eat fish.")[0]);
}
@Test
public void all_of_X_verb_Y() {
checkScope(2, 4, 4, 6, annotate("All of the cats hate dogs.")[1]);
checkScope(2, 6, 6, 9, annotate("Each of the other 99 companies owns one computer.")[1]);
}
@Test
public void PER_predicate() {
checkScope(0, 1, 1, 4, annotate("Felix likes cat food.")[0]);
}
@Test
public void PER_has_predicate() {
checkScope(0, 1, 1, 5, annotate("Felix has liked cat food.")[0]);
}
@Test
public void PER_predicate_prep() {
checkScope(0, 1, 1, 7, annotate("Jack paid the bank for 10 years")[0]);
}
@Test
public void PER_has_predicate_prep() {
checkScope(0, 1, 1, 5, annotate("Felix has spoken to Fido.")[0]);
}
@Test
public void PER_is_nn() {
checkScope(0, 1, 1, 4, annotate("Felix is a cat.")[0]);
}
@Test
public void PER_is_jj() {
checkScope(0, 1, 1, 3, annotate("Felix is cute.")[0]);
}
@Test
public void few_x_verb_y() {
checkScope(1, 2, 2, 4, annotate("all cats chase dogs")[0]);
}
@Test
public void a_few_x_verb_y() {
checkScope(2, 3, 3, 5, annotate("a few cats chase dogs")[1]);
assertFalse(annotate("a few cats chase dogs")[0].isPresent());
}
@Test
public void binary_no() {
checkScope(1, 2, 2, 4, annotate("no cats chase dogs")[0]);
}
@Test
public void unary_not() {
Optional<OperatorSpec>[] quantifiers = annotate("some cats don't like dogs");
checkScope(1, 2, 2, 6, quantifiers[0]); // some
checkScope(4, 6, quantifiers[3]); // no
assertFalse(quantifiers[3].get().isBinary()); // is unary no
}
@Test
public void num_X_verb_Y() {
checkScope(1, 2, 2, 4, annotate("Three cats eat mice.")[0]);
checkScope(1, 2, 2, 4, annotate("3 cats have tails.")[0]);
}
@Test
public void at_least_num_X_verb_Y() {
checkScope(3, 4, 4, 6, annotate("at least Three cats eat mice.")[2]);
checkScope(3, 4, 4, 6, annotate("at least 3 cats have tails.")[2]);
}
@Test
public void everyone_pp_verb_Y() {
checkScope(1, 3, 3, 5, annotate("everyone at Stanford likes cats.")[0]);
checkScope(1, 5, 5, 7, annotate("everyone who is at Stanford likes cats.")[0]);
}
@Test
public void there_are_np() {
checkScope(2, 3, annotate("there are cats")[1]);
}
@Test
public void there_are_np_pp() {
// TODO(gabor) this actually seems wrong...
checkScope(2, 6, annotate("there are cats who like dogs")[1]);
}
@Test
public void one_of_the_X_Y() {
checkScope(3, 4, 4, 6, annotate("one of the cats have tails")[2]);
}
@Test
public void regressionStrangeComma() {
Optional<OperatorSpec>[] operators = annotate("all cats, have tails.");
checkScope(1, 2, 3, 5, operators[0]); // though, unclear if this should even be true?
}
@Test
public void unarySome() {
checkScope(3, 4, annotate("Cats eat some mice")[2]);
}
@Test
public void fracasSentencesWithAll() {
checkScope("{ All } [ APCOM managers ] [ have company cars ]");
checkScope("{ All } [ Canadian residents ] [ can travel freely within Europe ]");
checkScope("{ All } [ Europeans ] [ are people ]");
checkScope("{ All } [ Europeans ] [ can travel freely within Europe ]");
checkScope("{ All } [ Europeans ] [ have the right to live in Europe ]");
checkScope("{ All } [ Italian men ] [ want to be a great tenor ]");
checkScope("{ All } [ committee members ] [ are people ]");
checkScope("{ All } [ competent legal authorities ] [ are competent law lecturers ]");
checkScope("{ All } [ elephants ] [ are large animals ]");
checkScope("{ All } [ fat legal authorities ] [ are fat law lecturers ]");
checkScope("{ All } [ law lecturers ] [ are legal authorities ]");
checkScope("{ All } [ legal authorities ] [ are law lecturers ]");
checkScope("{ All } [ mice ] [ are small animals ]");
checkScope("{ All } [ people who are from Portugal ] [ are from southern Europe ]");
checkScope("{ All } [ people who are from Sweden ] [ are from Scandinavia ]");
checkScope("{ All } [ people who are resident in Europe ] [ can travel freely within Europe ]");
checkScope("{ All } [ residents of major western countries ] [ are residents of western countries ]");
checkScope("{ All } [ residents of member states ] [ are individuals ]");
checkScope("{ All } [ residents of the North American continent ] [ can travel freely within Europe ]");
checkScope("{ All } [ the people who were at the meeting ] [ voted for a new chairman ]");
}
@Test
public void fracasSentencesWithEach() {
checkScope("{ Each } [ Canadian resident ] [ can travel freely within Europe ]");
checkScope("{ Each } [ European ] [ can travel freely within Europe ]");
checkScope("{ Each } [ European ] [ has the right to live in Europe ]");
checkScope("{ Each } [ Italian tenor ] [ wants to be great ]");
checkScope("{ Each } [ department ] [ has a dedicated line ]");
// checkScope("{ Each of } [ the other 99 companies ] [ owns one computer ]"); // TODO(gabor) parse error (nsubj where it should be dobj)
checkScope("{ Each } [ resident of the North American continent ] [ can travel freely within Europe ]");
}
@Test
public void fracasSentencesWithEvery() {
checkScope("{ Every } [ Ancient Greek ] [ was a noted philosopher ]");
checkScope("{ Every } [ Canadian resident ] [ can travel freely within Europe ]");
checkScope("{ Every } [ Canadian resident ] [ is a resident of the North American continent ]");
checkScope("{ Every } [ European ] [ can travel freely within Europe ]");
checkScope("{ Every } [ European ] [ has the right to live in Europe ]");
checkScope("{ Every } [ European ] [ is a person ]");
checkScope("{ Every } [ Italian man ] [ wants to be a great tenor ]");
checkScope("{ Every } [ Swede ] [ is a Scandinavian ]");
checkScope("{ Every } [ committee ] [ has a chairman ]");
checkScope("{ Every } [ committee ] [ has a chairman appointed by members of the committee ]");
checkScope("{ Every } [ customer who owns a computer ] [ has a service contract for it ]");
checkScope("{ Every } [ department ] [ rents a line from BT ]");
checkScope("{ Every } [ executive who had a laptop computer ] [ brought it to take notes at the meeting ]");
checkScope("{ Every } [ four-legged mammal ] [ is a four-legged animal ]");
checkScope("{ Every } [ individual who has the right to live anywhere in Europe ] [ can travel freely within Europe ]");
checkScope("{ Every } [ individual who has the right to live in Europe ] [ can travel freely within Europe ]");
checkScope("{ Every } [ inhabitant of Cambridge ] [ voted for a Labour MP ]");
checkScope("{ Every } [ mammal ] [ is an animal ]");
checkScope("{ Every } [ person who has the right to live in Europe ] [ can travel freely within Europe ]");
checkScope("{ Every } [ report ] [ has a cover page ]");
checkScope("{ Every } [ representative and client ] [ was at the meeting ]");
checkScope("{ Every } [ representative and every client ] [ was at the meeting ]");
checkScope("{ Every } [ representative ] [ has read this report ]");
checkScope("{ Every } [ representative or client ] [ was at the meeting ]");
checkScope("{ Every } [ representative ] [ was at the meeting ]");
checkScope("{ Every } [ resident of the North American continent ] [ can travel freely within Europe ]");
checkScope("{ Every } [ student ] [ used her workstation ]");
}
@Test
public void fracasSentencesWithEveryone() {
checkScope("{ Everyone } [ at the meeting ] [ voted for a new chairman ]");
checkScope("{ Everyone } [ who starts gambling seriously ] [ continues until he is broke ]");
checkScope("{ Everyone } [ who starts gambling seriously ] [ stops the moment he is broke ]");
}
@Test
public void fracasSentencesWithFew() {
checkScope("{ Few } [ committee members ] [ are from Portugal ]");
checkScope("{ Few } [ committee members ] [ are from southern Europe ]");
checkScope("{ Few } [ female committee members ] [ are from southern Europe ]");
}
@Test
public void fracasSentencesWithA() {
checkScope("{ A } [ Scandinavian ] [ won a Nobel prize ]");
checkScope("{ A } [ Swede ] [ won a Nobel prize ]");
checkScope("{ A } [ company director ] [ awarded himself a large payrise ]");
checkScope("{ A } [ company director ] [ has awarded and been awarded a payrise ]");
checkScope("{ A } [ lawyer ] [ signed every report ]");
checkScope("{ An } [ Irishman ] [ won a Nobel prize ]");
checkScope("{ An } [ Irishman ] [ won the Nobel prize for literature ]");
checkScope("{ An } [ Italian ] [ became the world 's greatest tenor ]");
}
@Test
public void fracasSentencesWithAFew() {
checkScope("{ A few } [ committee members ] [ are from Scandinavia ]");
checkScope("{ A few } [ committee members ] [ are from Sweden ]");
checkScope("{ A few } [ female committee members ] [ are from Scandinavia ]");
checkScope("{ A few } [ great tenors ] [ sing popular music ]");
}
@Test
public void fracasSentencesWithAtLeastAFew() {
checkScope("{ At least a few } [ committee members ] [ are from Scandinavia ]");
checkScope("{ At least a few } [ committee members ] [ are from Sweden ]");
// TODO(gabor) how do any of these work? Why is it only this one that's commented out?
// checkScope("{ At least a few } [ female committee members ] [ are from Scandinavia ]");
}
@Test
public void fracasSentencesWithEither() {
checkScope("{ Either } [ Smith Jones or Anderson ] [ signed the contract ]");
}
@Test
public void fracasSentencesWithOneOfThe() {
checkScope("{ One of } [ the commissioners ] [ spends a lot of time at home ]");
// checkScope("{ One of } [ the leading tenors ] [ is Pavarotti ]"); // TODO(gabor) these are actually a bit tricky; [one of] and [the] are separate constituents
}
@Test
public void fracasSentencesWithSeveral() {
checkScope("{ Several } [ Portuguese delegates ] [ got the results published in major national newspapers ]");
checkScope("{ Several } [ delegates ] [ got the results published ]");
checkScope("{ Several } [ delegates ] [ got the results published in major national newspapers ]");
checkScope("{ Several } [ great tenors ] [ are British ]");
}
@Test
public void fracasSentencesWithSome() {
checkScope("{ Some } [ Irish delegates ] [ finished the survey on time ]");
checkScope("{ Some } [ Italian men ] [ are great tenors ]");
checkScope("{ Some } [ Italian tenors ] [ are great ]");
checkScope("{ Some } [ Scandinavian delegate ] [ finished the report on time ]");
checkScope("{ Some } [ accountant ] [ attended the meeting ]");
checkScope("{ Some } [ accountants ] [ attended the meeting ]");
checkScope("{ Some } [ delegate ] [ finished the report on time ]");
checkScope("{ Some } [ delegates ] [ finished the survey ]");
checkScope("{ Some } [ delegates ] [ finished the survey on time ]");
checkScope("{ Some } [ great tenors ] [ are Swedish ]");
// checkScope("{ Some } [ great tenors ] [ like popular music ]"); // parse error
checkScope("{ Some } [ people ] [ discover that they have been asleep ]");
}
@Test
public void fracasSentencesWithThe() {
checkScope("{ The } [ Ancient Greeks ] [ were all noted philosophers ]");
checkScope("{ The } [ Ancient Greeks ] [ were noted philosophers ]");
checkScope("{ The } [ ITEL-XZ ] [ is fast ]");
checkScope("{ The } [ ITEL-ZX ] [ is an ITEL computer ]");
checkScope("{ The } [ ITEL-ZX ] [ is slower than 500 MIPS ]");
checkScope("{ The } [ PC-6082 ] [ is as fast as the ITEL-XZ ]");
checkScope("{ The } [ PC-6082 ] [ is fast ]");
checkScope("{ The } [ PC-6082 ] [ is faster than 500 MIPS ]");
checkScope("{ The } [ PC-6082 ] [ is faster than any ITEL computer ]");
checkScope("{ The } [ PC-6082 ] [ is faster than every ITEL computer ]");
checkScope("{ The } [ PC-6082 ] [ is faster than some ITEL computer ]");
checkScope("{ The } [ PC-6082 ] [ is faster than the ITEL-XZ ]");
checkScope("{ The } [ PC-6082 ] [ is faster than the ITEL-ZX ]");
checkScope("{ The } [ PC-6082 ] [ is faster than the ITEL-ZX and the ITEL-ZY ]");
checkScope("{ The } [ PC-6082 ] [ is faster than the ITEL-ZX or the ITEL-ZY ]");
checkScope("{ The } [ PC-6082 ] [ is slow ]");
checkScope("{ The } [ PC-6082 ] [ is slower than the ITEL-XZ ]");
checkScope("{ The } [ chairman of the department ] [ is a person ]");
checkScope("{ The } [ chairman ] [ read out every item on the agenda ]");
checkScope("{ The } [ chairman ] [ read out the items on the agenda ]");
checkScope("{ The } [ conference ] [ started on July 4th , 1994 ]");
checkScope("{ The } [ conference ] [ was over on July 8th , 1994 ]");
checkScope("{ The } [ inhabitants of Cambridge ] [ voted for a Labour MP ]");
// checkScope("{ The } [ people who were at the meeting ] [ all voted for a new chairman ]"); // TODO(gabor) Parse error on "meeting -dep-> all"
checkScope("{ The } [ people who were at the meeting ] [ voted for a new chairman ]");
checkScope("{ The } [ really ambitious tenors ] [ are Italian ]");
checkScope("{ The } [ residents of major western countries ] [ can travel freely within Europe ]");
checkScope("{ The } [ residents of major western countries ] [ have the right to live in Europe ]");
checkScope("{ The } [ residents of member states ] [ can travel freely within Europe ]");
checkScope("{ The } [ residents of member states ] [ have the right to live anywhere in Europe ]");
checkScope("{ The } [ residents of member states ] [ have the right to live in Europe ]");
checkScope("{ The } [ residents of western countries ] [ can travel freely within Europe ]");
checkScope("{ The } [ residents of western countries ] [ have the right to live in Europe ]");
checkScope("{ The } [ sales department ] [ rents a line from BT ]");
checkScope("{ The } [ sales department ] [ rents it from BT ]");
checkScope("{ The } [ students ] [ are going to Paris by train ]");
checkScope("{ The } [ students ] [ have spoken to Mary ]");
checkScope("{ The } [ system failure ] [ was blamed on one or more software faults ]");
}
@Test
public void fracasSentencesWithThereAre() {
checkScope("{ There are } [ 100 companies ]");
checkScope("{ There are } [ Italian men who want to be a great tenor ]");
checkScope("{ There are } [ Italian tenors who want to be great ]");
checkScope("{ There are } [ few committee members from Portugal ]");
checkScope("{ There are } [ few committee members from southern Europe ]");
checkScope("{ There are } [ great tenors who are British ]");
checkScope("{ There are } [ great tenors who are German ]");
checkScope("{ There are } [ great tenors who are Italian ]");
checkScope("{ There are } [ great tenors who are Swedish ]");
checkScope("{ There are } [ great tenors who sing popular music ]");
// checkScope("{ There are } [ really ambitious tenors who are Italian ]"); // TODO(gabor) parse error on are -advmod-> really
// checkScope("{ There are } [ really great tenors who are modest ]"); // TODO(gabor) as above
checkScope("{ There are } [ sixteen representatives ]");
checkScope("{ There are } [ some reports from ITEL on Smith 's desk ]");
checkScope("{ There are } [ tenors who will take part in the concert ]");
checkScope("{ There is } [ a car that John and Bill own ]");
checkScope("{ There is } [ someone whom Helen saw answer the phone ]");
checkScope("{ There was } [ a group of people that met ]");
checkScope("{ There was } [ an Italian who became the world 's greatest tenor ]");
checkScope("{ There was } [ one auditor who signed all the reports ]");
}
@Test
public void fracasSentencesWithProperNouns() {
checkScope("[ { APCOM } ] [ has a more important customer than ITEL ]");
checkScope("[ { APCOM } ] [ has a more important customer than ITEL has ]");
checkScope("[ { APCOM } ] [ has a more important customer than ITEL is ]");
checkScope("[ { APCOM } ] [ has been paying mortgage interest for a total of 15 years or more ]");
checkScope("[ { APCOM } ] [ lost some orders ]");
checkScope("[ { APCOM } ] [ lost ten orders ]");
checkScope("[ { APCOM } ] [ signed the contract Friday , 13th ]");
checkScope("[ { APCOM } ] [ sold exactly 2500 computers ]");
checkScope("[ { APCOM } ] [ won some orders ]");
checkScope("[ { APCOM } ] [ won ten orders ]");
checkScope("[ { Bill } ] [ bought a car ]");
checkScope("[ { Bill } ] [ has spoken to Mary ]");
checkScope("[ { Bill } ] [ is going to ]");
checkScope("[ { Bill } ] [ knows why John had his paper accepted ]");
checkScope("[ { Bill } ] [ owns a blue car ]");
checkScope("[ { Bill } ] [ owns a blue one ]");
checkScope("[ { Bill } ] [ owns a car ]");
checkScope("[ { Bill } ] [ owns a fast car ]");
checkScope("[ { Bill } ] [ owns a fast one ]");
checkScope("[ { Bill } ] [ owns a fast red car ]");
checkScope("[ { Bill } ] [ owns a red car ]");
checkScope("[ { Bill } ] [ owns a slow one ]");
checkScope("[ { Bill } ] [ owns a slow red car ]");
checkScope("[ { Bill } ] [ said Mary wrote a report ]");
checkScope("[ { Bill } ] [ said Peter wrote a report ]");
checkScope("[ { Bill } ] [ spoke to Mary ]");
checkScope("[ { Bill } ] [ spoke to Mary at five o'clock ]");
checkScope("[ { Bill } ] [ spoke to Mary at four o'clock ]");
checkScope("[ { Bill } ] [ spoke to Mary on Monday ]");
checkScope("[ { Bill } ] [ spoke to everyone that John did ]");
checkScope("[ { Bill } ] [ suggested to Frank 's boss that they should go to the meeting together , and Carl to Alan 's wife ]");
checkScope("[ { Bill } ] [ went to Berlin by car ]");
checkScope("[ { Bill } ] [ went to Berlin by train ]");
checkScope("[ { Bill } ] [ went to Paris by train ]");
checkScope("[ { Bill } ] [ will speak to Mary ]");
checkScope("[ { Bill } ] [ wrote a report ]");
checkScope("[ { Dumbo } ] [ is a four-legged animal ]");
checkScope("[ { Dumbo } ] [ is a large animal ]");
checkScope("[ { Dumbo } ] [ is a small animal ]");
checkScope("[ { Dumbo } ] [ is a small elephant ]");
checkScope("[ { Dumbo } ] [ is four-legged ]");
checkScope("[ { Dumbo } ] [ is larger than Mickey ]");
checkScope("[ { GFI } ] [ owns several computers ]");
checkScope("[ { Helen } ] [ saw the chairman of the department answer the phone ]");
checkScope("[ { ICM } ] [ is one of the companies and owns 150 computers ]");
// checkScope("[ { ITEL } ] [ always delivers reports late ]"); // TODO(gabor) bad parse from ITEL -dep-> delivers
checkScope("[ { ITEL } ] [ built MTALK in 1993 ]");
// checkScope("[ { ITEL } ] [ currently has a factory in Birmingham ]"); // fix me (bad scope)
checkScope("[ { ITEL } ] [ delivered reports late in 1993 ]");
checkScope("[ { ITEL } ] [ developed a new editor in 1993 ]");
checkScope("[ { ITEL } ] [ existed in 1992 ]");
checkScope("[ { ITEL } ] [ expanded in 1993 ]");
checkScope("[ { ITEL } ] [ finished MTALK in 1993 ]");
checkScope("[ { ITEL } ] [ has a factory in Birmingham ]");
checkScope("[ { ITEL } ] [ has developed a new editor since 1992 ]");
checkScope("[ { ITEL } ] [ has expanded since 1992 ]");
checkScope("[ { ITEL } ] [ has made a loss since 1992 ]");
checkScope("[ { ITEL } ] [ has sent most of the reports Smith needs ]");
checkScope("[ { ITEL } ] [ made a loss in 1993 ]");
checkScope("[ { ITEL } ] [ maintains all the computers that GFI owns ]");
checkScope("[ { ITEL } ] [ maintains them ]");
checkScope("[ { ITEL } ] [ managed to win the contract in 1992 ]");
// checkScope("[ { ITEL } ] [ never delivers reports late ]"); // TODO(gabor) parse error
checkScope("[ { ITEL } ] [ owned APCOM from 1988 to 1992 ]");
checkScope("[ { ITEL } ] [ owned APCOM in 1990 ]");
checkScope("[ { ITEL } ] [ sent a progress report in July 1994 ]");
checkScope("[ { ITEL } ] [ sold 3000 more computers than APCOM ]");
checkScope("[ { ITEL } ] [ sold 5500 computers ]");
checkScope("[ { ITEL } ] [ tried to win the contract in 1992 ]");
checkScope("[ { ITEL } ] [ was building MTALK in 1993 ]");
checkScope("[ { ITEL } ] [ was winning the contract from APCOM in 1993 ]");
checkScope("[ { ITEL } ] [ won a contract in 1993 ]");
checkScope("[ { ITEL } ] [ won at least eleven orders ]");
checkScope("[ { ITEL } ] [ won more orders than APCOM ]");
checkScope("[ { ITEL } ] [ won more orders than APCOM did ]");
// checkScope("[ { ITEL } ] [ won more orders than APCOM lost ]"); // TODO(gabor) parse error
checkScope("[ { ITEL } ] [ won more orders than the APCOM contract ]");
checkScope("[ { ITEL } ] [ won more than one order ]");
checkScope("[ { ITEL } ] [ won some orders ]");
checkScope("[ { ITEL } ] [ won the APCOM contract ]");
checkScope("[ { ITEL } ] [ won the contract from APCOM in 1993 ]");
checkScope("[ { ITEL } ] [ won the contract in 1992 ]");
checkScope("[ { ITEL } ] [ won twenty orders ]");
checkScope("[ { ITEL } ] [ won twice as many orders than APCOM ]");
checkScope("[ { Itel } ] [ was in Birmingham in 1993 ]");
checkScope("[ { John } ] [ bought a car ]");
checkScope("[ { John } ] [ found Mary before Bill ]");
checkScope("[ { John } ] [ found Mary before Bill found Mary ]");
checkScope("[ { John } ] [ found Mary before John found Bill ]");
checkScope("[ { John } ] [ had his paper accepted ]");
checkScope("[ { John } ] [ has a diamond ]");
checkScope("[ { John } ] [ has a genuine diamond ]");
checkScope("[ { John } ] [ has spoken to Mary ]");
checkScope("[ { John } ] [ hated the meeting ]");
checkScope("[ { John } ] [ is a cleverer politician than Bill ]");
checkScope("[ { John } ] [ is a fatter politician than Bill ]");
checkScope("[ { John } ] [ is a former successful university student ]");
checkScope("[ { John } ] [ is a former university student ]");
checkScope("[ { John } ] [ is a man and Mary is a woman ]");
checkScope("[ { John } ] [ is a successful former university student ]");
checkScope("[ { John } ] [ is a university student ]");
checkScope("[ { John } ] [ is cleverer than Bill ]");
checkScope("[ { John } ] [ is fatter than Bill ]");
checkScope("[ { John } ] [ is going to Paris by car , and the students by train ]");
checkScope("[ { John } ] [ is successful ]");
// checkScope("[ { John } ] [ needed to buy a car ] and Bill did "); // TODO(gabor) interesting example; also, parse error
checkScope("[ { John } ] [ owns a car ]");
checkScope("[ { John } ] [ owns a fast red car ]");
checkScope("[ { John } ] [ owns a red car ]");
checkScope("[ { John } ] [ represents his company ] and so does Mary");
checkScope("[ { John } ] [ said Bill had been hurt ]");
checkScope("[ { John } ] [ said Bill had hurt himself ]");
checkScope("[ { John } ] [ said Bill wrote a report ]");
checkScope("[ { John } ] [ said Mary wrote a report ] , and Bill did too"); // interesting example
// checkScope("[ { John } ] [ said that Mary wrote a report ] , and that Bill did too"); // TODO(gabor) fix me (bad scope)
checkScope("[ { John } ] [ spoke to Mary ]");
checkScope("[ { John } ] [ spoke to Mary at four o'clock ]");
checkScope("[ { John } ] [ spoke to Mary on Friday ]");
checkScope("[ { John } ] [ spoke to Mary on Monday ]");
checkScope("[ { John } ] [ spoke to Mary on Thursday ]");
checkScope("[ { John } ] [ spoke to Sue ]");
checkScope("[ { John } ] [ wanted to buy a car ] , and he did");
checkScope("[ { John } ] [ wants to know how many men work part time ]");
checkScope("[ { John } ] [ wants to know how many men work part time , and which ]");
checkScope("[ { John } ] [ wants to know how many women work part time ]");
checkScope("[ { John } ] [ wants to know which men work part time ]");
checkScope("[ { John } ] [ went to Paris by car ]");
checkScope("[ { John } ] [ went to Paris by car , and Bill by train ]");
checkScope("[ { John } ] [ went to Paris by car , and Bill by train to Berlin ]");
checkScope("[ { John } ] [ went to Paris by car , and Bill to Berlin ]");
checkScope("[ { John } ] [ wrote a report ]");
// checkScope("[ { John } ] [ wrote a report ] , and Bill said Peter did too ]"); // TODO(gabor) fix me
checkScope("[ { Jones } ] [ claimed Smith had costed Jones ' proposal ]");
checkScope("[ { Jones } ] [ claimed Smith had costed Smith 's proposal ]");
checkScope("[ { Jones } ] [ claimed he had costed Smith 's proposal ]");
checkScope("[ { Jones } ] [ claimed he had costed his own proposal ]");
checkScope("[ { Jones } ] [ graduated in March ] and has been employed ever since");
checkScope("[ { Jones } ] [ has a company car ]");
checkScope("[ { Jones } ] [ has been unemployed in the past ]");
checkScope("[ { Jones } ] [ has more than one company car ]");
checkScope("[ { Jones } ] [ is an APCOM manager ]");
checkScope("[ { Jones } ] [ is the chairman of ITEL ]");
checkScope("[ { Jones } ] [ left after Anderson left ]");
checkScope("[ { Jones } ] [ left after Anderson was present ]");
checkScope("[ { Jones } ] [ left after Smith left ]");
checkScope("[ { Jones } ] [ left before Anderson left ]");
checkScope("[ { Jones } ] [ left before Smith left ]");
checkScope("[ { Jones } ] [ left the meeting ]");
checkScope("[ { Jones } ] [ represents Jones 's company ]");
checkScope("[ { Jones } ] [ represents Smith 's company ]");
checkScope("[ { Jones } ] [ revised the contract ]");
checkScope("[ { Jones } ] [ revised the contract after Smith did ]");
checkScope("[ { Jones } ] [ revised the contract before Smith did ]");
checkScope("[ { Jones } ] [ signed another contract ]");
checkScope("[ { Jones } ] [ signed the contract ]");
checkScope("[ { Jones } ] [ signed two contracts ]");
checkScope("[ { Jones } ] [ swam after Smith swam ]");
checkScope("[ { Jones } ] [ swam to the shore ]");
checkScope("[ { Jones } ] [ swam to the shore after Smith swam to the shore ]");
checkScope("[ { Jones } ] [ was present ]");
checkScope("[ { Jones } ] [ was present after Smith was present ]");
checkScope("[ { Jones } ] [ was present before Smith was present ]");
checkScope("[ { Jones } ] [ was unemployed at some time before he graduated ]");
checkScope("[ { Jones } ] [ was writing a report ]");
checkScope("[ { Jones } ] [ was writing a report after Smith was writing a report ]");
checkScope("[ { Jones } ] [ was writing a report before Smith was writing a report ]");
checkScope("[ { Kim } ] [ is a clever person ]");
checkScope("[ { Kim } ] [ is a clever politician ]");
checkScope("[ { Kim } ] [ is clever ]");
checkScope("[ { MFI } ] [ has a service contract for all its computers ]");
checkScope("[ { MFI } ] [ is a customer that owns exactly one computer ]");
checkScope("[ { MFI } ] [ is a customer that owns several computers ]");
checkScope("[ { Mary } ] [ has a workstation ]");
checkScope("[ { Mary } ] [ is a student ]");
checkScope("[ { Mary } ] [ is female ]");
checkScope("[ { Mary } ] [ represents John 's company ]");
checkScope("[ { Mary } ] [ represents her own company ]");
checkScope("[ { Mary } ] [ used a workstation ]");
checkScope("[ { Mary } ] [ used her workstation ]");
checkScope("[ { Mickey } ] [ is a large animal ]");
checkScope("[ { Mickey } ] [ is a large mouse ]");
checkScope("[ { Mickey } ] [ is a small animal ]");
checkScope("[ { Mickey } ] [ is larger than Dumbo ]");
checkScope("[ { Mickey } ] [ is smaller than Dumbo ]");
checkScope("[ { Pavarotti } ] [ is a leading tenor who comes cheap ]");
}
@Test
public void fracasSentencesWithAtMostAtLeast() {
checkScope("{ At least three } [ commissioners ] [ spend a lot of time at home ]");
checkScope("{ At least three } [ commissioners ] [ spend time at home ]");
checkScope("{ At least three } [ female commissioners ] [ spend time at home ]");
checkScope("{ At least three } [ male commissioners ] [ spend time at home ]");
checkScope("{ At least three } [ tenors ] [ will take part in the concert ]");
checkScope("{ At most ten } [ commissioners ] [ spend a lot of time at home ]");
checkScope("{ At most ten } [ commissioners ] [ spend time at home ]");
checkScope("{ At most ten } [ female commissioners ] [ spend time at home ]");
checkScope("{ Just one } [ accountant ] [ attended the meeting ]");
}
@Test
public void fracasSentencesWithPureNumbers() {
checkScope("{ Eight } [ machines ] [ have been removed ]");
checkScope("{ Five } [ men ] [ work part time ]");
checkScope("{ Forty five } [ women ] [ work part time ]");
checkScope("{ Six } [ accountants ] [ signed the contract ]");
checkScope("{ Six } [ lawyers ] [ signed the contract ]");
// checkScope("{ Ten } [ machines ] [ were here yesterday ]"); // TODO(gabor) yesterday doesn't come into scope
checkScope("{ Twenty } [ men ] [ work in the Sales Department ]");
checkScope("{ Two } [ machines ] [ have been removed ]");
checkScope("{ Two } [ women ] [ work in the Sales Department ]");
}
@Test
public void fracasSentencesWithBoth() {
checkScope("{ Both } [ commissioners ] [ used to be businessmen ]");
checkScope("{ Both } [ commissioners ] [ used to be leading businessmen ]");
checkScope("{ Both } [ leading tenors ] [ are excellent ]");
checkScope("{ Both } [ leading tenors ] [ are indispensable ]");
}
@Test
public void fracasSentencesWithMany() {
checkScope("{ Many } [ British delegates ] [ obtained interesting results from the survey ]");
checkScope("{ Many } [ delegates ] [ obtained interesting results from the survey ]");
checkScope("{ Many } [ delegates ] [ obtained results from the survey ]");
checkScope("{ Many } [ great tenors ] [ are German ]");
}
@Test
public void fracasSentencesWithMost() {
checkScope("{ Most } [ Europeans ] [ can travel freely within Europe ]");
checkScope("{ Most } [ Europeans who are resident in Europe ] [ can travel freely within Europe ]");
checkScope("{ Most } [ Europeans who are resident outside Europe ] [ can travel freely within Europe ]");
checkScope("{ Most } [ clients at the demonstration ] [ were impressed by the system 's performance ]");
checkScope("{ Most } [ companies that own a computer ] [ have a service contract for it ]");
checkScope("{ Most } [ great tenors ] [ are Italian ]");
}
@Test
public void fracasSentencesWithNeither() {
checkScope("{ Neither } [ commissioner ] [ spends a lot of time at home ]");
checkScope("{ Neither } [ commissioner ] [ spends time at home ]");
checkScope("{ Neither } [ leading tenor ] [ comes cheap ]");
}
@Test
public void fracasSentencesWithBinaryNo() {
checkScope("{ No } [ Scandinavian delegate ] [ finished the report on time ]");
checkScope("{ No } [ accountant ] [ attended the meeting ]");
checkScope("{ No } [ accountants ] [ attended the meeting ]");
checkScope("{ No } [ delegate ] [ finished the report ]");
checkScope("{ No } [ really great tenors ] [ are modest ]");
checkScope("{ No } [ representative ] [ took less than half a day to read the report ]");
checkScope("{ No } [ student ] [ used her workstation ]");
checkScope("{ No } [ two representatives ] [ have read it at the same time ]");
checkScope("{ No } [ delegate ] [ finished the report on time ]");
}
@Test
public void fracasSentencesWithBinaryNoOne() {
// Ignore "no one" for now.
// checkScope("{ No one } [ can gamble ] [ when he is broke ]"); // interesting: subject object reversal (we of course don't actually get this...)
// checkScope("{ No one } [ gambling seriously ] [ stops until he is broke ]");
// checkScope("{ No one } [ who starts gambling seriously ] [ stops until he is broke ]");
checkScope("{ Nobody } [ who is asleep ] [ ever knows that he is asleep ]");
}
}