|
|
1.1 root 1: /* NOTICE-NOT TO BE DISCLOSED OUTSIDE BELL SYS EXCEPT UNDER WRITTEN AGRMT */
2: /* Writer's Workbench version 2.0, January 1981 */
3: #include <stdio.h>
4: #include <ctype.h>
5: #include <math.h>
6: #define MAXDOCS 75
7: #define NVAR 10
8: #define MINSENT 90
9: #define MINWDS 1900
10: #define FALSE 0
11: #define TRUE 1
12: #define MINN 20
13:
14: char filen[MAXDOCS][15], extra[MAXDOCS], extra2[MAXDOCS];
15: float kindex[MAXDOCS], avw[MAXDOCS],snonf[MAXDOCS], simple[MAXDOCS],complex[MAXDOCS], compound[MAXDOCS], compdx[MAXDOCS];
16: float ppron[MAXDOCS],padj[MAXDOCS];
17: float passive[MAXDOCS],explet[MAXDOCS];
18: int nomin[MAXDOCS],x[MAXDOCS];
19: int maxsent[MAXDOCS], numsent[MAXDOCS], numwds[MAXDOCS],qcount[MAXDOCS], icount[MAXDOCS],numnonf[MAXDOCS],ml[MAXDOCS],lsum[MAXDOCS],mg[MAXDOCS],gsum[MAXDOCS];
20: int maxindex[MAXDOCS],minindex[MAXDOCS],minsent[MAXDOCS];
21: float aindex[MAXDOCS],cindex[MAXDOCS],fgrad[MAXDOCS],findex[MAXDOCS],avl[MAXDOCS],fnumnonf[MAXDOCS],centlsum[MAXDOCS],centgsum[MAXDOCS];
22: int nsimple[MAXDOCS],ncomplex[MAXDOCS],ncompound[MAXDOCS],ncompdx[MAXDOCS],ntobe[MAXDOCS];
23: int npassive[MAXDOCS],pron[MAXDOCS],pos[MAXDOCS],adj[MAXDOCS],art[MAXDOCS],beg[MAXDOCS],begadv[MAXDOCS],begprep[MAXDOCS],begverb[MAXDOCS],begscon[MAXDOCS];
24: int begconj[MAXDOCS], begexp[MAXDOCS],noun[MAXDOCS];
25: float ptobe[MAXDOCS],paux[MAXDOCS],pinfin[MAXDOCS],padv[MAXDOCS],pconjc[MAXDOCS],pprepc[MAXDOCS],pnoun[MAXDOCS],pnomin[MAXDOCS],tot[MAXDOCS];
26: float pbegprep[MAXDOCS],pbegadv[MAXDOCS],pbegverb[MAXDOCS],pbegscon[MAXDOCS],pbegconj[MAXDOCS],pbegexp[MAXDOCS];
27: int tobe[MAXDOCS],aux[MAXDOCS],infin[MAXDOCS],prepc[MAXDOCS],conjc[MAXDOCS],adv[MAXDOCS];
28:
29: FILE *fopen(), *stylout, *out, *scores, *tmp;
30:
31:
32: main(argc, argv)
33: int argc;
34: char *argv[];
35: {
36: int n, i, j, x;
37: int aok,ok,once,lmesg;
38: int number, orignum;
39: float m[NVAR], sd[NVAR];
40: float *score[NVAR], mm2[NVAR], mm1[NVAR], mp1[NVAR], mp2[NVAR];
41: char *file[MAXDOCS];
42: float mean(), sdev();
43: float smpmcmp[MAXDOCS], cmpcmdx[MAXDOCS];
44: int nvar;
45: char name[14], *pid;
46:
47: /* Begin */
48:
49: number = *argv[1];
50: number=number-'0';
51: if(isdigit(*(argv[1]+1)))number=10*number+(*(argv[1]+1)-'0');
52: orignum=number;
53: pid=argv[2];
54: sprintf(name,"/tmp/%sstat.out",pid);
55: if((stylout=fopen(name,"r"))==NULL) {
56: fprintf(stderr, "Can't read %s.\n",name);
57: exit(2);
58: }
59: if((out=fopen("stand.out","w"))==NULL) {
60: printf("Can't write \"stand.out\".\n");
61: exit(2);
62: }
63: if((scores=fopen("styl.scores","w"))==NULL) {
64: printf("Can't write \"styl.scores\".\n");
65: exit(2);
66: }
67:
68: aok=FALSE;
69: once=FALSE;
70: lmesg=FALSE;
71:
72: /* Read style scores */
73:
74: for(n=0; n<number; n++) {
75: fscanf(stylout,"%s %s %s\n", extra[n],extra2[n],filen[n]);
76: fscanf(stylout,"readability grades:\n");
77: fscanf(stylout," (Kincaid) %f (auto) %f (Coleman-Liau) %f (Flesch) %f (%f)",&kindex[n],&aindex[n],&cindex[n],&fgrad[n],&findex[n]);
78: fscanf(stylout," sentence info:");
79: fscanf(stylout," no. sent %d no. wds %ld",&numsent[n],&numwds[n]);
80: fscanf(stylout," av sent leng %f av word leng %f",&avw[n],&avl[n]);
81: fscanf(stylout," no. questions %d no. imperatives %d",&qcount[n],&icount[n]);
82: fscanf(stylout," no. content wds %d %f%% av leng %f",&numnonf[n],&fnumnonf[n],&snonf[n]);
83: fscanf(stylout," short sent (<%d)%f%% (%d) long sent (>%d) %f%% (%d)",&ml[n],¢lsum[n],&lsum[n],&mg[n],¢gsum[n],&gsum[n]);
84: fscanf(stylout," longest sent %d wds at sent %d; shortest sent %d wds at sent %d",&maxsent[n],&maxindex[n],&minsent[n],&minindex[n]);
85: fscanf(stylout," sentence types:");
86: fscanf(stylout," simple %f%% (%d) complex %f%% (%d)",&simple[n],&nsimple[n],&complex[n],&ncomplex[n]);
87: fscanf(stylout," compound %f%% (%d) compound-complex %f%% (%d)",&compound[n],&ncompound[n],&compdx[n],&ncompdx[n]);
88: fscanf(stylout," word usage:");
89: fscanf(stylout," verb types as %% of total verbs");
90: fscanf(stylout," tobe %f%% (%d) aux %f%% (%d) inf %f%% (%d)",&ptobe[n],&tobe[n],&paux[n],&aux[n],&pinfin[n],&infin[n]);
91: fscanf(stylout," passives as %% of non-inf verbs %f%% (%d)",&passive[n],&npassive[n]);
92: fscanf(stylout," types as %% of total");
93: fscanf(stylout," prep %f%% (%d) conj %f%% (%d) adv %f%% (%d)",&pprepc[n],&prepc[n],&pconjc[n],&conjc[n],&padv[n],&adv[n]);
94: fscanf(stylout," noun %f%% (%d) adj %f%% (%d) pron %f%% (%d)",&pnoun[n],&noun[n], &padj[n],&adj[n],&ppron[n],&pron[n]);
95: fscanf(stylout," nominalizations %f %% (%d)",&pnomin[n],&nomin[n]);
96: fscanf(stylout," sentence beginnings:");
97: fscanf(stylout," subject opener: noun (%d) pron (%d) pos (%d) adj (%d) art (%d) tot %f%%",&noun[n],&pron[n],&pos[n],&adj[n],&art[n],&tot[n]);
98: fscanf(stylout," prep %f%% (%d) adv %f%% (%d) ",&pbegprep[n],&begprep[n],&pbegadv[n],&begadv[n]);
99: fscanf(stylout," verb %f%% (%d) ",&pbegverb[n],&begverb[n]);
100: fscanf(stylout," sub_conj %f%% (%d) conj %f%% (%d)",&pbegscon[n],&begscon[n],&pbegconj[n],&begconj[n]);
101: fscanf(stylout," expletives %f%% (%d)",&pbegexp[n],&begexp[n]);
102: }
103: fclose(stylout);
104:
105:
106: /* Set file to point at filen */
107: for(n=0; n<number; n++) file[n]=filen[n];
108:
109: /* Compute sentence variation and complexity scores */
110:
111: for(n=0; n<number; n++) {
112: smpmcmp[n] = simple[n] - complex[n];
113: cmpcmdx[n] = compound[n] + compdx[n];
114: }
115:
116: /* Set score arrays */
117:
118: score[0]=kindex;
119: score[1]=snonf;
120: score[2]=centlsum;
121: score[3]=centgsum;
122: score[4]=passive;
123: score[5]=pnomin;
124: score[6]=avw;
125: score[7]=pbegexp;
126: score[8]=smpmcmp;
127: score[9]=cmpcmdx;
128: nvar=NVAR;
129:
130: /* Check file lengths */
131: n=0;
132: while(n < number) {
133: if(numsent[n] < MINSENT && numwds[n] < MINWDS) {
134: if(lmesg==FALSE) {
135: printf("Files must be at least 1900 words OR 90 sentences long,\nfor mkstand to compute reliable standards.\n");
136: lmesg=TRUE;
137: }
138: printf("File %s is too short, its scores will be excluded.\n", file[n]);
139: for(i=n; i<number-1; i++) {
140: file[i]=file[i+1];
141: kindex[i]=kindex[i+1];
142: snonf[i]=snonf[i+1];
143: centlsum[i]=centlsum[i+1];
144: centgsum[i]=centgsum[i+1];
145: passive[i]=passive[i+1];
146: pnomin[i]=pnomin[i+1];
147: avw[i]=avw[i+1];
148: pbegexp[i]=pbegexp[i+1];
149: smpmcmp[i]=smpmcmp[i+1];
150: cmpcmdx[i]=cmpcmdx[i+1];
151: numwds[i]=numwds[i+1];
152: numsent[i]=numsent[i+1];
153: }
154: number=number-1;
155: }
156: else n++;
157: }
158:
159: /* While aok = FALSE */
160:
161: while(aok==FALSE) {
162: ok=TRUE;
163:
164: /* Check new number */
165:
166: if(number<=1) {
167: if(number==0) printf("All the input files ");
168: if(number==1) printf("All the input files but one ");
169: printf("were too short\nfor mkstand to compute reliable standards.\n");
170: printf("Rerun mkstand with files that are longer than 1900 words or 90 sentences.\n");
171: exit(2);
172: }
173: if(number < MINN && orignum >= MINN) {
174: printf("Since some files had to be excluded,\nthere are no longer 20 files.\n");
175: printf("Mkstand will compute the standards,\n");
176: printf("but they would probably be more reliable.\n");
177: printf("if you run mkstand again with additional files\n");
178: printf("to replace those that were excluded.\n");
179: }
180:
181: /* Compute standards */
182:
183: for(i=0; i<nvar; i++) {
184: m[i]=mean(score[i],number);
185:
186: sd[i]=sdev(score[i],m[i],number);
187:
188: mm2[i] = m[i] - 2 * sd[i];
189: mm1[i] = m[i] - sd[i];
190: mp1[i] = m[i] + sd[i];
191: mp2[i] = m[i] + 2 * sd[i];
192:
193: }
194:
195: /* Check for outliers */
196:
197: if(once==FALSE) {
198: n=0;
199: while(n < number) {
200: for(i=0; i<nvar; i++) {
201: if(score[i][n] < mm2[i] || score[i][n] > mp2[i]) {
202: ok=FALSE;
203: once=TRUE;
204: printf("File %s has a score more than 2 standard deviations from the mean,\nand will be excluded.\n", file[n]);
205: for(j=n; j<number-1; j++) {
206: file[j]=file[j+1];
207: kindex[j]=kindex[j+1];
208: snonf[j]=snonf[j+1];
209: centlsum[j]=centlsum[j+1];
210: centgsum[j]=centgsum[j+1];
211: passive[j]=passive[j+1];
212: pnomin[j]=pnomin[j+1];
213: avw[j]=avw[j+1];
214: pbegexp[j]=pbegexp[j+1];
215: smpmcmp[j]=smpmcmp[j+1];
216: cmpcmdx[j]=cmpcmdx[j+1];
217: }
218: number=number-1;
219: i=nvar;
220: }
221: else if(i==nvar-1) n++;
222: }
223: }
224: if(ok != FALSE) aok=TRUE;
225: }
226: else aok=TRUE;
227: }
228:
229: /* Print scores for examination */
230:
231: printf("The style scores used to compile the standards\n");
232: printf("are in a file named styl.scores. Please examine\n");
233: printf("this file for any scores that seem unusual or invalid.\n");
234: printf("If you find any, rerun mkstand without the unusual\n");
235: printf("document.\n");
236: for(n=0;n<number; n++) {
237: fprintf(scores,"Document %s:\n", file[n]);
238: fprintf(scores,"\tKincaid readability %4.1f\n", kindex[n]);
239: fprintf(scores,"\tAve. length of non-function words %4.1f\n", snonf[n]);
240: fprintf(scores,"\t%% short sentences %4.1f\n", centlsum[n]);
241: fprintf(scores,"\t%% long sentences %4.1f\n", centgsum[n]);
242: fprintf(scores,"\t%% passives %4.1f\n", passive[n]);
243: fprintf(scores,"\t%% nominalizations %4.1f\n", pnomin[n]);
244: fprintf(scores,"\tAve. sentence length %4.1f\n", avw[n]);
245: fprintf(scores,"\t%% expletives as sentence beginners %4.1f\n", pbegexp[n]);
246: fprintf(scores,"\t%% simple sentences minus %% complex sentences %4.1f\n", smpmcmp[n]);
247: fprintf(scores,"\t%% compound sentences plus %% compound-complex sentences %4.1f\n", cmpcmdx[n]);
248: fprintf(scores,"\n");
249: }
250:
251: /* Write standards to stand.out */
252:
253: for(i=0; i<nvar; i++) {
254: fprintf(out,"%4.2f %4.2f %4.2f %4.2f\n", mm2[i], mm1[i], mp1[i], mp2[i]);
255: if(i==3)
256: fprintf(out,"0.0 0.0 0.0 0.0\n0.0 0.0 0.0 0.0\n0.0 0.0 0.0 0.0\n0.0 0.0 0.0 0.0\n");
257: }
258: }
259: float sdev(score,m,n)
260: float score[], m;
261: int n;
262: {
263: float *sc, sumsq;
264: double sqrt();
265:
266: sumsq=0.0;
267: for(sc = score; sc < score + n; sc++) sumsq += (*sc-m) * (*sc-m);
268: return(sqrt(sumsq/(n-1)));
269: }
270: float mean(score,n)
271: float score[];
272: int n;
273: {
274:
275: float *sc, sum;
276:
277: sum=0.0;
278: for(sc = score; sc < score +n; sc++) sum += *sc;
279: return(sum/n);
280: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.