public function ordenarSlotES($subjmasc, $subjpl) { $nucli = $this->paraulafinal; $elementaux = array(); if ($nucli != null) { switch ($nucli->tipus) { case "name": $numeros = array(); $quantifieradj = array(); // stores the quantifiers that complement the adj instead of the nucleus $hasquantifieradj = false; $hasnumorquant = false; $haspossessive = 0; // al nostre sistema només els nuclis poden tenir possessius // també l'activarem si té ordinals o altres elements que van // entre l'article i el nom // calculem els valors per la concordància general $masc = true; $plural = false; // si el nom és femení if ($nucli->propietats->mf == "fem") { $masc = false; } // si el nom és plural if ($nucli->propietats->singpl == "pl") { $plural = true; } // si té modificadors de femení i l'accepta if ($nucli->propietats->femeni != "NULL" && $nucli->fem) { $masc = false; } // si té modificador de plural if ($nucli->plural) { $plural = true; } // PREPOSICIÓ // posem la preposició, si n'hi ha, excepte si el nom és el nucli d'un slot de LocAt i // el complementa un adverbi de lloc. Per evitar ex: "Está en debajo la mesa." if ($this->prep != null) { if (!($this->category == "LocAt" && $this->CAdvassigned && $this->cmpAdvs[$this->CAdvassignedkey]->paraulafinal->isClass("lloc"))) { $elementaux[0] = $this->prep; $elementaux[1] = null; $this->slotstring[] = $elementaux; } } // Posem, si cal, la preposició "en" o "por", davant dels slots de temps if ($this->category == "Time") { $CI =& get_instance(); $CI->load->library('Mymatching'); $matching = new Mymatching(); if ($matching->isTimePrepES($nucli->text)) { $elementaux[0] = $matching->tempsPrepES[$nucli->text]; $elementaux[1] = null; $this->slotstring[] = $elementaux; } } // QUANTIFICADOR O POSSESSIUS // si el nom té un modificador, que només pot ser un quantificador o possessiu if ($this->CModassigned) { for ($i = 0; $i < count($this->CModassignedkey); $i++) { $quantifierslot = $this->cmpMod[$this->CModassignedkey[$i]]; // si és un número if ($quantifierslot->paraulafinal->isClass("numero")) { $numeros[] = $quantifierslot; // si és un número diferent d'1, tot passarà a ser plural if ($quantifierslot->paraulafinal->text != "un") { $plural = true; } } else { // si el nucli també té un adjectiu assignat, mirem si va millor amb l'adjectiu if ($this->CAdjassigned) { // si és quantifier i anava just davant de l'adjectiu, el guardem per després if ($quantifierslot->paraulafinal->inputorder - $this->cmpAdjs[$this->CAdjassignedkey]->paraulafinal->inputorder == -1 && $quantifierslot->paraulafinal->isClass("quant")) { $quantifieradj[] = $quantifierslot; $hasquantifieradj = true; } else { if ($masc && !$plural) { $elementaux[0] = $quantifierslot->paraulafinal->propietats->masc; } else { if ($masc && $plural) { $elementaux[0] = $quantifierslot->paraulafinal->propietats->mascpl; } else { if (!$masc && !$plural) { $elementaux[0] = $quantifierslot->paraulafinal->propietats->fem; } else { $elementaux[0] = $quantifierslot->paraulafinal->propietats->fempl; } } } $elementaux[1] = $quantifierslot->paraulafinal; $this->slotstring[] = $elementaux; $hasnumorquant = true; if (strpos($quantifierslot->paraulafinal->classes[0], "pos") === 0) { $haspossessive++; $hasnumorquant = false; } } } else { if ($masc && !$plural) { $elementaux[0] = $quantifierslot->paraulafinal->propietats->masc; } else { if ($masc && $plural) { $elementaux[0] = $quantifierslot->paraulafinal->propietats->mascpl; } else { if (!$masc && !$plural) { $elementaux[0] = $quantifierslot->paraulafinal->propietats->fem; } else { $elementaux[0] = $quantifierslot->paraulafinal->propietats->fempl; } } } $elementaux[1] = $quantifierslot->paraulafinal; $this->slotstring[] = $elementaux; $hasnumorquant = true; if (strpos($quantifierslot->paraulafinal->classes[0], "pos") === 0) { $haspossessive++; $hasnumorquant = false; } } } } } // ADVERBI DE LLOC if ($this->CAdvassigned) { $adverbistring = $this->cmpAdvs[$this->CAdvassignedkey]->paraulafinal; // dividir-lo en cada una de les paraules que formen l'adverbi $auxstring = explode(" ", $adverbistring->text); // afegir cada paraula en ordre a slotstring for ($i = 0; $i < count($auxstring); $i++) { $elementaux[0] = $auxstring[$i]; $elementaux[1] = $adverbistring; $this->slotstring[] = $elementaux; } } // NUMEROS for ($i = 0; $i < count($numeros); $i++) { if ($masc) { $elementaux[0] = $numeros[$i]->paraulafinal->propietats->masc; } else { $elementaux[0] = $numeros[$i]->paraulafinal->propietats->fem; } $elementaux[1] = $numeros[$i]->paraulafinal; $this->slotstring[] = $elementaux; $hasnumorquant = true; } // ORDINALS if ($this->CAdjassigned) { $adjectiu = $this->cmpAdjs[$this->CAdjassignedkey]->paraulafinal; if ($adjectiu->isClass("ordinal")) { if ($masc && !$plural) { // excepció per ex: El primer coche llega tarde. if ($adjectiu->propietats->masc == "primero") { $elementaux[0] = "primer"; } else { $elementaux[0] = $adjectiu->propietats->masc; } } else { if ($masc && $plural) { $elementaux[0] = $adjectiu->propietats->mascpl; } else { if (!$masc && !$plural) { $elementaux[0] = $adjectiu->propietats->fem; } else { $elementaux[0] = $adjectiu->propietats->fempl; } } } $elementaux[1] = $adjectiu; $this->slotstring[] = $elementaux; $haspossessive++; $this->CAdjassigned = false; // indiquem que ja s'ha vist l'adjectiu } } // NOM + COORDINACIÓ if ($plural) { if ($nucli->propietats->mf != "fem" && !$masc) { $elementaux[0] = $nucli->propietats->fempl; } else { $elementaux[0] = $nucli->propietats->plural; } } else { if ($masc && !$plural) { $elementaux[0] = $nucli->propietats->nomtext; } else { if ($nucli->propietats->mf == "fem") { $elementaux[0] = $nucli->propietats->nomtext; } else { $elementaux[0] = $nucli->propietats->femeni; } } } $elementaux[1] = $nucli; // com que el nucli és un nom, afegim la informació extra $elementaux[2] = true; $elementaux[3] = $masc; $elementaux[4] = $plural; $elementaux[5] = $hasnumorquant; $elementaux[6] = false; $elementaux[7] = $haspossessive; $this->slotstring[] = $elementaux; // si té element coordinat if ($nucli->paraulacoord != null) { $paraulacoord = $nucli->paraulacoord; // afegim la "i" $elementaux[0] = "y"; $elementaux[1] = null; $this->slotstring[] = $elementaux; // afegim la paraula coordinada, el plural es passa, però el femení // s'ha de mirar si la paraula ho era o no el tenia el modificador $masccoord = true; $pluralcoord = $plural; if ($paraulacoord->propietats->mf == "fem" || $paraulacoord->fem) { $masccoord = false; } // el plural només pot canviar si plural era false i la paraulacoord sempre és plural // que aleshores ha de passar a true o si volíem que la paraulacoord fos plural if ($paraulacoord->propietats->singpl == "pl" || $paraulacoord->plural) { $plural = true; } if ($pluralcoord) { $elementaux[0] = $paraulacoord->propietats->plural; } else { if ($masccoord && !$pluralcoord) { $elementaux[0] = $paraulacoord->propietats->nomtext; } else { if ($paraulacoord->propietats->mf == "fem") { $elementaux[0] = $paraulacoord->propietats->nomtext; } else { $elementaux[0] = $paraulacoord->propietats->femeni; } } } $elementaux[1] = $paraulacoord; // com que la paraula coordinada ha de ser un nom, afegim la info extra $elementaux[2] = true; $elementaux[3] = $masccoord; $elementaux[4] = $pluralcoord; $elementaux[5] = $hasnumorquant; $elementaux[6] = false; $elementaux[7] = $haspossessive; $this->slotstring[] = $elementaux; } // ADJECTIUS I COMPLEMENTS DE NOM // si té un adjectiu i no un complement de nom if ($this->CAdjassigned && !$this->NCassigned) { // si l'adjectiu tenia un quantificador l'afegim if ($hasquantifieradj) { for ($i = 0; $i < count($quantifieradj); $i++) { // aquí els quantificadors tenen forma invariable // excepte "mucho" que pasa a ser "muy" if ($quantifieradj[$i]->paraulafinal->propietats->masc == "mucho") { $elementaux[0] = "muy"; } else { $elementaux[0] = $quantifieradj[$i]->paraulafinal->propietats->masc; } $elementaux[1] = $quantifieradj[$i]->paraulafinal; $this->slotstring[] = $elementaux; } } // tant si tenia quantificador com si no, posem l'adjectiu $adjectiu = $this->cmpAdjs[$this->CAdjassignedkey]->paraulafinal; if ($masc && !$plural) { $elementaux[0] = $adjectiu->propietats->masc; } else { if ($masc && $plural) { $elementaux[0] = $adjectiu->propietats->mascpl; } else { if (!$masc && !$plural) { $elementaux[0] = $adjectiu->propietats->fem; } else { $elementaux[0] = $adjectiu->propietats->fempl; } } } $elementaux[1] = $adjectiu; $this->slotstring[] = $elementaux; // si té element adjectiu coordinat if ($adjectiu->paraulacoord != null) { $paraulacoord = $adjectiu->paraulacoord; // afegim la "i" $elementaux[0] = "y"; $elementaux[1] = null; $this->slotstring[] = $elementaux; // afegim la paraula coordinada amb la mateixa concordància if ($masc && !$plural) { $elementaux[0] = $paraulacoord->propietats->masc; } else { if ($masc && $plural) { $elementaux[0] = $paraulacoord->propietats->mascpl; } else { if (!$masc && !$plural) { $elementaux[0] = $paraulacoord->propietats->fem; } else { $elementaux[0] = $paraulacoord->propietats->fempl; } } } $elementaux[1] = $paraulacoord; $this->slotstring[] = $elementaux; } } else { if ($this->NCassigned && !$this->CAdjassigned) { $nouncmpslot = $this->complements[$this->NCassignedkey]; $nouncmp = $nouncmpslot->paraulafinal; // afegim la preposició "de" $elementaux[0] = $nouncmpslot->prep; $elementaux[1] = null; $this->slotstring[] = $elementaux; // afegim el nom $masccmp = true; $pluralcmp = false; // si el nom és femení if ($nouncmp->propietats->mf == "fem") { $masccmp = false; } // si el nom és plural if ($nouncmp->propietats->singpl == "pl") { $pluralcmp = true; } // si té modificadors de femení i l'accepta if ($nouncmp->propietats->femeni != "NULL" && $nouncmp->fem) { $masccmp = false; } // si té modificador de plural if ($nouncmp->plural) { $pluralcmp = true; } if ($pluralcmp) { $elementaux[0] = $nouncmp->propietats->plural; } else { if ($masccmp && !$pluralcmp) { $elementaux[0] = $nouncmp->propietats->nomtext; } else { if ($nouncmp->propietats->mf == "fem") { $elementaux[0] = $nouncmp->propietats->nomtext; } else { $elementaux[0] = $nouncmp->propietats->femeni; } } } $elementaux[1] = $nouncmp; // com que el nucli és un nom, afegim la informació extra $elementaux[2] = true; $elementaux[3] = $masccmp; $elementaux[4] = $pluralcmp; $elementaux[5] = false; $elementaux[6] = true; $elementaux[7] = $haspossessive; $this->slotstring[] = $elementaux; // si té element coordinat if ($nouncmp->paraulacoord != null) { $paraulacoord = $nouncmp->paraulacoord; // afegim la "i" $elementaux[0] = "y"; $elementaux[1] = null; $this->slotstring[] = $elementaux; // afegim la paraula coordinada amb la seva concordància $masccmp = true; $pluralcmp = false; // si el nom és femení if ($paraulacoord->propietats->mf == "fem") { $masccmp = false; } // si el nom és plural if ($paraulacoord->propietats->singpl == "pl") { $pluralcmp = true; } // si té modificadors de femení i l'accepta if ($paraulacoord->propietats->femeni != "NULL" && $paraulacoord->fem) { $masccmp = false; } // si té modificador de plural if ($paraulacoord->plural) { $pluralcmp = true; } if ($pluralcmp) { $elementaux[0] = $paraulacoord->propietats->plural; } else { if ($masccmp && !$pluralcmp) { $elementaux[0] = $paraulacoord->propietats->nomtext; } else { if ($paraulacoord->propietats->mf == "fem") { $elementaux[0] = $paraulacoord->propietats->nomtext; } else { $elementaux[0] = $paraulacoord->propietats->femeni; } } } $elementaux[1] = $paraulacoord; // com que el nucli és un nom, afegim la informació extra $elementaux[2] = true; $elementaux[3] = $masccmp; $elementaux[4] = $pluralcmp; $elementaux[5] = false; $elementaux[6] = true; $elementaux[7] = $haspossessive; $this->slotstring[] = $elementaux; } } else { if ($this->NCassigned && $this->CAdjassigned) { $nouncmpslot = $this->complements[$this->NCassignedkey]; $adjectiuslot = $this->cmpAdjs[$this->CAdjassignedkey]; $puntsFitAdjWithNucli = $adjectiuslot->puntsfinal; // calculem els punts que tindria fent fit al complement $CI =& get_instance(); $CI->load->library('Mymatching'); $matching = new Mymatching(); $classeadj = $adjectiuslot->paraulafinal->classes[$adjectiuslot->indexclassfinalword]; $numclassesnomcmp = count($nouncmpslot->paraulafinal->classes); $puntsFitAdjWithCMP = 1000; for ($j = 0; $j < $numclassesnomcmp; $j++) { $classenomaux = $nouncmpslot->paraulafinal->classes[$j]; if ($matching->isSetKeyAdjNoun($classeadj) && $matching->isSetKeyNoun($classenomaux)) { $tipusx = $matching->adjNounFitKeys[$classeadj]; $tipusy = $matching->nounsFitKeys[$classenomaux]; if ($matching->adjNounFit[$tipusx][$tipusy] < $puntsFitAdjWithCMP) { $puntsFitAdjWithCMP = $matching->adjNounFit[$tipusx][$tipusy]; } } } // nom - adjectiu $distance = $nouncmpslot->paraulafinal->inputorder - $adjectiuslot->paraulafinal->inputorder; // com més lluny i com menys fit facin, pitjor $puntsFitAdjWithCMP = 7 - $puntsFitAdjWithCMP - abs($distance); if ($distance == -1) { $puntsFitAdjWithCMP += 1; } // si fa millor fit al NUCLI if ($puntsFitAdjWithNucli >= $puntsFitAdjWithCMP) { // insertem primer l'adjectiu // si l'adjectiu tenia un quantificador l'afegim if ($hasquantifieradj) { for ($i = 0; $i < count($quantifieradj); $i++) { // aquí els quantificadors tenen forma invariable // excepte "mucho" que pasa a ser "muy" if ($quantifieradj[$i]->paraulafinal->propietats->masc == "mucho") { $elementaux[0] = "muy"; } else { $elementaux[0] = $quantifieradj[$i]->paraulafinal->propietats->masc; } $elementaux[1] = $quantifieradj[$i]->paraulafinal; $this->slotstring[] = $elementaux; } } // tant si tenia quantificador com si no, posem l'adjectiu $adjectiu = $adjectiuslot->paraulafinal; if ($masc && !$plural) { $elementaux[0] = $adjectiu->propietats->masc; } else { if ($masc && $plural) { $elementaux[0] = $adjectiu->propietats->mascpl; } else { if (!$masc && !$plural) { $elementaux[0] = $adjectiu->propietats->fem; } else { $elementaux[0] = $adjectiu->propietats->fempl; } } } $elementaux[1] = $adjectiu; $this->slotstring[] = $elementaux; // si té element adjectiu coordinat l'afegim if ($adjectiu->paraulacoord != null) { $paraulacoord = $adjectiu->paraulacoord; // afegim la "i" $elementaux[0] = "i"; $elementaux[1] = null; $this->slotstring[] = $elementaux; // afegim la paraula coordinada amb la mateixa concordància if ($masc && !$plural) { $elementaux[0] = $paraulacoord->propietats->masc; } else { if ($masc && $plural) { $elementaux[0] = $paraulacoord->propietats->mascpl; } else { if (!$masc && !$plural) { $elementaux[0] = $paraulacoord->propietats->fem; } else { $elementaux[0] = $paraulacoord->propietats->fempl; } } } $elementaux[1] = $paraulacoord; $this->slotstring[] = $elementaux; } // després insertem el nom que fa de complement $nouncmp = $nouncmpslot->paraulafinal; // afegim la preposició "de" $elementaux[0] = $nouncmpslot->prep; $elementaux[1] = null; $this->slotstring[] = $elementaux; // afegim el nom $masccmp = true; $pluralcmp = false; // si el nom és femení if ($nouncmp->propietats->mf == "fem") { $masccmp = false; } // si el nom és plural if ($nouncmp->propietats->singpl == "pl") { $pluralcmp = true; } // si té modificadors de femení i l'accepta if ($nouncmp->propietats->femeni != "NULL" && $nucli->fem) { $masccmp = false; } // si té modificador de plural if ($nouncmp->plural) { $pluralcmp = true; } if ($pluralcmp) { $elementaux[0] = $nouncmp->propietats->plural; } else { if ($masccmp && !$pluralcmp) { $elementaux[0] = $nouncmp->propietats->nomtext; } else { if ($nouncmp->propietats->mf == "fem") { $elementaux[0] = $nouncmp->propietats->nomtext; } else { $elementaux[0] = $nouncmp->propietats->femeni; } } } $elementaux[1] = $nouncmp; // com que el nucli és un nom, afegim la informació extra $elementaux[2] = true; $elementaux[3] = $masccmp; $elementaux[4] = $pluralcmp; $elementaux[5] = false; $elementaux[6] = true; $elementaux[7] = $haspossessive; $this->slotstring[] = $elementaux; // si té element coordinat if ($nouncmp->paraulacoord != null) { $paraulacoord = $nouncmp->paraulacoord; // afegim la "i" $elementaux[0] = "y"; $elementaux[1] = null; $this->slotstring[] = $elementaux; // afegim la paraula coordinada amb la seva concordància $masccmp = true; $pluralcmp = false; // si el nom és femení if ($paraulacoord->propietats->mf == "fem") { $masccmp = false; } // si el nom és plural if ($paraulacoord->propietats->singpl == "pl") { $pluralcmp = true; } // si té modificadors de femení i l'accepta if ($paraulacoord->propietats->femeni != "NULL" && $paraulacoord->fem) { $masccmp = false; } // si té modificador de plural if ($paraulacoord->plural) { $pluralcmp = true; } if ($pluralcmp) { $elementaux[0] = $paraulacoord->propietats->plural; } else { if ($masccmp && !$pluralcmp) { $elementaux[0] = $paraulacoord->propietats->nomtext; } else { if ($paraulacoord->propietats->mf == "fem") { $elementaux[0] = $paraulacoord->propietats->nomtext; } else { $elementaux[0] = $paraulacoord->propietats->femeni; } } } $elementaux[1] = $paraulacoord; // com que el nucli és un nom, afegim la informació extra $elementaux[2] = true; $elementaux[3] = $masccmp; $elementaux[4] = $pluralcmp; $elementaux[5] = false; $elementaux[6] = true; $elementaux[7] = $haspossessive; $this->slotstring[] = $elementaux; } } else { // primer insertem el nom que fa de complement $nouncmp = $nouncmpslot->paraulafinal; // afegim la preposició "de" $elementaux[0] = $nouncmpslot->prep; $elementaux[1] = null; $this->slotstring[] = $elementaux; // afegim el nom $masccmp = true; $pluralcmp = false; // si el nom és femení if ($nouncmp->propietats->mf == "fem") { $masccmp = false; } // si el nom és plural if ($nouncmp->propietats->singpl == "pl") { $pluralcmp = true; } // si té modificadors de femení i l'accepta if ($nouncmp->propietats->femeni != "NULL" && $nucli->fem) { $masccmp = false; } // si té modificador de plural if ($nouncmp->plural) { $pluralcmp = true; } if ($pluralcmp) { $elementaux[0] = $nouncmp->propietats->plural; } else { if ($masccmp && !$pluralcmp) { $elementaux[0] = $nouncmp->propietats->nomtext; } else { if ($nouncmp->propietats->mf == "fem") { $elementaux[0] = $nouncmp->propietats->nomtext; } else { $elementaux[0] = $nouncmp->propietats->femeni; } } } $elementaux[1] = $nouncmp; // com que el nucli és un nom, afegim la informació extra $elementaux[2] = true; $elementaux[3] = $masccmp; $elementaux[4] = $pluralcmp; $elementaux[5] = false; $elementaux[6] = true; $elementaux[7] = $haspossessive; $this->slotstring[] = $elementaux; // si té element coordinat if ($nouncmp->paraulacoord != null) { $paraulacoord = $nouncmp->paraulacoord; // afegim la "i" $elementaux[0] = "y"; $elementaux[1] = null; $this->slotstring[] = $elementaux; // afegim la paraula coordinada amb la seva concordància $masccmp = true; $pluralcmp = false; // si el nom és femení if ($paraulacoord->propietats->mf == "fem") { $masccmp = false; } // si el nom és plural if ($paraulacoord->propietats->singpl == "pl") { $pluralcmp = true; } // si té modificadors de femení i l'accepta if ($paraulacoord->propietats->femeni != "NULL" && $paraulacoord->fem) { $masccmp = false; } // si té modificador de plural if ($paraulacoord->plural) { $pluralcmp = true; } if ($pluralcmp) { $elementaux[0] = $paraulacoord->propietats->plural; } else { if ($masccmp && !$pluralcmp) { $elementaux[0] = $paraulacoord->propietats->nomtext; } else { if ($paraulacoord->propietats->mf == "fem") { $elementaux[0] = $paraulacoord->propietats->nomtext; } else { $elementaux[0] = $paraulacoord->propietats->femeni; } } } $elementaux[1] = $paraulacoord; // com que el nucli és un nom, afegim la informació extra $elementaux[2] = true; $elementaux[3] = $masccmp; $elementaux[4] = $pluralcmp; $elementaux[5] = false; $elementaux[6] = true; $elementaux[7] = $haspossessive; $this->slotstring[] = $elementaux; } // després afegim l'adjectiu // si l'adjectiu tenia un quantificador l'afegim if ($hasquantifieradj) { for ($i = 0; $i < count($quantifieradj); $i++) { // aquí els quantificadors tenen forma invariable // excepte "mucho" que pasa a ser "muy" if ($quantifieradj[$i]->paraulafinal->propietats->masc == "mucho") { $elementaux[0] = "muy"; } else { $elementaux[0] = $quantifieradj[$i]->paraulafinal->propietats->masc; } $elementaux[1] = $quantifieradj[$i]->paraulafinal; $this->slotstring[] = $elementaux; } } // tant si tenia quantificador com si no, posem l'adjectiu que concorda amb el complement $adjectiu = $adjectiuslot->paraulafinal; if ($masccmp && !$pluralcmp) { $elementaux[0] = $adjectiu->propietats->masc; } else { if ($masccmp && $pluralcmp) { $elementaux[0] = $adjectiu->propietats->mascpl; } else { if (!$masccmp && !$pluralcmp) { $elementaux[0] = $adjectiu->propietats->fem; } else { $elementaux[0] = $adjectiu->propietats->fempl; } } } $elementaux[1] = $adjectiu; $this->slotstring[] = $elementaux; // si té element adjectiu coordinat l'afegim if ($adjectiu->paraulacoord != null) { $paraulacoord = $adjectiu->paraulacoord; // afegim la "i" $elementaux[0] = "y"; $elementaux[1] = null; $this->slotstring[] = $elementaux; // afegim la paraula coordinada amb la mateixa concordància if ($masccmp && !$pluralcmp) { $elementaux[0] = $paraulacoord->propietats->masc; } else { if ($masccmp && $pluralcmp) { $elementaux[0] = $paraulacoord->propietats->mascpl; } else { if (!$masccmp && !$pluralcmp) { $elementaux[0] = $paraulacoord->propietats->fem; } else { $elementaux[0] = $paraulacoord->propietats->fempl; } } } $elementaux[1] = $paraulacoord; $this->slotstring[] = $elementaux; } } } } } // Fi si té complement de nom i adjectiu break; case "adj": // PREPOSICIÓ // posem la preposició, si n'hi ha if ($this->prep != null) { $elementaux[0] = $this->prep; $elementaux[1] = null; $this->slotstring[] = $elementaux; } // QUANTIFICADOR // si l'adjectiu té un modificador, que només pot ser un quantificador if ($this->CModassigned) { for ($i = 0; $i < count($this->CModassignedkey); $i++) { $quantifierslot = $this->cmpMod[$this->CModassignedkey[$i]]; // el quantificador és invariable // excepte "mucho" que pasa a ser "muy" if ($quantifierslot->paraulafinal->propietats->masc == "mucho") { $elementaux[0] = "muy"; } else { $elementaux[0] = $quantifierslot->paraulafinal->propietats->masc; } $elementaux[1] = $quantifierslot->paraulafinal; $this->slotstring[] = $elementaux; } } // POSEM L'ADJECTIU, HA DE CONCORDAR AMB EL SUBJECTE, ja que l'adjectiu // només té slots per fer de nucli en verbs copulatius o verbless patterns // tenint en compte els modificadors de subjecte // si estan definits, tenen preferència els modificadors de l'adjectiu // Si és d'un slot de MANNER no ha de concordar // si és de manera posem l'adjectiu en masculí if ($this->category == "Manner") { $elementaux[0] = $nucli->text; $elementaux[1] = $nucli; $elementaux[2] = false; $this->slotstring[] = $elementaux; // si té element adjectiu coordinat if ($nucli->paraulacoord != null) { $paraulacoord = $nucli->paraulacoord; // afegim la "i" $elementaux[0] = "y"; $elementaux[1] = null; $this->slotstring[] = $elementaux; // afegim la paraula coordinada amb la mateixa concordància $elementaux[0] = $paraulacoord->text; $elementaux[1] = $paraulacoord; $this->slotstring[] = $elementaux; } } else { // posem l'adjectiu que concordi if (!$subjmasc && $subjpl) { $elementaux[0] = $nucli->propietats->fempl; } else { if (!$subjmasc && !$subjpl) { $elementaux[0] = $nucli->propietats->fem; } else { if ($subjmasc && $subjpl) { $elementaux[0] = $nucli->propietats->mascpl; } else { $elementaux[0] = $nucli->propietats->masc; } } } // sobreescrivim si l'adjectiu tenia modificadors activats // ho fem perquè si és verbless no té subjecte if ($nucli->fem && $nucli->plural) { $elementaux[0] = $nucli->propietats->fempl; } else { if ($nucli->fem) { $elementaux[0] = $nucli->propietats->fem; } else { if ($nucli->plural) { $elementaux[0] = $nucli->propietats->mascpl; } } } $elementaux[1] = $nucli; $elementaux[2] = false; $this->slotstring[] = $elementaux; // si té element adjectiu coordinat if ($nucli->paraulacoord != null) { $paraulacoord = $nucli->paraulacoord; // afegim la "i" $elementaux[0] = "y"; $elementaux[1] = null; $this->slotstring[] = $elementaux; // afegim la paraula coordinada amb la mateixa concordància if (!$subjmasc && $subjpl) { $elementaux[0] = $paraulacoord->propietats->fempl; } else { if (!$subjmasc && !$subjpl) { $elementaux[0] = $paraulacoord->propietats->fem; } else { if ($subjmasc && $subjpl) { $elementaux[0] = $paraulacoord->propietats->mascpl; } else { $elementaux[0] = $paraulacoord->propietats->masc; } } } // sobreescrivim si l'adjectiu tenia modificadors activats // ho fem perquè si és verbless no té subjecte if ($nucli->fem && $nucli->plural) { $elementaux[0] = $paraulacoord->propietats->fempl; } else { if ($nucli->fem) { $elementaux[0] = $paraulacoord->propietats->fem; } else { if ($nucli->plural) { $elementaux[0] = $paraulacoord->propietats->mascpl; } } } $elementaux[1] = $paraulacoord; $this->slotstring[] = $elementaux; } } break; case "verb": // MODIFICADOR, NOMÉS ELS QUE NO VAN A L'INICI DE LA FRASE // més endavant, si hi ha pronoms febles amb el verb, l'ordre potser es canviarà // NO FEM RES: HO FARAN EL CONJUGADOR I EL CLEANER POSARÀ ELS MODIFICADORS QUE FALTIN // A ON CALGUI DE LA FRASE /* if ($this->CModassigned) { $CI = &get_instance(); $CI->load->library('Mymatching'); $matching = new Mymatching(); for ($i=0; $i<count($this->CModassignedkey); $i++) { $quantifier = $this->cmpMod[$this->CModassignedkey[$i]]->paraulafinal; // si és dels que va entre subjecte i verb if ($matching->isModAfterSubj($quantifier->text)) { $elementaux[0] = $quantifier->text; $elementaux[1] = $quantifier; $this->slotstring[] = $elementaux; } } } // POSEM EL VERB, de moment en infinitiu $elementaux[0] = $nucli->text; $elementaux[1] = $nucli; $elementaux[2] = false; $this->slotstring[] = $elementaux; */ break; case "modifier": // PREPOSICIÓ // posem la preposició, si n'hi ha if ($this->prep != null) { $elementaux[0] = $this->prep; $elementaux[1] = null; $this->slotstring[] = $elementaux; } // NUCLI -> que és un modificador $elementaux[0] = $nucli->text; $elementaux[1] = $nucli; $elementaux[2] = false; $this->slotstring[] = $elementaux; // QUANTIFICADORS, si n'hi ha if ($this->CModassigned) { for ($i = 0; $i < count($this->CModassignedkey); $i++) { $quantifier = $this->cmpMod[$this->CModassignedkey[$i]]->paraulafinal; $elementaux[0] = $quantifier->text; $elementaux[1] = $quantifier; $this->slotstring[] = $elementaux; } } break; case "adv": // PREPOSICIÓ // posem la preposició, si n'hi ha if ($this->prep != null) { $elementaux[0] = $this->prep; $elementaux[1] = null; $this->slotstring[] = $elementaux; } // QUANTIFICADORS, si n'hi ha if ($this->CModassigned) { for ($i = 0; $i < count($this->CModassignedkey); $i++) { $quantifier = $this->cmpMod[$this->CModassignedkey[$i]]->paraulafinal; // Excepció: Ex: "Muy arriba". if ($quantifier->text == "mucho") { $elementaux[0] = "muy"; } else { $elementaux[0] = $quantifier->text; } $elementaux[1] = $quantifier; $this->slotstring[] = $elementaux; } } // NUCLI -> que és un adverbi $elementaux[0] = $nucli->text; $elementaux[1] = $nucli; $elementaux[2] = false; $this->slotstring[] = $elementaux; break; case "questpart": // Va sense preposició // NUCLI -> que és una partícula de pregunta $elementaux[0] = $nucli->text; $elementaux[1] = $nucli; $elementaux[2] = false; $this->slotstring[] = $elementaux; break; // Per qualsevol altra mena de nucli // posar primer la preposició, si n'hi ha, i després el valor per defecte // Per qualsevol altra mena de nucli // posar primer la preposició, si n'hi ha, i després el valor per defecte default: // PREPOSICIÓ // posem la preposició, si n'hi ha if ($this->prep != null) { $elementaux[0] = $this->prep; $elementaux[1] = null; $this->slotstring[] = $elementaux; } // NUCLI $elementaux[0] = $nucli->text; $elementaux[1] = $nucli; $elementaux[2] = false; $this->slotstring[] = $elementaux; // si té element element coordinat if ($nucli->paraulacoord != null) { $paraulacoord = $nucli->paraulacoord; // afegim la "i" $elementaux[0] = "y"; $elementaux[1] = null; $this->slotstring[] = $elementaux; // afegim la paraula coordinada $elementaux[0] = $paraulacoord->text; $elementaux[1] = $paraulacoord; $this->slotstring[] = $elementaux; } break; } } else { // PREPOSICIÓ // posem la preposició, si n'hi ha if ($this->prep != null) { $elementaux[0] = $this->prep; $elementaux[1] = null; $this->slotstring[] = $elementaux; } $elementaux[0] = $this->defvalue; $elementaux[1] = null; $elementaux[2] = false; $this->slotstring[] = $elementaux; } // print_r($this->slotstring); echo "<br /><br />"; }
public function launchCleanerES($tipusfrase) { $CI =& get_instance(); $CI->load->library('Mymatching'); $CI->load->library('Myslot'); $matching = new Mymatching(); // TREURE ELS "YO" I "TÚ" i agafar info dels verbs per després $keymainverb = null; $indexmainverb = -1; $indexsecondaryverb = -1; $indextheme1 = -1; $indextheme2 = -1; $indexdesire = -1; $indexpermission = -1; $mainverbinf = false; $secondaryverbinf = false; $numslots = count($this->ordrefrase); for ($i = 0; $i < $numslots; $i++) { $slotaux = $this->slotarray[$this->ordrefrase[$i]]; if ($slotaux->category == "Main Verb") { $indexmainverb = $i; if ($slotaux->isInfinitive) { $mainverbinf = true; } $keymainverb = $this->ordrefrase[$i]; // agafem el key del main verb pel pas dels modificadors } else { if ($slotaux->category == "Secondary Verb") { $indexsecondaryverb = $i; if ($slotaux->isInfinitive) { $secondaryverbinf = true; } } else { if ($slotaux->category == "Theme") { if ($slotaux->level == 1 && $slotaux->defvalueused && $slotaux->defvalue == "lo") { $indextheme1 = $i; } else { if ($slotaux->level == 2 && $slotaux->defvalueused && $slotaux->defvalue == "lo") { $indextheme2 = $i; } } } else { if ($slotaux->category == "Desire") { $indexdesire = $i; } else { if ($slotaux->category == "Permission") { $indexpermission = $i; } else { if ($slotaux->category == "Subject") { if ($slotaux->defvalueused) { // esborrem el tú o yo if ($slotaux->defvalue == '1' || $slotaux->defvalue == '2') { $slotaux->slotstring = array(); } } else { // esborrem el tú o el yo if ($slotaux->paraulafinal->text == "yo" || $slotaux->paraulafinal->text == "tú") { $slotaux->slotstring = array(); } // esborrem el subjecte del verb secundari, si és el mateix que el del principal if ($slotaux->level == 2 && $this->subjsiguals) { $slotaux->slotstring = array(); } } } } } } } } } $indexreceiver1 = -1; $indexreceiver2 = -1; $receiver1pron = false; $receiver2pron = false; // si és una ordre els pronoms aniran darrere el verb i tindran una altra forma $ordre = $tipusfrase == "ordre"; $elementaux = array(); // TRANSFORMAR ELS PRONOMS A FEBLES DEL RECEIVER for ($i = 0; $i < $numslots; $i++) { $slotaux = $this->slotarray[$this->ordrefrase[$i]]; if ($slotaux->category == "Receiver") { // si hi ha valors per defecte if ($slotaux->defvalueused) { if ($slotaux->defvalue == "mí") { // posar "me" en tots els casos if ($slotaux->level == 1) { $slotaux->slotstring = array(); $elementaux[0] = "me"; $elementaux[1] = null; $slotaux->slotstring[] = $elementaux; $indexreceiver1 = $i; $receiver1pron = true; } else { if ($slotaux->level == 2) { $slotaux->slotstring = array(); $elementaux[0] = "me"; $elementaux[1] = null; $slotaux->slotstring[] = $elementaux; $indexreceiver2 = $i; $receiver2pron = true; } } } else { if ($slotaux->defvalue == "tú") { // posar "te" if ($slotaux->level == 1) { $slotaux->slotstring = array(); $elementaux[0] = "te"; $elementaux[1] = null; $slotaux->slotstring[] = $elementaux; $indexreceiver1 = $i; $receiver1pron = true; } else { if ($slotaux->level == 2) { $slotaux->slotstring = array(); $elementaux[0] = "te"; $elementaux[1] = null; $slotaux->slotstring[] = $elementaux; $indexreceiver2 = $i; $receiver2pron = true; } } } } } else { if ($slotaux->level == 1 && $mainverbinf || $slotaux->level == 1 && $ordre && !$this->frasenegativa) { // si són pronoms personals, posem la forma correcta pels receivers de darrere el verb if ($matching->isPronomPersES($slotaux->paraulafinal->text)) { $slotaux->slotstring = array(); $elementaux[0] = $matching->pronomsPersonalsReceiverES[$slotaux->paraulafinal->text]; $elementaux[1] = null; $slotaux->slotstring[] = $elementaux; $indexreceiver1 = $i; $receiver1pron = true; } } else { if ($slotaux->level == 1) { // si són pronoms personals, posem la forma correcta pels receivers d'abans del verb if ($matching->isPronomPersES($slotaux->paraulafinal->text)) { $slotaux->slotstring = array(); $elementaux[0] = $matching->pronomsPersonalsReceiverES[$slotaux->paraulafinal->text]; $elementaux[1] = null; $slotaux->slotstring[] = $elementaux; $indexreceiver1 = $i; $receiver1pron = true; } } else { if ($slotaux->level == 2 && $secondaryverbinf) { // si són pronoms personals, posem la forma correcta pels receivers de darrere el verb if ($matching->isPronomPersES($slotaux->paraulafinal->text)) { $slotaux->slotstring = array(); $elementaux[0] = $matching->pronomsPersonalsReceiverES[$slotaux->paraulafinal->text]; $elementaux[1] = null; $slotaux->slotstring[] = $elementaux; $indexreceiver2 = $i; $receiver2pron = true; } } else { if ($slotaux->level == 2) { // si són pronoms personals, posem la forma correcta pels receivers d'abans del verb if ($matching->isPronomPersES($slotaux->paraulafinal->text)) { $slotaux->slotstring = array(); $elementaux[0] = $matching->pronomsPersonalsReceiverES[$slotaux->paraulafinal->text]; $elementaux[1] = null; $slotaux->slotstring[] = $elementaux; $indexreceiver2 = $i; $receiver2pron = true; } } } } } } } // Fi if slotaux = receiver } // Fi for transformar pronoms /* * ESTIC AQUÍ DEL CLEANER EN CASTELLÀ!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! * !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! */ // ORDRE DELS PRONOMS // amb tota la info recollida, movem els pronoms de lloc si cal // pel main verb si és infinitiu (els d'ordre ja són a darrere) if ($mainverbinf) { // el theme 1 if ($indextheme1 != -1) { $temp = $this->ordrefrase[$indextheme1]; // esborrem el theme 1 per moure'l de lloc array_splice($this->ordrefrase, $indextheme1, 1); // l'insertem just després del main verb array_splice($this->ordrefrase, $indexmainverb, 0, $temp); $indextheme1 = $indexmainverb; $indexmainverb -= 1; } // el receiver 1 if ($indexreceiver1 != -1) { $temp = $this->ordrefrase[$indexreceiver1]; // esborrem el receiver 1 per moure'l de lloc array_splice($this->ordrefrase, $indexreceiver1, 1); // l'insertem just després del main verb array_splice($this->ordrefrase, $indexmainverb, 0, $temp); $indexreceiver1 = $indexmainverb; $indexmainverb -= 1; } } // pel verb secundari si és infinitiu if ($secondaryverbinf) { // el theme 2 if ($indextheme2 != -1) { $temp = $this->ordrefrase[$indextheme2]; // esborrem el theme 2 per moure'l de lloc array_splice($this->ordrefrase, $indextheme2, 1); // l'insertem just després del main verb array_splice($this->ordrefrase, $indexsecondaryverb, 0, $temp); $indextheme2 = $indexsecondaryverb; $indexsecondaryverb -= 1; } // el receiver 2 if ($indexreceiver2 != -1) { $temp = $this->ordrefrase[$indexreceiver2]; // esborrem el receiver 2 per moure'l de lloc array_splice($this->ordrefrase, $indexreceiver2, 1); // l'insertem just després del main verb array_splice($this->ordrefrase, $indexsecondaryverb, 0, $temp); $indexreceiver2 = $indexsecondaryverb; $indexsecondaryverb -= 1; } } // ORDRE MODIFICADORS DE FRASE QUE NO VAN AL PRINCIPI: "NO", "TAMBÉ" // agafem els modificadors, si n'hi ha $slotmainverb = $this->slotarray[$keymainverb]; $counter = 0; $indexsmodifs = array(); $janegatiu = false; if ($slotmainverb->CModassigned) { for ($i = 0; $i < count($slotmainverb->cmpMod); $i++) { $keymodifaux = $slotmainverb->CModassignedkey[$i]; $slotmodifaux = $slotmainverb->cmpMod[$keymodifaux]; // si és del grup que va darrere el subjecte (ex: no, también) if ($matching->isModAfterSubjES($slotmodifaux->paraulafinal->text)) { // indiquem, que si la frase era negativa, ja no caldrà afegir el no if ($slotmodifaux->paraulafinal->text == "no") { $janegatiu = true; } // Creem un slot, el posem a slotarray i de moment al final d'ordrefrase $counter += 1; $newslotmodif = new Myslot(); $newslotmodif->category = "Modifier " . $counter; $newslotmodif->grade = "opt"; $newslotmodif->type = "modif"; $newslotmodif->full = true; $newslotmodif->paraulafinal = $slotmodifaux->paraulafinal; $elementaux = array(); $elementaux[0] = $slotmodifaux->paraulafinal->text; $elementaux[1] = $slotmodifaux->paraulafinal; $newslotmodif->slotstring[] = $elementaux; $newslotmodif->puntsfinal = 7; $this->slotarray["Modifier " . $counter] = $newslotmodif; $this->ordrefrase[] = "Modifier " . $counter; $indexsmodifs[] = $numslots; } } } // afegim un slot amb el no si la frase era negativa i no l'hem afegit ja if ($this->frasenegativa && !$janegatiu) { // Creem un slot, el posem a slotarray i de moment al final d'ordrefrase $counter += 1; $newslotmodif = new Myslot(); $newslotmodif->category = "Modifier " . $counter; $newslotmodif->grade = "opt"; $newslotmodif->type = "modif"; $newslotmodif->full = true; $elementaux = array(); $elementaux[0] = "no"; $elementaux[1] = null; $newslotmodif->slotstring[] = $elementaux; $newslotmodif->puntsfinal = 7; $this->slotarray["Modifier " . $counter] = $newslotmodif; $this->ordrefrase[] = "Modifier " . $counter; $indexsmodifs[] = $numslots; } // si hem trobat algun d'aquests slots, els col·loquem al lloc on toqui if ($counter > 0) { for ($i = 0; $i < count($indexsmodifs); $i++) { $indexmodifaux = $indexsmodifs[$i]; // si hi ha un verb de desig, posar-los abans, amb els de permís van darrere del permís if ($indexdesire != -1) { $indexaux = $indexdesire; $temp = $this->ordrefrase[$indexmodifaux]; // esborrem el modif per moure'l de lloc array_splice($this->ordrefrase, $indexmodifaux, 1); // l'insertem just abans del desig array_splice($this->ordrefrase, $indexaux, 0, $temp); } else { if (!$mainverbinf && (!$ordre || $this->frasenegativa)) { // si hi ha receiver, que sempre va abans del theme en versió pronominal // el posem abans del receiver if ($receiver1pron) { $temp = $this->ordrefrase[$indexmodifaux]; // esborrem el modif per moure'l de lloc array_splice($this->ordrefrase, $indexmodifaux, 1); // l'insertem just abans del receiver array_splice($this->ordrefrase, $indexreceiver1, 0, $temp); } else { if ($indextheme1 != -1) { $temp = $this->ordrefrase[$indexmodifaux]; // esborrem el modif per moure'l de lloc array_splice($this->ordrefrase, $indexmodifaux, 1); // l'insertem just abans del theme array_splice($this->ordrefrase, $indextheme1, 0, $temp); } else { $temp = $this->ordrefrase[$indexmodifaux]; // esborrem el modif per moure'l de lloc array_splice($this->ordrefrase, $indexmodifaux, 1); // l'insertem just abans del mainverb array_splice($this->ordrefrase, $indexmainverb, 0, $temp); } } } else { $temp = $this->ordrefrase[$indexmodifaux]; // esborrem el modif per moure'l de lloc array_splice($this->ordrefrase, $indexmodifaux, 1); // l'insertem just abans del mainverb array_splice($this->ordrefrase, $indexmainverb, 0, $temp); } } } } // Fi si hi ha algun slot de modificador d'aquesta mena // AJUNTAR PREPS+ARTS / PRONOMS FEBLES I APÒSTROFS $frasebruta = $this->frasefinal . $this->printFraseFinalSlotString(); // perps + arts $patterns[0] = '/[[:space:]][d][e][[:space:]][e][l][[:space:]]/u'; $patterns[1] = '/[[:space:]][a][[:space:]][e][l][[:space:]]/u'; // verb + pronoms de theme a darrere $patterns[2] = '/(?<=@VERBUM)[[:space:]]lo[[:space:]]/u'; // verb + pronoms de receiver a darrere $patterns[3] = '/(?<=@VERBUM)[[:space:]]me[[:space:]]/u'; $patterns[4] = '/(?<=@VERBUM)[[:space:]]te[[:space:]]/u'; $patterns[5] = '/(?<=@VERBUM)[[:space:]]se[[:space:]]/u'; $patterns[6] = '/(?<=@VERBUM)[[:space:]]nos[[:space:]]/u'; $patterns[7] = '/(?<=@VERBUM)[[:space:]]os[[:space:]]/u'; // verb+pronom feble de receiver ja enganxat, seguit de "lo" $patterns[8] = "/(?<=@VERBUM)me[[:space:]]lo[[:space:]]/u"; $patterns[9] = "/(?<=@VERBUM)te[[:space:]]lo[[:space:]]/u"; $patterns[10] = "/(?<=@VERBUM)se[[:space:]]lo[[:space:]]/u"; $patterns[11] = "/(?<=@VERBUM)nos[[:space:]]lo[[:space:]]/u"; $patterns[12] = "/(?<=@VERBUM)os[[:space:]]lo[[:space:]]/u"; // netejar @VERBUM $patterns[13] = "/@VERBUM/u"; $replacements[0] = ' del '; $replacements[1] = ' al '; $replacements[2] = "lo"; $replacements[3] = "me "; $replacements[4] = "te "; $replacements[5] = "se "; $replacements[6] = "nos "; $replacements[7] = "os "; $replacements[8] = "melo "; $replacements[9] = "telo "; $replacements[10] = "selo "; $replacements[11] = "noslo "; $replacements[12] = "roslo "; $replacements[13] = ""; $frasebruta = preg_replace($patterns, $replacements, $frasebruta); // fem una assignació prèvia $this->frasefinal = $frasebruta; // afegim les expressions de temps que van a darrere, si n'hi havia for ($i = 0; $i < count($this->timeexpr); $i++) { $wordaux = $this->timeexpr[$i]; if (!$matching->isFrontAdvTempsES($wordaux->text)) { // el posem darrere de la frase $frasebruta .= $wordaux->text . " "; } } // afegim les expressions a darrere de la frase, si la frase no era buida, // afegim una coma abans $numexprs = count($this->exprsarray); if ($numexprs > 0 && $this->frasefinal != " ") { $frasebruta .= ", "; $frasebruta = preg_replace("/[[:space:]],/u", ",", $frasebruta); } for ($i = 0; $i < $numexprs; $i++) { // l'hola sempre va a davant if ($this->exprsarray[$i] == "hola") { $fraseaux = $frasebruta; $frasebruta = " " . $this->exprsarray[$i]; // si la frase no era buida, afegim una coma if ($this->frasefinal != " ") { $frasebruta = $frasebruta . ", " . $fraseaux; } } else { $frasebruta .= $this->exprsarray[$i] . " "; } } // POSAR ELS PUNTS O EXCLAMACIONS O INTERROGANTS // esborrar l'últim espai i una coma al final si hi és. També l'espai del principi $frasebruta = preg_replace("/[[:space:]]\$/u", "", $frasebruta); $frasebruta = preg_replace("/,\$/u", "", $frasebruta); $frasebruta = substr($frasebruta, 1); $frasebruta[0] = strtoupper($frasebruta[0]); $llargfrase = strlen($frasebruta); $lastcharacter = $frasebruta[$llargfrase - 1]; if ($lastcharacter != "?") { if ($tipusfrase == "exclamacio") { $frasebruta .= "!"; $frasebruta = "¡" . $frasebruta; } else { if ($tipusfrase == "pregunta" || $tipusfrase == "permis") { $frasebruta .= "?"; $frasebruta = "¿" . $frasebruta; } else { $frasebruta .= "."; } } } $this->frasefinal = $frasebruta; // DEBUG // echo $frasebruta.'<br /><br />'; }