load->library('Myslot'); $this->id = $patternbbdd->patternid; $this->idverb = $patternbbdd->verbid; $this->verbless = $verbless; // els verbless patterns quan competeixen amb patrons no verbless, que comencin amb menys punts // que només els agafi si no en troba de millors if ($this->idverb == '0') $this->puntuaciofinal = 90; if ($patternbbdd->pronominal == '1') $this->pronominal = true; if ($patternbbdd->pseudoimpersonal == '1') $this->pseudoimpersonal = true; if ($patternbbdd->copulatiu == '1') $this->copulatiu = true; $this->tipusfrase = $patternbbdd->tipusfrase; $this->defaulttense = $patternbbdd->defaulttense; $this->verbpeticio = $patternbbdd->verbpeticio; if ($patternbbdd->subverb == '1') $this->subverb = true; $this->exemple = $patternbbdd->exemple; // Slot SUBJECT if ($patternbbdd->subj != '0') { $subjecte = new Myslot(); $subjecte->category = "Subject"; $subjecte->grade = "1"; $subjecte->type = $patternbbdd->subj; $subjecte->defvalue = $patternbbdd->subjdef; $subjecte->slotPuntsInicials(); $subjecte->verbless = $verbless; // sobreescrivim el subjecte per defecte, si s'envia des de la columna subdef dels adjectius if ($subjdef) { $subjecte->defvalue = $subjdef; } if ($subjecte->type == "verb") $this->subverb = "Subject"; $this->hasslot["Subject"] = true; $this->slotarray["Subject"] = $subjecte; } // si no té subjecte else { $this->impersonal = true; } // Slot ROOT $rootslot = new Myslot(); $rootslot->category = "Main Verb"; $rootslot->grade = "1"; $rootslot->type = "verb"; $rootslot->slotPuntsInicials(); $this->slotarray["Main Verb"] = $rootslot; $this->hasslot["Main Verb"] = true; // Després d'inicialitzar tot el pattern, s'omple l'slot de Main Verb amb el Verb principal // Slot THEME if ($patternbbdd->theme != '0') { $theme = new Myslot(); $theme->category = "Theme"; $theme->grade = $patternbbdd->theme; $theme->slotPuntsInicials(); $theme->type = $patternbbdd->themetipus; if ($theme->grade == '1') $theme->defvalue = $patternbbdd->themedef; if ($patternbbdd->themeprep != "") $theme->prep = $patternbbdd->themeprep; if ($patternbbdd->themeart != "NULL") $theme->art = $patternbbdd->themeart; if ($theme->type == "verb") $this->subverb = "Theme"; $this->hasslot["Theme"] = true; $this->slotarray["Theme"] = $theme; } // Slot RECEIVER if ($patternbbdd->receiver != '0') { $receiver = new Myslot(); $receiver->category = "Receiver"; $receiver->grade = $patternbbdd->receiver; $receiver->slotPuntsInicials(); $receiver->type = "human"; if ($receiver->grade == '1') $receiver->defvalue = $patternbbdd->receiverdef; if ($patternbbdd->receiverprep != "") $receiver->prep = $patternbbdd->receiverprep; if ($receiver->type == "verb") $this->subverb = "Receiver"; $this->hasslot["Receiver"] = true; $this->slotarray["Receiver"] = $receiver; } // Slot BENEFICIARY if ($patternbbdd->benef != '0') { $benef = new Myslot(); $benef->category = "Beneficiary"; $benef->grade = $patternbbdd->benef; $benef->slotPuntsInicials(); $benef->type = $patternbbdd->beneftipus; if ($benef->grade == '1') $benef->defvalue = $patternbbdd->benefdef; if ($patternbbdd->benefprep != "") $benef->prep = $patternbbdd->benefprep; if ($benef->type == "verb") $this->subverb = "Beneficiary"; $this->hasslot["Beneficiary"] = true; $this->slotarray["Beneficiary"] = $benef; } // Slot ACOMP if ($patternbbdd->acomp != '0') { $acomp = new Myslot(); $acomp->category = "Company"; $acomp->grade = $patternbbdd->acomp; $acomp->slotPuntsInicials(); $acomp->type = "animate"; if ($acomp->grade == '1') $acomp->defvalue = $patternbbdd->acompdef; if ($patternbbdd->acompprep != "") $acomp->prep = $patternbbdd->acompprep; if ($acomp->type == "verb") $this->subverb = "Company"; $this->hasslot["Company"] = true; $this->slotarray["Company"] = $acomp; } // Slot TOOL if ($patternbbdd->tool != '0') { $tool = new Myslot(); $tool->category = "Tool"; $tool->grade = $patternbbdd->tool; $tool->slotPuntsInicials(); $tool->type = "tool"; if ($tool->grade == '1') $tool->defvalue = $patternbbdd->tooldef; if ($patternbbdd->toolprep != "") $tool->prep = $patternbbdd->toolprep; if ($tool->type == "verb") $this->subverb = "Tool"; $this->hasslot["Tool"] = true; $this->slotarray["Tool"] = $tool; } // Slot MANNER if ($patternbbdd->manera != '0') { $manera = new Myslot(); $manera->category = "Manner"; $manera->grade = $patternbbdd->manera; $manera->slotPuntsInicials(); if ($patternbbdd->maneratipus == 'adv') $manera->type = "manera"; else $manera->type = $patternbbdd->maneratipus; if ($manera->grade == '1') $manera->defvalue = $patternbbdd->maneradef; if ($manera->type == "verb") $this->subverb = "Manner"; $this->hasslot["Manner"] = true; $this->slotarray["Manner"] = $manera; } // Slot LOCTO if ($patternbbdd->locto != '0') { $locto = new Myslot(); $locto->category = "LocTo"; $locto->grade = $patternbbdd->locto; $locto->slotPuntsInicials(); if ($patternbbdd->loctotipus != "verb") $locto->type = "lloc"; else $locto->type = $patternbbdd->loctotipus; if ($locto->grade == '1') $locto->defvalue = $patternbbdd->loctodef; if ($patternbbdd->loctoprep != "") $locto->prep = $patternbbdd->loctoprep; if ($locto->type == "verb") $this->subverb = "LocTo"; $this->hasslot["LocTo"] = true; $this->slotarray["LocTo"] = $locto; } // Slot LOCFROM if ($patternbbdd->locfrom != '0') { $locfrom = new Myslot(); $locfrom->category = "LocFrom"; $locfrom->grade = $patternbbdd->locfrom; $locfrom->slotPuntsInicials(); if ($patternbbdd->locfromtipus != "verb") $locfrom->type = "lloc"; else $locfrom->type = $patternbbdd->locfromtipus; if ($locfrom->grade == '1') $locfrom->defvalue = $patternbbdd->locfromdef; if ($patternbbdd->locfromprep != "") $locfrom->prep = $patternbbdd->locfromprep; if ($locfrom->type == "verb") $this->subverb = "LocFrom"; $this->hasslot["LocFrom"] = true; $this->slotarray["LocFrom"] = $locfrom; } // Slot LOCAT if ($patternbbdd->locat != '0') { $locat = new Myslot(); $locat->category = "LocAt"; $locat->grade = $patternbbdd->locat; $locat->slotPuntsInicials(); $locat->type = "lloc"; if ($locat->grade == '1') $locat->defvalue = $patternbbdd->locatdef; if ($patternbbdd->locatprep != "") $locat->prep = $patternbbdd->locatprep; if ($locat->type == "verb") $this->subverb = "LocAt"; $this->hasslot["LocAt"] = true; $this->slotarray["LocAt"] = $locat; } // Slot TIME: Només es fa servir pels noms, estil dies de la setmana, mesos... // Pels adverbis de temps fem servir l'array timeexpr if ($patternbbdd->time != '0') { $this->allowstime = true; $time = new Myslot(); $time->category = "Time"; $time->grade = "opt"; $time->type = "time"; $time->slotPuntsInicials(); $this->hasslot["Time"] = true; $this->slotarray["Time"] = $time; } // Slot EXPRESSIONS if ($patternbbdd->expressio == '1') $this->needexpr = true; else if ($patternbbdd->expressio != "") { $aux = array(); $aux[0] = $patternbbdd->expressio; $aux[1] = '0'; $this->exprsarray[] = $aux; } $this->hasslot["Expression"] = true; } public function forceFillSlot($slotname, $word, $penalty, $indexclassfinalword) { // DEBUG // echo $slotname." ".$word->text."

"; $word->slotfinal = $slotname; $word->used = true; // marquem la paraula com ja adjudicada $slotaux = new Myslot(); $slotaux = &$this->slotarray[$slotname]; $slotaux->paraulafinal = $word; $slotaux->puntsguanyats = $slotaux->puntsfinal - $penalty; $slotaux->puntsfinal = $penalty; $slotaux->full = true; $slotaux->indexclassfinalword = $indexclassfinalword; // $this->slotarray[$slotname]->paraulestemp = array(); } // Les noves keys de l'array de slots acabaran en 1 ó 2, // depenent de si venen del pattern principal o el secundari public function fusePatterns($pattern2) { $CI = &get_instance(); $CI->load->library('Myslot'); $auxpatternresultat = new Mypattern(); foreach ($this->slotarray as $slots1) { // Si l'slot és el subverb, insertem els slots del 2on pattern if ($slots1->type == "verb" && $slots1->category != "Main Verb") { foreach ($pattern2->slotarray as $slots2) { $slots2->level = 2; $slots2->parent = $slots1->category; if ($slots2->category == "Main Verb") { $slots2->category = "Secondary Verb"; // i passem, si n'hi ha, la preposició que ha d'anar davant del subverb if ($slots1->prep != null) { $slots2->prep = $slots1->prep; } } $auxpatternresultat->slotarray[$slots2->category." 2"] = $slots2; $auxpatternresultat->hasslot[$slots2->category." 2"] = true; } } else { $auxpatternresultat->slotarray[$slots1->category." 1"] = $slots1; $auxpatternresultat->hasslot[$slots1->category." 1"] = true; } } $this->slotarray = array(); $this->slotarray = $auxpatternresultat->slotarray; $this->hasslot = array(); $this->hasslot = $auxpatternresultat->hasslot; // Passem les propietats del pattern del subverb $this->id2 = $pattern2->id; $this->idverb2 = $pattern2->idverb; $this->pronominal2 = $pattern2->pronominal; $this->pseudoimpersonal2 = $pattern2->pseudoimpersonal; $this->tipusfrase2 = $pattern2->tipusfrase; $this->defaulttense2 = $pattern2->defaulttense; $this->verbpeticio2 = $pattern2->verbpeticio; $this->allowstime = ($this->allowstime || $pattern2->allowstime); $this->needexpr = ($this->needexpr || $pattern2->needexpr); // S'acumulen les expressions, si n'hi ha foreach ($pattern2->exprsarray as $expr) { $this->exprsarray[] = $expr; } } // Posa la partícula a l'slot corresponent public function fillPartPregunta($particula) { $CI = &get_instance(); $CI->load->library('Myslot'); $classe1 = null; $classe2 = null; $classeaux1 = "null"; $classeaux2 = "null"; $particulabona = false; $numclasses = count($particula->classes); for($i=0; $i<$numclasses; $i++) { if ($i==0) $classe1 = $particula->classes[0]; else if ($i==1) $classe2 = $particula->classes[1]; } if ($classe1 == null && $classe2 == null) { $particulabona = true; // és una partícula que no va a un slot // creem un slot per la particula $slotpartpregunta = new Myslot(); $slotpartpregunta->category = "PartPreguntaNoSlot"; $slotpartpregunta->grade = '1'; $slotpartpregunta->type = "questpart"; $slotpartpregunta->full = true; $slotpartpregunta->paraulafinal = $particula; $slotpartpregunta->puntsfinal = -7; $slotpartpregunta->level = 1; $keyaux = "PartPreguntaNoSlot"; if (isset($this->slotarray["Secondary Verb 2"])) $keyaux .= " 1"; $this->slotarray[$keyaux] = $slotpartpregunta; } else if ($numclasses >= 1) { if ($this->subverb) { $classeaux1 = $classe1." 2"; $classe1 .= " 1"; $classeaux2 = $classe2." 2"; $classe2 .= " 1"; } // Provem si hi ha la mena d'slot i omplim l'slot, primer del subverb, si n'hi ha, i primer de la 1era classe if (array_key_exists($classeaux1, $this->slotarray)) { $this->forceFillSlot($classeaux1, $particula, 0, 0); $particulabona = true; } else if (array_key_exists($classe1, $this->slotarray)) { $this->forceFillSlot($classe1, $particula, 0, 0); $particulabona = true; } else if (array_key_exists($classeaux2, $this->slotarray)) { $this->forceFillSlot($classeaux2, $particula, 0, 1); $particulabona = true; } else if (array_key_exists($classe2, $this->slotarray)) { $this->forceFillSlot($classe2, $particula, 0, 1); $particulabona = true; } } $this->partpreguntabona = $particulabona; return $particulabona; } public function solveNouns($arrayNouns) { $unusedNouns = array(); // noms no utilitzats a la primera ronda d'intents de fit $usedNouns = array(); $numNouns = count($arrayNouns); for ($i=0; $i<$numNouns; $i++) { $word = $arrayNouns[$i]; foreach ($this->slotarray as $keyslot => $slot) { $fittype = 0; // 1, si fit slot, 0 si no // passem el key de l'slot per si de cas hi ha subverb i els slots són de l'estil "Theme 1|2" $fittype = $slot->nounFitsSlot($word, $keyslot); if ($fittype == 0) $unusedNouns[] = $word; // si no ha pogut anar a cap slot, no el fem servir else $usedNouns[] = $word; } // MIREM SI LA PARAULA NOMÉS HA POGUT FER FILL D'UN ÚNIC SLOT PER FER EL BLOCK CHAINING // SI L'ÚNIC SLOT ÉS DE NC JA SE LI ASSIGNA $this->chainBlockingSlotsType1($word, "NC"); } // QUAN JA TENIM POSADES TOTES LES PARAULES, RESOLEM ELS SLOTS ENCARA NO RESOLTS // HI HAURÂ SLOTS AMB JA NOMÉS UNA PARAULA O ALTRES SLOTS AMB VÀRIES PARAULES $mand2level = array(); $mand1level = array(); $subjectes = array(); $opts = array(); // Ordenem els slots en differents arrays Mandatory 2on nivell, Mandatory 1er nivell, subjecte, opts foreach ($this->slotarray as $keyslot => $slot) { if ($slot->level == 2) { if ($slot->category == 'Subject') $subjectes[$keyslot] = $slot; else if ($slot->grade == '1') $mand2level[$keyslot] = $slot; else $opts[] = $slot; } else { if ($slot->category == 'Subject') $subjectes[$keyslot] = $slot; else if ($slot->grade == '1') $mand1level[$keyslot] = $slot; else $opts[$keyslot] = $slot; } } // ordenem els slots per importància, per anar-los desambiguant per ordre $this->calculateVirtualOrder(); $this->disambiguateSlotsNew("NC"); // Primer els obligatoris de 2on nivell // $this->disambiguateSlots($mand2level, "NC"); // Després els obligatoris del 1er nivell // $this->disambiguateSlots($mand1level, "NC"); // Després els de subjecte // $this->disambiguateSlots($subjectes, "NC"); // Finalment els optatius // $this->disambiguateSlots($opts, "NC"); $CI = &get_instance(); $langnouncorder = $CI->session->userdata('uinterfacelangncorder'); $langtype = $CI->session->userdata('uinterfacelangtype'); $svo = true; if ($langtype != 'svo') $svo = false; // un cop desambiguats tots els slots, veiem si alguna paraula aniria millor com a NC // en comptes de com a opt. // Per cada slot optatiu mirem si la paraula que fa el fit podia fer de NC foreach ($opts as $keyslotopt => $slotopt) { // Només si l'slot és full i no té un altre complement assignat, que aleshores no el podem eliminar if ($slotopt->full && !$slotopt->NCassigned) { // si no era un perfect fill o si els dos noms anaven contigus abans del verb (en cas de SVO) // i la frase no era pseudoimpersonal o de pregunta que tenen els valors de subverb invertits if ($slotopt->puntsfinal > 0 || ($svo && $slotopt->paraulafinal->beforeverb && !$this->pseudoimpersonal && !$this->partpreguntabona)) { $wordfill = $slotopt->paraulafinal; $i=0; $chosencompl = false; // trobem si aquella paraula podia fer de NC d'una altra paraula while($islotstemps) && !$chosencompl) { $keycompl = -1; $keyaux = null; $keyaux = $wordfill->slotstemps[$i]; // DEBUG // echo $wordfill->text." ".$keyaux."

