Exemple #1
0
cst_val *lts_apply_val(const cst_val *wlist,const char *feats,const cst_lts_rules *r)
{
    /* for symbol to symbol mapping */
    const cst_val *v;
    cst_val *p;
    char *word;
    int i,j;

    word = cst_alloc(char,val_length(wlist)+1);

    for (v=wlist,i=0; v; v=val_cdr(v),i++)
    {
	for (j=0; r->letter_table[j]; j++)
	    if (cst_streq(val_string(val_car(v)),r->letter_table[j]))
	    {
		word[i] = j;
		break;
	    }
        if (!r->letter_table[j])
        {
#if 0
            printf("awb_debug unknown letter >%s<\n",val_string(val_car(v)));
#endif
            i--;  /* can't find this letter so skip it */
        }
    }

    p = lts_apply(word,feats,r);
    cst_free(word);

    return p;
}
Exemple #2
0
cst_val *lex_lookup(const cst_lexicon *l, const char *word, const char *pos,
                    const cst_features *feats)
{
    int index;
    int p;
    const char *q;
    char *wp;
    cst_val *phones = 0;
    int found = FALSE;

    wp = cst_alloc(char,cst_strlen(word)+2);
    cst_sprintf(wp,"%c%s",(pos ? pos[0] : '0'),word);

    if (l->addenda)
        phones = lex_lookup_addenda(wp,l,&found);

    if (!found)
    {
        index = lex_lookup_bsearch(l,wp);

        if (index >= 0)
        {
            if (l->phone_hufftable)
            {
                for (p=index-2; l->data[p]; p--)
                    for (q=l->phone_hufftable[l->data[p]]; *q; q++)
                        phones = cons_val(string_val(l->phone_table[(unsigned char)*q]),
                                          phones);
            }
            else  /* no compression -- should we still support this ? */
            {
                for (p=index-2; l->data[p]; p--)
                    phones = cons_val(string_val(l->phone_table[l->data[p]]),
                                      phones);
            }
            phones = val_reverse(phones);
        }
        else if (l->lts_function)
        {
            phones = (l->lts_function)(l,word,"",feats);
        }
        else if (l->lts_rule_set)
        {
            phones = lts_apply(word,
                               "",  /* more features if we had them */
                               l->lts_rule_set);
        }
    }

    cst_free(wp);

    return phones;
}
cst_val *lex_lookup_return_pos(const cst_lexicon *l, const char *word, const char *pos, int *return_pos)
{
    int index,p;
    char *wp, *buf;
    cst_val *phones = 0;
    int found = FALSE;

    wp = cst_alloc(char,strlen(word)+2);
    buf = cst_alloc(char,3);
    sprintf(wp,"%c%s",(pos ? pos[0] : '0'),word);
    
#ifdef CECUM_DEBUG    
    printf ("lex_lookup_return_pos looks for %s \n", word);
#endif

    if (l->addenda)
      phones = CECUM_lex_lookup_addenda (wp,l,&found);
    
    if (!found)
      {
        index = CECUM_lex_lookup_bsearch (l, l->entry_index,0,l->num_entries,wp);

#ifdef CECUM_DEBUG          
	printf ("lex_lookup_return_pos has found the word at pos %d \n", index);
#endif
	
	if (index >= 0)
	  {
	    for (p=l->entry_index[index].phone_index; l->phones[p]; p++)
	      phones = cons_val(string_val(l->phone_table[l->phones[p]]), phones);
	    phones = val_reverse(phones);
	    if (!pos) 
	      {
                //aggiungi in testa il pos se non lo ho!
		*return_pos = TRUE;
		sprintf(buf,"%c",l->entry_index[index].word_pos[0]);
		phones = cons_val(string_val(buf), phones);	      
	      }
	    //val_print(stdout,phones);
	    //printf("\n");
	  } 
	else 
        {
#ifdef CECUM_DEBUG          
	  printf ("lex_lookup_return_pos: word not found \n", index);
#endif

	  /*
	       E' a partire da questo punto che si verifica in genere il problema su cui stavamo
               lavorando. Se la parola non viene trovata nel dizionario, viene restituito un indice -1.
               Ora, lts_rules_set (e lts_apply) non viene eseguita perchè in ifd_lex.c noi abbiamo
	       posto
		
			ifd_lex.lts_rule_set = 0;

	       Del resto, nella lingua italiana non sembrano essere fornite rules compatibili con lst_apply,
	       a differenza di quello che accade con la lingua inglese

	       Il puntatore a funzione l->lst_function viene, al contrario, eseguito. Qui la funzione 
               richiamata è italian_lts_function() (dentro ifd_lex.c). Sarà quest'ultima a richiamare
	       più volte una serie di routine di rewrites (è qui che si verifica l'errore su cui stiamo
	       lavorando). Per esempio, è qui che verrà richiamata ifd_mid_lts_rewrites ()
	 */	 		

	  if (l->lts_rule_set)
	  phones = lts_apply(word,
			     "",  /* more features if we had them */
			     l->lts_rule_set);
	  else  if (l->lts_function)
	  	phones = (l->lts_function)(l,word,"");
        }
      }

    cst_free(wp);
    cst_free(buf);
    return phones;
}