universal_bot
Version:
Taking the principles of aiml - but allowing a dynamic and extendable *.js environment
513 lines (389 loc) • 14.5 kB
JavaScript
var meta = require('debug')('tagger');
var SpeechactTagger = function(parent, phrase) {
var self = this;
this.pronouns = parent.pronouns;
this.questions = parent.questions
this.auxiliary = parent.auxiliary;
this.conjunctions = parent.conjunctions;
this.reflexive_pronouns = parent.reflexive_pronouns;
this.articles = parent.articles;
this.prepositions = parent.prepositions;
this.adjectives = parent.adjectives;
this.verbs = parent.verbs;
this.possessive = parent.possessive;
this.nouns = parent.nouns;
this.relative_pronoun = parent.relative_pronoun;
this.aclause = parent.aclause;
this.demonstrative = parent.demonstrative;
this.splitted = parent.splitted;
self.sequence = parent.sequence;
self.act = parent.act;
this.check_reflexive_pronoun_item = function( item ) {
for (var n = 0; n < self.reflexive_pronouns.length; n++) {
var p = self.reflexive_pronouns[n];
if (p.word === item) return p;
}
}
this.check_reflexive_pronoun = function() {
var words = self.splitted;
for (var i = 0; i < words.length; i++) {
var x = self.check_reflexive_pronoun_item( words[i] );
if (x) {
meta(" REFLEXIV " );
if (! self.act.reflexive_pronoun) self.act.reflexive_pronoun = [];
self.act.reflexive_pronoun.push(x);
self.sequence[i].type = "reflexive_pronoun";
self.sequence[i].reflexive_pronoun = x;
}
}
}
this.check_pronoun_item = function(item) {
for (var n = 0; n < self.pronouns.length; n++) {
var p = self.pronouns[n];
if (p.word === item) return p;
}
}
this.check_pronoun = function() {
meta("Suche nach dem Subjekt");
var words = self.splitted;
for (var i = 0; i < words.length; i++) {
var x = self.check_pronoun_item( words[i] );
if (x) {
if (! self.act.pronoun) self.act.pronoun = [];
self.act.pronoun.push(x);
self.sequence[i].type = "pronoun";
self.sequence[i].pronoun = x;
}
}
}
this.check_auxiliary_item = function(item) {
for (var n = 0; n < self.auxiliary.length; n++) {
var p = self.auxiliary[n];
if (p.word === item) return p;
}
}
this.check_auxiliary = function () {
meta("Suche nach Hilfsverben");
var words = self.splitted;
for (var i = 0; i < words.length; i++) {
var x = self.check_auxiliary_item( words[i] );
if (x) {
if (! self.act.aux) self.act.aux = [];
self.act.aux.push(x);
self.act.auxiliary = x;
self.sequence[i].type = "auxiliary";
}
}
}
this.check_item = function(item, type) {
meta(item);
var list;
switch(type) {
case "adjective":
list = self.adjectives;
break;
case "preposition":
list = self.prepositions;
break;
case "noun":
list = self.nouns;
break;
case "relative_pronoun":
list = self.relative_pronoun;
break;
case "possessive":
list = self.possessive;
break;
case "verb":
list = self.verbs;
break;
case "demonstrative":
list = self.demonstrative;
break;
default:
list = [];
debugr("Liste ist falsch definiert " + type )
break;
}
for (var n = 0; n < list.length; n++) {
var p = list[n];
if (p.word === item) return p;
}
}
this.check_adverbs = function() {
var words = self.splitted;
for (var i = 0; i < words.length; i++) {
var l = words[i].length;
var v = words[i];
if (v.length > 3) {
var ending = v.substring(l-2, l);
if (ending == "ly") {
var adj = v.substring(0, l-2);
var nd = v.substring(l-3, l);
if (nd === "bly") var adj = v.substring(0, l-1) + "e";
meta("Das könnte ein Adverb sein " + adj);
var x = self.check_item( adj, "adjective" );
if (x) {
self.sequence[i].type = "adverb";
x.word = v;
self.sequence[i].adverb = x;
self.sequence[i].adverb.adjective = adj;
}
}
}
}
}
this.check_nouns = function() {
meta("sollte Nouns suchen");
var words = self.splitted;
for (var i = 0; i < words.length; i++) {
var x = self.check_item( words[i], "noun" );
if (x) {
meta("Noun gefunden");
self.sequence[i].type = "noun";
self.sequence[i].noun = x;
self.sequence[i].subject = null;
self.sequence[i].object = null;
self.sequence[i].genitive = null;
self.sequence[i].prepositional_object = null;
} else {
var w = words[i];
if (w[w.length-1] === 's') {
var short = w.slice(0, w.length-1);
meta ( short );
var test = new RegExp(/ies\b/);
var ndx = w.search(test);
if (ndx !== -1) meta("PLURAL MIT IES " + ndx);
short = w.slice(0, ndx) + "y";
meta ( short );
var x = self.check_item( short, "noun" );
if (x) {
meta (" Eine Plural-Form" );
self.sequence[i].type = "noun";
self.sequence[i].noun = x;
self.sequence[i].subject = null;
self.sequence[i].object = null;
self.sequence[i].genitive = null;
self.sequence[i].prepositional_object = null;
self.sequence[i].numerus = "plural";
}
}
}
}
}
this.check_demonstrative = function() {
meta("sollte Demonstrtiva suchen");
var words = self.splitted;
for (var i = 0; i < words.length; i++) {
var x = self.check_item( words[i], "demonstrative" );
if (x) {
meta("Demostrativ gefunden");
self.sequence[i].type = "demonstrative";
self.sequence[i].demonstrative = x;
}
}
}
this.check_verb_item = function( item ) {
list = self.verbs;
for (var n = 0; n < list.length; n++) {
var p = list[n];
if (Array.isArray(p.word)) {
for (var k = 0; k < p.word.length; k++) {
var w = p.word[k];
if (w === item) {
var form = "";
switch(k) {
case 0:
form = "infinitive";
break;
case 1:
if (p.word[1] === p.word[2] ) form = "past or participle";
else form = "past";
break;
case 2:
if (p.word[1] === p.word[2] ) form = "past or participle";
else form = "participle";
break;
case 3:
form = "3rd person present";
break;
case 4:
form = "gerund";
break;
}
var res = {
word: w,
stem: p.word[0],
form: form
}
return res;
}
}
}
else if (p.word === item) return p;
}
}
this.check_verbs = function() {
meta ("sollte Verben suchen");
var words = self.splitted;
for (var i = 0; i < words.length; i++) {
// var x = self.check_item( words[i], "verb" );
var x = self.check_verb_item( words[i], "verb" );
if (x) {
meta("Verb gefunden");
self.sequence[i].type = "verb";
self.sequence[i].verb = x;
}
}
}
this.check_relative_pronouns = function() {
var words = self.splitted;
for (var i = 0; i < words.length; i++) {
var x = self.check_item( words[i], "relative_pronoun" );
if (x) {
meta ("Relativ-Pronomen gefunden");
self.sequence[i].type = "relative_pronoun";
self.sequence[i].relative_pronoun = x;
self.sequence[i].relative_pronoun.position = i;
if (! self.act.relative_pronouns) self.act.relative_pronouns = [];
self.act.relative_pronouns.push( self.sequence[i].relative_pronoun );
}
}
}
this.check_possessive = function() {
meta ("sollte die Possiva checken");
var words = self.splitted;
for (var i = 0; i < words.length; i++) {
var x = self.check_item( words[i], "possessive" );
if (x) {
meta("PossessivDeterminer gefunden");
self.sequence[i].type = "possessive";
self.sequence[i].possessive = x;
}
}
}
this.check_addjectives = function() {
meta("sollte Adjektive suchen");
var words = self.splitted;
for (var i = 0; i < words.length; i++) {
var x = self.check_item( words[i], "adjective" );
if (x) {
meta("Adjektiv gefunden");
self.sequence[i].type = "adjective";
self.sequence[i].adjective = x;
}
}
}
this.check_prepositions = function() {
meta("sollte die Präpositionen suchen");
var words = self.splitted;
for (var i = 0; i < words.length; i++) {
var x = self.check_item( words[i], "preposition" );
if (x) {
meta("Präposition gefunden");
self.sequence[i].type = "preposition";
self.sequence[i].preposition = x;
}
}
}
this.check_negation = function() {
meta("sollte die Präpositionen suchen");
var words = self.splitted;
for (var i = 0; i < words.length; i++) {
if (words[i] === "not")
{
meta ("Verneinung");
self.sequence[i].type = "negation";
self.sequence[i].negation = "not";
}
}
}
this.check_article_item = function(item) {
for (var n = 0; n < self.articles.length; n++) {
var p = self.articles[n];
if (p.word === item) return p;
}
}
this.check_articles = function() {
meta("Suche nach Artikeln");
var words = self.splitted;
for (var i = 0; i < words.length; i++) {
var x = self.check_article_item( words[i] );
if (x) {
self.sequence[i].type = "article";
self.sequence[i].article = x;
}
}
}
this.check_conjunction_item = function( item ) {
for (var n = 0; n < self.conjunctions.length; n++) {
var p = self.conjunctions[n];
if (p.word === item) return p;
}
}
this.check_conjunctions = function() {
meta("Suche nach Konkunktionen");
var words = self.splitted;
for (var i = 0; i < words.length; i++) {
var x = self.check_conjunction_item( words[i] );
if (x) {
meta("Konjunktion gefunden");
self.act.conjunction = x;
self.sequence[i].type = "conjunction";
}
}
}
this.check_question_word = function(item) {
var word = item.toLowerCase();
meta("Check der Frage");
for (var i = 0; i < self.questions.length; i++) {
if (word === self.questions[i].word)
{
return self.questions[i];
}
}
return null;
}
this.check_question = function(phrase) {
var words = phrase.split(' ');
var x = self.check_question_word( words[0]);
if (x) {
meta("Offendkundig eine Frage");
self.act.type = "question",
self.act.probability = 1;
self.sequence[0].type = "question_particle";
}
else {
meta("Die anderen Wörter");
for (var n = 1; n < words.length; n++) {
meta( words[n]);
var x = self.check_question_word( words[n]);
if (x) {
self.act.type = "question",
self.act.probability = 0.7;
self.sequence[n].type = "question_particle";
}
}
}
meta(self.act);
}
this.process = function() {
self.check_verbs();
self.check_prepositions();
self.check_nouns();
self.check_addjectives();
self.check_demonstrative();
self.check_reflexive_pronoun();
self.check_articles();
self.check_conjunctions();
self.check_auxiliary();
self.check_question(phrase);
self.check_pronoun();
self.check_possessive();
self.check_adverbs();
self.check_negation();
self.check_relative_pronouns();
}
self.process();
}
module.exports = SpeechactTagger;