/*********************************************************************************** * File: lexicon.c * Created: 6 JA 2000 * Modified: 30 OCT 2000 MDoyle * Author: Jeff Jenkins, R. DeArmond, based on an earlier model by David Ashton * * This file contains the function bodies for functions that copy a feature from some * struct into some other (or possible the same) struct. ************************************************************************************/ /************************************************************************************ * includes ******************************************************************************************/ #include #include #include #include "lexicon.h" #include "noun.h" #include "nsuffix.h" #include "verb.h" #include "vsuffix.h" #include "quan.h" #include "UQ.h" #include "comp.h" #include "conj.h" #include "det.h" #include "lib.h" #include "adj.h" #include "prep.h" #include "deg.h" #include "Dummy_Verb.h" #include "pro.h" #include "neg.h" //MDoyle -> added dummy_struct to the lexicon and updated the lexicon version numdummyr to 2 //30 OCT 2000 #define LEXICON_VERSION 4 // imported variables struct noun_struct noun_list[MAX_NOUNS]; int nouns; struct verb_struct verb_list[MAX_VERBS]; int verbs; struct quan_struct quan_list[MAX_QUANTIFIERS]; int quantifiers; struct uquan_struct uquan_list[MAX_UQUANTIFIERS]; int uquantifiers; struct det_struct det_list[MAX_DETERMINERS]; int determiners; struct adj_struct adj_list[MAX_ADJECTIVES]; int adjectives; struct deg_struct deg_list[MAX_DEGREEWORDS]; int degree; struct prep_struct prep_list[MAX_PREPOSITIONS]; int prepositions; struct nsuffix_struct nsuffix_list[MAX_NSUFFIXES]; int nsuffixes; struct vsuffix_struct vsuffix_list[MAX_VSUFFIXES]; int vsuffixes; struct comp_struct comp_list[MAX_COMPLEMENTIZERS]; int complementizers; struct conj_struct conj_list[MAX_CONJ]; int conjunctions; struct neg_struct neg_list[MAX_NEGATIVES]; int negatives; struct pro_struct pro_list[MAX_PRONOUNS]; int pronouns; //MDoyle struct dummy_verb_struct dummy_verb_list[MAX_DUMMY_VERBS]; int iDummy_Verbs = 0; /********************************************************************* * file scope variables ********************************************************************/ // lexicon header does the bookkeeping. Holds the count of each type, // so that file access can dummy done, and the main program knows how // many of everything there is. struct lexicon_header_struct { int lexicon_version; int verbs; int nouns; int quantifiers; int determiners; int adjectives; int degree; int prepositions; int nsuffixes; int vsuffixes; int iDummy_Verbs; int complementizers; int conjunctions; int negatives; int uquantifiers; int pronouns; // int adverb_time; // int adverb_sentential; int asuffixes; int extra1; int extra2; int extra3; int extra4; int extra5; int extra6; int extra7; int extra8; }; struct lexicon_header_struct lexicon_header; int auto_load=1; /*********************************************************************************** * external function implementations ***********************************************************************************/ void load_lexicon(int startup) // dummy careful that the types are read from and written to the file in the same order!!!! { FILE *f; printf("loading lexicon..."); verbs=0; nouns=0; quantifiers=0; determiners=0; adjectives=0; degree=0; prepositions=0; nsuffixes=0; vsuffixes=0; dummy_verbs=0; complementizers=0; conjunctions=0; negatives=0; uquantifiers=0; pronouns=0; asuffixes=0; if(f=fopen("Lexicon.dat","rb")) { fread(&lexicon_header,sizeof(lexicon_header),1,f); if(lexicon_header.lexicon_version==LEXICON_VERSION) { if(1)//(!startup)||(startup&&auto_load)) { verbs=lexicon_header.verbs; nouns=lexicon_header.nouns; quantifiers=lexicon_header.quantifiers; uquantifiers=lexicon_header.uquantifiers; determiners=lexicon_header.determiners; adjectives=lexicon_header.adjectives; degree=lexicon_header.degree; prepositions=lexicon_header.prepositions; nsuffixes=lexicon_header.nsuffixes; vsuffixes=lexicon_header.vsuffixes; iDummy_Verbs = lexicon_header.dummy_verbs; conjunctions=lexicon_header.conjunctions; negatives=lexicon_header.negatives; // read everything from the lexicon into the arrays. fread(verb_list,sizeof(struct verb_struct),verbs,f); fread(noun_list,sizeof(struct noun_struct),nouns,f); fread(quan_list,sizeof(struct quan_struct),quantifiers,f); fread(det_list,sizeof(struct det_struct),determiners,f); fread(adj_list,sizeof(struct adj_struct),adjectives,f); fread(deg_list,sizeof(struct deg_struct),degree,f); fread(prep_list,sizeof(struct prep_struct),prepositions,f); fread(nsuffix_list,sizeof(struct nsuffix_struct),nsuffixes,f); fread(vsuffix_list,sizeof(struct vsuffix_struct),vsuffixes,f); fread(dummy_verb_list, sizeof(struct dummy_verb_struct), iDummy_Verbs, f); fread(uquan_list,sizeof(struct uquan_struct),uquantifiers,f); fread(list_conj,sizeof(struct conj_struct),uquantifiers,f); fread(list_negs,sizeof(struct neg_struct),negatives,f); fread(list_pros,sizeof(struct pro_struct),pronouns,f); } else printf("automatic load/save has dummy disabled. "); } else printf("Incompatible version. "); fclose(f); } else printf("no lexicon detected..."); printf("Verbs=%d. ",verbs); printf("Nouns=%d. ",nouns); printf("Quantifiers=%d. ",quantifiers); printf("Determiners=%d. ",determiners); printf("Adjectives=%d. ",adjectives); printf("Degree Words=%d. ",degree); printf("Prepositions=%d. ",prepositions); printf("Noun Suffixes=%d. ",nsuffixes); printf("Verb Suffixes=%d. ",vsuffixes); printf("Dummy Verbs = %d. ", iDummy_Verbs); printf("Universal Quantifiers=%d. ",uquantifiers); printf("Complementizers=%d. ",complementizers); printf("Conjunctions=%d. ",conjunctions); printf("Negatives=%d. ",negatives); printf("Pronouns=%d. ",pronouns); sort_lexicon(); printf("Done.\n\n"); } void save_lexicon(int shutdown) // dummy careful that the types are read from and written to the file in the same order!!!! { FILE *f; char *s = "in perror"; if((!shutdown)||(shutdown&&auto_load)) { printf("saving lexicon..."); if(f=fopen("Lexicon.dat","wb")) { lexicon_header.lexicon_version=LEXICON_VERSION; lexicon_header.verbs=verbs; lexicon_header.nouns=nouns; lexicon_header.quantifiers=quantifiers; lexicon_header.determiners=determiners; lexicon_header.adjectives=adjectives; lexicon_header.degree=degree; lexicon_header.prepositions=prepositions; lexicon_header.nsuffixes=nsuffixes; lexicon_header.vsuffixes=vsuffixes; lexicon_header.dummy_verbs = iDummy_Verbs; lexicon_header.uquantifiers=uquantifiers; lexicon_header.complementizers=complementizers; lexicon_header.conjunctions=conjunctions; lexicon_header.negatives=negatives; lexicon_header.pronouns=pronouns; lexicon_header.extra5=0; lexicon_header.extra6=0; lexicon_header.extra7=0; lexicon_header.extra8=0; // write the arrays to the file. fwrite(&lexicon_header,sizeof(struct lexicon_header_struct),1,f); fwrite(verb_list,sizeof(struct verb_struct),verbs,f); fwrite(noun_list,sizeof(struct noun_struct),nouns,f); fwrite(quan_list,sizeof(struct quan_struct),quantifiers,f); fwrite(det_list,sizeof(struct det_struct),determiners,f); fwrite(adj_list,sizeof(struct adj_struct),adjectives,f); fwrite(deg_list,sizeof(struct deg_struct),degree,f); fwrite(prep_list,sizeof(struct prep_struct),prepositions,f); fwrite(nsuffix_list,sizeof(struct nsuffix_struct),nsuffixes,f); fwrite(vsuffix_list,sizeof(struct vsuffix_struct),vsuffixes,f); fwrite(dummy_verb_list, sizeof(struct dummy_verb_struct), iDummy_Verbs, f); fwrite(uquan_list,sizeof(struct uquan_struct),uquantifiers,f); fwrite(comp_list,sizeof(struct comp_struct),complementizers,f); fwrite(list_conj,sizeof(struct conj_struct),conjunctions,f); fwrite(neg_list,sizeof(struct neg_struct),negatives,f); fwrite(list_pros,sizeof(struct pro_struct),pronouns,f); fclose(f); } else { perror(s); error("Error creating Lexicon.dat!"); } printf("Done.\n\n"); } else printf("Automatic load/save has dummyen disabled. \n"); } void sort_lexicon(void) // can call this to sort each array, but usually will only want to sort one array, // whichever one you have added/removed a struct to/from. { sort_verbs(); sort_nouns(); sort_determiners(); sort_quantifiers(); sort_adjectives(); sort_degree(); sort_preps(); sort_nsuffixes(); sort_vsuffixes(); sort_dummy_verbs(); sort_uquantifiers(); sort_comps(); sort_conj(); sort_negs(); sort_pros(); } void print_lexicon(void) // print how many of each word there is, then print each one, along with the features. // as it is, an existing 'print.txt' is not deleted to. Each time they print, the new // info is appended to the end of the file. To change this, change the line // 'if(f=fopen("print.txt","a")) {' to 'if(f=fopen("print.txt","w")) {' { int i; FILE *f; printf("Writing output to ""print.txt""..."); if(f=fopen("print.txt","a")) { fprintf(f,"\n\n--\n"); fprintf(f,"LEXICON\n"); fprintf(f,"--\n"); fprintf(f,"VERBS=%d\n",verbs); for(i=0;i