Select Git revision
-
Alexis Nasr authored
one module available : maca_trans_parser a transition based parser
Alexis Nasr authoredone module available : maca_trans_parser a transition based parser
simple_decoder_parser_arc_eager.c 3.78 KiB
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<unistd.h>
#include<getopt.h>
#include"context.h"
#include"movement_parser_arc_eager.h"
#include"feat_fct.h"
#include"config2feat_vec.h"
#include"feature_table.h"
#include"dico.h"
void print_word_buffer(config *c, dico *dico_labels)
{
int i;
word *dep;
char *label;
for(i=0; i < config_get_buffer(c)->nbelem; i++){
dep = word_buffer_get_word_n(config_get_buffer(c), i);
printf("%s\t", word_get_input(dep));
printf("%d\t", word_get_gov(dep));
label = (word_get_label(dep) == -1)? NULL : dico_int2string(dico_labels, word_get_label(dep));
if(label != NULL)
printf("%s\t", label) ;
else
printf("_\t");
if(word_get_sent_seg(dep) == 1)
printf("1\n") ;
else
printf("0\n");
}
}
void simple_decoder_parser_arc_eager(context *ctx)
{
FILE *f = (ctx->input_filename)? myfopen(ctx->input_filename, "r") : stdin;
feature_table *ft = feature_table_load(ctx->perc_model_filename, ctx->verbose);
int root_label;
int mvt_code;
int mvt_type;
int mvt_label;
float max;
feat_vec *fv = feat_vec_new(feature_types_nb);
config *c = NULL;
int result;
float entropy;
/* float delta; */
int argmax1, argmax2;
float max1, max2;
int index;
root_label = dico_string2int(ctx->dico_labels, ctx->root_label);
if(root_label == -1) root_label = 0;
c = config_new(f, ctx->mcd_struct, 5);
while(!config_is_terminal(c)){
config2feat_vec_cff(ctx->features_model, c, ctx->d_perceptron_features, fv, LOOKUP_MODE);
mvt_code = feature_table_argmax(fv, ft, &max);
mvt_type = movement_parser_type(mvt_code);
mvt_label = movement_parser_label(mvt_code);
if(ctx->trace_mode){
index = word_get_index(word_buffer_b0(config_get_buffer(c)));
fprintf(stdout, "%d\t", index);
stack_print(stdout, c->st);
fprintf(stdout, "\t");
movement_parser_print(stdout, mvt_code, ctx->dico_labels);
fprintf(stdout, "\t");
feature_table_argmax_1_2(fv, ft, &argmax1, &max1, &argmax2, &max2);
printf("%f\n", max1 - max2);
}
if(ctx->debug_mode){
fprintf(stdout, "***********************************\n");
config_print(stdout, c);
entropy = feature_table_entropy(fv, ft);
/* delta = feature_table_diff_scores(fv, ft); */
feature_table_argmax_1_2(fv, ft, &argmax1, &max1, &argmax2, &max2);
movement_parser_print(stdout, argmax1, ctx->dico_labels);
printf(":\t%f\n", max1);
movement_parser_print(stdout, argmax2, ctx->dico_labels);
printf(":\t%f\n", max2);
printf("delta = %f\n", max1 - max2);
/* delta = feature_table_first_second(fv, ft); */
/* printf("entropy = %f delta = %f\n", entropy, delta); */
printf("entropy = %f\n",entropy);
/* movement_parser_print(stdout, mvt_code, ctx->dico_labels); */
}
result = 0;
switch(mvt_type){
case MVT_PARSER_LEFT :
result = movement_parser_left_arc(c, mvt_label);
break;
case MVT_PARSER_RIGHT:
result = movement_parser_right_arc(c, mvt_label);
break;
case MVT_PARSER_REDUCE:
result = movement_parser_reduce(c);
break;
case MVT_PARSER_ROOT:
result = movement_parser_root(c, root_label);
break;
case MVT_PARSER_EOS:
result = movement_parser_eos(c);
break;
case MVT_PARSER_SHIFT:
result = movement_parser_shift(c);
}
if(result == 0){
if(ctx->debug_mode){
fprintf(stdout, "WARNING : movement cannot be executed doing a SHIFT instead !\n");
}
movement_parser_shift(c);
}
}
if(!ctx->trace_mode)
print_word_buffer(c, ctx->dico_labels);
config_free(c);
feat_vec_free(fv);
feature_table_free(ft);
if(ctx->input_filename)
fclose(f);
}