"; // Si és de compl. de nom (cada paraula només pot ser NC d'una altra paraula: de la precedent) if(strpos($keyaux, "NC")) $keycompl = $i; $i++; if ($keycompl != -1) { $auxstring = explode(" ", $keyaux); // agafem el key de l'slot que podia tenir el NC $numpartskeycompl = count($auxstring); if ($numpartskeycompl > 0) { $keyparent = null; // per si el compl era d'un slot de 2on nivell if ($numpartskeycompl == 4) $keyparent = $auxstring[0]." ".$auxstring[1]; else $keyparent = $auxstring[0]; // mirem si és d'un slot que està ple i que la paraula que l'omple sigui la que complia la condició // de ser l'anterior a la paraula que fa de complement (si langnouncorder == 1) o posterior (si langnouncorder == 0) if ($this->slotarray[$keyparent]->full && (($langnouncorder == '1' && ($this->slotarray[$keyparent]->paraulafinal->inputorder - $wordfill->inputorder == -1)) || ($langnouncorder == '0' && ($this->slotarray[$keyparent]->paraulafinal->inputorder - $wordfill->inputorder == 1)))) { // fem el canvi: dessassignem slotopt $slotopt->full = false; $slotopt->paraulafinal = null; $slotopt->puntsfinal = 7; $slotopt->indexclassfinalword = 0; // posem que complementa a l'altra slot com a NC $wordfill->slotfinal = $keyparent; $wordfill->used = true; // en principi ja estava a true // indiquem que ara aquest slot té un NC assignat $this->slotarray[$keyparent]->NCassigned = true; $this->slotarray[$keyparent]->NCassignedkey = $keyaux; $chosencompl = true; } } } } } } } // Fi de per cada slot optatiu mirar si la paraula que el fit fa millor de NC // Si han quedat noms sense slot, mirar si poden fer de NC for ($i=0; $i<$numNouns; $i++) { $word = $arrayNouns[$i]; if ($word->slotfinal == null) { $slotstemps = $word->slotstemps; foreach ($slotstemps as $num => $keyslot) { if (strpos($keyslot, " NC")) { $str = explode(" NC", $keyslot); // si l'slot on podia fer de complement existeix, té un nucli i // no té ja un complement assignat if (isset($this->slotarray[$str[0]]) && $this->slotarray[$str[0]]->full && !$this->slotarray[$str[0]]->NCassigned) { // comprovem que el nucli estés a la distància de NC if ((($langnouncorder == '1' && $this->slotarray[$str[0]]->paraulafinal->inputorder == $word->inputorder - 1)) || (($langnouncorder == '0' && $this->slotarray[$str[0]]->paraulafinal->inputorder == $word->inputorder + 1))) { $word->used = true; // indiquem que ara l'slot superior té un NC assignat $this->slotarray[$str[0]]->NCassigned = true; $this->slotarray[$str[0]]->NCassignedkey = $keyslot; // un cop trobem el que compleix les condicions, ja no seguim amb el foreach break; } } } } } } // fi si han quedat noms sense slot } public function solveAdverbs($arrayadverbs) { $unusedAdverbs = array(); // adverbis no utilitzats a la primera ronda d'intents de fit $usedAdverbs = array(); $numAdverbs = count($arrayadverbs); for ($i=0; $i<$numAdverbs; $i++) { $word = $arrayadverbs[$i]; // Si és un adverbi de temps, només pot anar a un slot de temps if ($word->isClass("temps")) { if ($this->allowstime) { $this->timeexpr[] = $word; $word->used = true; $word->slotfinal = "Time Expr"; // està a l'array d'expressions de temps $usedAdverbs[] = $word; } else $unusedAdverbs[] = $word; } else { // Pels altres adverbis foreach ($this->slotarray as $keyslot => $slot) { $fittype = 0; // 1, si fit slot, 0 si no // passem el key de l'slot per si de cas hi ha subverb i els slots són de l'estil "Theme 1|2" $fittype = $slot->adverbFitsSlot($word, $keyslot); if ($fittype == 0) $unusedAdverbs[] = $word; // si no ha pogut anar a cap slot, no el fem servir else $usedAdverbs[] = $word; } // MIREM SI LA PARAULA NOMÉS HA POGUT FER FILL D'UN ÚNIC SLOT PER FER EL BLOCK CHAINING $this->chainBlockingSlotsType1($word, "ADV"); } } // QUAN JA TENIM POSADES TOTES ELS ADVERBIS, RESOLEM ELS SLOTS ENCARA NO RESOLTS // HI HAURÂ SLOTS AMB JA NOMËS UNA PARAULA O ALTRES SLOTS AMB VÀRIES PARAULES $this->calculateVirtualOrder(); $this->disambiguateSlotsNew("ADV"); // un cop desambiguats tots els slots, veiem si alguna paraula aniria millor com a NC ADV // en comptes de com a opt. for ($i=0; $i<$numAdverbs; $i++) { $indexmillor = -1; $bestdistance = 1000; $bestpoints = 1000; $word = $arrayadverbs[$i]; // si la paraula està en un slot (no de temps), mirem si aquest slot és opt i el comparem amb els // slots als que l'adv pot fer de complement, si no, compararem només els slots als // que pot fer de complement entre ells if ($word->used && !$word->isClass("temps")) { $keyslotaux = $word->slotfinal; $slotaux = $this->slotarray[$keyslotaux]; if ($slotaux->grade == "opt") { $bestdistance = 0; $bestpoints = $slotaux->puntsfinal; } } for ($j=0; $jslotstemps); $j++) { $aux = explode(" ADV", $word->slotstemps[$j]); // comprovem que l'slot sigui del tipus ADV que complementa a nom, ja que // els altres opts als que pugui fer fit, com ara els de manner, també hi seran if (count($aux) > 1) { $keyslotnoun = $aux[0]; $slotnoun = $this->slotarray[$keyslotnoun]; // si no té ja un adverbi assignat if (!$slotnoun->CAdvassigned) { $slotadv = $slotnoun->cmpAdvs[$word->slotstemps[$j]]; $distance = $slotnoun->paraulafinal->inputorder - $word->inputorder; $points = $slotadv->puntsfinal + abs($distance); if ($points < $bestpoints) { $bestdistance = $distance; $bestpoints = $points; $indexmillor = $word->slotstemps[$j]; } else if ($points == $bestpoints) { // en cas d'empat ens quedem amb la que tenia distància positiva, // que vol dir un adverbi de lloc que vagi abans del nom al que complementa if ($distance > $bestdistance) { $bestdistance = $distance; $bestpoints = $points; $indexmillor = $word->slotstemps[$j]; } } } } } // si hem trobat un slot millor fem la substitució if ($indexmillor != -1) { // si l'adverbi que hem seleccionat feia fill a un altre slot (optatiu, com hem comprovat abans) // que no fos ja de complement el desassignem a l'slot que feia fill if ($word->slotfinal != null && !strpos($word->slotfinal, "ADV")) { $keyslotfinal = $word->slotfinal; $this->slotarray[$keyslotfinal]->full = false; $this->slotarray[$keyslotfinal]->paraulafinal = null; $this->slotarray[$keyslotfinal]->puntsfinal = 7; $this->slotarray[$keyslotfinal]->indexclassfinalword = 0; } $word->slotfinal = $indexmillor; if (!$word->used) $usedAdverbs[] = $word; $word->used = true; $word->assignadaAComplement = true; $aux2 = explode(" ADV", $indexmillor); $keyslotnoun = $aux2[0]; $this->slotarray[$keyslotnoun]->CAdvassigned = true; $this->slotarray[$keyslotnoun]->CAdvassignedkey = $indexmillor; // treiem la preposició que anava davant de l'slot, si n'hi havia $this->slotarray[$keyslotnoun]->prep = null; // no cal que l'esborrem de les altres cues de complements xq només acceptàvem paraules que no estessin // ja assignades a un altre complement } } // fi for per cada adverbi } public function solveAdjs($arrayAdjs) { $unusedAdjs = array(); // noms no utilitzats a la primera ronda d'intents de fit $usedAdjs = array(); $numAdjs = count($arrayAdjs); // Per cada adjectiu for ($i=0; $i<$numAdjs; $i++) { $word = $arrayAdjs[$i]; foreach ($this->slotarray as $keyslot => $slot) { $fittype = 0; // 1, si fit slot, 0 si no // passem el key de l'slot per si de cas hi ha subverb i els slots són de l'estil "Theme 1|2" $fittype = $slot->adjFitsSlot($word, $keyslot); if ($fittype == 0) $unusedAdjs[] = $word; // si no ha pogut anar a cap slot, no el fem servir else $usedAdjs[] = $word; } // MIREM SI LA PARAULA NOMÉS HA POGUT FER FILL D'UN ÚNIC SLOT PER FER EL BLOCK CHAINING $this->chainBlockingSlotsType1($word, "ADJ"); } // QUAN JA TENIM POSADES TOTES LES PARAULES, RESOLEM ELS SLOTS ENCARA NO RESOLTS // HI HAURÂ SLOTS AMB JA NOMËS UNA PARAULA O ALTRES SLOTS AMB VÀRIES PARAULES $mand2level = array(); $mand1level = array(); $subjectes = array(); $opts = array(); // Ordenem els slots en differents arrays Mandatory 2on nivell, Mandatory 1er nivell, subjecte, opts foreach ($this->slotarray as $keyslot => $slot) { if ($slot->level == 2) { if ($slot->category == 'Subject') $subjectes[$keyslot] = $slot; else if ($slot->grade == '1') $mand2level[$keyslot] = $slot; else $opts[] = $slot; } else { if ($slot->category == 'Subject') $subjectes[$keyslot] = $slot; else if ($slot->grade == '1') $mand1level[$keyslot] = $slot; else $opts[$keyslot] = $slot; } } $this->calculateVirtualOrder(); $this->disambiguateSlotsNew("ADJ"); // un cop desambiguats tots els slots, veiem a quin slot fan millor de complements // els adjs que no estan omplint ja un slot obligatori // si estan omplint un slot opt, mirem si és millor com a slotopt o com a complement // PER CADA ADJ foreach ($arrayAdjs as $wordadj) { $slotfinalobl = false; $slotfinalopt = false; $keyslotfinal = $wordadj->slotfinal; // mirem si l'slot final, que no sigui de tipus complement, és obligatori o optatiu if ($keyslotfinal != null) { if (!strpos($keyslotfinal, "ADJ")) { if ($this->slotarray[$keyslotfinal]->grade == '1') { $slotfinalobl = true; } else if ($this->slotarray[$keyslotfinal]->grade == 'opt') { $slotfinalopt = true; } } } // si no és obligatori, busquem el millor slot al que pot complementar l'adj if (!$slotfinalobl) { $puntsmillor = -1000; $keymillor = null; $keyparentmillor = null; // per cada slot al llistat de temporals foreach ($wordadj->slotstempsext as $auxtupla) { $keyaux = $auxtupla[0]; $auxpunts = $auxtupla[1]; // en cas d'empat volem els slot complements que entren més tard que els opts if ($auxpunts > $puntsmillor) { // extreiem també la key del parent slot al que complementa $auxstring = explode(" ", $keyaux); $keyparentaux; // agafem el key de l'slot que podia tenir el NC $numpartskeycompl = count($auxstring); if ($numpartskeycompl > 0) { // per si el compl era d'un slot de 2on nivell if ($numpartskeycompl == 4) $keyparentaux = $auxstring[0]." ".$auxstring[1]; else $keyparentaux = $auxstring[0]; } // si l'slot no té ja assignat un altre adj el podem escollir provisionalment if (!$this->slotarray[$keyparentaux]->CAdjassigned) { $puntsmillor = $auxpunts; $keymillor = $keyaux; $keyparentmillor = $keyparentaux; } } } // si hem trobat el millor slot, el posem com a final de la paraula // i a l'slot parent el posem al llistat de modificadors assignats if ($puntsmillor > -1000) { // si omplia un slot opt, mirem si el fit és millor de complement que opt if ($slotfinalopt) { $slotopt = $this->slotarray[$keyslotfinal]; // si el fit és millor, fem tot el procés de desassignar i assignar if ($puntsmillor >= $slotopt->puntsguanyats) { // desassignem $slotopt->full = false; $slotopt->paraulafinal = null; $slotopt->puntsfinal = 7; $slotopt->indexclassfinalword = 0; // assignem $wordadj->slotfinal = $keymillor; $wordadj->used = true; $wordadj->assignadaAComplement = true; $slotparent = $this->slotarray[$keyparentmillor]; $slotparent->CAdjassigned = true; $slotparent->CAdjassignedkey = $keymillor; } } else { $wordadj->slotfinal = $keymillor; $wordadj->used = true; $wordadj->assignadaAComplement = true; $slotparent = $this->slotarray[$keyparentmillor]; $slotparent->CAdjassigned = true; $slotparent->CAdjassignedkey = $keymillor; } } } } // Fi de buscar per cada adj, a on fan millor de complement } public function solveModifs($arrayModifs) { $unusedModifs = array(); // noms no utilitzats a la primera ronda d'intents de fit $usedModifs = array(); $numModifs = count($arrayModifs); $verbless = false; // Per cada modificador for ($i=0; $i<$numModifs; $i++) { $word = $arrayModifs[$i]; // si és de frase, i no és verbless, l'assignem al verb principal i ja està if ($word->tipus == "modifier" && $word->propietats->scope == "phrase" && $this->defaulttense != "verbless") { $keymainverb = "Main Verb"; if (isset ($this->slotarray["Main Verb 1"])) $keymainverb = "Main Verb 1"; $slotverb = $this->slotarray[$keymainverb]; $nummodsslot = count($slotverb->cmpMod); $newslot = new Myslot(); $word->slotfinal = $keymainverb." MOD ".$nummodsslot; // per dir que està de compl. $newslot->category = $slotverb->category." MOD"; $newslot->grade = "opt"; $newslot->full = true; $newslot->paraulafinal = $word; $newslot->level = $slotverb->level + 1; $newslot->parent = $keymainverb; $newslot->puntsfinal = 7; // Són els punts que resten un NC sobre 100 $newslot->indexclassfinalword = 0; $slotverb->cmpMod[$keymainverb." MOD ".$nummodsslot] = $newslot; $slotverb->CModassigned = true; $slotverb->CModassignedkey[] = $keymainverb." MOD ".$nummodsslot; $word->used = true; $word->assignadaAComplement = true; } else { foreach ($this->slotarray as $keyslot => $slot) { $fittype = 0; // 1, si fit slot, 0 si no // passem el key de l'slot per si de cas hi ha subverb i els slots són de l'estil "Theme 1|2" $fittype = $slot->modifFitsSlot($word, $keyslot); if ($fittype == 0) $unusedModifs[] = $word; // si no ha pogut anar a cap slot, no el fem servir else $usedModifs[] = $word; } // MIREM SI LA PARAULA NOMÉS HA POGUT FER FILL D'UN ÚNIC SLOT PER FER EL BLOCK CHAINING $this->chainBlockingSlotsType1($word, "MOD"); } } // QUAN JA TENIM POSADES TOTES LES PARAULES, RESOLEM ELS SLOTS ENCARA NO RESOLTS // HI HAURÂ SLOTS AMB JA NOMËS UNA PARAULA O ALTRES SLOTS AMB VÀRIES PARAULES $this->calculateVirtualOrder(); $this->disambiguateSlotsNew("MOD"); // un cop desambiguats tots els slots, veiem a quin slot fan millor de complements // els modifs que no estan omplint ja un slot obligatori // PER CADA MODIF foreach ($arrayModifs as $wordmodif) { $slotfinalobl = false; $slotfinalopt = false; $slotfinaloptpunts = -1000; $keyslotfinal = $wordmodif->slotfinal; // mirem si l'slot final, que no sigui de tipus complement, és obligatori o optatiu if ($keyslotfinal != null) { if (!strpos($keyslotfinal, "MOD")) { if ($this->slotarray[$keyslotfinal]->grade == '1') { $slotfinalobl = true; } else if ($this->slotarray[$keyslotfinal]->grade == 'opt') { $slotfinalopt = true; $slotfinaloptpunts = $this->slotarray[$keyslotfinal]->puntsguanyats-0; // -0 -> en cas d'empat ja agafa el complement vs l'slot optatiu // amb -1 ho penalitzaríem més perquè en cas d'altres empats // es quedés amb el complement i no amb l'slot optatiu } } } // si no és obligatori, busquem el millor slot al que pot complementar el modif // i si aquest slot supera a l'slot opt que ja hi ha if (!$slotfinalobl) { $puntsmillor = $slotfinaloptpunts; $keymillor = null; $keyparentmillor = null; $slotmillorat = false; // per cada slot al llistat de temporals foreach ($wordmodif->slotstempsext as $auxtupla) { $keyaux = $auxtupla[0]; $auxpunts = $auxtupla[1]; // si és de tipus complement if (strpos($keyaux, "MOD")) { if ($auxpunts > $puntsmillor) { // extreiem també la key del parent slot al que complementa $auxstring = explode(" ", $keyaux); $keyparentprov; // agafem el key de l'slot que podia tenir el NC $numpartskeycompl = count($auxstring); if ($numpartskeycompl > 0) { // per si el compl era d'un slot de 2on nivell if ($numpartskeycompl == 4) $keyparentprov = $auxstring[0]." ".$auxstring[1]; else $keyparentprov = $auxstring[0]; } // si no té un adverbi que ja el quantifiqui if (isset($this->slotarray[$keyparentprov]) && !$this->slotarray[$keyparentprov]->CAdvassigned) { $puntsmillor = $auxpunts; $keymillor = $keyaux; $keyparentmillor = $keyparentprov; $slotmillorat = true; } } } } // si hem trobat el millor slot, el posem com a final de la paraula // i a l'slot parent el posem al llistat de modificadors assignats if ($slotmillorat) { // si omplia un slot opt, desassignem la paraula d'aquest slot if ($slotfinalopt) { $slotopt = $this->slotarray[$keyslotfinal]; $slotopt->full = false; $slotopt->paraulafinal = null; $slotopt->puntsfinal = 7; $slotopt->indexclassfinalword = 0; } $wordmodif->slotfinal = $keymillor; $wordmodif->used = true; $wordmodif->assignadaAComplement = true; $slotparent = $this->slotarray[$keyparentmillor]; $slotparent->CModassigned = true; $slotparent->CModassignedkey[] = $keymillor; } } } // Fi de buscar per cada modif, a on fan millor de complement } function calculateVirtualOrder() { $this->virtualslotsort = array(); foreach ($this->slotarray as $keyslot => $slot) { $aux = array(); $aux[0] = $keyslot; $aux[1] = $slot->slotCalcPuntsGuanyats(); $aux[2] = $slot->grade; $aux[3] = $slot->level; if (!$slot->full && count($slot->paraulestemp) > 0) $this->virtualslotsort[] = $aux; } $this->mySort($this->virtualslotsort); // DEBUG: // print_r($this->virtualslotsort); // echo "

