//Question Syntax: https://www.englishclub.com/grammar/questions.htm
//Diff: tNegative and logic not present
//TODO: check if there is negative in (Wh-) questions, then use negative if yes. (if not, no)
//TODO: Make better ToNegative (detecting do and adding not)
//var nlp = nlp;
nlp.extend(compromiseSentences);
//console.clear();
/*IsRestatement("Where do you live?", "I live at McDonald's.");
IsRestatement(
"Why hasn't Tara done it?",
"Tara hasn't done it because she can't"
);
IsRestatement("Where do you live?", "I don't live at McDonald's.");
IsRestatement("Why hasn't Tara done it?", "she can't");*/
function IsRestatement(q, t) {
//var nlp = nlp;
console.time("IsRestatement()");
var question = nlp(q);
if (question.sentences().length > 1 || question.sentences().length < 1) {
console.error("Too Many (or Too Little) Sentences!");
console.error(question.sentences());
return false;
}
var text = nlp(t);
if (question.sentences().isQuestion().length === 1) {
//console.log(`Parse(): "${question.text()}", "${text.text()}"`);
var result = Parse(question, text);
console.timeEnd(`IsRestatement()`);
return result;
} else {
return false;
}
}
function Parse(q, t) {
var qpart = q.clone();
var tpart = t.clone();
console.log(`Parse(): QPart: ${qpart.text()}`);
console.log(`Parse(): TPart: ${tpart.text()}`);
if (qpart && tpart) {
var A = YesNo(qpart, tpart);
console.log(`Parse(): YesNo Result: ${A}`);
var B = QuestionWord(qpart, tpart); //AttemptB(qpart, tpart);
console.log(`Parse(): QuestionWord Result: ${B}`);
var C = Tag(qpart, tpart);
console.log(`Parse(): Tag Result: ${C}`);
return A || B || C;
} else return null;
}
function IsYesNo(q) {
var qpart = q.match(
"#QuestionWord? (#Verb|Will) (#ProperNoun|#Noun|#Pronoun) #Verb *"
);
//console.warn(qpart.match("(Who|What|When|How|Why|Where|Which)"));
if (!qpart.found) return false;
else if (qpart.match("(Who|What|When|How|Why|Where|Which)").found)
return false;
else return true;
}
function YesNo(q, t) {
var qpart = q
.match("#QuestionWord? (#Verb|Will) (#ProperNoun|#Noun|#Pronoun) #Verb *")
.clone();
//console.log(q.json());
console.log(`YesNo(): Match: ${qpart.text()}`);
if (!qpart.found) return false;
else if (qpart.match("(Who|What|When|How|Why|Where|Which)").found)
return false;
//console.log(q.json());
var Auxiliary = qpart.matchOne("(#Verb|Will)").clone();
qpart.matchOne("(#Verb|Will)").remove();
var Subject = qpart.matchOne("(#ProperNoun|#Noun|#Pronoun)").clone();
qpart.matchOne("(#ProperNoun|#Noun|#Pronoun)").remove();
var MainVerb = qpart.matchOne("#Verb").clone();
qpart.verbs().first().remove();
console.log(`YesNo(): Remainder: "${qpart.text()}"`);
console.log(`YesNo(): Auxiliary: "${Auxiliary.text()}"`);
console.log(`YesNo(): Subject: "${Subject.text()}"`);
console.log(`YesNo(): MainVerb: "${MainVerb.text()}"`);
return EvalYesNo(Subject, Auxiliary, MainVerb, qpart, t) || YesNoSimple(q, t);
}
function EvalYesNo(sub, aux, verb, remain, compare) {
var phrase = nlp(
sub.text() +
" " +
aux.text().toLowerCase() +
" " +
verb.text() +
" " +
remain.text()
);
console.log(`EvalYesNo(): Phrase: "${phrase.text()}"`);
var NegativePhrase = phrase.sentences().clone().toNegative();
var PositivePhrase = phrase.sentences().clone().toPositive();
//console.log(`(): $.`);
console.log(`EvalYesNo(): Negative "${NegativePhrase.text()}"`);
console.log(`EvalYesNo(): Positive: "${PositivePhrase.text()}"`);
console.log(`EvalYesNo(): Compare: "${compare.text()}"`);
return (
NegativePhrase.text()
.toLowerCase()
.includes(compare.text().toLowerCase()) ||
PositivePhrase.text()
.toLowerCase()
.includes(compare.text().toLowerCase()) ||
compare
.text()
.toLowerCase()
.includes(PositivePhrase.text().toLowerCase()) ||
compare
.text()
.toLowerCase()
.includes(NegativePhrase.text().toLowerCase()) ||
phrase.text().toLowerCase().includes(compare.text().toLowerCase()) ||
compare.text().toLowerCase().includes(phrase.text().toLowerCase())
);
}
function YesNoSimple(q, t) {
if (!IsSimple(q)) return false;
return Simple(q, t);
}
//var result = QuestionWordWho(nlp("Who has run out"), nlp("Ati has run out"));
//console.log(result);
function QuestionWordWho(q, t) {
var qpart = q.clone();
qpart.remove("^#QuestionWord");
var Auxiliary = qpart.matchOne("(#Verb|Will)").clone();
qpart.matchOne("(#Verb|Will)").remove();
qpart.remove("^#Negative");
var Subject = qpart.matchOne("(#ProperNoun|#Noun|#Pronoun)").clone();
qpart.remove("^(#ProperNoun|#Noun|#Pronoun)");
var MainVerb = qpart.matchOne("(#Verb|done)").clone();
qpart.matchOne("(#Verb|done)").remove();
console.log(`QuestionWordWho(): Remainder: "${qpart.text()}"`);
console.log(`QuestionWordWho(): Auxiliary: "${Auxiliary.text()}"`);
console.log(`QuestionWordWho(): Subject: "${Subject.text()}"`);
console.log(`QuestionWordWho(): MainVerb: "${MainVerb.text()}"`);
var result = false;
if (Subject.found) {
var WhomPhrase = nlp(Subject.text() + " " + MainVerb.text());
console.log(`QuestionWordWho(): WhomPhrase: "${WhomPhrase.text()}"`);
result = QuestionWordWhoTenseTest(WhomPhrase, t) || result;
}
var WhoSubjectPhrase = nlp(
Auxiliary.text() + " " + MainVerb.text() + " " + qpart.text()
);
var WhoSimplePhrase = nlp(MainVerb.text() + " " + qpart.text());
console.log(
`QuestionWordWho(): WhoSubjectPhrase: "${WhoSubjectPhrase.text()}"`
);
console.log(
`QuestionWordWho(): WhoSimplePhrase: "${WhoSimplePhrase.text()}"`
);
result =
QuestionWordWhoTenseTest(WhoSubjectPhrase, t, MainVerb) ||
QuestionWordWhoTenseTest(WhoSimplePhrase, t, MainVerb) ||
result;
return result;
}
function QuestionWordWhoTenseTest(phrase, t, mvb) {
var past = phrase.clone().sentences().toPastTense();
var present = phrase.clone().sentences().toPresentTense();
var future = phrase.clone().sentences().toFutureTense();
return (
QuestionWordWhoTest(phrase, t, mvb) ||
QuestionWordWhoTest(past, t, mvb) ||
QuestionWordWhoTest(present, t, mvb) ||
QuestionWordWhoTest(future, t, mvb)
);
}
function QuestionWordWhoTest(phrase, t, mvb) {
console.log(`QuestionWordWhenWhy(): Phrase: "${phrase.text()}"`);
var NegativePhrase = phrase.sentences().clone().toNegative();
var PositivePhrase = phrase.sentences().clone().toPositive();
var NegativeePhrase = phrase.clone();
NegativeePhrase.matchOne(mvb.text()).prepend("not");
//console.log(`(): $.`);
console.log(
`QuestionWordWhoTenseTest(): Negative "${NegativePhrase.text()}"`
);
console.log(
`QuestionWordWhoTenseTest(): Positive: "${PositivePhrase.text()}"`
);
console.log(
`QuestionWordWhoTenseTest(): Negativee: "${NegativeePhrase.text()}"`
);
console.log(`QuestionWordWhoTenseTest(): Compare: "${t.text()}"`);
return (
NegativePhrase.text().toLowerCase().includes(t.text().toLowerCase()) ||
PositivePhrase.text().toLowerCase().includes(t.text()) ||
t.text().toLowerCase().includes(PositivePhrase.text().toLowerCase()) ||
t.text().toLowerCase().includes(NegativePhrase.text().toLowerCase()) ||
NegativeePhrase.text().includes(t.text().toLowerCase()) ||
t.text().toLowerCase().includes(NegativeePhrase.text().toLowerCase()) ||
phrase.text().toLowerCase().includes(t.text().toLowerCase()) ||
t.text().toLowerCase().includes(phrase.text().toLowerCase())
);
}
function QuestionWordWhenWhy(q, t) {
var qpart = q.clone();
qpart.remove("^#QuestionWord");
var Auxiliary = qpart.matchOne("(#Verb|Will)").clone();
qpart.matchOne("(#Verb|Will)").remove();
qpart.remove("^#Negative");
var Subject = qpart.matchOne("(#ProperNoun|#Noun|#Pronoun)").clone();
qpart.remove("^(#ProperNoun|#Noun|#Pronoun)");
var MainVerb = qpart.matchOne("(#Verb|done)").clone();
qpart.matchOne("(#Verb|done)").remove();
console.log(`QuestionWordWhenWhy(): Remainder: "${qpart.text()}"`);
console.log(`QuestionWordWhenWhy(): Auxiliary: "${Auxiliary.text()}"`);
console.log(`QuestionWordWhenWhy(): Subject: "${Subject.text()}"`);
console.log(`QuestionWordWhenWhy(): MainVerb: "${MainVerb.text()}"`);
var phrase = nlp(
Subject.text() +
" " +
Auxiliary.text().toLowerCase() +
" " +
MainVerb.text() +
" " +
qpart.text()
);
console.log(`QuestionWordWhenWhy(): Phrase: "${phrase.text()}"`);
var NegativePhrase = phrase.sentences().clone().toNegative();
var PositivePhrase = phrase.sentences().clone().toPositive();
//console.log(`(): $.`);
console.log(`QuestionWordWhenWhy(): Negative "${NegativePhrase.text()}"`);
console.log(`QuestionWordWhenWhy(): Positive: "${PositivePhrase.text()}"`);
console.log(`QuestionWordWhenWhy(): Compare: "${t.text()}"`);
return (
NegativePhrase.text().toLowerCase().includes(t.text().toLowerCase()) ||
PositivePhrase.text().toLowerCase().includes(t.text().toLowerCase()) ||
t.text().toLowerCase().includes(PositivePhrase.text().toLowerCase()) ||
t.text().toLowerCase().includes(NegativePhrase.text().toLowerCase()) ||
phrase.text().toLowerCase().includes(t.text().toLowerCase()) ||
t.text().toLowerCase().includes(phrase.text().toLowerCase())
);
}
function QuestionWordWhere(q, t) {
var qpart = q.clone();
qpart.remove("^#QuestionWord");
var Auxiliary = qpart.matchOne("(#Verb|Will)").clone();
qpart.matchOne("(#Verb|Will)").remove();
qpart.remove("^#Negative");
var Subject = qpart.matchOne("(#ProperNoun|#Noun|#Pronoun)").clone();
qpart.remove("^(#ProperNoun|#Noun|#Pronoun)");
var MainVerb = qpart.matchOne("(#Verb|done)").clone();
qpart.matchOne("(#Verb|done)").remove();
console.log(`QuestionWordWhere(): Remainder: "${qpart.text()}"`);
console.log(`QuestionWordWhere(): Auxiliary: "${Auxiliary.text()}"`);
console.log(`QuestionWordWhere(): Subject: "${Subject.text()}"`);
console.log(`QuestionWordWhere(): MainVerb: "${MainVerb.text()}"`);
var phrase = nlp(MainVerb.text() + " " + qpart.text());
var phraseaux = nlp(
Auxiliary.text() + " " + MainVerb.text() + " " + qpart.text()
);
console.log(`QuestionWordWhere(): AuxPhrase: "${phraseaux.text()}"`);
var AuxNegativePhrase = phraseaux.sentences().clone().toNegative();
var AuxPositivePhrase = phraseaux.sentences().clone().toPositive();
//console.log(`(): $.`);
console.log(`QuestionWordWhere(): AuxNegative "${AuxNegativePhrase.text()}"`);
console.log(
`QuestionWordWhere(): AuxPositive: "${AuxPositivePhrase.text()}"`
);
console.log(`QuestionWordWhere(): AuxCompare: "${t.text()}"`);
var auxphraseresult =
AuxNegativePhrase.text().toLowerCase().includes(t.text().toLowerCase()) ||
AuxPositivePhrase.text().toLowerCase().includes(t.text().toLowerCase()) ||
t.text().toLowerCase().includes(AuxPositivePhrase.text().toLowerCase()) ||
t.text().toLowerCase().includes(AuxNegativePhrase.text().toLowerCase()) ||
phraseaux.text().toLowerCase().includes(t.text().toLowerCase()) ||
t.text().toLowerCase().includes(phraseaux.text().toLowerCase());
console.log(`QuestionWordWhere(): Phrase: "${phrase.text()}"`);
var NegativePhrase = phrase.sentences().clone().toNegative();
var PositivePhrase = phrase.sentences().clone().toPositive();
//console.log(`(): $.`);
console.log(`QuestionWordWhere(): Negative "${NegativePhrase.text()}"`);
console.log(`QuestionWordWhere(): Positive: "${PositivePhrase.text()}"`);
console.log(`QuestionWordWhere(): Compare: "${t.text()}"`);
var phraseresult =
NegativePhrase.text().toLowerCase().includes(t.text().toLowerCase()) ||
PositivePhrase.text().toLowerCase().includes(t.text().toLowerCase()) ||
t.text().toLowerCase().includes(PositivePhrase.text().toLowerCase()) ||
t.text().toLowerCase().includes(NegativePhrase.text().toLowerCase()) ||
phrase.text().toLowerCase().includes(t.text().toLowerCase()) ||
t.text().toLowerCase().includes(phrase.text().toLowerCase());
console.log(`QuestionWordWhere(): PhraseResult: ${phraseresult}`);
console.log(`QuestionWordWhere(): AuxPhraseResult: ${auxphraseresult}`);
console.log(
`QuestionWordWhere(): StartsWithNouny: ${
t.match("^(#ProperNoun|#Pronoun|#Noun)").found
}`
);
return (
t.match("^(#ProperNoun|#Pronoun|#Noun)").found &&
(phraseresult || auxphraseresult)
);
}
//IsRestatement("Where is Bombay?", "Bombay is at their house.");
//IsRestatement("How was she?", "She is fine.");
//IsRestatement("How am I?", "I am fine.");
//IsRestatement("Is Anne French?", "Anne is French.");
function IsSimple(q) {
//be: be, was, is
var match = q.match(
"^#QuestionWord? (be|was|is|am|are|were|been|being) (#Noun|#Pronoun|#ProperNoun) *"
);
return match.found;
}
function Simple(q, t) {
var result = false;
if (q.match("^#QuestionWord")) {
console.log("QuestionWord Simple()");
var qpart = q.clone();
qpart.remove("^#QuestionWord");
var vbe = qpart.match("^#Verb").clone();
qpart.remove("^#Verb");
var subject = qpart.clone();
subject.terms().last().post(" ");
var phrase = nlp(subject.text() + " " + vbe.text());
var past = phrase.clone().sentences().toPastTense();
var present = phrase.clone().sentences().toPresentTense();
var future = phrase.clone().sentences().toFutureTense();
if (subject.match("#Pronoun").found) {
var any = "#Pronoun (be|was|is|am|are|were|been|being)";
if (t.clone().match(any).found) return true;
}
/*console.error(
`stt: ${phrase.text()} ${t.text()} ${SimpleTenseTest(phrase, t)}`
);
console.error(
`stt: ${past.text()} ${t.text()} ${SimpleTenseTest(past, t)}`
);
console.error(
`stt: ${future.text()} ${t.text()} ${SimpleTenseTest(future, t)}`
);
console.error(
`stt: ${present.text()} ${t.text()} ${SimpleTenseTest(present, t)}`
);*/
result =
SimpleTenseTest(phrase, t) ||
SimpleTenseTest(past, t) ||
SimpleTenseTest(present, t) ||
SimpleTenseTest(future, t) ||
result;
}
if (!result) {
console.log("Normal Simple()");
var qpartt = q.clone();
var vbet = qpartt.match("^#Verb").clone();
qpartt.remove("^#Verb");
var subjectt = qpartt.match("^(#ProperNoun|#Pronoun|#Noun)").clone();
qpartt.remove("^(#ProperNoun|#Pronoun|#Noun)");
var remain = qpartt.clone();
remain.terms().last().post(" ");
var phraset = nlp(
subjectt.text() + " " + vbet.text() + " " + remain.text()
);
var pastt = phraset.clone().sentences().toPastTense();
var presentt = phraset.clone().sentences().toPresentTense();
var futuret = phraset.clone().sentences().toFutureTense();
/*console.error(
`stt: ${phrase.text()} ${t.text()} ${SimpleTenseTest(phrase, t)}`
);
console.error(
`stt: ${past.text()} ${t.text()} ${SimpleTenseTest(past, t)}`
);
console.error(
`stt: ${future.text()} ${t.text()} ${SimpleTenseTest(future, t)}`
);
console.error(
`stt: ${present.text()} ${t.text()} ${SimpleTenseTest(present, t)}`
);*/
return (
SimpleTenseTest(phraset, t) ||
SimpleTenseTest(pastt, t) ||
SimpleTenseTest(presentt, t) ||
SimpleTenseTest(futuret, t)
);
}
}
function SimpleTenseTest(phrase, t) {
console.log(`Simple(): Phrase: "${phrase.text()}"`);
var NegativePhrase = phrase.sentences().clone().toNegative();
var PositivePhrase = phrase.sentences().clone().toPositive();
var NegativeePhrase = phrase.clone();
NegativeePhrase.matchOne("(be|was|is|am|are|were|been|being)").append(" not");
//console.log(`(): $.`);
console.log(`Simple(): Negative: "${NegativePhrase.text()}"`);
console.log(`Simple(): Negativee: "${NegativeePhrase.text()}"`);
console.log(`Simple(): Positive: "${PositivePhrase.text()}"`);
console.log(`Simple(): Compare: "${t.text()}"`);
return (
NegativePhrase.text().toLowerCase().includes(t.text().toLowerCase()) ||
NegativeePhrase.text().toLowerCase().includes(t.text().toLowerCase()) ||
PositivePhrase.text().toLowerCase().includes(t.text().toLowerCase()) ||
t.text().toLowerCase().includes(PositivePhrase.text().toLowerCase()) ||
t.text().toLowerCase().includes(NegativePhrase.text().toLowerCase()) ||
t.text().toLowerCase().includes(NegativeePhrase.text().toLowerCase()) ||
phrase.text().toLowerCase().includes(t.text().toLowerCase()) ||
t.text().toLowerCase().includes(phrase.text().toLowerCase())
);
}
//possible ^#QuestionWord #Verb (#ProperNoun|#Pronoun|#Noun) ***TheRest***
//or ^#QuestionWord #Verb ***TheRest***
//example What is Joel doing?
//or What is that truck's model?
//leaning towards the second one
function QuestionWordWhat(q, t) {}
function QuestionWordWhich(q, t) {}
function QuestionWord(q, t) {
var qpart = q
.match(
"#QuestionWord (#Verb|Will) (#ProperNoun|#Noun|#Pronoun) (#Verb|done) *"
)
.clone();
if (!qpart.found) {
qpart = q
.match(
"#QuestionWord (#Verb|Will) .? (#ProperNoun|#Noun|#Pronoun) (#Verb|done) *"
)
.clone();
}
if (!qpart.found && IsSimple(q)) {
qpart = q.clone();
}
console.log(`QuestionWord(): Match: ${qpart.text()}`);
if (!qpart.found) return false;
var answer = false;
var QWord = qpart.match("^#QuestionWord").text().toLowerCase();
console.log(`QuestionWord(): Rerouter: ${QWord}`);
if (QWord.includes("who")) answer = QuestionWordWho(qpart, t);
else if (QWord.includes("when") || QWord.includes("why"))
answer = QuestionWordWhenWhy(qpart, t);
else if (QWord.includes("where")) answer = QuestionWordWhere(qpart, t);
else if (QWord.includes("what")) answer = QuestionWordWhat(qpart, t);
else if (QWord.includes("which")) answer = QuestionWordWhich(qpart, t);
if (/*QWord.includes("How") || QWord.includes("Where") ||*/ IsSimple(qpart))
answer = Simple(qpart, t) || answer;
if (!answer) answer = QuestionWordObject(qpart, t) || answer;
if (!answer) answer = DeIndirect(q, t) || answer;
return answer;
}
//function EvalQuestionWord() {}
//function Choice() {}
//function EvalChoice() {}
//example: You will go to the party, won't you?
//just remove tag and then TenseTest
function Tag(q, t) {
return false;
}
//https://image.slidesharecdn.com/basicstructurev2-121202115747-phpapp02/95/basic-english-structure-7-638.jpg?cb=1396347412
function QuestionWordObject(q, t) {}
//https://learnenglishwithdemi.files.wordpress.com/2015/01/indirect-questions-3-728.jpg
function DeIndirect(q, t) {
//remove introductory sentence
//call QuestionWord
}
/*//https://www.fluentu.com/blog/english/questions-in-english-grammar/#AskingNegativeQuestionsForConfirmation
function Negative() {
}
*/
//console.error(GetHint("How are you?", ""));
//console.error(GetHint("Is Anne French?", ""));
//console.error(GetHint("How can a dog jump that high?"), "");
function GetHint(q, t) {
console.log(`GetHint(): ${q}`);
var qpart = nlp(q)
.match(
"#QuestionWord (#Verb|Will) (#ProperNoun|#Noun|#Pronoun) (#Verb|done) *"
)
.clone();
if (!qpart.found) {
qpart = nlp(q)
.match(
"#QuestionWord (#Verb|Will) .? (#ProperNoun|#Noun|#Pronoun) (#Verb|done) *"
)
.clone();
}
var result = "";
var extraMessage = "";
if (qpart.found) {
qpart = nlp(q).clone();
qpart.remove("^#QuestionWord");
var verby = qpart.matchOne("^(#Verb|Will)").clone();
qpart.matchOne("^(#Verb|Will)").remove();
var prenoun = qpart.matchOne(".? (#ProperNoun|#Noun|#Pronoun)").clone();
qpart.matchOne(".? (#ProperNoun|#Noun|#Pronoun)").remove();
var remain = qpart.clone();
remain.terms().last().post(" ");
result = `${prenoun.text() + " " + verby.text() + " " + remain.text()}`;
extraMessage = ` This is a wh- question. Sometimes the hinter may not work. If you get total nonsense, try this: