static PyObject *constituents(PyObject *self, PyObject *args) { Dictionary dict; Parse_Options opts; Sentence sent; Linkage linkage; CNode * cn; /// Link counts int num_linkages; const char *text; PyObject *output_list; if (!PyArg_ParseTuple(args, "s", &text)) return NULL; opts = parse_options_create(); parse_options_set_verbosity(opts, -1); setlocale(LC_ALL, ""); dict = dictionary_create_default_lang(); if (!dict) { PyErr_SetString(PyExc_RuntimeError, "Fatal error: Unable to open the dictionary"); Py_INCREF(Py_None); return Py_None; } sent = sentence_create(text, dict); sentence_split(sent, opts); num_linkages = sentence_parse(sent, opts); if (num_linkages > 0) { linkage = linkage_create(0, sent, opts); cn = linkage_constituent_tree(linkage); output_list = build_tree(cn, linkage); if(output_list == Py_None) { Py_INCREF(output_list); return output_list; } linkage_free_constituent_tree(cn); linkage_delete(linkage); } else { sentence_delete(sent); dictionary_delete(dict); parse_options_delete(opts); Py_INCREF(Py_None); return Py_None; } sentence_delete(sent); dictionary_delete(dict); parse_options_delete(opts); return Py_BuildValue("S", output_list); }
static void finish(per_thread_data *ptd) { if (ptd->sent) sentence_delete(ptd->sent); ptd->sent = NULL; #if DO_PHRASE_TREE if (tree) linkage_free_constituent_tree(tree); tree = NULL; #endif if (ptd->linkage) linkage_delete(ptd->linkage); ptd->linkage = NULL; dictionary_delete(ptd->dict); ptd->dict = NULL; parse_options_delete(ptd->opts); ptd->opts = NULL; parse_options_delete(ptd->panic_parse_opts); ptd->panic_parse_opts = NULL; #ifdef USE_PTHREADS pthread_setspecific(java_key, NULL); #else global_ptd = NULL; #endif free(ptd); }
int main() { Dictionary dict; Parse_Options opts; Sentence sent; Linkage linkage; char * diagram; int i, num_linkages; char * input_string[] = { "Grammar is useless because there is nothing to say -- Gertrude Stein.", "Computers are useless; they can only give you answers -- Pablo Picasso.", }; opts = parse_options_create(); dict = dictionary_create("4.0.dict", "4.0.knowledge", "4.0.constituent-knowledge", "4.0.affix"); for (i=0; i<2; ++i) { sent = sentence_create(input_string[i], dict); num_linkages = sentence_parse(sent, opts); if (num_linkages > 0) { linkage = linkage_create(0, sent, opts); printf("%s\n", diagram = linkage_print_diagram(linkage)); string_delete(diagram); linkage_delete(linkage); } sentence_delete(sent); } dictionary_delete(dict); parse_options_delete(opts); return 0; }
int main(int argc, char * argv[]) { FILE *input_fh = stdin; Dictionary dict; Sentence sent; const char *language="en"; /* default to english, and not locale */ int pp_on=TRUE; int af_on=TRUE; int cons_on=TRUE; int num_linkages, i; char *input_string; Label label = NO_LABEL; const char *codeset; /*############################################################################################*/ int num=0; FILE *fp2,*fp_word_info,*fp_num,*fp_lname,*fp_rel,*fp_lcount,*fp_word_cat,*fp_word; /*##############################################################################################*/ i = 1; /*############################################################################################*/ if (argc > 4){ num =atoi(argv[4]); num=num-1; /// language = argv[1]; /*####################################################################################*/ // // if ((argc > 1) && (argv[1][0] != '-')) { /* the dictionary is the first argument if it doesn't begin with "-" */ // language = argv[1]; i++; } /*################################*/ language = argv[1]; /*################################*/ /* Get the locale from the environment... * perhaps we should someday get it from the dictionary ?? */ setlocale(LC_ALL, ""); /* Check to make sure the current locale is UTF8; if its not, * then force-set this to the english utf8 locale */ codeset = nl_langinfo(CODESET); if (!strstr(codeset, "UTF") && !strstr(codeset, "utf")) { setlocale(LC_CTYPE, "en_US.UTF-8"); } /*########################################*/ for (; i<argc-3; i++) { /*########################################*/ if (argv[i][0] == '-') { if (strcmp("--version", argv[i])==0) { printf("Version: %s\n", linkgrammar_get_version()); exit(0); } else if (strcmp("-ppoff", argv[i])==0) { pp_on = FALSE; } else if (strcmp("-coff", argv[i])==0) { cons_on = FALSE; } else if (strcmp("-aoff", argv[i])==0) { af_on = FALSE; } else if (strcmp("-batch", argv[i])==0) { } else if (strncmp("-!", argv[i],2)==0) { } else { print_usage(argv[0]); } } else { print_usage(argv[0]); } } opts = parse_options_create(); if (opts == NULL) { fprintf(stderr, "%s: Fatal error: unable to create parse options\n", argv[0]); exit(-1); } panic_parse_opts = parse_options_create(); if (panic_parse_opts == NULL) { fprintf(stderr, "%s: Fatal error: unable to create panic parse options\n", argv[0]); exit(-1); } setup_panic_parse_options(panic_parse_opts); parse_options_set_max_sentence_length(opts, 170); parse_options_set_panic_mode(opts, TRUE); parse_options_set_max_parse_time(opts, 30); parse_options_set_linkage_limit(opts, 1000); parse_options_set_short_length(opts, 10); /*##########################################*/ // parse_options_set_display_on(opts, TRUE); /*##########################################*/ if(language && *language) dict = dictionary_create_lang(language); else dict = dictionary_create_default_lang(); if (dict == NULL) { /*###########################################################################*/ fprintf(stderr, "%s: Fatal error: Unable to open dictionary.\n", argv[1]); /*##########################################################################*/ exit(-1); } /* process the command line like commands */ for (i=1; i<argc; i++) { if ((strcmp("-pp", argv[i])==0) || (strcmp("-c", argv[i])==0) || (strcmp("-a", argv[i])==0)) { i++; } else if ((argv[i][0] == '-') && (strcmp("-ppoff", argv[i])!=0) && (argv[i][0] == '-') && (strcmp("-coff", argv[i])!=0) && (argv[i][0] == '-') && (strcmp("-aoff", argv[i])!=0)) { if (argv[i][1] == '!') issue_special_command(argv[i]+2, opts, dict); else issue_special_command(argv[i]+1, opts, dict); } } verbosity = parse_options_get_verbosity(opts); /* Main input loop */ while (1) { input_string = fget_input_string(input_fh, stdout, opts); if (NULL == input_string) { if (input_fh == stdin) break; fclose (input_fh); input_fh = stdin; continue; } if ((strcmp(input_string, "quit\n")==0) || (strcmp(input_string, "exit\n")==0)) break; /* We have to handle the !file command inline; its too hairy * otherwise ... */ if (strncmp(input_string, "!file", 5) == 0) { char * filename = &input_string[6]; input_fh = fopen(filename, "r"); if (NULL == input_fh) { int perr = errno; fprintf(stderr, "Error: %s (%d) %s\n", filename, perr, strerror(perr)); input_fh = stdin; continue; } continue; } if (special_command(input_string, dict)) continue; if (parse_options_get_echo_on(opts)) { printf("%s", input_string); } if (parse_options_get_batch_mode(opts)) { label = strip_off_label(input_string); } sent = sentence_create(input_string, dict); if (sent == NULL) continue; if (sentence_length(sent) > parse_options_get_max_sentence_length(opts)) { if (verbosity > 0) { fprintf(stdout, "Sentence length (%d words) exceeds maximum allowable (%d words)\n", sentence_length(sent), parse_options_get_max_sentence_length(opts)); } sentence_delete(sent); continue; } /* First parse with cost 0 or 1 and no null links */ parse_options_set_disjunct_cost(opts, 2); parse_options_set_min_null_count(opts, 0); parse_options_set_max_null_count(opts, 0); parse_options_reset_resources(opts); num_linkages = sentence_parse(sent, opts); //############################################################################################ if(num+1>num_linkages && num_linkages != 0) { sprintf(link_info_filename,"%s/%s_tmp/linkid_cat.txt",argv[2],argv[3]); fp2 = fopen(link_info_filename,"a"); if(fp2==NULL) {printf("Could not open %s for writing\n",link_info_filename);exit(1);} fprintf(fp2,";~~~~~~~~~~\n"); fclose(fp2); sprintf(link_info_filename,"%s/%s_tmp/linkid_word.txt",argv[2],argv[3]); fp_word= fopen(link_info_filename, "a"); if(fp_word==NULL) {printf("Could not open %s for writing\n",link_info_filename);exit(1);} fprintf(fp_word,";~~~~~~~~~~\n"); fclose(fp_word); sprintf(link_info_filename,"%s/%s_tmp/link_numeric_word.txt",argv[2],argv[3]); fp_word_info= fopen(link_info_filename, "a"); if(fp_word_info==NULL) {printf("Could not open %s for writing\n",link_info_filename);exit(1);} fprintf(fp_word_info,";~~~~~~~~~~\n"); fclose(fp_word_info); sprintf(link_info_filename,"%s/%s_tmp/link_name_expand.txt",argv[2],argv[3]); fp_lname =fopen(link_info_filename,"a"); if(fp_lname==NULL) {printf("Could not open %s for writing\n",link_info_filename);exit(1);} fprintf(fp_lname,";~~~~~~~~~~\n"); fclose(fp_lname); sprintf(link_info_filename,"%s/%s_tmp/link_relation_info.txt",argv[2],argv[3]); fp_rel = fopen(link_info_filename,"a"); if(fp_rel==NULL) {printf("Could not open %s for writing\n",link_info_filename);exit(1);} fprintf(fp_rel,";~~~~~~~~~~\n"); fclose(fp_rel); /* sprintf(link_info_filename,"%s/%s_tmp/constituents.txt",argv[2],argv[3]); fp = fopen(link_info_filename,"a"); if(fp==NULL) {printf("Could not open %s for writing\n",link_info_filename);exit(1);} fprintf(fp,"\n"); fprintf(fp,";~~~~~~~~~~\n"); fclose(fp);*/ } sprintf(link_info_filename,"%s/%s_tmp/linkage_count.txt",argv[2],argv[3]); fp_lcount = fopen(link_info_filename,"a"); if(fp_lcount==NULL) {printf("Could not open %s for writing\n",link_info_filename);exit(1);} fprintf(fp_lcount, "(Found maximum of %d linkages )\n",num_linkages); fprintf(fp_lcount,";~~~~~~~~~~\n"); fclose(fp_lcount); //############################################################################################ if (num_linkages < 0) continue; /* Now parse with null links */ if ((num_linkages == 0) && (!parse_options_get_batch_mode(opts))) { if (verbosity > 0) //fprintf(stdout, "No complete linkages found.\n"); //############################################################################################ /* This part of the code written by Maha Laxmi and Shirisha Manju * if no complete linkage is found then redirect the output to standard output in clips format*/ sprintf(link_info_filename,"%s/%s_tmp/number.txt",argv[2],argv[3]); fp_num =fopen(link_info_filename,"a"); if(fp_num==NULL) {printf("Could not open %s for writing\n",link_info_filename);exit(1);} /* sprintf(link_info_filename,"%s/%s_tmp/constituents.txt",argv[2],argv[3]); fp_cons= fopen(link_info_filename,"a"); if(fp_cons==NULL) {printf("Could not open %s for writing\n",link_info_filename);exit(1);}*/ sprintf(link_info_filename,"%s/%s_tmp/linkid_word.txt",argv[2],argv[3]); fp_word= fopen(link_info_filename, "a"); if(fp_word==NULL) {printf("Could not open %s for writing\n",link_info_filename);exit(1);} sprintf(link_info_filename,"%s/%s_tmp/link_numeric_word.txt",argv[2],argv[3]); fp_word_info= fopen(link_info_filename, "a"); if(fp_word_info==NULL) {printf("Could not open %s for writing\n",link_info_filename);exit(1);} sprintf(link_info_filename,"%s/%s_tmp/linkid_cat.txt",argv[2],argv[3]); fp_word_cat= fopen(link_info_filename, "a"); if(fp_word_cat==NULL) {printf("Could not open %s for writing\n",link_info_filename);exit(1);} sprintf(link_info_filename,"%s/%s_tmp/link_name_expand.txt",argv[2],argv[3]); fp_lname =fopen(link_info_filename,"a"); if(fp_lname==NULL) {printf("Could not open %s for writing\n",link_info_filename);exit(1);} sprintf(link_info_filename,"%s/%s_tmp/link_relation_info.txt",argv[2],argv[3]); fp_rel = fopen(link_info_filename,"a"); if(fp_rel==NULL) {printf("Could not open %s for writing\n",link_info_filename);exit(1);} fprintf(fp_word, "\n(No complete linkages found)\n"); fprintf(fp_word_cat, "\n(No complete linkages found)\n"); fprintf(fp_word_info, "\n(No complete linkages found)\n"); fprintf(fp_lname, "\n(No complete linkages found)\n"); fprintf(fp_rel,"\n(No complete linkages found)\n"); fprintf(fp_word_cat,";~~~~~~~~~~\n"); // fprintf(fp_cons,";~~~~~~~~~~\n"); fprintf(fp_lname,";~~~~~~~~~~\n"); fprintf(fp_rel,";~~~~~~~~~~\n"); fprintf(fp_word_info,";~~~~~~~~~~\n"); fprintf(fp_word,";~~~~~~~~~~\n"); /* fclose(fp_cons); */ fclose(fp_word_cat); fclose(fp_word_info); fclose(fp_lname); fclose(fp_rel); fclose(fp_word); continue; /*###############################################################################################################*/ if (parse_options_get_allow_null(opts)) { parse_options_set_min_null_count(opts, 1); parse_options_set_max_null_count(opts, sentence_length(sent)); num_linkages = sentence_parse(sent, opts); } } if (parse_options_timer_expired(opts)) { if (verbosity > 0) fprintf(stdout, "Timer is expired!\n"); } if (parse_options_memory_exhausted(opts)) { if (verbosity > 0) fprintf(stdout, "Memory is exhausted!\n"); } if ((num_linkages == 0) && parse_options_resources_exhausted(opts) && parse_options_get_panic_mode(opts)) { /* print_total_time(opts); */ if (verbosity > 0) fprintf(stdout, "Entering \"panic\" mode...\n"); parse_options_reset_resources(panic_parse_opts); parse_options_set_verbosity(panic_parse_opts, verbosity); num_linkages = sentence_parse(sent, panic_parse_opts); if (parse_options_timer_expired(panic_parse_opts)) { if (verbosity > 0) fprintf(stdout, "Timer is expired!\n"); } } /* print_total_time(opts); */ if (parse_options_get_batch_mode(opts)) { //####################################################################### batch_process_some_linkages(label, sent, opts,argv[2],argv[3]); //######################################################################### // batch_process_some_linkages(label, sent, opts); } /*###############################################################################*/ // send num as an argument to process_some_linkages else { int c = process_some_linkages(sent, opts,num,argv[2],argv[3]); if (c == EOF) break; } /*################################################################################*/ /* else { int c = process_some_linkages(sent, opts); if (c == EOF) break; }*/ sentence_delete(sent); } if (parse_options_get_batch_mode(opts)) { /* print_time(opts, "Total"); */ /* fprintf(stderr, "%d error%s.\n", batch_errors, (batch_errors==1) ? "" : "s");*/ } parse_options_delete(panic_parse_opts); parse_options_delete(opts); dictionary_delete(dict); // printf ("Bye.\n"); return 0; }
/******************************************************************************************* * This functions translats a list of sentences in the input_string array, * terminates when it finds "end" in the array * Inputs: input_string: Array of sentences * all_linkages: if true, translate all possible linkages of the sentence * out_to_file : if true, outputs the results to seperate files in the out directory, * the out files names would be something like : src-x-y: Contains a linkage for the source sentence, x is the index of sentence in the array and y is the index of linkage trg-x-y-z: Contains a linklage for the target sentence, x is the index of sentence in the array, y is the index of linkage and z is the zth translation of that linkage x-y(a linkage in the source language may have more than one correspondent target * linkage) *******************************************************************************************/ void translate(char input_string[][200], int all_linkages, int out_to_file){ Dictionary dict; Parse_Options opts; Sentence sent; Linkage src_linkage, trg_linkage; Transfer trans; char * diagram; FILE * fp; int i, j, num_src_linkages, num_trg_linkages; //char filename[30], txfilename[30], filenum[4]; char txfilename[30]; char output_string[200]; int n; opts = parse_options_create(); parse_options_set_verbosity (opts, FALSE); parse_options_set_display_walls(opts, TRUE); parse_options_set_display_postscript(opts, TRUE); dict = dictionary_create("4.0.dict", "4.0.knowledge", NULL, NULL, "morphology/morphemes.dict"); if (!dict){ fprintf(stderr, "%s\n", lperrmsg); parse_options_delete(opts); printf("size : %lld", space_in_use); exit(0); } trans=transfer_create("translation/mapfile.txt", "translation/links_list.txt","translation/lexicon.txt", "target/trg.dict" ); if (!trans){ fprintf(stderr, "%s\n", maperrmsg); fprintf(stderr, "%s\n", lperrmsg); printf("size : %lld", space_in_use); exit(0); } for (n=0; strcmp (input_string[n],"end")!=0; n++ ){ sent = sentence_create(input_string[n], dict); if (!sent){ fprintf(stderr, "%s\n", lperrmsg); parse_options_delete(opts); printf("size : %lld", space_in_use); exit(0); } printf ("\n************************************\n%d-%s\n************************************\n", n+1, input_string[n]); num_src_linkages = sentence_parse(sent, opts); num_src_linkages = (all_linkages) ? num_src_linkages: (num_src_linkages!=0)*1; for (i=0; i<num_src_linkages;i++) { src_linkage = linkage_create(i, sent, opts); diagram = linkage_print_diagram(src_linkage); printf ("\nLinkage No. %d-%d\n\n", n+1, i+1); printf("%s\n", diagram); if (out_to_file){ sprintf(txfilename,"out/src-%d-%d.txt", n+1, i+1); fp=fopen(txfilename,"w+"); if (fp==NULL){ fprintf(stderr, "%s%s\n", "Unable to open ", txfilename); printf("size : %lld", space_in_use); exit(0); } fprintf(fp,"%s",diagram); fclose(fp); } string_delete(diagram); num_trg_linkages = transfer_linkage_driver(trans, src_linkage); if(num_trg_linkages==0){ fprintf(stderr, "%s\n", maperrmsg); } else{ parse_options_set_display_walls (trans->opts, TRUE); for (j=0; j<num_trg_linkages; j++){ //second parameter should always be 0 !? trg_linkage=trans_linkage_create(trans, 0, trans->sent[j], trans->opts); diagram = linkage_print_diagram(trg_linkage); printf ("\nTranslation No. %d_%d_%d\n\n", n+1,i+1,j+1); printf("Translation: %s\n", output_string); printf("%s\n", diagram); if (out_to_file){ sprintf(txfilename,"out/trg-%d-%d-%d.txt", n+1, i+1, j+1); fp=fopen(txfilename,"w+"); if (fp==NULL){ fprintf(stderr, "%s%s\n", "Unable to open ", txfilename); printf("size : %lld", space_in_use); exit(0); } extract_sent (trg_linkage, output_string); fprintf(fp, "Translation:%s\n", output_string); fprintf(fp,"%s",diagram); fclose(fp); } string_delete(diagram); linkage_delete(trg_linkage); } } linkage_delete(src_linkage); } fprintf(stderr, "%s\n", lperrmsg); sentence_delete(sent); } transfer_delete(trans); dictionary_delete(dict); parse_options_delete(opts); }
/******************************************************************************************* * This functions parses a list of sentences and outputs the results to seperate files in * the out directory, * The files are indexed as out_x_y, where x is the index of the sentence in the array and y * is the index of the linkage *******************************************************************************************/ void normal_parse(char input_string[][200], int unify_features, int all_linkages, int out_to_file){ Dictionary dict; Parse_Options opts; int n; Sentence sent; Linkage linkage; char * diagram; int i, num_linkages; char txfilename[30]; FILE * fp; opts = parse_options_create(); parse_options_set_display_walls(opts, TRUE); parse_options_set_display_postscript(opts, TRUE); parse_options_set_unify_features(opts, unify_features); dict = dictionary_create("4.0.dict", "4.0.knowledge", NULL, NULL, "morphology/morphemes.dict"); if (!dict){ fprintf(stderr, "%s\n", lperrmsg); parse_options_delete(opts); printf("size : %lld", space_in_use); exit(0); } //setting opts->unify_features to TRUE enables unification for (n=0; strcmp (input_string[n],"end")!=0; n++ ){ sent = sentence_create(input_string[n], dict); if (!sent){ fprintf(stderr, "%s\n", lperrmsg); dictionary_delete(dict); parse_options_delete(opts); exit(0); } printf ("\n************************************\n%d-%s\n************************************\n", n+1, input_string[n]); num_linkages = sentence_parse(sent, opts); num_linkages = (all_linkages) ? num_linkages : (num_linkages!=0)*1 ; //Echos all linkages to screen, ps file and text file in ./out directory for (i=0; i<num_linkages; ++i) { linkage = linkage_create(i , sent, opts); diagram = linkage_print_diagram(linkage); printf ("\n Linkage No. %d-%d\n\n", n+1, i+1); printf("%s\n", diagram); if (out_to_file){ sprintf(txfilename,"out/src-%d-%d.txt", n+1, i+1); fp=fopen(txfilename,"w+"); if (fp==NULL){ fprintf(stderr, "%s%s\n", "Unable to open ", txfilename); printf("size : %lld", space_in_use); exit(0); } fprintf(fp,"%s",diagram); fclose(fp); } string_delete(diagram); linkage_delete(linkage); } sentence_delete(sent); } dictionary_delete(dict); parse_options_delete(opts); }
int main(int argc, char * argv[]) { Dictionary dict; Sentence sent; char *dictionary_file=NULL; char *post_process_knowledge_file=NULL; char *constituent_knowledge_file=NULL; char *affix_file=NULL; int pp_on=TRUE; int af_on=TRUE; int cons_on=TRUE; int num_linkages, i; char input_string[MAXINPUT]; Label label = NO_LABEL; int parsing_space_leaked, reported_leak, dictionary_and_option_space; i = 1; if ((argc > 1) && (argv[1][0] != '-')) { /* the dictionary is the first argument if it doesn't begin with "-" */ dictionary_file = argv[1]; i++; } for (; i<argc; i++) { if (argv[i][0] == '-') { if (strcmp("-pp", argv[i])==0) { if ((post_process_knowledge_file != NULL) || (i+1 == argc)) print_usage(argv[0]); post_process_knowledge_file = argv[i+1]; i++; } else if (strcmp("-c", argv[i])==0) { if ((constituent_knowledge_file != NULL) || (i+1 == argc)) print_usage(argv[0]); constituent_knowledge_file = argv[i+1]; i++; } else if (strcmp("-a", argv[i])==0) { if ((affix_file != NULL) || (i+1 == argc)) print_usage(argv[0]); affix_file = argv[i+1]; i++; } else if (strcmp("-ppoff", argv[i])==0) { pp_on = FALSE; } else if (strcmp("-coff", argv[i])==0) { cons_on = FALSE; } else if (strcmp("-aoff", argv[i])==0) { af_on = FALSE; } else if (strcmp("-batch", argv[i])==0) { } else if (strncmp("-!", argv[i],2)==0) { } else { print_usage(argv[0]); } } else { print_usage(argv[0]); } } if (!pp_on && post_process_knowledge_file != NULL) print_usage(argv[0]); if (dictionary_file == NULL) { dictionary_file = "4.0.dict"; fprintf(stderr, "No dictionary file specified. Using %s.\n", dictionary_file); } if (af_on && affix_file == NULL) { affix_file = "4.0.affix"; fprintf(stderr, "No affix file specified. Using %s.\n", affix_file); } if (pp_on && post_process_knowledge_file == NULL) { post_process_knowledge_file = "4.0.knowledge"; fprintf(stderr, "No post process knowledge file specified. Using %s.\n", post_process_knowledge_file); } if (cons_on && constituent_knowledge_file == NULL) { constituent_knowledge_file = "4.0.constituent-knowledge"; fprintf(stderr, "No constituent knowledge file specified. Using %s.\n", constituent_knowledge_file); } opts = parse_options_create(); if (opts == NULL) { fprintf(stderr, "%s\n", lperrmsg); exit(-1); } panic_parse_opts = parse_options_create(); if (panic_parse_opts == NULL) { fprintf(stderr, "%s\n", lperrmsg); exit(-1); } setup_panic_parse_options(panic_parse_opts); parse_options_set_max_sentence_length(opts, 70); parse_options_set_panic_mode(opts, TRUE); parse_options_set_max_parse_time(opts, 30); parse_options_set_linkage_limit(opts, 1000); parse_options_set_short_length(opts, 10); dict = dictionary_create(dictionary_file, post_process_knowledge_file, constituent_knowledge_file, affix_file); if (dict == NULL) { fprintf(stderr, "%s\n", lperrmsg); exit(-1); } /* process the command line like commands */ for (i=1; i<argc; i++) { if ((strcmp("-pp", argv[i])==0) || (strcmp("-c", argv[i])==0) || (strcmp("-a", argv[i])==0)) { i++; } else if ((argv[i][0] == '-') && (strcmp("-ppoff", argv[i])!=0) && (argv[i][0] == '-') && (strcmp("-coff", argv[i])!=0) && (argv[i][0] == '-') && (strcmp("-aoff", argv[i])!=0)) { issue_special_command(argv[i]+1, opts, dict); } } dictionary_and_option_space = space_in_use; reported_leak = external_space_in_use = 0; verbosity = parse_options_get_verbosity(opts); while (fget_input_string(input_string, stdin, stdout, opts)) { if (space_in_use != dictionary_and_option_space + reported_leak) { fprintf(stderr, "Warning: %d bytes of space leaked.\n", space_in_use-dictionary_and_option_space-reported_leak); reported_leak = space_in_use - dictionary_and_option_space; } if ((strcmp(input_string, "quit\n")==0) || (strcmp(input_string, "exit\n")==0)) break; if (special_command(input_string, dict)) continue; if (parse_options_get_echo_on(opts)) { printf("%s", input_string); } if (parse_options_get_batch_mode(opts)) { label = strip_off_label(input_string); } sent = sentence_create(input_string, dict); if (sent == NULL) { if (verbosity > 0) fprintf(stderr, "%s\n", lperrmsg); if (lperrno != NOTINDICT) exit(-1); else continue; } if (sentence_length(sent) > parse_options_get_max_sentence_length(opts)) { sentence_delete(sent); if (verbosity > 0) { fprintf(stdout, "Sentence length (%d words) exceeds maximum allowable (%d words)\n", sentence_length(sent), parse_options_get_max_sentence_length(opts)); } continue; } /* First parse with cost 0 or 1 and no null links */ parse_options_set_disjunct_cost(opts, 2); parse_options_set_min_null_count(opts, 0); parse_options_set_max_null_count(opts, 0); parse_options_reset_resources(opts); num_linkages = sentence_parse(sent, opts); /* Now parse with null links */ if ((num_linkages == 0) && (!parse_options_get_batch_mode(opts))) { if (verbosity > 0) fprintf(stdout, "No complete linkages found.\n"); if (parse_options_get_allow_null(opts)) { parse_options_set_min_null_count(opts, 1); parse_options_set_max_null_count(opts, sentence_length(sent)); num_linkages = sentence_parse(sent, opts); } } if (parse_options_timer_expired(opts)) { if (verbosity > 0) fprintf(stdout, "Timer is expired!\n"); } if (parse_options_memory_exhausted(opts)) { if (verbosity > 0) fprintf(stdout, "Memory is exhausted!\n"); } if ((num_linkages == 0) && parse_options_resources_exhausted(opts) && parse_options_get_panic_mode(opts)) { print_total_time(opts); if (verbosity > 0) fprintf(stdout, "Entering \"panic\" mode...\n"); parse_options_reset_resources(panic_parse_opts); parse_options_set_verbosity(panic_parse_opts, verbosity); num_linkages = sentence_parse(sent, panic_parse_opts); if (parse_options_timer_expired(panic_parse_opts)) { if (verbosity > 0) fprintf(stdout, "Timer is expired!\n"); } } print_total_time(opts); if (parse_options_get_batch_mode(opts)) { batch_process_some_linkages(label, sent, opts); } else { process_some_linkages(sent, opts); } sentence_delete(sent); if (external_space_in_use != 0) { fprintf(stderr, "Warning: %d bytes of external space leaked.\n", external_space_in_use); } } if (parse_options_get_batch_mode(opts)) { print_time(opts, "Total"); fprintf(stderr, "%d error%s.\n", batch_errors, (batch_errors==1) ? "" : "s"); } parsing_space_leaked = space_in_use - dictionary_and_option_space; if (parsing_space_leaked != 0) { fprintf(stderr, "Warning: %d bytes of space leaked during parsing.\n", parsing_space_leaked); } parse_options_delete(panic_parse_opts); parse_options_delete(opts); dictionary_delete(dict); if (space_in_use != parsing_space_leaked) { fprintf(stderr, "Warning: %d bytes of dictionary and option space leaked.\n", space_in_use - parsing_space_leaked); } else if (parsing_space_leaked == 0) { fprintf(stderr, "Good news: no space leaked.\n"); } if (external_space_in_use != 0) { fprintf(stderr, "Warning: %d bytes of external space leaked.\n", external_space_in_use); } return 0; }
void command_options_delete(Command_Options* co) { parse_options_delete(co->panic_opts); parse_options_delete(co->popts); free(co); }
static PyObject *domains(PyObject *self, PyObject *args) { Dictionary dict; Parse_Options opts; Sentence sent; Linkage linkage; //CNode * cn; /// Link counts int num_linkages; int links; int i; int j = 0; int num_domains; const char *text; PyObject *output_list; PyObject *temp; output_list = PyList_New(0); if (!PyArg_ParseTuple(args, "s", &text)) return NULL; opts = parse_options_create(); parse_options_set_verbosity(opts, -1); setlocale(LC_ALL, ""); dict = dictionary_create_default_lang(); if (!dict) { PyErr_SetString(PyExc_RuntimeError, "Fatal error: Unable to open the dictionary"); Py_INCREF(Py_None); return Py_None; } sent = sentence_create(text, dict); sentence_split(sent, opts); num_linkages = sentence_parse(sent, opts); if (num_linkages > 0) { linkage = linkage_create(0, sent, opts); links = linkage_get_num_sublinkages(linkage); for(i=0; i<=links; i++) { num_domains = linkage_get_link_num_domains(linkage, i); const char **temp1 = linkage_get_link_domain_names(linkage, i); //for(j=0; j<=num_domains; j++){ while(num_domains < j) { temp = PyString_FromString(temp1[j]); PyList_Append(output_list, temp); j++; } j = 0; } linkage_delete(linkage); } else { sentence_delete(sent); dictionary_delete(dict); parse_options_delete(opts); Py_INCREF(Py_None); return Py_None; } sentence_delete(sent); dictionary_delete(dict); parse_options_delete(opts); return Py_BuildValue("Si", output_list, num_domains); }
/// This is the basic sentence dissection static PyObject *sentence(PyObject *self, PyObject *args) { Dictionary dict; Parse_Options opts; Sentence sent; Linkage linkage; Linkage sub_linkage; char * diagram; /// Link counts int num_linkages; int links; /// Index's for the iterators int link_idx; int word_idx; int num_words; long span; long sub_linkages; const char *text; const char *d_output; PyObject *output_list; PyObject *word_list; PyObject *word2_list; PyObject *span_list; PyObject *temp; PyObject *sublinkage_list; PyObject *_diagram; output_list = PyList_New(0); word_list = PyList_New(0); word2_list = PyList_New(0); sublinkage_list = PyList_New(0); span_list = PyList_New(0); if (!PyArg_ParseTuple(args, "s", &text)) return NULL; opts = parse_options_create(); parse_options_set_verbosity(opts, -1); parse_options_set_screen_width(opts, 50); setlocale(LC_ALL, ""); dict = dictionary_create_default_lang(); if (!dict) { PyErr_SetString(PyExc_RuntimeError, "Fatal error: Unable to open the dictionary"); Py_INCREF(Py_None); return Py_None; } sent = sentence_create(text, dict); sentence_split(sent, opts); num_linkages = sentence_parse(sent, opts); if (num_linkages > 0) { linkage = linkage_create(0, sent, opts); /// Get the lengths of everything num_words = linkage_get_num_words(linkage); links = linkage_get_num_links(linkage); for(link_idx=0; link_idx < links; link_idx++) { PyObject *temp_subLen; diagram = linkage_print_diagram(linkage); _diagram = PyString_FromString(diagram); sub_linkage = linkage_create(link_idx, sent, opts); sub_linkages = linkage_get_num_sublinkages(linkage); temp_subLen = PyLong_FromLong(sub_linkages); linkage_delete(sub_linkage); PyList_Append(sublinkage_list, temp_subLen); span = linkage_get_link_length(linkage, link_idx); PyList_Append(span_list, PyInt_FromLong(span)); PyObject *temp_list; temp_list = PyList_New(0); /// Sub Group these (left and right labels) const char *t1 = linkage_get_link_llabel(linkage, link_idx); temp = PyString_FromString(t1); PyList_Append(temp_list, temp); const char *t2 = linkage_get_link_rlabel(linkage, link_idx); temp = PyString_FromString(t2); PyList_Append(temp_list, temp); /// Then add to the main list PyList_Append(output_list, temp_list); /// Just the label const char *t3 = linkage_get_link_label(linkage, link_idx); temp = PyString_FromString(t3); PyList_Append(word2_list, temp); } for(word_idx=0; word_idx < num_words; word_idx++) { d_output = linkage_get_word(linkage, word_idx); PyObject *word; word = PyString_FromString(d_output); PyList_Append(word_list, word); } linkage_free_diagram(diagram); linkage_delete(linkage); } else { sentence_delete(sent); dictionary_delete(dict); parse_options_delete(opts); Py_INCREF(Py_None); return Py_None; } sentence_delete(sent); dictionary_delete(dict); parse_options_delete(opts); return Py_BuildValue("SSSSSS", word_list, span_list, output_list, word2_list, sublinkage_list, _diagram); }
void free_parse_options_ptr(ParseOptionsPtr *ptr) { parse_options_delete(ptr->opts); free(ptr); }
void delete_morpho_structures(Morpho_structures morpho_structures){ dictionary_delete(morpho_structures->dict); // free_morpho_list(morpho_structures->ecomposed_word); parse_options_delete(morpho_structures->opts); xfree(morpho_structures, sizeof(struct Morpho_structures_s)); }