"; } function mySort($virtualslotorder) { $auxorder = array(); for ($i=0; $i $infoactual[1]) { $indexinsert = $j; $found = true; } else if ($infoaux[1] == $infoactual[1]) { // DEBUG: // echo "Infoaux: "; print_r($infoaux); echo "/ Infoactual: "; print_r($infoactual); // en cas d'empat, si és són del mateix grade i del mateix nivell o el Receiver té més grade, // el receiver té prioritat sobre el qualsevol slot, excepte el Theme, si no és pseudoimpersonal if (strpos($infoaux[0], "Receiver") === 0 && !($infoaux[3] == 2 && (strpos($infoactual[0], "Subject 1") === 0)) && !($infoaux[2] == "opt" && $infoactual[2] == '1') && !(strpos($infoactual[0], "Theme") === 0) && !$this->pseudoimpersonal) { $indexinsert = $j; $found = true; } // els slots secundaris tenen preferència sobre els de primer nivell // menys si és el subjecte else if (strpos($infoaux[0], "2") != 0 && !(strpos($infoactual[0], "Subject") === 0) && !$this->pseudoimpersonal) { $indexinsert = $j; $found = true; } // si és pseudoimpersonal el Receiver 1 té més importància que els slots de segon nivell else if ($this->pseudoimpersonal && strpos($infoaux[0], "Receiver") === 0 && strpos($infoactual[0], "2") != 0) { $indexinsert = $j; $found = true; } } } $j++; } array_splice($auxorder, $indexinsert, 0, array($infoaux)); // construim l'array ordenat } $this->virtualslotsort = $auxorder; } // Per quan una paraula només fa fit a 1 slot (no NC, ADJ, ADV, MOD) function chainBlockingSlotsType1($word, $stringCMP) { if (count($word->slotstemps) == 1) { $slotkey = $word->slotstemps[0]; $word->slotfinal = $slotkey; $word->slotstemps = array(); // esborrem el llistat d'slots // DEBUG // echo $word->text; if (isset($this->slotarray[$slotkey])) { // si trobem l'slot dins el pattern. Els NC no es troben // però com que se'n crea un per paraula, ja estan tractats $slotaux = $this->slotarray[$slotkey]; if (!$slotaux->full) { // si no ha estat ja tractat // Passem la paraula com a final de l'slot (+ tot el que calgui) i bloquegem l'slot $indexinslot = $slotaux->searchIndexWordInSlot($word); $penalty = $slotaux->paraulestemp[$indexinslot][1]; $indexclassfinalword = $slotaux->paraulestemp[$indexinslot][2]; $this->forceFillSlot($slotkey, $word, $penalty, $indexclassfinalword); // Esborrem la paraula del llistat temporal i reiniciem els index de l'array de paraulestemp // unset($slotaux->paraulestemp[$indexinslot]); array_splice($slotaux->paraulestemp, $indexinslot, 1); // $slotaux->paraulestemp = array_values($slotaux->paraulestemp); $wordaux; // per cada paraula que hi havia al llistat temporal for ($i=0; $iparaulestemp); $i++) { $wordaux = $slotaux->paraulestemp[$i][0]; // Buscar l'slot, esborrar l'slot i fer chainblocking de la paraula $indexslot = $wordaux->searchSlotIndex($slotkey); if ($indexslot != -1) { array_splice($wordaux->slotstemps, $indexslot, 1); // $wordaux->slotstemps = array_values($wordaux->slotstemps); $this->chainBlockingSlotsType1($wordaux, $stringCMP); } } } } else if ($stringCMP == "NC") { // si era de NC $word->used = true; $keyparent = null; $auxstring = explode(" ", $slotkey); // agafem el key de l'slot que podia tenir el NC $numpartskeycompl = count($auxstring); if ($numpartskeycompl > 0) { // per si el compl era d'un slot de 2on nivell if ($numpartskeycompl == 4) $keyparent = $auxstring[0].$auxstring[1]; else $keyparent = $auxstring[0]; } if ($keyparent != null) { // indiquem que ara l'slot superior té un NC assignat $this->slotarray[$keyparent]->NCassigned = true; $this->slotarray[$keyparent]->NCassignedkey = $slotkey; } } } } // Per quan una paraula podia anar a varis slots i un és el seleccionat com a millor opció function chainBlockingSlotsType2($word) { } /*function disambiguateSlots($arraySlots, $stringCMP) { foreach ($arraySlots as $keyslot => $slot) { $indexselect = -1; $penalty = 1000; if (!$slot->full && count($slot->paraulestemp) > 0) { // per cada paraula que podia anar a l'slot busquem la que fa millor fit for ($i=0; $iparaulestemp); $i++) { if ($slot->paraulestemp[$i][1] < $penalty) { $penalty = $slot->paraulestemp[$i][1]; $indexselect = $i; } // si dues paraules estan empatades i omplen igual de bé l'slot else if ($slot->paraulestemp[$i][1] == $penalty) { if ($slot->category != "Subjecte") { // si l'slot no és de categoria subjecte if (!$slot->paraulestemp[$i][0]->beforeverb && $slot->paraulestemp[$indexselect][0]->beforeverb) { $penalty = $slot->paraulestemp[$i][1]; $indexselect = $i; } // potser no cal xq les paraules han estat introduïdes en ordre als slots else if ($slot->paraulestemp[$i][0]->inputorder < $slot->paraulestemp[$indexselect][0]->inputorder) { $penalty = $slot->paraulestemp[$i][1]; $indexselect = $i; } } else { // si és de categoria subjecte // només fem el canvi si la nova és before verb i l'altre no if ($slot->paraulestemp[$i][0]->beforeverb && !$slot->paraulestemp[$indexselect][0]->beforeverb) { $penalty = $slot->paraulestemp[$i][1]; $indexselect = $i; } } } } // Ja tenim la paraula seleccionada $wordaux = $slot->paraulestemp[$indexselect][0]; $this->forceFillSlot($keyslot, $wordaux, $slot->paraulestemp[$indexselect][1], $slot->paraulestemp[$indexselect][2]); // esborrem la paraula del llistat de paraulestemp de l'slot array_splice($slot->paraulestemp, $indexselect, 1); // esborrem l'slot del llistat d'slots temps de la paraula $indexslotaux = $wordaux->searchSlotIndex($keyslot); if ($indexslotaux != -1) array_splice($wordaux->slotstemps, $indexslotaux, 1); // per la resta d'slots que quedin esborrem la paraula del llistat de paraulestemp for ($i=0; $islotstemps); $i++) { $keyaux = $wordaux->slotstemps[$i]; // Si no és de tipus NC que tractarem més endavant if (!strpos($keyaux, $stringCMP)) { $slotaux = $this->slotarray[$keyaux]; $indexinslot = $slotaux->searchIndexWordInSlot($wordaux); // esborrem la paraula seleccionada if ($indexinslot != -1) array_splice($slotaux->paraulestemp, $indexinslot, 1); } } // per la resta de paraules que podien anar a l'slot esborrem l'slot del llistat de slotstemps for ($i=0; $iparaulestemp); $i++) { $wordaux2 = $slot->paraulestemp[$i][0]; $indexslotaux2 = $wordaux2->searchSlotIndex($keyslot); if ($indexslotaux2 != -1) array_splice($wordaux2->slotstemps, $indexslotaux2, 1); } } // Fi si l'slot no estava ja ple i almenys tenia alguna paraula que podia fer fit } // Fi de per cada slot } */ function disambiguateSlotsNew($stringCMP) { $CI = &get_instance(); // agafem el tipus d'idioma, ja que per desambiguar si l'idioma és svo // les paraules que vagin abans del verb tindran punts extra per fer de subjecte // i les que vagin darrere per fer dels altres slots $langtype = $CI->session->userdata('uinterfacelangtype'); $svo = true; if ($langtype != 'svo') $svo = false; $numslots = count($this->virtualslotsort); $slotsleft = true; if ($numslots == 0) $slotsleft = false; while ($slotsleft) { // DEBUG // echo "Pattern id ".$this->id.": "; // print_r($this->virtualslotsort); echo '
'; $infoslot = $this->virtualslotsort[0]; $keyslot = $infoslot[0]; $slot = $this->slotarray[$keyslot]; $indexselect = -1; $penalty = 1000; if (!$slot->full && count($slot->paraulestemp) > 0) { // per cada paraula que podia anar a l'slot busquem la que fa millor fit for ($i=0; $iparaulestemp); $i++) { // si la paraula no ha estat ja utilitzada if (!$slot->paraulestemp[$i][0]->used) { if ($slot->paraulestemp[$i][1] < $penalty) { $penalty = $slot->paraulestemp[$i][1]; $indexselect = $i; } // si dues paraules estan empatades i omplen igual de bé l'slot else if ($slot->paraulestemp[$i][1] == $penalty) { // si l'idioma té estructura SVO if ($svo) { if ($slot->category != "Subjecte") { // si l'slot no és de categoria subjecte if (!$slot->paraulestemp[$i][0]->beforeverb && $slot->paraulestemp[$indexselect][0]->beforeverb) { $penalty = $slot->paraulestemp[$i][1]; $indexselect = $i; } // potser no cal xq les paraules han estat introduïdes en ordre als slots else if ($slot->paraulestemp[$i][0]->inputorder < $slot->paraulestemp[$indexselect][0]->inputorder) { $penalty = $slot->paraulestemp[$i][1]; $indexselect = $i; } } else { // si és de categoria subjecte // només fem el canvi si la nova és before verb i l'altre no if ($slot->paraulestemp[$i][0]->beforeverb && !$slot->paraulestemp[$indexselect][0]->beforeverb) { $penalty = $slot->paraulestemp[$i][1]; $indexselect = $i; } } } // si no té estructura SVO else { // es quedarà amb la primera paraula que podia fer fit a l'slot if ($slot->paraulestemp[$i][0]->inputorder < $slot->paraulestemp[$indexselect][0]->inputorder) { $penalty = $slot->paraulestemp[$i][1]; $indexselect = $i; } } } } } if ($indexselect == -1 ) $indexselect = 0; // Ja tenim la paraula seleccionada $wordaux = $slot->paraulestemp[$indexselect][0]; $this->forceFillSlot($keyslot, $wordaux, $slot->paraulestemp[$indexselect][1], $slot->paraulestemp[$indexselect][2]); // esborrem la paraula del llistat de paraulestemp de l'slot array_splice($slot->paraulestemp, $indexselect, 1); // esborrem l'slot del llistat d'slots temps de la paraula $indexslotaux = $wordaux->searchSlotIndex($keyslot); if ($indexslotaux != -1) array_splice($wordaux->slotstemps, $indexslotaux, 1); // per la resta d'slots que quedin esborrem la paraula del llistat de paraulestemp for ($i=0; $islotstemps); $i++) { $keyaux = $wordaux->slotstemps[$i]; // Si no és de tipus NC que tractarem més endavant if (!strpos($keyaux, $stringCMP)) { $slotaux = $this->slotarray[$keyaux]; $indexinslot = $slotaux->searchIndexWordInSlot($wordaux); // esborrem la paraula seleccionada if ($indexinslot != -1) array_splice($slotaux->paraulestemp, $indexinslot, 1); } } // per la resta de paraules que podien anar a l'slot esborrem l'slot del llistat de slotstemps for ($i=0; $iparaulestemp); $i++) { $wordaux2 = $slot->paraulestemp[$i][0]; $indexslotaux2 = $wordaux2->searchSlotIndex($keyslot); if ($indexslotaux2 != -1) array_splice($wordaux2->slotstemps, $indexslotaux2, 1); } $slot->paraulestemp = array(); // eliminem totes les paraules que podien anar a l'slot } // Fi si l'slot no estava ja ple i almenys tenia alguna paraula que podia fer fit // recalculem la preferència dels slots $this->calculateVirtualOrder(); if (count($this->virtualslotsort) == 0) $slotsleft = false; } // Fi de per cada slot } public function calcPuntsFinalPattern() { // ens diu si una paraula introduïda no s'ha utilitzat al patró $paraulanoposada = false; foreach ($this->slotarray as $slot) { if ($slot->full) { // compensem que si un slot obligatori és un perfect fill, que el triï sobre un slot opt d'un altre patró if ($slot->grade == '1' && $slot->puntsfinal == 0) $this->puntuaciofinal += 1; else $this->puntuaciofinal -= $slot->puntsfinal; // echo $slot->category.": ".$slot->puntsfinal." (".$slot->paraulafinal->text.')
'; // punts de coordinacions $wordaux = $slot->paraulafinal; if (count($wordaux->paraulacoord) > 0) $this->puntuaciofinal += 7; if ($slot->NCassigned) { $slotcomp = $slot->complements[$slot->NCassignedkey]; $this->puntuaciofinal += $slotcomp->puntsfinal; // echo $slot->NCassignedkey.": ".$slotcomp->puntsfinal.'
'; // punts de coordinacions $wordaux = $slotcomp->paraulafinal; if ($wordaux->paraulacoord != null) $this->puntuaciofinal += 7; } if ($slot->CAdvassigned) { $slotcomp = $slot->cmpAdvs[$slot->CAdvassignedkey]; $this->puntuaciofinal += $slotcomp->puntsfinal; // echo $slot->CAdvassignedkey.": ".$slotcomp->puntsfinal.'
'; // punts de coordinacions $wordaux = $slotcomp->paraulafinal; if (count($wordaux->paraulacoord) > 0) $this->puntuaciofinal += 7; } if ($slot->CAdjassigned) { $slotcomp = $slot->cmpAdjs[$slot->CAdjassignedkey]; $this->puntuaciofinal += $slotcomp->puntsfinal; // echo $slot->CAdjassignedkey.": ".$slotcomp->puntsfinal.'
'; // punts de coordinacions $wordaux = $slotcomp->paraulafinal; if (count($wordaux->paraulacoord) > 0) $this->puntuaciofinal += 7; } if ($slot->CModassigned) { // un slot pot tenir varis modificadors assignats foreach ($slot->CModassignedkey as $keymod) { $slotcomp = $slot->cmpMod[$keymod]; $this->puntuaciofinal += $slotcomp->puntsfinal; // punts de coordinacions $wordaux = $slotcomp->paraulafinal; if (count($wordaux->paraulacoord) > 0) $this->puntuaciofinal += 7; } } // sumem les expressions de temps (advs) $numtemps = count($this->timeexpr); for ($i=0; $i<$numtemps; $i++) $this->puntuaciofinal += 7; $numexprs = count($this->exprsarray); // si necessitava una expressió i no hi és, li restem 25 punts if ($this->needexpr && $numexprs == 0) $this->puntuaciofinal -= 25; // si no, sumem 1 punt per expressió else { for ($i=0; $i<$numexprs; $i++) $this->puntuaciofinal += 1; } } else { // restem els punts dels slots no plens // els optatius de time, manera, locat, locfrom que la majoria poden tenir no els restem // perquè si no els patterns amb pocs slots, que no els tenen tindrien avantatge if ($slot->grade == '1' || ($slot->category != "Manner" && $slot->category != "Time" && $slot->category != "LocAt" && $slot->category != "LocFrom" && $slot->category != "Company" && $slot->category != "Tool")) { $this->puntuaciofinal -= $slot->puntsfinal; // echo $slot->category.": -".$slot->puntsfinal.'
'; } // que resti un punt pels slots anteriors no plens else if ($slot->category == "Company" || $slot->category == "Tool") { $this->puntuaciofinal -= 1; } } } // Fi per cada slot // restem els punts de les paraules no fetes servir (les expressions no conten i // les preguntes tampoc (aquestes ja es tracten prèviament si no hi ha lloc per la // partícula de la pregunta) for ($i=0; $iparaules); $i++) { if ($this->paraules[$i]->used == false && $this->paraules[$i]->tipus != "expression" && $this->paraules[$i]->tipus != "questpart") { $this->puntuaciofinal -= 25; $paraulanoposada = true; } } // retorna un array on [0] = puntuaciofinal i [1] = si no ha pogut posar alguna paraula $aux = array(); $aux[0] = $this->puntuaciofinal; $aux[1] = $paraulanoposada; return $aux; } // Imprimir el pattern public function printPattern() { $string = ""; $string = "+++++++++++BEGIN PATTERN+++++++++++++

"; $string .= "Score: ".$this->puntuaciofinal.' --> Pattern ID: '.$this->id.'

'; foreach ($this->slotarray as $keyslot => $slot) { if ($slot->full) { $string .= "Slot: ".$keyslot." = ".$slot->paraulafinal->text; // tractem les coordinacions $wordaux = $slot->paraulafinal; if (count($wordaux->paraulacoord) > 0) { for ($k=0; $kparaulacoord); $k++) { $string .= " (i ".$wordaux->paraulacoord[$k]->text.")"; } } if ($slot->NCassigned) { $slotcomp = $slot->complements[$slot->NCassignedkey]; $string .= " --> NC = ".$slotcomp->paraulafinal->text; // tractem les coordinacions $wordaux = $slotcomp->paraulafinal; if (count($wordaux->paraulacoord) > 0) { for ($k=0; $kparaulacoord); $k++) { $string .= " (i ".$wordaux->paraulacoord[$k]->text.")"; } } } if ($slot->CAdvassigned) { $slotcomp = $slot->cmpAdvs[$slot->CAdvassignedkey]; $string .= " --> ADV = ".$slotcomp->paraulafinal->text; // tractem les coordinacions $wordaux = $slotcomp->paraulafinal; if (count($wordaux->paraulacoord) > 0) { for ($k=0; $kparaulacoord); $k++) { $string .= " (i ".$wordaux->paraulacoord[$k]->text.")"; } } } if ($slot->CAdjassigned) { $slotcomp = $slot->cmpAdjs[$slot->CAdjassignedkey]; $string .= " --> ADJ = ".$slotcomp->paraulafinal->text; // tractem les coordinacions $wordaux = $slotcomp->paraulafinal; if (count($wordaux->paraulacoord) > 0) { for ($k=0; $kparaulacoord); $k++) { $string .= " (i ".$wordaux->paraulacoord[$k]->text.")"; } } } if ($slot->CModassigned) { // un slot pot tenir varis modificadors assignats foreach ($slot->CModassignedkey as $keymod) { $slotcomp = $slot->cmpMod[$keymod]; $string .= " --> MOD = ".$slotcomp->paraulafinal->text; // tractem les coordinacions $wordaux = $slotcomp->paraulafinal; if (count($wordaux->paraulacoord) > 0) { for ($k=0; $kparaulacoord); $k++) { $string .= " (i ".$wordaux->paraulacoord[$k]->text.")"; } } } } $string .= "

"; } } // escrivim els adverbis de temps $numtemps = count($this->timeexpr); if ($numtemps > 0) { $string .= "Slot: Time Expr = "; for ($i=0; $i<$numtemps; $i++) { $string .= $this->timeexpr[$i]->text."; "; } $string .= '

'; } // escrivim les expressions $numexpr = count($this->exprsarray); if ($numexpr > 0) { $string .= "Slot: Expressions = "; for ($i=0; $i<$numexpr; $i++) { $string .= $this->exprsarray[$i][0]."; "; } $string .= '

'; } $string .= "+++++++++++END PATTERN++++++++++++++
"; return $string; } public function printAllPattern() { // PER DEBUG echo "
++++++++++++++++++++BEGIN PATTERN+++++++++++++++++++++++

"; foreach ($this->slotarray as $keyslot => $slot) { echo "Slot: ".$keyslot." = ".$slot->puntsfinal.' / '.$slot->puntsguanyats; if ($slot->full) echo " FULL"; if (count($slot->cmpAdjs) > 0) { foreach ($slot->cmpAdjs as $slotcomp) { echo " --> ADJ = ".$slotcomp->paraulafinal->text; } } echo "

"; } echo "++++++++++++++++++++END PATTERN++++++++++++++++++++++++


"; } /* * FUNCIONS PEL GENERADOR */ // Ordena els slots de la frase: ÉS EL PRIMER PAS DEL GENERADOR public function ordenarSlotsFrase($propietatsfrase) { $CI = &get_instance(); $CI->load->library('Mymatching'); $CI->load->library('Myslot'); $CI->load->library('Myword'); $matching = new Mymatching(); //agafem si l'usuari parla en masculí o en femení pel generador if ($CI->session->userdata('isfem') == '1') $this->isfem = true; // agafem si la frase és negativa $this->frasenegativa = $propietatsfrase['negativa']; // ADVS TEMPS // mirar adverbis de temps, per si n'hi ha dels que van a davant de la frase $numadvstemps = count($this->timeexpr); for ($i=0; $i<$numadvstemps; $i++) { $wordaux = $this->timeexpr[$i]; if ($matching->isFrontAdvTemps($wordaux->text)) { // el posem davant de la frase $this->frasefinal .= $wordaux->text." "; } } // SI SUBJ2 == JO -> SUBJ2 = SUBJ1 // si hi ha subverb i el subjecte 2 no està definit, si el defvalue era "jo", que el subj2 s'ompli // amb el subj1 (defvalue o word que fa fill) if ($this->subverb) { if (isset($this->slotarray["Subject 2"])) { if (!$this->slotarray["Subject 2"]->full && $this->slotarray["Subject 2"]->defvalue == '1') { // si el subj1 tindrà un defvalue assignat passem aquest valor al subj2 if (isset($this->slotarray["Subject 1"]) && !$this->slotarray["Subject 1"]->full) { $this->slotarray["Subject 2"]->defvalue = $this->slotarray["Subject 1"]->defvalue; } // si el subj 1 té una paraula que l'omple, passem la paraula al subj2 else if (isset($this->slotarray["Subject 1"])) { $this->slotarray["Subject 2"]->full = true; $this->slotarray["Subject 2"]->paraulafinal = $this->slotarray["Subject 1"]->paraulafinal; $this->slotarray["Subject 2"]->indexclassfinalword = $this->slotarray["Subject 1"]->indexclassfinalword; } } } } // ORDRE NORMAL $counter = 0; $indexmainverb = 0; $indexsecondaryverb = null; $indexpartpregunta = null; // posem tots els slots en l'ordre normal foreach ($this->slotarray as $keyslot => $slot) { if ($slot->full || $slot->grade == '1') { // si no estava ple, vol dir que era un obligatori i l'omplim amb el valor per defecte if (!$slot->full) { // si la frase és una ordre o una pregunta, el subj per defecte passa a ser "tu" if (($propietatsfrase['tipusfrase'] == "ordre" || $propietatsfrase['tipusfrase'] == "pregunta") && $slot->category == "Subject" && $slot->level == 1) { $slot->defvalue = '2'; } $slot->full = true; $slot->defvalueused = true; } // busquem si hi ha una partícula de pregunta, que només poden ser a slots plens else { if ($slot->category == "PartPreguntaNoSlot" || $slot->paraulafinal->tipus == "questpart") { $indexpartpregunta = $counter; } } if ($slot->category == "Main Verb") $indexmainverb = $counter; if ($slot->category == "Secondary Verb") $indexsecondaryverb = $counter; $this->ordrefrase[] = $keyslot; $counter += 1; } } // MODIFICADORS INICI DE FRASE // tractem els modificadors de frase que estan enganxats al verb principal $keymainverb = "Main Verb"; if (isset($this->slotarray["Secondary Verb 2"])) $keymainverb .= " 1"; $slotmainverb = $this->slotarray[$keymainverb]; $nummodifsfrase = count($slotmainverb->CModassignedkey); for ($i=0; $i<$nummodifsfrase; $i++) { $keymodifaux = $slotmainverb->CModassignedkey[$i]; $slotmodifaux = $slotmainverb->cmpMod[$keymodifaux]; // si no és del grup que va darrere el subjecte el posem al principi de la frase (ex: si, perquè, però) if (!$matching->isModAfterSubj($slotmodifaux->paraulafinal->text)) { $this->frasefinal = " ".$slotmodifaux->paraulafinal->text." ".$this->frasefinal; } // marquem si la frase és negativa pel modificador no else if ($slotmodifaux->paraulafinal->text == "no") $this->frasenegativa = true; } // THEME PRONOMINAL HO, JO, TU $indextheme1 = null; $indextheme2 = null; // busquem si té un slot de theme que sigui pronominal "ho", "jo", "tu" for($i=0; $iordrefrase); $i++) { $slotaux = $this->slotarray[$this->ordrefrase[$i]]; if ($slotaux->category == "Theme") { // si està en forma de pronom if ($slotaux->defvalueused && ($slotaux->defvalue == "ho" || $slotaux->defvalue == "jo" || $slotaux->defvalue == "tu")) { if ($slotaux->level == 1) $indextheme1 = $i; if ($slotaux->level == 2) $indextheme2 = $i; } } } if ($indextheme1 != null) { $temp = $this->ordrefrase[$indextheme1]; // esborrem el theme 1 per moure'l de lloc array_splice($this->ordrefrase, $indextheme1, 1); // si la frase és un ordre i no és negativa if ($propietatsfrase['tipusfrase'] == "ordre" && !$this->frasenegativa) { // l'insertem just després del main verb array_splice($this->ordrefrase, $indexmainverb+1, 0, $temp); } else { // l'insertem just abans del main verb array_splice($this->ordrefrase, $indexmainverb, 0, $temp); } } // fem el mateix amb el theme 2, si hi és if ($indextheme2 != null) { $temp = $this->ordrefrase[$indextheme2]; // esborrem el theme 1 per moure'l de lloc array_splice($this->ordrefrase, $indextheme2, 1); // l'insertem just abans del verb secundari array_splice($this->ordrefrase, $indexsecondaryverb, 0, $temp); } // RECEIVER PRONOMINAL // anirà abans que un theme pronominal, per això va després a l'algoritme $indexreceiver1 = null; $indexreceiver2 = null; // busquem si té un slot de receiver que sigui pronominal i el posem abans del verb principal for($i=0; $iordrefrase); $i++) { $slotaux = $this->slotarray[$this->ordrefrase[$i]]; if ($slotaux->category == "Receiver") { $wordslotauxfinal = $slotaux->paraulafinal; // si està en forma de pronom (només de tu, jo) if ($slotaux->defvalueused || $wordslotauxfinal->isClass("pronoun")) { if ($slotaux->level == 1) $indexreceiver1 = $i; if ($slotaux->level == 2) $indexreceiver2 = $i; } } } if ($indexreceiver1 != null) { $temp = $this->ordrefrase[$indexreceiver1]; // esborrem el receiver 1 per moure'l de lloc array_splice($this->ordrefrase, $indexreceiver1, 1); // si la frase és un ordre if ($propietatsfrase['tipusfrase'] == "ordre" && !$this->frasenegativa) { // l'insertem just després del main verb array_splice($this->ordrefrase, $indexmainverb+1, 0, $temp); } else { // l'insertem just abans del main verb array_splice($this->ordrefrase, $indexmainverb, 0, $temp); } } // fem el mateix amb el receiver 2, si hi és if ($indexreceiver2 != null) { $temp = $this->ordrefrase[$indexreceiver2]; // esborrem el receiver 1 per moure'l de lloc array_splice($this->ordrefrase, $indexreceiver2, 1); // l'insertem just abans del verb secundari array_splice($this->ordrefrase, $indexsecondaryverb, 0, $temp); } // THEME PRONOMINAL -> JO / TU / ELL... si no té una preposició davant $indextheme1 = null; $indextheme2 = null; // busquem si té un slot de theme que sigui pronominal i el posem abans del verb principal for($i=0; $iordrefrase); $i++) { $slotaux = $this->slotarray[$this->ordrefrase[$i]]; if ($slotaux->category == "Theme" && $slotaux->prep == null) { $wordslotauxfinal = $slotaux->paraulafinal; // si està en forma de pronom if (!$slotaux->defvalueused && $wordslotauxfinal->isClass("pronoun")) { if ($slotaux->level == 1) $indextheme1 = $i; if ($slotaux->level == 2) $indextheme2 = $i; } } } if ($indextheme1 != null) { $temp = $this->ordrefrase[$indextheme1]; // esborrem el receiver 1 per moure'l de lloc array_splice($this->ordrefrase, $indextheme1, 1); // si la frase és un ordre if ($propietatsfrase['tipusfrase'] == "ordre" && !$this->frasenegativa) { // l'insertem just després del main verb array_splice($this->ordrefrase, $indexmainverb+1, 0, $temp); } else { // l'insertem just abans del main verb array_splice($this->ordrefrase, $indexmainverb, 0, $temp); } } // fem el mateix amb el receiver 2, si hi és if ($indextheme2 != null) { $temp = $this->ordrefrase[$indextheme2]; // esborrem el receiver 1 per moure'l de lloc array_splice($this->ordrefrase, $indextheme2, 1); // l'insertem just abans del verb secundari array_splice($this->ordrefrase, $indexsecondaryverb, 0, $temp); } // DESIRE // si és un desig afegir el verb voler a un slot Desire if ($propietatsfrase['tipusfrase'] == "desig") { $slotvoler = new Myslot(); $slotvoler->category = "Desire"; $slotvoler->type = "verb"; $slotvoler->full = true; $slotvoler->level = 0; $auxtupla[0] = "vull"; $auxtupla[1] = null; $slotvoler->slotstring[] = $auxtupla; $this->slotarray["Desire"] = $slotvoler; array_unshift($this->ordrefrase, "Desire"); // afegir si us plau: de moment NO // $aux = array(); // $aux[0] = "si us plau"; // $aux[1] = '0'; // $this->exprsarray[] = $aux; } // PERMISSION // si és un permís afegir el verb poder a un slot Permission if ($propietatsfrase['tipusfrase'] == "permis") { $slotpoder = new Myslot(); $slotpoder->category = "Permission"; $slotpoder->type = "verb"; $slotpoder->full = true; $slotpoder->level = 0; $auxtupla[0] = "puc"; $auxtupla[1] = null; $slotpoder->slotstring[] = $auxtupla; $this->slotarray["Permission"] = $slotpoder; array_unshift($this->ordrefrase, "Permission"); // afegir si us plau $aux = array(); $aux[0] = "si us plau"; $aux[1] = '0'; $this->exprsarray[] = $aux; } // CONDITIONAL PHRASE // si és una frsse condicional, afegim el "si" a davant (però darrere els advs de temps // i modificadors de frase que vagin a l'inici de frase) if ($propietatsfrase['tipusfrase'] == "condicional") { $this->frasefinal .= "si "; } // QUESTION PARTICLE // si hi ha una partícula de pregunta, posem el seu slot a davant de tot if ($indexpartpregunta != null) { $temp = $this->ordrefrase[$indexpartpregunta]; // esborrem l'slot de la part pregunta per moure'l de lloc array_splice($this->ordrefrase, $indexpartpregunta, 1); // l'insertem a l'inici de la frase array_splice($this->ordrefrase, 0, 0, $temp); } // SI HI HA UNA PREGUNTA DE "QUANT" if (isset($this->slotarray["PartPreguntaNoSlot"])) { if ($this->slotarray["PartPreguntaNoSlot"]->paraulafinal->text == "quant") { // si hi ha dos verbs a la frase, només passem el theme 2 davant del subjecte if (isset($this->slotarray["Secondary Verb 2"])) { $indexsubject1 = -1; $indextheme2 = -1; for ($i=0; $iordrefrase); $i++) { if ($this->ordrefrase[$i] == "Theme 2") $indextheme2 = $i; if ($this->ordrefrase[$i] == "Subject 1") $indexsubject1 = $i; } // pot ser que el verb no tingués theme 2, tot i que el "quant" aleshores no // tindria sentit if ($indexsubject1 != -1 && $indextheme2 != -1) { $temp = $this->ordrefrase[$indextheme2]; // esborrem l'slot del theme per moure'l de lloc array_splice($this->ordrefrase, $indextheme2, 1); // l'insertem a l'inici de la frase array_splice($this->ordrefrase, $indexsubject1, 0, $temp); $this->questiontypequant = true; } } // si només hi ha un verb, fem swap de theme i subject else { $indexsubject = -1; $indextheme = -1; for ($i=0; $iordrefrase); $i++) { if ($this->ordrefrase[$i] == "Theme") $indextheme = $i; if ($this->ordrefrase[$i] == "Subject") $indexsubject = $i; } // si tenia subjecte i theme if ($indexsubject != -1 && $indextheme != -1) { $auxslotname = $this->ordrefrase[$indexsubject]; // guardem el subj // posem el theme al subj $this->ordrefrase[$indexsubject] = $this->ordrefrase[$indextheme]; // i el subj guardat al theme $this->ordrefrase[$indextheme] = $auxslotname; $this->questiontypequant = true; } } } } // SI HI HA QUALSEVOL ALTRA PREGUNTA: passem el subjecte al final de la frase else if ($indexpartpregunta != null) { $indexsubject1 = -1; if (isset($this->slotarray["Secondary Verb 2"])) { for ($i=0; $iordrefrase); $i++) { if ($this->ordrefrase[$i] == "Subject 1") $indexsubject1 = $i; } } else { for ($i=0; $iordrefrase); $i++) { if ($this->ordrefrase[$i] == "Subject") $indexsubject1 = $i; } } if ($indexsubject1 != -1) { $temp = $this->ordrefrase[$indexsubject1]; // esborrem l'slot del subjecte per moure'l de lloc array_splice($this->ordrefrase, $indexsubject1, 1); // l'insertem al final de la frase $this->ordrefrase[] = $temp; } } // IMPERATIVE if ($propietatsfrase['tipusfrase'] == "ordre" && !$this->frasenegativa) { // afegir si us plau $aux = array(); $aux[0] = "si us plau"; $aux[1] = '0'; $this->exprsarray[] = $aux; } // DEBUG // echo $this->printOrdreFrase()."

"; } // Ordena els slots de la frase: ÉS EL PRIMER PAS DEL GENERADOR public function ordenarSlotsFraseES($propietatsfrase) { $CI = &get_instance(); $CI->load->library('Mymatching'); $CI->load->library('Myslot'); $CI->load->library('Myword'); $matching = new Mymatching(); // agafem si la frase és negativa $this->frasenegativa = $propietatsfrase['negativa']; //agafem si l'usuari parla en masculí o en femení pel generador if ($CI->session->userdata('isfem') == '1') $this->isfem = true; // ADVS TEMPS // mirar adverbis de temps, per si n'hi ha dels que van a davant de la frase $numadvstemps = count($this->timeexpr); for ($i=0; $i<$numadvstemps; $i++) { $wordaux = $this->timeexpr[$i]; if ($matching->isFrontAdvTempsES($wordaux->text)) { // el posem davant de la frase $this->frasefinal .= $wordaux->text." "; } } // SI SUBJ2 == JO -> SUBJ2 = SUBJ1 // si hi ha subverb i el subjecte 2 no està definit, si el defvalue era "jo", que el subj2 s'ompli // amb el subj1 (defvalue o word que fa fill) if ($this->subverb) { if (isset($this->slotarray["Subject 2"])) { if (!$this->slotarray["Subject 2"]->full && $this->slotarray["Subject 2"]->defvalue == '1') { // si el subj1 tindrà un defvalue assignat passem aquest valor al subj2 if (isset($this->slotarray["Subject 1"]) && !$this->slotarray["Subject 1"]->full) { $this->slotarray["Subject 2"]->defvalue = $this->slotarray["Subject 1"]->defvalue; } // si el subj 1 té una paraula que l'omple, passem la paraula al subj2 else if (isset($this->slotarray["Subject 1"])) { $this->slotarray["Subject 2"]->full = true; $this->slotarray["Subject 2"]->paraulafinal = $this->slotarray["Subject 1"]->paraulafinal; $this->slotarray["Subject 2"]->indexclassfinalword = $this->slotarray["Subject 1"]->indexclassfinalword; } } } } // ORDRE NORMAL $counter = 0; $indexmainverb = 0; $indexsecondaryverb = null; $indexpartpregunta = null; // posem tots els slots en l'ordre normal foreach ($this->slotarray as $keyslot => $slot) { if ($slot->full || $slot->grade == '1') { // si no estava ple, vol dir que era un obligatori i l'omplim amb el valor per defecte if (!$slot->full) { // si la frase és una ordre o una pregunta, el subj per defecte passa a ser "tu" if (($propietatsfrase['tipusfrase'] == "ordre" || $propietatsfrase['tipusfrase'] == "pregunta") && $slot->category == "Subject" && $slot->level == 1) { $slot->defvalue = '2'; } $slot->full = true; $slot->defvalueused = true; } // busquem si hi ha una partícula de pregunta, que només poden ser a slots plens else { if ($slot->category == "PartPreguntaNoSlot" || $slot->paraulafinal->tipus == "questpart") { $indexpartpregunta = $counter; } } if ($slot->category == "Main Verb") $indexmainverb = $counter; if ($slot->category == "Secondary Verb") $indexsecondaryverb = $counter; $this->ordrefrase[] = $keyslot; $counter += 1; } } // MODIFICADORS INICI DE FRASE // tractem els modificadors de frase que estan enganxats al verb principal $keymainverb = "Main Verb"; if (isset($this->slotarray["Secondary Verb 2"])) $keymainverb .= " 1"; $slotmainverb = $this->slotarray[$keymainverb]; $nummodifsfrase = count($slotmainverb->CModassignedkey); for ($i=0; $i<$nummodifsfrase; $i++) { $keymodifaux = $slotmainverb->CModassignedkey[$i]; $slotmodifaux = $slotmainverb->cmpMod[$keymodifaux]; // si no és del grup que va darrere el subjecte el posem al principi de la frase (ex: si, perquè, pero) if (!$matching->isModAfterSubjES($slotmodifaux->paraulafinal->text)) { $this->frasefinal = " ".$slotmodifaux->paraulafinal->text." ".$this->frasefinal; } /** * INFO LANGUAGE DEPENDENT!! */ // marquem si la frase és negativa pel modificador no else if ($slotmodifaux->paraulafinal->text == "no") $this->frasenegativa = true; } // THEME PRONOMINAL LO, TÚ, YO $indextheme1 = null; $indextheme2 = null; // busquem si té un slot de theme que sigui pronominal "lo", "tú", "yo" for($i=0; $iordrefrase); $i++) { $slotaux = $this->slotarray[$this->ordrefrase[$i]]; if ($slotaux->category == "Theme") { // si està en forma de pronom if ($slotaux->defvalueused && ($slotaux->defvalue == "lo" || $slotaux->defvalue == "tú" || $slotaux->defvalue == "yo")) { if ($slotaux->level == 1) $indextheme1 = $i; if ($slotaux->level == 2) $indextheme2 = $i; } } } if ($indextheme1 != null) { $temp = $this->ordrefrase[$indextheme1]; // esborrem el theme 1 per moure'l de lloc array_splice($this->ordrefrase, $indextheme1, 1); // si la frase és una ordre i no és negativa if ($propietatsfrase['tipusfrase'] == "ordre" && !$this->frasenegativa) { // l'insertem just després del main verb array_splice($this->ordrefrase, $indexmainverb+1, 0, $temp); } else { // l'insertem just abans del main verb array_splice($this->ordrefrase, $indexmainverb, 0, $temp); } } // fem el mateix amb el theme 2, si hi és if ($indextheme2 != null) { $temp = $this->ordrefrase[$indextheme2]; // esborrem el theme 2 per moure'l de lloc array_splice($this->ordrefrase, $indextheme2, 1); // l'insertem just abans del verb secundari array_splice($this->ordrefrase, $indexsecondaryverb, 0, $temp); } // RECEIVER PRONOMINAL // anirà abans que un theme pronominal, per això va després a l'algoritme $indexreceiver1 = null; $indexreceiver2 = null; // busquem si té un slot de receiver que sigui pronominal i el posem abans del verb principal for($i=0; $iordrefrase); $i++) { $slotaux = $this->slotarray[$this->ordrefrase[$i]]; if ($slotaux->category == "Receiver") { $wordslotauxfinal = $slotaux->paraulafinal; // si està en forma de pronom (només de tu, jo) if ($slotaux->defvalueused || $wordslotauxfinal->isClass("pronoun")) { if ($slotaux->level == 1) $indexreceiver1 = $i; if ($slotaux->level == 2) $indexreceiver2 = $i; } } } if ($indexreceiver1 != null) { $temp = $this->ordrefrase[$indexreceiver1]; // esborrem el receiver 1 per moure'l de lloc array_splice($this->ordrefrase, $indexreceiver1, 1); // si la frase és un ordre if ($propietatsfrase['tipusfrase'] == "ordre" && !$this->frasenegativa) { // l'insertem just després del main verb array_splice($this->ordrefrase, $indexmainverb+1, 0, $temp); } else { // l'insertem just abans del main verb array_splice($this->ordrefrase, $indexmainverb, 0, $temp); } } // fem el mateix amb el receiver 2, si hi és if ($indexreceiver2 != null) { $temp = $this->ordrefrase[$indexreceiver2]; // esborrem el receiver 1 per moure'l de lloc array_splice($this->ordrefrase, $indexreceiver2, 1); // l'insertem just abans del verb secundari array_splice($this->ordrefrase, $indexsecondaryverb, 0, $temp); } // THEME PRONOMINAL / Yo, tu, él, etc. si no té preposició, excepte "a" // si té la preposició "a" davant, farà el canvi, però no posarà la preposició $indextheme1 = null; $indextheme2 = null; // busquem si té un slot de theme que sigui pronominal i el posem abans del verb principal for($i=0; $iordrefrase); $i++) { $slotaux = $this->slotarray[$this->ordrefrase[$i]]; if ($slotaux->category == "Theme" && ($slotaux->prep == null || $slotaux->prep == "a")) { $wordslotauxfinal = $slotaux->paraulafinal; // si està en forma de pronom if (!$slotaux->defvalueused && $wordslotauxfinal->isClass("pronoun")) { if ($slotaux->level == 1) $indextheme1 = $i; if ($slotaux->level == 2) $indextheme2 = $i; } } } if ($indextheme1 != null) { $temp = $this->ordrefrase[$indextheme1]; // esborrem el theme 1 per moure'l de lloc array_splice($this->ordrefrase, $indextheme1, 1); // si la frase és un ordre if ($propietatsfrase['tipusfrase'] == "ordre" && !$this->frasenegativa) { // l'insertem just després del main verb array_splice($this->ordrefrase, $indexmainverb+1, 0, $temp); } else { // l'insertem just abans del main verb array_splice($this->ordrefrase, $indexmainverb, 0, $temp); } } // fem el mateix amb el theme 2, si hi és if ($indextheme2 != null) { $temp = $this->ordrefrase[$indextheme2]; // esborrem el theme 1 per moure'l de lloc array_splice($this->ordrefrase, $indextheme2, 1); // l'insertem just abans del verb secundari array_splice($this->ordrefrase, $indexsecondaryverb, 0, $temp); } // DESIRE // si és un desig afegir el verb voler a un slot Desire if ($propietatsfrase['tipusfrase'] == "desig") { $slotvoler = new Myslot(); $slotvoler->category = "Desire"; $slotvoler->type = "verb"; $slotvoler->full = true; $slotvoler->level = 0; $auxtupla[0] = "quiero"; $auxtupla[1] = null; $slotvoler->slotstring[] = $auxtupla; $this->slotarray["Desire"] = $slotvoler; array_unshift($this->ordrefrase, "Desire"); // afegir por favor: de moment NO // $aux = array(); // $aux[0] = "por favor"; // $aux[1] = '0'; // $this->exprsarray[] = $aux; } // PERMISSION // si és un permís afegir el verb poder a un slot Permission if ($propietatsfrase['tipusfrase'] == "permis") { $slotpoder = new Myslot(); $slotpoder->category = "Permission"; $slotpoder->type = "verb"; $slotpoder->full = true; $slotpoder->level = 0; $auxtupla[0] = "puedo"; $auxtupla[1] = null; $slotpoder->slotstring[] = $auxtupla; $this->slotarray["Permission"] = $slotpoder; array_unshift($this->ordrefrase, "Permission"); // afegir por favor $aux = array(); $aux[0] = "por favor"; $aux[1] = '0'; $this->exprsarray[] = $aux; } // CONDITIONAL PHRASE // si és una frsse condicional, afegim el "si" a davant (però darrere els advs de temps // i modificadors de frase que vagin a l'inici de frase) if ($propietatsfrase['tipusfrase'] == "condicional") { $this->frasefinal .= "si "; } // QUESTION PARTICLE // si hi ha una partícula de pregunta, posem el seu slot a davant de tot if ($indexpartpregunta != null) { $temp = $this->ordrefrase[$indexpartpregunta]; // esborrem l'slot de la part pregunta per moure'l de lloc array_splice($this->ordrefrase, $indexpartpregunta, 1); // l'insertem a l'inici de la frase array_splice($this->ordrefrase, 0, 0, $temp); } // SI HI HA UNA PREGUNTA DE "QUANT" if (isset($this->slotarray["PartPreguntaNoSlot"])) { if ($this->slotarray["PartPreguntaNoSlot"]->paraulafinal->text == "cuánto") { // si hi ha dos verbs a la frase, només passem el theme 2 davant del subjecte if (isset($this->slotarray["Secondary Verb 2"])) { $indexsubject1 = -1; $indextheme2 = -1; for ($i=0; $iordrefrase); $i++) { if ($this->ordrefrase[$i] == "Theme 2") $indextheme2 = $i; if ($this->ordrefrase[$i] == "Subject 1") $indexsubject1 = $i; } // pot ser que el verb no tingués theme 2, tot i que el "quant" aleshores no // tindria sentit if ($indexsubject1 != -1 && $indextheme2 != -1) { $temp = $this->ordrefrase[$indextheme2]; // esborrem l'slot del theme per moure'l de lloc array_splice($this->ordrefrase, $indextheme2, 1); // l'insertem a l'inici de la frase array_splice($this->ordrefrase, $indexsubject1, 0, $temp); $this->questiontypequant = true; } } // si només hi ha un verb, fem swap de theme i subject else { $indexsubject = -1; $indextheme = -1; for ($i=0; $iordrefrase); $i++) { if ($this->ordrefrase[$i] == "Theme") $indextheme = $i; if ($this->ordrefrase[$i] == "Subject") $indexsubject = $i; } // si tenia subjecte i theme if ($indexsubject != -1 && $indextheme != -1) { $auxslotname = $this->ordrefrase[$indexsubject]; // guardem el subj // posem el theme al subj $this->ordrefrase[$indexsubject] = $this->ordrefrase[$indextheme]; // i el subj guardat al theme $this->ordrefrase[$indextheme] = $auxslotname; $this->questiontypequant = true; } } } } // SI HI HA QUALSEVOL ALTRA PREGUNTA: passem el subjecte al final de la frase else if ($indexpartpregunta != null) { $indexsubject1 = -1; if (isset($this->slotarray["Secondary Verb 2"])) { for ($i=0; $iordrefrase); $i++) { if ($this->ordrefrase[$i] == "Subject 1") $indexsubject1 = $i; } } else { for ($i=0; $iordrefrase); $i++) { if ($this->ordrefrase[$i] == "Subject") $indexsubject1 = $i; } } if ($indexsubject1 != -1) { $temp = $this->ordrefrase[$indexsubject1]; // esborrem l'slot del subjecte per moure'l de lloc array_splice($this->ordrefrase, $indexsubject1, 1); // l'insertem al final de la frase $this->ordrefrase[] = $temp; } } // IMPERATIVE if ($propietatsfrase['tipusfrase'] == "ordre" && !$this->frasenegativa) { // afegir por favor $aux = array(); $aux[0] = "por favor"; $aux[1] = '0'; $this->exprsarray[] = $aux; } // DEBUG // echo $this->printOrdreFrase()."

"; } // Agafa la Persona, Gènere i número dels subjectes del pattern public function getPersGenNumSubjs() { $keysubj1 = "Subject"; $keysubj2 = null; $slotsubj1 = null; // als pseudoimpersonals que com a subj hi ha un subverb, no hi ha subj1 if (isset($this->slotarray["Secondary Verb 2"])) { $keysubj1 .= " 1"; $keysubj2 = "Subject 2"; } // si no hi ha subjecte i el verb és impersonal if(!isset($this->slotarray[$keysubj1]) && $this->impersonal) { $keysubj1 = "Theme"; } // agafem les dades del primer subjecte if (isset($this->slotarray[$keysubj1]) && $this->slotarray[$keysubj1]->full) { $slotsubj1 = $this->slotarray[$keysubj1]; // si hi ha el subjecte per defecte if ($slotsubj1->defvalueused) { $subj1 = $slotsubj1->defvalue; if ($subj1 == '1') { $this->perssubj1 = 1; if ($this->isfem) $this->genmascsubj1 = false; } else if ($subj1 == '2') $this->perssubj1 = 2; else $this->perssubj1 = 3; } // si el subjecte és una paraula // si hi ha una partícula de pregunta al subjecte o no hi havia slot subjecte // perquè era impersonal, no ha d'agafar-ne les propietats else if($slotsubj1->paraulafinal->tipus != "questpart") { $subj1 = $slotsubj1->paraulafinal; // si és un pronom personal if ($subj1->isClass("pronoun")) { if ($subj1->text == "jo") { if ($subj1->fem || $this->isfem) $this->genmascsubj1 = false; else $this->genmascsubj1 = true; $this->plsubj1 = false; $this->perssubj1 = 1; } else if ($subj1->text == "tu") { if ($subj1->fem) $this->genmascsubj1 = false; else $this->genmascsubj1 = true; $this->plsubj1 = false; $this->perssubj1 = 2; } else if ($subj1->text == "ell") { $this->genmascsubj1 = true; if ($subj1->plural) $this->plsubj1 = true; else $this->plsubj1 = false; $this->perssubj1 = 3; } else if ($subj1->text == "ella") { $this->genmascsubj1 = false; if ($subj1->plural) $this->plsubj1 = true; else $this->plsubj1 = false; $this->perssubj1 = 3; } else if ($subj1->text == "nosaltres") { if ($subj1->fem) $this->genmascsubj1 = false; else $this->genmascsubj1 = true; $this->plsubj1 = true; $this->perssubj1 = 1; } else if ($subj1->text == "vosaltres") { if ($subj1->fem) $this->genmascsubj1 = false; else $this->genmascsubj1 = true; $this->plsubj1 = true; $this->perssubj1 = 2; } else if ($subj1->text == "ells") { if ($subj1->fem) $this->genmascsubj1 = false; else $this->genmascsubj1 = true; $this->plsubj1 = true; $this->perssubj1 = 3; } // per altra mena de pronoms, tipus això, allò, posem 3a persona else { $this->genmascsubj1 = true; $this->plsubj1 = false; $this->perssubj1 = 3; } } // si no, agafem les propietats de la paraula else { if ($subj1->tipus == "name") { if ($subj1->propietats->mf == "fem") $this->genmascsubj1 = false; else $this->genmascsubj1 = true; if ($subj1->propietats->singpl == "pl") $this->plsubj1 = true; else $this->plsubj1 = false; // hem de mirar si el subjecte té un quantificador o modificador que el fa ser plural // la info estarà codificada a slotstring, al primer element que és nom $i=0; $found = false; while ($islotstring) && !$found) { $aux = $slotsubj1->slotstring[$i]; // si trobem el nucli i efectivament és un nom if (isset($aux[2]) && $aux[2]) { $this->genmascsubj1 = $aux[3]; $this->plsubj1 = $aux[4]; $found = true; } $i++; } } $this->perssubj1 = 3; } // si la paraula en té una altra de coordinada, passarà a plural if ($subj1->tipus == "name" && count($subj1->paraulacoord) > 0) $this->plsubj1 = true; } else if($slotsubj1->paraulafinal->tipus == "questpart") { $this->perssubj1 = 3; } } // si hi és també agafem les dades del segon subjecte if ($keysubj2 != null && isset($this->slotarray[$keysubj2])) { $slotsubj2 = $this->slotarray[$keysubj2]; // si hi ha el subjecte per defecte if ($slotsubj2->defvalueused) { $subj2 = $slotsubj2->defvalue; if ($subj2 == '1') { $this->perssubj2 = 1; if ($this->isfem) $this->genmascsubj2 = false; } else if ($subj2 == '2') $this->perssubj2 = 2; else $this->perssubj2 = 3; } // si el subjecte és una paraula else { $subj2 = $slotsubj2->paraulafinal; // si és un pronom personalq if ($subj2->isClass("pronoun")) { if ($subj2->text == "jo") { if ($subj2->fem || $this->isfem) $this->genmascsubj2 = false; else $this->genmascsubj2 = true; $this->plsubj2 = false; $this->perssubj2 = 1; } else if ($subj2->text == "tu") { if ($subj2->fem) $this->genmascsubj2 = false; else $this->genmascsubj2 = true; $this->plsubj2 = false; $this->perssubj2 = 2; } else if ($subj2->text == "ell") { $this->genmascsubj2 = true; if ($subj2->plural) $this->plsubj2 = true; else $this->plsubj2 = false; $this->perssubj2 = 3; } else if ($subj2->text == "ella") { $this->genmascsubj2 = false; if ($subj2->plural) $this->plsubj2 = true; else $this->plsubj2 = false; $this->perssubj2 = 3; } else if ($subj2->text == "nosaltres") { if ($subj2->fem) $this->genmascsubj2 = false; else $this->genmascsubj2 = true; $this->plsubj2 = true; $this->perssubj2 = 1; } else if ($subj2->text == "vosaltres") { if ($subj2->fem) $this->genmascsubj2 = false; else $this->genmascsubj2 = true; $this->plsubj2 = true; $this->perssubj2 = 2; } else if ($subj2->text == "ells") { if ($subj2->fem) $this->genmascsubj2 = false; else $this->genmascsubj2 = true; $this->plsubj2 = true; $this->perssubj2 = 3; } // per altra mena de pronoms, tipus això, allò, posem 3a persona else { $this->genmascsubj2 = true; $this->plsubj2 = false; $this->perssubj2 = 3; } } // si no, agafem les propietats de la paraula else { if ($subj2->propietats->mf == "fem") $this->genmascsubj2 = false; else $this->genmascsubj2 = true; if ($subj2->propietats->singpl == "pl") $this->plsubj2 = true; else $this->plsubj2 = false; // hem de mirar si el subjecte té un quantificador o modificador que el fa ser plural // la info estarà codificada a slotstring, al primer element que és nom $i=0; $found = false; while ($islotstring) && !$found) { $aux = $slotsubj2->slotstring[$i]; // si trobem el nucli i efectivament és un nom if (isset($aux[2]) && $aux[2]) { $this->genmascsubj2 = $aux[3]; $this->plsubj2 = $aux[4]; $found = true; } $i++; } $this->perssubj2 = 3; } // si la paraula en té una altra de coordinada, passarà a plural if (count($subj2->paraulacoord) > 0) $this->plsubj2 = true; } // sempre hi ha subj1 a no ser que a un pseudoimpersonal el subj sigui un subverb // No serveix per frases que no tenen subjecte, estil "És un pal" o "Fa sol" if ($slotsubj1 != null) { // Si hi havia dos subjectes MIREM SI ELS DOS SUBJECTES SÓN IGUALS if ($slotsubj1->paraulafinal != null && $slotsubj2->paraulafinal != null) { if ($slotsubj1->paraulafinal->text == $slotsubj2->paraulafinal->text) $this->subjsiguals = true; } // si els dos estaven buits, seran iguals, per la funció ordenar slots else if ($slotsubj1->paraulafinal == null && $slotsubj2->paraulafinal == null) $this->subjsiguals = true; // si el primer és null i el segon no else if ($slotsubj1->paraulafinal == null && $slotsubj2->paraulafinal != null) { if ($slotsubj1->defvalue == '1' && $slotsubj2->paraulafinal->text == "jo") $this->subjsiguals = true; else if ($slotsubj1->defvalue == '2' && $slotsubj2->paraulafinal->text == "tu") $this->subjsiguals = true; } // si el primer no és null i el segon ho és else if ($slotsubj1->paraulafinal != null && $slotsubj2->paraulafinal == null) { if ($slotsubj2->defvalue == '1' && $slotsubj1->paraulafinal->text == "jo") $this->subjsiguals = true; else if ($slotsubj2->defvalue == '2' && $slotsubj1->paraulafinal->text == "tu") $this->subjsiguals = true; } } else { $this->subjsiguals = true; // i el subjecte és en 3a persona, ja que és una proposició $this->perssubj1 = 3; } } // si era pseudimpersonal amb subverb, si el receiver1 està definit i el subj2 no ho està, // que subj2 = receiver1 if ($this->pseudoimpersonal && isset($this->slotarray["Receiver 1"]) && $keysubj2 != null && !isset($this->slotarray[$keysubj2]) ) { $this->subjsiguals = true; } // Si és verbless que posi per defecte la 1a persona, per si hi ha "Desig" activat // Ex: "Desig" Poma = Vull una poma if ($this->defaulttense == "verbless") $this->perssubj1 = 1; // Serveix per frases que no tenen subjecte, estil "És un pal" o "Fa sol" else if ($slotsubj1 == null) $this->perssubj1 = 3; } // Agafa la Persona, Gènere i número dels subjectes del pattern public function getPersGenNumSubjsES() { $keysubj1 = "Subject"; $keysubj2 = null; $slotsubj1 = null; // als pseudoimpersonals que com a subj hi ha un subverb, no hi ha subj1 if (isset($this->slotarray["Secondary Verb 2"])) { $keysubj1 .= " 1"; $keysubj2 = "Subject 2"; } // si no hi ha subjecte i el verb és impersonal if(!isset($this->slotarray[$keysubj1]) && $this->impersonal) { $keysubj1 = "Theme"; } // agafem les dades del primer subjecte if (isset($this->slotarray[$keysubj1]) && $this->slotarray[$keysubj1]->full) { $slotsubj1 = $this->slotarray[$keysubj1]; // si hi ha el subjecte per defecte if ($slotsubj1->defvalueused) { $subj1 = $slotsubj1->defvalue; if ($subj1 == '1') { $this->perssubj1 = 1; if ($this->isfem) $this->genmascsubj1 = false; } else if ($subj1 == '2') $this->perssubj1 = 2; else $this->perssubj1 = 3; } // si el subjecte és una paraula // si hi ha una partícula de pregunta al subjecte o no hi havia slot subjecte // perquè era impersonal, no ha d'agafar-ne les propietats else if($slotsubj1->paraulafinal->tipus != "questpart") { $subj1 = $slotsubj1->paraulafinal; // si és un pronom personal if ($subj1->isClass("pronoun")) { if ($subj1->text == "yo") { if ($subj1->fem || $this->isfem) $this->genmascsubj1 = false; else $this->genmascsubj1 = true; $this->plsubj1 = false; $this->perssubj1 = 1; } else if ($subj1->text == "tú") { if ($subj1->fem) $this->genmascsubj1 = false; else $this->genmascsubj1 = true; $this->plsubj1 = false; $this->perssubj1 = 2; } else if ($subj1->text == "él") { $this->genmascsubj1 = true; if ($subj1->plural) $this->plsubj1 = true; else $this->plsubj1 = false; $this->perssubj1 = 3; } else if ($subj1->text == "ella") { $this->genmascsubj1 = false; if ($subj1->plural) $this->plsubj1 = true; else $this->plsubj1 = false; $this->perssubj1 = 3; } else if ($subj1->text == "nosotros") { if ($subj1->fem) $this->genmascsubj1 = false; else $this->genmascsubj1 = true; $this->plsubj1 = true; $this->perssubj1 = 1; } else if ($subj1->text == "vosotros") { if ($subj1->fem) $this->genmascsubj1 = false; else $this->genmascsubj1 = true; $this->plsubj1 = true; $this->perssubj1 = 2; } else if ($subj1->text == "ellos") { if ($subj1->fem) $this->genmascsubj1 = false; else $this->genmascsubj1 = true; $this->plsubj1 = true; $this->perssubj1 = 3; } // per altra mena de pronoms, tipus això, allò, posem 3a persona else { $this->genmascsubj1 = true; $this->plsubj1 = false; $this->perssubj1 = 3; } } // si no, agafem les propietats de la paraula else { if ($subj1->tipus == "name") { if ($subj1->propietats->mf == "fem") $this->genmascsubj1 = false; else $this->genmascsubj1 = true; if ($subj1->propietats->singpl == "pl") $this->plsubj1 = true; else $this->plsubj1 = false; // hem de mirar si el subjecte té un quantificador o modificador que el fa ser plural // la info estarà codificada a slotstring, al primer element que és nom $i=0; $found = false; while ($islotstring) && !$found) { $aux = $slotsubj1->slotstring[$i]; // si trobem el nucli i efectivament és un nom if (isset($aux[2]) && $aux[2]) { $this->genmascsubj1 = $aux[3]; $this->plsubj1 = $aux[4]; $found = true; } $i++; } } $this->perssubj1 = 3; } // si la paraula en té una altra de coordinada, passarà a plural if ($subj1->tipus == "name" && count($subj1->paraulacoord) > 0) $this->plsubj1 = true; } else if($slotsubj1->paraulafinal->tipus == "questpart") { $this->perssubj1 = 3; } } // si hi és també agafem les dades del segon subjecte if ($keysubj2 != null && isset($this->slotarray[$keysubj2])) { $slotsubj2 = $this->slotarray[$keysubj2]; // si hi ha el subjecte per defecte if ($slotsubj2->defvalueused) { $subj2 = $slotsubj2->defvalue; if ($subj2 == '1') { $this->perssubj2 = 1; if ($this->isfem) $this->genmascsubj2 = false; } else if ($subj2 == '2') $this->perssubj2 = 2; else $this->perssubj2 = 3; } // si el subjecte és una paraula else { $subj2 = $slotsubj2->paraulafinal; // si és un pronom personal if ($subj2->isClass("pronoun")) { if ($subj2->text == "yo") { if ($subj2->fem || $this->isfem) $this->genmascsubj2 = false; else $this->genmascsubj2 = true; $this->plsubj2 = false; $this->perssubj2 = 1; } else if ($subj2->text == "tú") { if ($subj2->fem) $this->genmascsubj2 = false; else $this->genmascsubj2 = true; $this->plsubj2 = false; $this->perssubj2 = 2; } else if ($subj2->text == "él") { $this->genmascsubj2 = true; if ($subj2->plural) $this->plsubj2 = true; else $this->plsubj2 = false; $this->perssubj2 = 3; } else if ($subj2->text == "ella") { $this->genmascsubj2 = false; if ($subj2->plural) $this->plsubj2 = true; else $this->plsubj2 = false; $this->perssubj2 = 3; } else if ($subj2->text == "nosotros") { if ($subj2->fem) $this->genmascsubj2 = false; else $this->genmascsubj2 = true; $this->plsubj2 = true; $this->perssubj2 = 1; } else if ($subj2->text == "vosotros") { if ($subj2->fem) $this->genmascsubj2 = false; else $this->genmascsubj2 = true; $this->plsubj2 = true; $this->perssubj2 = 2; } else if ($subj2->text == "ellos") { if ($subj2->fem) $this->genmascsubj2 = false; else $this->genmascsubj2 = true; $this->plsubj2 = true; $this->perssubj2 = 3; } // per altra mena de pronoms, tipus això, allò, posem 3a persona else { $this->genmascsubj2 = true; $this->plsubj2 = false; $this->perssubj2 = 3; } } // si no, agafem les propietats de la paraula else { if ($subj2->propietats->mf == "fem") $this->genmascsubj2 = false; else $this->genmascsubj2 = true; if ($subj2->propietats->singpl == "pl") $this->plsubj2 = true; else $this->plsubj2 = false; // hem de mirar si el subjecte té un quantificador o modificador que el fa ser plural // la info estarà codificada a slotstring, al primer element que és nom $i=0; $found = false; while ($islotstring) && !$found) { $aux = $slotsubj2->slotstring[$i]; // si trobem el nucli i efectivament és un nom if (isset($aux[2]) && $aux[2]) { $this->genmascsubj2 = $aux[3]; $this->plsubj2 = $aux[4]; $found = true; } $i++; } $this->perssubj2 = 3; } // si la paraula en té una altra de coordinada, passarà a plural if (count($subj2->paraulacoord) > 0) $this->plsubj2 = true; } // sempre hi ha subj1 a no ser que a un pseudoimpersonal el subj sigui un subverb // No serveix per frases que no tenen subjecte, estil "És un pal" o "Fa sol" if ($slotsubj1 != null) { // Si hi havia dos subjectes MIREM SI ELS DOS SUBJECTES SÓN IGUALS if ($slotsubj1->paraulafinal != null && $slotsubj2->paraulafinal != null) { if ($slotsubj1->paraulafinal->text == $slotsubj2->paraulafinal->text) $this->subjsiguals = true; } // si els dos estaven buits, seran iguals, per la funció ordenar slots else if ($slotsubj1->paraulafinal == null && $slotsubj2->paraulafinal == null) $this->subjsiguals = true; // si el primer és null i el segon no else if ($slotsubj1->paraulafinal == null && $slotsubj2->paraulafinal != null) { if ($slotsubj1->defvalue == '1' && $slotsubj2->paraulafinal->text == "yo") $this->subjsiguals = true; else if ($slotsubj1->defvalue == '2' && $slotsubj2->paraulafinal->text == "tú") $this->subjsiguals = true; } // si el primer no és null i el segon ho és else if ($slotsubj1->paraulafinal != null && $slotsubj2->paraulafinal == null) { if ($slotsubj2->defvalue == '1' && $slotsubj1->paraulafinal->text == "yo") $this->subjsiguals = true; else if ($slotsubj2->defvalue == '2' && $slotsubj1->paraulafinal->text == "tú") $this->subjsiguals = true; } } else { $this->subjsiguals = true; // i el subjecte és en 3a persona, ja que és una proposició $this->perssubj1 = 3; } } // si era pseudimpersonal amb subverb, si el receiver1 està definit i el subj2 no ho està, // que subj2 = receiver1 if ($this->pseudoimpersonal && isset($this->slotarray["Receiver 1"]) && $keysubj2 != null && !isset($this->slotarray[$keysubj2]) ) { $this->subjsiguals = true; } // Si és verbless que posi per defecte la 1a persona, per si hi ha "Desig" activat // Ex: "Desig" Poma = Vull una poma if ($this->defaulttense == "verbless") $this->perssubj1 = 1; // Serveix per frases que no tenen subjecte, estil "És un pal" o "Fa sol" else if ($slotsubj1 == null) $this->perssubj1 = 3; } // Ordena internament les paraules de cada slot i les fa concordar en gènere i nombre entre elles // PASSOS 2 I 3 DEL GENERADOR public function ordenarSlotsInternament() { $numslots = count($this->ordrefrase); $this->getPersGenNumSubjs(); for ($i=0; $i<$numslots; $i++) { $slotaux = $this->slotarray[$this->ordrefrase[$i]]; // si és un slot del subverb li passem les dades del subj2 if ($slotaux->level == 2) $slotaux->ordenarSlot($this->genmascsubj2, $this->plsubj2, $this->copulatiu, $this->impersonal); else $slotaux->ordenarSlot($this->genmascsubj1, $this->plsubj1, $this->copulatiu, $this->impersonal); // si acabem de tractar un subjecte, refresquem els valors de gènere i número per si no eren // pronoms, i pels possibles adjectius que hagin de concordar amb ells, que apareixeran després // pels verbs impersonals sense subjecte també ho fem if ($slotaux->category == "Subject" || ($this->impersonal && $slotaux->category == "Theme")) { $this->getPersGenNumSubjs(); } } if ($this->questiontypequant) { // fer que el quant concordi en gènere i nombre amb el nucli del theme $keytheme = "Theme"; if (isset($this->slotarray["Secondary Verb 2"])) $keytheme .= " 2"; $thememasc = true; $themepl = false; $slottheme = $this->slotarray[$keytheme]; $slotstringtheme = $slottheme->slotstring; // canviem al nucli del theme que no necessiti article i agafem les dades de concordància $i=0; $found = false; while ($islotarray["PartPreguntaNoSlot"]; $slotpartquant->slotstring = array(); $partpregunta = $slotpartquant->paraulafinal->text; $elementaux = array(); if ($thememasc && !$themepl) $partpregunta = $partpregunta; // masc sing else if ($thememasc && $themepl) $partpregunta = $partpregunta."s"; // masc pl else if (!$thememasc && !$themepl) $partpregunta = $partpregunta."a"; // fem sing else $partpregunta = $partpregunta."es"; // fem pl $elementaux[0] = $partpregunta; $elementaux[1] = $slotpartquant->paraulafinal; $elementaux[2] = false; $slotpartquant->slotstring[] = $elementaux; } // DEBUG // echo $this->printFraseFinalSlotString()."

"; } // Ordena internament les paraules de cada slot i les fa concordar en gènere i nombre entre elles // PASSOS 2 I 3 DEL GENERADOR public function ordenarSlotsInternamentES() { $numslots = count($this->ordrefrase); $this->getPersGenNumSubjsES(); for ($i=0; $i<$numslots; $i++) { $slotaux = $this->slotarray[$this->ordrefrase[$i]]; // si és un slot del subverb li passem les dades del subj2 if ($slotaux->level == 2) $slotaux->ordenarSlotES($this->genmascsubj2, $this->plsubj2, $this->copulatiu, $this->impersonal); else $slotaux->ordenarSlotES($this->genmascsubj1, $this->plsubj1, $this->copulatiu, $this->impersonal); // si acabem de tractar un subjecte, refresquem els valors de gènere i número per si no eren // pronoms, i pels possibles adjectius que hagin de concordar amb ells, que apareixeran després // pels verbs impersonals sense subjecte també ho fem if ($slotaux->category == "Subject" || ($this->impersonal && $slotaux->category == "Theme")) { $this->getPersGenNumSubjsES(); } } if ($this->questiontypequant) { // fer que el quant concordi en gènere i nombre amb el nucli del theme $keytheme = "Theme"; if (isset($this->slotarray["Secondary Verb 2"])) $keytheme .= " 2"; $thememasc = true; $themepl = false; $slottheme = $this->slotarray[$keytheme]; $slotstringtheme = $slottheme->slotstring; // canviem al nucli del theme que no necessiti article i agafem les dades de concordància $i=0; $found = false; while ($islotarray["PartPreguntaNoSlot"]; $slotpartquant->slotstring = array(); $partpregunta = $slotpartquant->paraulafinal->text; $elementaux = array(); if ($thememasc && !$themepl) $partpregunta = $partpregunta; // masc sing else if ($thememasc && $themepl) $partpregunta = $partpregunta."s"; // masc pl else if (!$thememasc && !$themepl) $partpregunta = substr($partpregunta, 0, -1)."a"; // fem sing else $partpregunta = substr($partpregunta, 0, -1)."as"; // fem pl $elementaux[0] = $partpregunta; $elementaux[1] = $slotpartquant->paraulafinal; $elementaux[2] = false; $slotpartquant->slotstring[] = $elementaux; } // DEBUG // echo $this->printFraseFinalSlotString()."

"; } // Posa els articles als noms que hi ha a la frase, segons les propietats del nom // i el tipus d'slot on es trobi public function putArticlesToNouns($tipusfrase) { // per cada slot for ($i=0; $iordrefrase); $i++) { $slotaux = $this->slotarray[$this->ordrefrase[$i]]; $slotaux->putArticles($tipusfrase, $this->questiontypequant); } // DEBUG // echo $this->printFraseFinalSlotString()."

"; } // Posa els articles als noms que hi ha a la frase, segons les propietats del nom // i el tipus d'slot on es trobi public function putArticlesToNounsES($tipusfrase) { // per cada slot for ($i=0; $iordrefrase); $i++) { $slotaux = $this->slotarray[$this->ordrefrase[$i]]; $slotaux->putArticlesES($tipusfrase, $this->questiontypequant); } // DEBUG // echo $this->printFraseFinalSlotString()."

"; } // Conjuga els verbs principals, els secundaris i els de desig i permís, segons // el context (paraules de temps) i tipus de frase i els modificadors de temps public function conjugarVerbs($propietatsfrase) { $CI = &get_instance(); $CI->load->model('Lexicon'); $CI->load->library('Mymatching'); $matching = new Mymatching(); // agafem el default tense. Si no n'hi ha, perquè la frase és verbless, el posarem a present // per si ha seleccionat l'opció de desig if ($this->defaulttense == "verbless") $tense = "present"; else $tense = $this->defaulttense; // per ORDRE d'importància, anem mirant si agafem un tense diferent del default if ($propietatsfrase['tipusfrase'] == "ordre") { if ($this->frasenegativa) $tense = "prsubj"; else $tense = "imperatiu"; } else { // si està definit el temps des de l'input, té preferència if ($propietatsfrase['tense'] != "defecte") $tense = $propietatsfrase['tense']; // si no, trajecte normal else { // si hi ha expressions de temps, la primera afegida que tingui associat // un temps verbal, és la que té preferència $found = false; $i=0; while ($itimeexpr) && !$found) { if (isset($matching->advsTempsTense[$this->timeexpr[$i]->text])) { $tense = $matching->advsTempsTense[$this->timeexpr[$i]->text]; $found = true; $tenseadvs = true; } $i++; } } } // Variables de persona i número dels verbs $persona = $this->perssubj1; $numero = "sing"; if ($this->plsubj1) $numero = "pl"; $persona2 = $this->perssubj2; $numero2 = "sing"; if ($this->plsubj2) $numero2 = "pl"; $desig = false; $permis = false; $subverb = false; // si el tense era imperatiu per primera persona, que no és possible, ho passem a present if ($tense == "imperatiu" && $persona == 1) $tense = "present"; if ($propietatsfrase['tipusfrase'] == "desig") $desig = true; else if ($propietatsfrase['tipusfrase'] == "permis") $permis = true; if (isset($this->slotarray["Secondary Verb 2"])) $subverb = true; // conjuguem els verbs de desig o permís if ($desig || $permis) { // si el tense era imperatiu o present de subjuntiu, per una ordre positiva // o negativa, el canviem a present if ($tense == 'imperatiu' || $tense == "prsubj") $tense = "present"; $slotaux; $verbid; if ($desig) { $slotaux = $this->slotarray["Desire"]; $verbid = 99; // id del verb voler } if ($permis) { $slotaux = $this->slotarray["Permission"]; $verbid = 104; // id del verb poder } // Els modificadors de tipuis de frase de permís o desig són per fer frases // en 1a persona "Vull que vagis a comprar" o "Puc menjar un gelat?". $verbconjugat = $CI->Lexicon->conjugar($verbid, $tense, 1, "sing", false); $auxtupla[0] = $verbconjugat."@VERBUM"; $auxtupla[1] = null; $slotaux->slotstring = array(); $slotaux->slotstring[] = $auxtupla; $slotaux->isInfinitive = false; } $mainverbslot; if (!$subverb) $mainverbslot = $this->slotarray["Main Verb"]; else $mainverbslot = $this->slotarray["Main Verb 1"]; // si era verbless, no el tractarem if ($mainverbslot->paraulafinal->text == "verbless") $mainverbslot = null; $secondaryverbslot = null; if ($subverb) $secondaryverbslot = $this->slotarray["Secondary Verb 2"]; // si no era verbless if ($mainverbslot != null) { // si la frase era de permís (verb poder), tant el mainverb com el secondary verb van en infinitiu if ($permis) { $verbconjugat = $CI->Lexicon->conjugar($mainverbslot->paraulafinal->id, 'infinitiu', $persona, $numero, $this->pronominal); $auxtupla[0] = $verbconjugat."@VERBUM"; $auxtupla[1] = $mainverbslot->paraulafinal; $mainverbslot->slotstring[] = $auxtupla; // omplim l'slotstring $mainverbslot->isInfinitive = true; if ($secondaryverbslot != null) { $verbconjugat = $CI->Lexicon->conjugar($secondaryverbslot->paraulafinal->id, 'infinitiu', $persona2, $numero2, $this->pronominal2); // posem la preposició que va davant del verb secundari, si n'hi havia if ($secondaryverbslot->prep != null) { $auxtupla[0] = $secondaryverbslot->prep; $auxtupla[1] = null; // la preposició del verb secundari va darrere del verb principal $mainverbslot->slotstring[] = $auxtupla; } $auxtupla[0] = $verbconjugat."@VERBUM"; $auxtupla[1] = $secondaryverbslot->paraulafinal; $secondaryverbslot->slotstring[] = $auxtupla; $secondaryverbslot->isInfinitive = true; } } // Fi permís // si era un desig, el mainverb va en infinitiu (si el subjecte1 era en primera persona, // si no va en subjuntiu) i el secondary verb segons el subjecte2 else if ($desig) { if ($persona == 1 && $numero == "sing") { $verbconjugat = $CI->Lexicon->conjugarES($mainverbslot->paraulafinal->id, 'infinitiu', $persona, $numero, $this->pronominal); $mainverbslot->isInfinitive = true; } else { $verbconjugat = $CI->Lexicon->conjugarES($mainverbslot->paraulafinal->id, 'prsubj', $persona, $numero, $this->pronominal); // afegim la partícula QUE després del "Vull" $auxtupla[0] = "que"; $auxtupla[1] = null; $slotaux = $this->slotarray["Desire"]; $slotaux->slotstring[] = $auxtupla; } $auxtupla[0] = $verbconjugat."@VERBUM"; $auxtupla[1] = $mainverbslot->paraulafinal; $mainverbslot->slotstring[] = $auxtupla; // omplim l'slotstring if ($secondaryverbslot != null) { // si els subjectes eren iguals, també va en infinitiu if ($this->subjsiguals) { $verbconjugat = $CI->Lexicon->conjugar($secondaryverbslot->paraulafinal->id, 'infinitiu', $persona2, $numero2, $this->pronominal2); $secondaryverbslot->isInfinitive = true; // posem la preposició que va davant del verb secundari, si n'hi havia if ($secondaryverbslot->prep != null) { $auxtupla[0] = $secondaryverbslot->prep; $auxtupla[1] = null; $secondaryverbslot->slotstring[] = $auxtupla; } } // si no, aleshores va en subjuntiu (si fos en passat hauria d'anar en passat // de subjuntiu, però el sistema encara no ho té else { $verbconjugat = $CI->Lexicon->conjugar($secondaryverbslot->paraulafinal->id, 'prsubj', $persona2, $numero2, $this->pronominal2); // posem la preposició que va darrer del verb principal, si n'hi havia if ($secondaryverbslot->prep != null) { $auxtupla[0] = $secondaryverbslot->prep; $auxtupla[1] = null; $mainverbslot->slotstring[] = $auxtupla; } // afegim la partícula QUE després del main verb $auxtupla[0] = "que"; $auxtupla[1] = null; $mainverbslot->slotstring[] = $auxtupla; } $auxtupla[0] = $verbconjugat."@VERBUM"; $auxtupla[1] = $secondaryverbslot->paraulafinal; $secondaryverbslot->slotstring[] = $auxtupla; } } // Fi desig // si no, CONJUGACIÓ NORMAL else { $verbconjugat = $CI->Lexicon->conjugar($mainverbslot->paraulafinal->id, $tense, $persona, $numero, $this->pronominal); $auxtupla[0] = $verbconjugat."@VERBUM"; $auxtupla[1] = $mainverbslot->paraulafinal; $auxtupla[8] = true; $mainverbslot->isInfinitive = ($tense == "infinitiu"); // pel perifràstic no cal posar // els pronoms febles a darrere, ja que a davant hi queden millor $mainverbslot->slotstring[] = $auxtupla; // omplim l'slotstring if ($secondaryverbslot != null) { // si els subjectes eren iguals, també va en infinitiu if ($this->subjsiguals) { $verbconjugat = $CI->Lexicon->conjugar($secondaryverbslot->paraulafinal->id, 'infinitiu', $persona2, $numero2, $this->pronominal2); $secondaryverbslot->isInfinitive = true; // posem la preposició que va davant del verb secundari, si n'hi havia if ($secondaryverbslot->prep != null) { $auxtupla[0] = $secondaryverbslot->prep; $auxtupla[1] = null; $secondaryverbslot->slotstring[] = $auxtupla; } } // si no, aleshores va en subjuntiu (si fos en passat hauria d'anar en passat // de subjuntiu, però el sistema encara no ho té else { $verbconjugat = $CI->Lexicon->conjugar($secondaryverbslot->paraulafinal->id, 'prsubj', $persona2, $numero2, $this->pronominal2); // posem la preposició que va darrer del verb principal, si n'hi havia if ($secondaryverbslot->prep != null) { $auxtupla[0] = $secondaryverbslot->prep; $auxtupla[1] = null; $mainverbslot->slotstring[] = $auxtupla; } // afegim la partícula QUE després del main verb $auxtupla[0] = "que"; $auxtupla[1] = null; $mainverbslot->slotstring[] = $auxtupla; } $auxtupla[0] = $verbconjugat."@VERBUM"; $auxtupla[1] = $secondaryverbslot->paraulafinal; $secondaryverbslot->slotstring[] = $auxtupla; } } // Fi conjugació normal } // Fi si no era verbless // DEBUG // echo $this->printFraseFinalSlotString()."

"; } // Conjuga els verbs principals, els secundaris i els de desig i permís, segons // el context (paraules de temps) i tipus de frase i els modificadors de temps public function conjugarVerbsES($propietatsfrase) { $CI = &get_instance(); $CI->load->model('Lexicon'); $CI->load->library('Mymatching'); $matching = new Mymatching(); // agafem el default tense. Si no n'hi ha, perquè la frase és verbless, el posarem a present // per si ha seleccionat l'opció de desig if ($this->defaulttense == "verbless") $tense = "present"; else $tense = $this->defaulttense; // per ORDRE d'importància, anem mirant si agafem un tense diferent del default if ($propietatsfrase['tipusfrase'] == "ordre") { if ($this->frasenegativa) $tense = "prsubj"; else $tense = "imperatiu"; } else { // si està definit el temps des de l'input, té preferència if ($propietatsfrase['tense'] != "defecte") $tense = $propietatsfrase['tense']; // si no, trajecte normal else { // si hi ha expressions de temps, la primera afegida que tingui associat // un temps verbal, és la que té preferència $found = false; $i=0; while ($itimeexpr) && !$found) { if (isset($matching->advsTempsTenseES[$this->timeexpr[$i]->text])) { $tense = $matching->advsTempsTenseES[$this->timeexpr[$i]->text]; $found = true; $tenseadvs = true; } $i++; } } } // Variables de persona i número dels verbs $persona = $this->perssubj1; $numero = "sing"; if ($this->plsubj1) $numero = "pl"; $persona2 = $this->perssubj2; $numero2 = "sing"; if ($this->plsubj2) $numero2 = "pl"; $desig = false; $permis = false; $subverb = false; // En castellà no hi ha perifràstic, és passat if ($tense == "perifrastic") $tense = "passat"; // si el tense era imperatiu per primera persona, que no és possible, ho passem a present if ($tense == "imperatiu" && $persona == 1) $tense = "present"; if ($propietatsfrase['tipusfrase'] == "desig") $desig = true; else if ($propietatsfrase['tipusfrase'] == "permis") $permis = true; if (isset($this->slotarray["Secondary Verb 2"])) $subverb = true; // conjuguem els verbs de desig o permís if ($desig || $permis) { // si el tense era imperatiu o present de subjuntiu, per una ordre positiva // o negativa, el canviem a present if ($tense == 'imperatiu' || $tense == "prsubj") $tense = "present"; $slotaux; $verbid; if ($desig) { $slotaux = $this->slotarray["Desire"]; $verbid = 99; // id del verb voler } if ($permis) { $slotaux = $this->slotarray["Permission"]; $verbid = 104; // id del verb poder } // Els modificadors de tipuis de frase de permís o desig són per fer frases // en 1a persona "Vull que vagis a comprar" o "Puc menjar un gelat?". $verbconjugat = $CI->Lexicon->conjugarES($verbid, $tense, 1, "sing", false); $auxtupla[0] = $verbconjugat."@VERBUM"; $auxtupla[1] = null; $slotaux->slotstring = array(); $slotaux->slotstring[] = $auxtupla; $slotaux->isInfinitive = false; } $mainverbslot; if (!$subverb) $mainverbslot = $this->slotarray["Main Verb"]; else $mainverbslot = $this->slotarray["Main Verb 1"]; // si era verbless, no el tractarem if ($mainverbslot->paraulafinal->text == "verbless") $mainverbslot = null; $secondaryverbslot = null; if ($subverb) $secondaryverbslot = $this->slotarray["Secondary Verb 2"]; // si no era verbless if ($mainverbslot != null) { // si la frase era de permís (verb poder), tant el mainverb com el secondary verb van en infinitiu if ($permis) { $verbconjugat = $CI->Lexicon->conjugarES($mainverbslot->paraulafinal->id, 'infinitiu', $persona, $numero, $this->pronominal); $auxtupla[0] = $verbconjugat."@VERBUM"; $auxtupla[1] = $mainverbslot->paraulafinal; $mainverbslot->slotstring[] = $auxtupla; // omplim l'slotstring $mainverbslot->isInfinitive = true; if ($secondaryverbslot != null) { $verbconjugat = $CI->Lexicon->conjugarES($secondaryverbslot->paraulafinal->id, 'infinitiu', $persona2, $numero2, $this->pronominal2); // posem la preposició que va davant del verb secundari, si n'hi havia if ($secondaryverbslot->prep != null) { $auxtupla[0] = $secondaryverbslot->prep; $auxtupla[1] = null; // la preposició del verb secundari va darrere del verb principal $mainverbslot->slotstring[] = $auxtupla; } $auxtupla[0] = $verbconjugat."@VERBUM"; $auxtupla[1] = $secondaryverbslot->paraulafinal; $secondaryverbslot->slotstring[] = $auxtupla; $secondaryverbslot->isInfinitive = true; } } // Fi permís // si era un desig, el mainverb va en infinitiu (si el subjecte1 era en primera persona, // si no va en subjuntiu) i el secondary verb segons el subjecte2 else if ($desig) { if ($persona == 1 && $numero == "sing") { $verbconjugat = $CI->Lexicon->conjugarES($mainverbslot->paraulafinal->id, 'infinitiu', $persona, $numero, $this->pronominal); $mainverbslot->isInfinitive = true; } else { $verbconjugat = $CI->Lexicon->conjugarES($mainverbslot->paraulafinal->id, 'prsubj', $persona, $numero, $this->pronominal); // afegim la partícula QUE després del "Quiero" $auxtupla[0] = "que"; $auxtupla[1] = null; $slotaux = $this->slotarray["Desire"]; $slotaux->slotstring[] = $auxtupla; } $auxtupla[0] = $verbconjugat."@VERBUM"; $auxtupla[1] = $mainverbslot->paraulafinal; $mainverbslot->slotstring[] = $auxtupla; // omplim l'slotstring if ($secondaryverbslot != null) { // si els subjectes eren iguals, va en infinitiu if ($this->subjsiguals) { $verbconjugat = $CI->Lexicon->conjugarES($secondaryverbslot->paraulafinal->id, 'infinitiu', $persona2, $numero2, $this->pronominal2); $secondaryverbslot->isInfinitive = true; // posem la preposició que va davant del verb secundari, si n'hi havia if ($secondaryverbslot->prep != null) { $auxtupla[0] = $secondaryverbslot->prep; $auxtupla[1] = null; $secondaryverbslot->slotstring[] = $auxtupla; } } // si no, aleshores va en subjuntiu (si fos en passat hauria d'anar en passat // de subjuntiu, però el sistema encara no ho té else { $verbconjugat = $CI->Lexicon->conjugarES($secondaryverbslot->paraulafinal->id, 'prsubj', $persona2, $numero2, $this->pronominal2); // posem la preposició que darrere del verb principal, si n'hi havia if ($secondaryverbslot->prep != null) { $auxtupla[0] = $secondaryverbslot->prep; $auxtupla[1] = null; $mainverbslot->slotstring[] = $auxtupla; } // afegim la partícula QUE després del main verb $auxtupla[0] = "que"; $auxtupla[1] = null; $mainverbslot->slotstring[] = $auxtupla; } $auxtupla[0] = $verbconjugat."@VERBUM"; $auxtupla[1] = $secondaryverbslot->paraulafinal; $secondaryverbslot->slotstring[] = $auxtupla; } } // Fi desig // si no, CONJUGACIÓ NORMAL else { $verbconjugat = $CI->Lexicon->conjugarES($mainverbslot->paraulafinal->id, $tense, $persona, $numero, $this->pronominal); $auxtupla[0] = $verbconjugat."@VERBUM"; $auxtupla[1] = $mainverbslot->paraulafinal; $auxtupla[8] = true; $mainverbslot->isInfinitive = ($tense == "infinitiu"); // pel perifràstic no cal posar // els pronoms febles a darrere, ja que a davant hi queden millor $mainverbslot->slotstring[] = $auxtupla; // omplim l'slotstring if ($secondaryverbslot != null) { // si els subjectes eren iguals, també va en infinitiu if ($this->subjsiguals) { $verbconjugat = $CI->Lexicon->conjugarES($secondaryverbslot->paraulafinal->id, 'infinitiu', $persona2, $numero2, $this->pronominal2); $secondaryverbslot->isInfinitive = true; // posem la preposició que va davant del verb secundari, si n'hi havia if ($secondaryverbslot->prep != null) { $auxtupla[0] = $secondaryverbslot->prep; $auxtupla[1] = null; $secondaryverbslot->slotstring[] = $auxtupla; } } // si no, aleshores va en subjuntiu (si fos en passat hauria d'anar en passat // de subjuntiu, però el sistema encara no ho té else { $verbconjugat = $CI->Lexicon->conjugarES($secondaryverbslot->paraulafinal->id, 'prsubj', $persona2, $numero2, $this->pronominal2); // posem la preposició que darrere del verb principal, si n'hi havia if ($secondaryverbslot->prep != null) { $auxtupla[0] = $secondaryverbslot->prep; $auxtupla[1] = null; $mainverbslot->slotstring[] = $auxtupla; } // afegim la partícula QUE després del main verb $auxtupla[0] = "que"; $auxtupla[1] = null; $mainverbslot->slotstring[] = $auxtupla; } $auxtupla[0] = $verbconjugat."@VERBUM"; $auxtupla[1] = $secondaryverbslot->paraulafinal; $secondaryverbslot->slotstring[] = $auxtupla; } } // Fi conjugació normal } // Fi si no era verbless // DEBUG // echo $this->printFraseFinalSlotString()."

"; } // Treure els "jo" i "tu" dels subjectes. Canviar receivers a pronoms febles i posar-los // a darrere el verb si cal. Posar modificadors de frase com el "no" o el "també". // Fusionar preposicions amb articles (de+el/s = del/s... a+el, per+el...). Posar apòstrofs // de preps i pronoms febles (i guions?). Netejar espais abans o després dels apòstrofs. // Escriure la frase final, posant les expressions i altres advs de temps al final. public function launchCleaner($tipusfrase) { $CI = &get_instance(); $CI->load->library('Mymatching'); $CI->load->library('Myslot'); $matching = new Mymatching(); // TREURE ELS "JO" I "TU" 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 == "ho") $indextheme1 = $i; else if ($slotaux->level == 2 && $slotaux->defvalueused && $slotaux->defvalue == "ho") $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 tu o jo o 3a persona impersonal o vostè quan hi són per defecte if ($slotaux->defvalue == '1' || $slotaux->defvalue == '2' || $slotaux->defvalue == '3' || $slotaux->defvalue == '7') $slotaux->slotstring = array(); } // si no s'ha fet servir el subjecte per defecte else { // esborrem el tu o el jo (si no tenen cap element coordinat) if (($slotaux->paraulafinal->text == "jo" || $slotaux->paraulafinal->text == "tu") && !$slotaux->paraulafinal->coord) { $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; $theme1pron = false; $theme2pron = 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 O DEL THEME 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 == "mi") { // posar "me", si és infinitiu o ordre positiva, els apòstrofs després if (($slotaux->level == 1 && $mainverbinf) || ($slotaux->level == 1 && $ordre && !$this->frasenegativa)) { $slotaux->slotstring = array(); $elementaux[0] = "me"; $elementaux[1] = null; $slotaux->slotstring[] = $elementaux; $indexreceiver1 = $i; $receiver1pron = true; } // posar "me" else if ($slotaux->level == 2 && $secondaryverbinf) { $slotaux->slotstring = array(); $elementaux[0] = "me"; $elementaux[1] = null; $slotaux->slotstring[] = $elementaux; $indexreceiver2 = $i; $receiver2pron = true; } // posar "em" else { $slotaux->slotstring = array(); $elementaux[0] = "em"; $elementaux[1] = null; $slotaux->slotstring[] = $elementaux; if ($slotaux->level == 1) { $indexreceiver1 = $i; $receiver1pron = true; } else if ($slotaux->level == 2) { $indexreceiver2 = $i; $receiver2pron = true; } } } else if ($slotaux->defvalue == "tu") { // posar "te" if ($slotaux->level == 1 && $mainverbinf || ($slotaux->level == 1 && $ordre && !$this->frasenegativa)) { $slotaux->slotstring = array(); $elementaux[0] = "te"; $elementaux[1] = null; $slotaux->slotstring[] = $elementaux; $indexreceiver1 = $i; $receiver1pron = true; } // posar "te" else if ($slotaux->level == 2 && $secondaryverbinf) { $slotaux->slotstring = array(); $elementaux[0] = "te"; $elementaux[1] = null; $slotaux->slotstring[] = $elementaux; $indexreceiver2 = $i; $receiver2pron = true; } // posar "et" else { $slotaux->slotstring = array(); $elementaux[0] = "et"; $elementaux[1] = null; $slotaux->slotstring[] = $elementaux; if ($slotaux->level == 1) { $indexreceiver1 = $i; $receiver1pron = true; } else if ($slotaux->level == 2) { $indexreceiver2 = $i; $receiver2pron = true; } } } } // si no hi ha valors per defecte -> transformar tots els pronoms personals 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->isPronomPers($slotaux->paraulafinal->text)) { $slotaux->slotstring = array(); $elementaux[0] = $matching->pronomsPersonalsAfterReceiver[$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->isPronomPers($slotaux->paraulafinal->text)) { $slotaux->slotstring = array(); $elementaux[0] = $matching->pronomsPersonalsFrontReceiver[$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->isPronomPers($slotaux->paraulafinal->text)) { $slotaux->slotstring = array(); $elementaux[0] = $matching->pronomsPersonalsAfterReceiver[$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->isPronomPers($slotaux->paraulafinal->text)) { $slotaux->slotstring = array(); $elementaux[0] = $matching->pronomsPersonalsFrontReceiver[$slotaux->paraulafinal->text]; $elementaux[1] = null; $slotaux->slotstring[] = $elementaux; $indexreceiver2 = $i; $receiver2pron = true; } } } } // Fi if slotaux = receiver else if ($slotaux->category == "Theme") { // si hi ha valors per defecte if ($slotaux->defvalueused) { if ($slotaux->defvalue == "jo") { // posar "me", si és infinitiu o ordre positiva, els apòstrofs després if (($slotaux->level == 1 && $mainverbinf) || ($slotaux->level == 1 && $ordre && !$this->frasenegativa)) { $slotaux->slotstring = array(); $elementaux[0] = "me"; $elementaux[1] = null; $slotaux->slotstring[] = $elementaux; $indextheme1 = $i; $theme1pron = true; } // posar "me" else if ($slotaux->level == 2 && $secondaryverbinf) { $slotaux->slotstring = array(); $elementaux[0] = "me"; $elementaux[1] = null; $slotaux->slotstring[] = $elementaux; $indextheme2 = $i; $theme2pron = true; } // posar "em" else { $slotaux->slotstring = array(); $elementaux[0] = "em"; $elementaux[1] = null; $slotaux->slotstring[] = $elementaux; if ($slotaux->level == 1) { $indextheme1 = $i; $theme1pron = true; } else if ($slotaux->level == 2) { $indextheme2 = $i; $theme2pron = true; } } } else if ($slotaux->defvalue == "tu") { // posar "te" if ($slotaux->level == 1 && $mainverbinf || ($slotaux->level == 1 && $ordre && !$this->frasenegativa)) { $slotaux->slotstring = array(); $elementaux[0] = "te"; $elementaux[1] = null; $slotaux->slotstring[] = $elementaux; $indextheme1 = $i; $theme1pron = true; } // posar "te" else if ($slotaux->level == 2 && $secondaryverbinf) { $slotaux->slotstring = array(); $elementaux[0] = "te"; $elementaux[1] = null; $slotaux->slotstring[] = $elementaux; $indextheme2 = $i; $theme2pron = true; } // posar "et" else { $slotaux->slotstring = array(); $elementaux[0] = "et"; $elementaux[1] = null; $slotaux->slotstring[] = $elementaux; if ($slotaux->level == 1) { $indextheme1 = $i; $theme1pron = true; } else if ($slotaux->level == 2) { $indextheme2 = $i; $theme2pron = true; } } } } // si no hi ha valors per defecte -> transformar tots els pronoms personals else { $parauladerivada = $slotaux->slotstring[0]; $parauladerivada = $parauladerivada[0]; // si hi ha una preposicio davant del pronom, no hauria de fer el canvi if (($slotaux->level == 1 && $mainverbinf) || ($slotaux->level == 1 && $ordre && !$this->frasenegativa)) { // si són pronoms personals, posem la forma correcta pels themes de darrere el verb // menys si és un patró verbless, on la frase només tindrà el pronom if ($matching->isPronomPers($parauladerivada) && !$this->verbless) { $slotaux->slotstring = array(); $elementaux[0] = $matching->pronomsPersonalsAfterTheme[$parauladerivada]; $elementaux[1] = null; $slotaux->slotstring[] = $elementaux; $indextheme1 = $i; $theme1pron = true; } } else if ($slotaux->level == 1) { // si són pronoms personals, posem la forma correcta pels themes d'abans del verb // menys si és un patró verbless, on la frase només tindrà el pronom if ($matching->isPronomPers($parauladerivada) && !$this->verbless) { $slotaux->slotstring = array(); $elementaux[0] = $matching->pronomsPersonalsFrontTheme[$parauladerivada]; $elementaux[1] = null; $slotaux->slotstring[] = $elementaux; $indextheme1 = $i; $theme1pron = true; } } else if ($slotaux->level == 2 && $secondaryverbinf) { // si són pronoms personals, posem la forma correcta pels themes de darrere el verb if ($matching->isPronomPers($parauladerivada)) { $slotaux->slotstring = array(); $elementaux[0] = $matching->pronomsPersonalsAfterTheme[$parauladerivada]; $elementaux[1] = null; $slotaux->slotstring[] = $elementaux; $indextheme2 = $i; $theme2pron = true; } } else if ($slotaux->level == 2) { // si són pronoms personals, posem la forma correcta pels themes d'abans del verb if ($matching->isPronomPers($parauladerivada)) { $slotaux->slotstring = array(); $elementaux[0] = $matching->pronomsPersonalsFrontTheme[$parauladerivada]; $elementaux[1] = null; $slotaux->slotstring[] = $elementaux; $indextheme2 = $i; $theme2pron = true; } } } } // Fi if slotaux = theme } // Fi for transformar pronoms // 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 theme 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 1 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 theme 1 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; $icmpMod); $i++) { $keymodifaux = $slotmainverb->CModassignedkey[$i]; $slotmodifaux = $slotmainverb->cmpMod[$keymodifaux]; // si és del grup que va darrere el subjecte (ex: no, també) if ($matching->isModAfterSubj($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; $iordrefrase[$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, $indexaux, 0, $temp); } // si els possibles pronoms que hi hagi, van abans del verb principal 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); } // si hi ha theme i no receiver, el posem abans del theme 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 receiver array_splice($this->ordrefrase, $indextheme1, 0, $temp); } // si no hi ha ni receiver, ni theme, el posem abans del mainverb else { $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, $indexmainverb, 0, $temp); } } // si no, va just abans del verb else { $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, $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:]][d][e][[:space:]][e][l][s][[:space:]]/u'; $patterns[2] = '/[[:space:]][a][[:space:]][e][l][[:space:]]/u'; $patterns[3] = '/[[:space:]][a][[:space:]][e][l][s][[:space:]]/u'; $patterns[4] = '/[[:space:]][p][e][r][[:space:]][e][l][[:space:]]/u'; $patterns[5] = '/[[:space:]][p][e][r][[:space:]][e][l][s][[:space:]]/u'; // de => d' $patterns[6] = '/[[:space:][d][e][[:space:]](?=[(aeiouAEIOUhH)])/u'; // em => m'; et => t' $patterns[7] = '/[[:space:]][e][m][[:space:]](?=[(aeiouAEIOUhH)])/u'; $patterns[8] = '/[[:space:]][e][t][[:space:]](?=[(aeiouAEIOUhH)])/u'; //verb acabat en vocal + pronoms de receiver/theme a darrere $patterns[9] = '/(?<=[aeio]@VERBUM)[[:space:]]me[[:space:]]/u'; $patterns[10] = '/(?<=[aeio]@VERBUM)[[:space:]]te[[:space:]]/u'; $patterns[11] = '/(?<=[aeiou]@VERBUM)[[:space:]]li[[:space:]]/u'; $patterns[12] = '/(?<=[aeio]@VERBUM)[[:space:]]nos[[:space:]]/u'; $patterns[13] = '/(?<=[aeiou]@VERBUM)[[:space:]]vos[[:space:]]/u'; $patterns[14] = '/(?<=[aeio]@VERBUM)[[:space:]]los[[:space:]]/u'; $patterns[38] = '/(?<=[aeio]@VERBUM)[[:space:]]lo[[:space:]]/u'; $patterns[39] = '/(?<=[aeiou]@VERBUM)[[:space:]]@PRFEBLEla[[:space:]]/u'; $patterns[42] = '/(?<=[aeiou]@VERBUM)[[:space:]]@PRFEBLEles[[:space:]]/u'; $patterns[48] = '/(?<=[aeiou]@VERBUM)[[:space:]]ho[[:space:]]/u'; // verb acabat en vocal+r + pronoms de receiver a darrere $patterns[15] = '/(?<=@VERBUM)[[:space:]]me[[:space:]]/u'; $patterns[16] = '/(?<=@VERBUM)[[:space:]]te[[:space:]]/u'; $patterns[17] = '/(?<=@VERBUM)[[:space:]]li[[:space:]]/u'; $patterns[18] = '/(?<=@VERBUM)[[:space:]]nos[[:space:]]/u'; $patterns[19] = '/(?<=@VERBUM)[[:space:]]vos[[:space:]]/u'; $patterns[20] = '/(?<=@VERBUM)[[:space:]]los[[:space:]]/u'; $patterns[40] = '/(?<=@VERBUM)[[:space:]]lo[[:space:]]/u'; $patterns[41] = '/(?<=@VERBUM)[[:space:]]@PRFEBLEla[[:space:]]/u'; $patterns[43] = '/(?<=@VERBUM)[[:space:]]@PRFEBLEles[[:space:]]/u'; $patterns[49] = '/(?<=@VERBUM)[[:space:]]ho[[:space:]]/u'; // verb+pronom feble de receiver ja enganxat, seguit de "ho" $patterns[21] = "/(?<=@VERBUM)'m[[:space:]]ho[[:space:]]/u"; $patterns[22] = "/(?<=@VERBUM)'t[[:space:]]ho[[:space:]]/u"; $patterns[23] = "/(?<=@VERBUM)-li[[:space:]]ho[[:space:]]/u"; $patterns[24] = "/(?<=@VERBUM)'ns[[:space:]]ho[[:space:]]/u"; $patterns[25] = "/(?<=@VERBUM)-vos[[:space:]]ho[[:space:]]/u"; $patterns[26] = "/(?<=@VERBUM)'ls[[:space:]]ho[[:space:]]/u"; $patterns[27] = "/(?<=@VERBUM)-me[[:space:]]ho[[:space:]]/u"; $patterns[28] = "/(?<=@VERBUM)-te[[:space:]]ho[[:space:]]/u"; $patterns[29] = "/(?<=@VERBUM)-nos[[:space:]]ho[[:space:]]/u"; $patterns[30] = "/(?<=@VERBUM)-vos[[:space:]]ho[[:space:]]/u"; $patterns[31] = "/(?<=@VERBUM)-los[[:space:]]ho[[:space:]]/u"; // netejar espais abans i després dels apòstrofs, si n'hi ha $patterns[32] = "/[[:space:]]'/u"; $patterns[33] = "/'[[:space:]]/u"; // netejar @VERBUM $patterns[50] = "/@VERBUM/u"; // canviar els pronoms febles el i la, per l', si cal $patterns[35] = "/(?<=@PRFEBLE)el[[:space:]](?=[(aeiouAEIOUhH)])/u"; $patterns[36] = "/(?<=@PRFEBLE)la[[:space:]](?=[(aeiouAEIOUhH)])/u"; // netejar @PRFEBLE $patterns[51] = "/@PRFEBLE/u"; //preps + pronoms personals $patterns[44] = '/[[:space:]][p][e][r][[:space:]][j][o][[:space:]]/u'; $patterns[45] = '/[[:space:]][a][m][b][[:space:]][j][o][[:space:]]/u'; $patterns[46] = '/[[:space:]][a][[:space:]][j][o][[:space:]]/u'; $patterns[47] = '/[[:space:]][d][e][[:space:]][j][o][[:space:]]/u'; $patterns[34] = '/[[:space:]][e][n][[:space:]][j][o][[:space:]]/u'; $replacements[0] = ' del '; $replacements[1] = ' dels '; $replacements[2] = ' al '; $replacements[3] = ' als '; $replacements[4] = ' pel '; $replacements[5] = ' pels '; $replacements[6] = " d'"; $replacements[7] = " m'"; $replacements[8] = " t'"; $replacements[9] = "'m "; $replacements[10] = "'t "; $replacements[11] = "-li "; $replacements[12] = "'ns "; $replacements[13] = "-vos "; $replacements[14] = "'ls "; $replacements[38] = "'l "; $replacements[39] = "-la "; $replacements[42] = "-les "; $replacements[48] = "-ho "; $replacements[15] = "-me "; $replacements[16] = "-te "; $replacements[17] = "-li "; $replacements[18] = "-nos "; $replacements[19] = "-vos "; $replacements[20] = "-los "; $replacements[40] = "-lo "; $replacements[41] = "-la "; $replacements[43] = "-les "; $replacements[49] = "-ho "; $replacements[21] = "-m'ho "; $replacements[22] = "-t'ho "; $replacements[23] = "-li-ho "; $replacements[24] = "'ns-ho "; $replacements[25] = "-vos-ho "; $replacements[26] = "'ls-ho "; $replacements[27] = "-m'ho "; $replacements[28] = "-t'ho "; $replacements[29] = "-nos-ho "; $replacements[30] = "-vos-ho "; $replacements[31] = "-los-ho "; $replacements[32] = "'"; $replacements[33] = "'"; $replacements[50] = ""; $replacements[35] = "l'"; $replacements[36] = "l'"; $replacements[51] = ""; $replacements[44] = ' per mi '; $replacements[45] = ' amb mi '; $replacements[46] = ' a mi '; $replacements[47] = ' de mi '; $replacements[34] = ' en mi '; $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; $itimeexpr); $i++) { $wordaux = $this->timeexpr[$i]; if (!$matching->isFrontAdvTemps($wordaux->text)) { // el posem darrere de la frase $frasebruta .= $wordaux->text." "; } } // afegim les expressions a davant o a darrere de la frase, si la frase no era buida, // afegim una coma abans -> CANVIAT, ja no afegim la coma $numexprs = count($this->exprsarray); $capitalafterexpr = false; /* if ($numexprs > 0 && $this->frasefinal != " ") { $frasebruta .= ", "; $frasebruta = preg_replace("/[[:space:]],/u", ",", $frasebruta); } */ for ($i=0; $i<$numexprs; $i++) { // l'hola sempre va a davant i les que tenen 1 a la propietat front if ($this->exprsarray[$i][1] == '1') { $fraseaux = $frasebruta; $frasebruta = " ".$this->exprsarray[$i][0]; $llargexpr = strlen($this->exprsarray[$i][0]); $lastcharexpr = $this->exprsarray[$i][0][$llargexpr-1]; // passem a majúscula la frase, si l'expressió de davant acaba en ".", "?", "!". if ($lastcharexpr != "?" || $lastcharexpr != "." || $lastcharexpr == "!") { $fraseaux = preg_replace("/[[:space:]]$/u", "", $fraseaux); if (isset($fraseaux[0])) { if ($fraseaux[0] == " ") $fraseaux[1] = strtoupper($fraseaux[1]); else $fraseaux[0] = strtoupper($fraseaux[0]); } } // si la frase no era buida, afegim una coma if (($this->frasefinal != " " || $numexprs > 1) && $lastcharexpr != "?" && $lastcharexpr != ".") $frasebruta = $frasebruta.", "; $frasebruta .= $fraseaux; } else $frasebruta .= $this->exprsarray[$i][0]." "; } // POSAR ELS PUNTS O EXCLAMACIONS O INTERROGANTS // esborrar si hi ha dos espais junts, l'últim espai i una coma al final si hi és. També l'espai del principi $frasebruta = preg_replace("/[[:space:]][[:space:]]/u", " ", $frasebruta); $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 .= "!"; else if ($tipusfrase == "pregunta" || $tipusfrase == "permis") $frasebruta .= "?"; else $frasebruta .= "."; } $this->frasefinal = $frasebruta; // DEBUG // echo $frasebruta.'

'; } // Treure els "jo" i "tu" dels subjectes. Canviar receivers a pronoms febles i posar-los // a darrere el verb si cal. Posar accents a les noves formes verbals, si cal. // Posar modificadors de frase com el "no" o el "també". // Fusionar preposicions amb articles (de+el/s = del/s... a+el...). // Escriure la frase final, posant les expressions i altres advs de temps al final. 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") { // si l'idioma d'expansió no podia expandir i s'ha fet servir el castellà per defecte // que no elimini els subjectes perquè així per la posterior traducció hi haurà menys // ambigüitats if ($slotaux->defvalueused) { if ($CI->session->userdata('explangcannotexpand') == '1') { switch ($slotaux->defvalue) { case '1': $slotaux->slotstring = array(); $elementaux[0] = "yo"; $elementaux[1] = null; $slotaux->slotstring[] = $elementaux; break; case '2': $slotaux->slotstring = array(); $elementaux[0] = "tú"; $elementaux[1] = null; $slotaux->slotstring[] = $elementaux; break; case '3': $slotaux->slotstring = array(); break; case '7': $slotaux->slotstring = array(); $elementaux[0] = "usted"; $elementaux[1] = null; $slotaux->slotstring[] = $elementaux; break; default: break; } } else { // esborrem el tú o yo, 3a persona impersonal o usted quan hi són per defecte if ($slotaux->defvalue == '1' || $slotaux->defvalue == '2' || $slotaux->defvalue == '3' || $slotaux->defvalue == '7') $slotaux->slotstring = array(); } } // si no s'ha fet servir el subjecte per defecte else { if ($CI->session->userdata('explangcannotexpand') != '1') { // esborrem el tú o el yo, si no tenen elements coordinats if (($slotaux->paraulafinal->text == "yo" || $slotaux->paraulafinal->text == "tú") && !$slotaux->paraulafinal->coord) { $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; $theme1pron = false; $theme2pron = 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 O DEL THEME 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; } // posar "me" 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; } // posar "te" else if ($slotaux->level == 2) { $slotaux->slotstring = array(); $elementaux[0] = "te"; $elementaux[1] = null; $slotaux->slotstring[] = $elementaux; $indexreceiver2 = $i; $receiver2pron = true; } } } // si no hi ha valors per defecte -> transformar tots els pronoms personals 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 if ($slotaux->category == "Theme") { // si hi ha valors per defecte if ($slotaux->defvalueused) { if ($slotaux->defvalue == "yo") { // posar "me" en tots els casos if ($slotaux->level == 1) { $slotaux->slotstring = array(); $elementaux[0] = "me"; $elementaux[1] = null; $slotaux->slotstring[] = $elementaux; $indextheme1 = $i; $theme1pron = true; } // posar "me" else if ($slotaux->level == 2) { $slotaux->slotstring = array(); $elementaux[0] = "me"; $elementaux[1] = null; $slotaux->slotstring[] = $elementaux; $indextheme2 = $i; $theme2pron = true; } } else if ($slotaux->defvalue == "tú") { // posar "te" if ($slotaux->level == 1) { $slotaux->slotstring = array(); $elementaux[0] = "te"; $elementaux[1] = null; $slotaux->slotstring[] = $elementaux; $indextheme1 = $i; $theme1pron = true; } // posar "te" else if ($slotaux->level == 2) { $slotaux->slotstring = array(); $elementaux[0] = "te"; $elementaux[1] = null; $slotaux->slotstring[] = $elementaux; $indextheme2 = $i; $theme2pron = true; } } } // si no hi ha valors per defecte -> transformar tots els pronoms personals else { $parauladerivada = $slotaux->slotstring[0]; $parauladerivada = $parauladerivada[0]; 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 // menys si és un patró verbless, on la frase només tindrà el pronom if ($matching->isPronomPersES($parauladerivada) && !$this->verbless) { $slotaux->slotstring = array(); $elementaux[0] = $matching->pronomsPersonalsThemeES[$parauladerivada]; $elementaux[1] = null; $slotaux->slotstring[] = $elementaux; $indextheme1 = $i; $theme1pron = true; } } else if ($slotaux->level == 1) { // si són pronoms personals, posem la forma correcta pels receivers d'abans del verb // menys si és un patró verbless, on la frase només tindrà el pronom if ($matching->isPronomPersES($parauladerivada) && !$this->verbless) { $slotaux->slotstring = array(); $elementaux[0] = $matching->pronomsPersonalsThemeES[$parauladerivada]; $elementaux[1] = null; $slotaux->slotstring[] = $elementaux; $indextheme1 = $i; $theme1pron = 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($parauladerivada)) { $slotaux->slotstring = array(); $elementaux[0] = $matching->pronomsPersonalsThemeES[$parauladerivada]; $elementaux[1] = null; $slotaux->slotstring[] = $elementaux; $indextheme2 = $i; $theme2pron = true; } } else if ($slotaux->level == 2) { // si són pronoms personals, posem la forma correcta pels receivers d'abans del verb if ($matching->isPronomPersES($parauladerivada)) { $slotaux->slotstring = array(); $elementaux[0] = $matching->pronomsPersonalsThemeES[$parauladerivada]; $elementaux[1] = null; $slotaux->slotstring[] = $elementaux; $indextheme2 = $i; $theme2pron = true; } } } } } // Fi for transformar pronoms // 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; $icmpMod); $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; $iordrefrase[$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); } // si els possibles pronoms que hi hagi, van abans del verb principal 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); } // si hi ha theme i no receiver, el posem abans del theme 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); } // si no hi ha ni receiver, ni theme, el posem abans del mainverb 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); } } // si no, va just abans del verb 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'; $patterns[14] = '/(?<=@VERBUM)[[:space:]]@PRFEBLEla[[:space:]]/u'; $patterns[15] = '/(?<=@VERBUM)[[:space:]]@PRFEBLElos[[:space:]]/u'; $patterns[16] = '/(?<=@VERBUM)[[:space:]]@PRFEBLElas[[: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'; $patterns[30] = '/(?<=@VERBUM)[[:space:]]le[[: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 i @PRFEBLE $patterns[28] = "/@VERBUM/u"; $patterns[29] = "/@PRFEBLE/u"; // preps + pronoms personals $patterns[17] = '/[[:space:]][c][o][n][[:space:]][y][o][[:space:]]/u'; $patterns[18] = '/[[:space:]][c][o][n][[:space:]][m][í][[:space:]]/u'; $patterns[19] = '/[[:space:]][c][o][n][[:space:]][t][ú][[:space:]]/u'; $patterns[20] = '/[[:space:]][c][o][n][[:space:]][t][i][[:space:]]/u'; $patterns[21] = '/[[:space:]][p][a][r][a][[:space:]][y][o][[:space:]]/u'; $patterns[22] = '/[[:space:]][p][a][r][a][[:space:]][t][ú][[:space:]]/u'; $patterns[23] = '/[[:space:]][a][[:space:]][y][o][[:space:]]/u'; $patterns[24] = '/[[:space:]][a][[:space:]][t][ú][[:space:]]/u'; $patterns[25] = '/[[:space:]][d][e][[:space:]][y][o][[:space:]]/u'; $patterns[26] = '/[[:space:]][d][e][[:space:]][t][ú][[:space:]]/u'; $patterns[13] = '/[[:space:]][e][n][[:space:]][y][o][[:space:]]/u'; $patterns[27] = '/[[:space:]][e][n][[:space:]][t][ú][[:space:]]/u'; $replacements[0] = ' del '; $replacements[1] = ' al '; $replacements[2] = "lo"; $replacements[14] = "la "; $replacements[15] = "los "; $replacements[16] = "las "; $replacements[3] = "me "; $replacements[4] = "te "; $replacements[5] = "se "; $replacements[6] = "nos "; $replacements[7] = "os "; $replacements[30] = "le "; $replacements[8] = "melo "; $replacements[9] = "telo "; $replacements[10] = "selo "; $replacements[11] = "noslo "; $replacements[12] = "roslo "; $replacements[28] = ""; $replacements[29] = ""; $replacements[17] = ' conmigo '; $replacements[18] = ' conmigo '; $replacements[19] = ' contigo '; $replacements[20] = ' contigo '; $replacements[21] = ' para mí '; $replacements[22] = ' para ti '; $replacements[23] = ' a mí '; $replacements[24] = ' a ti '; $replacements[25] = ' de mí '; $replacements[26] = ' de ti '; $replacements[13] = ' en mí '; $replacements[27] = ' en ti '; $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; $itimeexpr); $i++) { $wordaux = $this->timeexpr[$i]; if (!$matching->isFrontAdvTempsES($wordaux->text)) { // el posem darrere de la frase $frasebruta .= $wordaux->text." "; } } // afegim les expressions a davant o a darrere de la frase, si la frase no era buida, // afegim una coma abans -> CANVIAT, ja no afegim la coma $numexprs = count($this->exprsarray); $capitalafterexpr = false; /* if ($numexprs > 0 && $this->frasefinal != " ") { $frasebruta .= ", "; $frasebruta = preg_replace("/[[:space:]],/u", ",", $frasebruta); } */ for ($i=0; $i<$numexprs; $i++) { // l'hola sempre va a davant i les que tenen 1 a la propietat front if ($this->exprsarray[$i][1] == '1') { $fraseaux = $frasebruta; $frasebruta = " ".$this->exprsarray[$i][0]; $llargexpr = strlen($this->exprsarray[$i][0]); $lastcharexpr = $this->exprsarray[$i][0][$llargexpr-1]; // passem a majúscula la frase, si l'expressió de davant acaba en ".", "?", "!". if ($lastcharexpr != "?" || $lastcharexpr != "." || $lastcharexpr == "!") { $fraseaux = preg_replace("/[[:space:]]$/u", "", $fraseaux); if (isset($fraseaux[0])) { if ($fraseaux[0] == " ") $fraseaux[1] = strtoupper($fraseaux[1]); else $fraseaux[0] = strtoupper($fraseaux[0]); } } // si la frase no era buida, afegim una coma if (($this->frasefinal != " " || $numexprs > 1) && $lastcharexpr != "?" && $lastcharexpr != ".") $frasebruta = $frasebruta.", "; $frasebruta .= $fraseaux; } else $frasebruta .= $this->exprsarray[$i][0]." "; } // POSAR ELS PUNTS O EXCLAMACIONS O INTERROGANTS // esborrar si hi ha dos espais junts, l'últim espai i una coma al final si hi és. També l'espai del principi $frasebruta = preg_replace("/[[:space:]][[:space:]]/u", " ", $frasebruta); $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.'

'; } public function printOrdreFrase() { $string = ""; for ($i=0; $iordrefrase); $i++) { $string .= $this->ordrefrase[$i]." "; } return $string; } public function printFraseFinalSlotString() { $string = ""; // provisional mentre no haguem omplert frasefinal // agafem la frase dels slots // DEBUG // print_r($this->ordrefrase);echo '

'; for ($i=0; $iordrefrase); $i++) { $slotaux = $this->slotarray[$this->ordrefrase[$i]]; for ($j=0; $jslotstring); $j++) { $aux = $slotaux->slotstring[$j]; $string .= $aux[0]." "; } } return $string; } public function printFraseFinal() { return $this->frasefinal; } } /* End of file Mypattern.php */