43 #include "EST_types.h"
44 #include "ling_class/EST_Relation.h"
45 #include "ling_class/EST_relation_aux.h"
48 #include "EST_Option.h"
49 #include "EST_Token.h"
56 float ins,
float del,
float sub);
61 return (n->prev() == 0) ? 0.0 : n->prev()->
F(
"end");
66 return n->
F(
"end") - start(n);
74 for (a_ptr = a.
head(); a_ptr != 0; a_ptr = a_ptr->next())
76 end = a_ptr->
F(
"end") / q;
79 a_ptr->
set(
"end", end);
88 char command[100], name[100], newname[100], sf[100];
95 fp = fopen(file1,
"wb");
98 fprintf(stderr,
"edit_labels: cannot open \"%s\" for writing\n",
102 for (a_ptr = a.
head(); a_ptr != 0; a_ptr = a_ptr->next())
104 strcpy(name, a_ptr->name());
105 fprintf(fp,
"%s\n", name);
108 strcpy(command,
"cat ");
109 strcat(command, file1);
110 strcat(command,
" | sed -f ");
111 strcat(command, sedfile);
112 strcat(command,
" > ");
113 strcat(command, file2);
115 printf(
"command: %s\n", command);
118 fp = fopen(file2,
"rb");
121 fprintf(stderr,
"edit_labels: cannot open \"%s\" for reading\n",
122 (
const char *)file2);
125 for (a_ptr = a.
head(); a_ptr != 0; a_ptr = a_ptr->next())
127 fscanf(fp,
"%s", newname);
129 a_ptr->set_name(newname);
142 for (a = orig.
head(); a != 0; a = a->next())
143 if ((a->
F(
"end") > s) && (start(a) < e))
146 if ((a->
F(
"end") > e))
156 for (a_ptr = seg.
head(); a_ptr != seg.
tail(); a_ptr = n_ptr)
158 n_ptr = a_ptr->next();
159 if (a_ptr->name() == a_ptr->next()->name())
169 for (a_ptr = seg.
head(); a_ptr != 0; a_ptr = a_ptr->next())
170 if (a_ptr->name() == oname)
171 a_ptr->set_name(nname);
180 for (a_ptr = seg.
head(); a_ptr != 0; a_ptr = a_ptr->next())
181 for (p = oname.head(); p ; p = p->next())
182 if (a_ptr->name() == oname(p))
183 a_ptr->set_name(nname);
190 for (p = s.head(); p; p = p->next())
200 for (s = a.
head(); s; s = s->next())
201 if (!is_in_class(s->name(), vocab))
203 cerr<<
"Illegal entry in file " <<a.
name()<<
":\"" << *s <<
"\"\n";
215 EST_String tmp_class_type = class_type +
"_list";
222 pos_list.append(ts.
get().string());
224 convert_to_broad(seg, pos_list);
231 if (broad_name ==
"")
234 for (a_ptr = seg.
head(); a_ptr != 0; a_ptr = a_ptr->next())
235 if (is_in_class(a_ptr->name(), pos_list))
236 a_ptr->
set(broad_name, (polarity) ? 1 : 0);
238 a_ptr->
set(broad_name, (polarity) ? 0 : 1);
245 for (p = seg.
head(); p != 0; n = p)
250 if (map.
val(p->name()) ==
"!DELETE")
253 p->set_name(map.
val(p->name()));
264 for (a_ptr = seg.
head(); a_ptr != 0; a_ptr = a_ptr->next())
265 a_ptr->
set(
"end", a_ptr->
F(
"end") + shift);
278 for (ptr = filenames.head(); ptr != NULL; ptr = ptr->next())
280 tmp_filenames.
append( filenames(ptr) );
284 for(fptr=mlf.head(); fptr != NULL;)
287 for (ptr = tmp_filenames.head(); ptr != NULL; ptr = ptr->next())
290 if(tmp_filenames(ptr) == mlf(fptr).name())
296 else if(mlf(fptr).name().contains(tmp_filenames(ptr)))
314 tmp_filenames.
clear();
326 for (p = mlf.head(); p; p = p->next())
332 for (p = mlf.head(); p; p = p->next())
334 if (
basename(mlf(p).name()) == filename)
338 cerr <<
"No match for file " << filename <<
" found in mlf\n";
351 for (p = mlf.head(); p; p = p->next())
353 for (s = mlf(p).head(); s; s = s->next())
356 t->
set(
"name", s->
S(
"name"));
357 t->
set(
"end", s->
F(
"end") + last);
358 cout <<
"appended t " << t << endl;
360 last = (t != 0) ? t->
F(
"end") : 0.0;
372 if (key.
length() != mlf.length())
374 cerr <<
"RelationList has " << mlf.length() <<
" elements: expected "
375 << key.
length() <<
" from key file\n";
379 for (k = key.
head(), p = mlf.head(); p; p = p->next(), k = k->next())
382 for (s = mlf(p).head(); s; s = s->next())
385 t->
set(
"name", s->
S(
"name"));
386 t->
set(
"end", (s->
F(
"end") + st));
408 if ((keylab.
tail())->F(
"end") < (lab.
tail())->F(
"end"))
410 cerr <<
"Key file must extend beyond end of label file\n";
415 for (k = keylab.
head(); k ; k = k->next())
416 if (k->
F(
"end") > lab.
head()->
F(
"end"))
420 a.
f.
set(
"name", (filename + ext));
423 for (s = lab.
head(); s; s = s->next())
429 t->
set(
"end", (s->
F(
"end") - kstart));
432 if (n->
F(
"end") > k->
F(
"end"))
434 if (((n->
F(
"end") - k->
F(
"end")) <
435 (k->
F(
"end") - start(n))) ||
436 is_in_class(n->name(), blank))
439 t->
set(
"end", (s->
F(
"end") - kstart));
442 t->
set(
"end", (k->
F(
"end") - kstart));
444 if (!is_in_class(n->name(), blank))
450 t->
set(
"end", (k->
F(
"end") - kstart));
458 a.
f.
set(
"name", (filename + ext));
463 t->
set(
"end", (s->
F(
"end") - kstart));
480 if ((keylab.
tail())->F(
"end") < (lab.
tail())->F(
"end"))
482 cerr <<
"Key file must extend beyond end of label file\n";
487 a.
f.
set(
"name", (k->name() + ext));
490 for (s = lab.
head(); s; s = s->next())
493 t->set_name(s->name());
494 t->
set(
"end", (s->
F(
"end") - kstart));
496 if (s->
F(
"end") > k->
F(
"end"))
498 cout <<
"appending " << a;
501 kstart = s->
F(
"end");
502 k->
set(
"end", (s->
F(
"end")));
505 a.f.set(
"name", (k->name() + ext));
508 cout <<
"appending " << a;
521 float prev_end, inc, first_end, last_end;
534 for (s = target.
head(); s; s = s->next())
538 s->
set(time_name +
"end", t->
F(
"end"));
540 s->
set(time_name +
"start", t->
F(
"start"));
542 last_end = t->
F(
"end");
544 first_end = t->
F(
"end");
550 target.
head()->
set(time_name +
"end", first_end / 2.0);
552 target.
head()->
set(time_name +
"start", 0.0);
557 target.
tail()->
set(time_name +
"end", last_end + 0.01);
559 target.
tail()->
set(time_name +
"start", last_end);
562 for (s = target.
head(); s; s = s->next())
567 for (i = 1, p = s; p; p = p->next(), ++i)
570 inc = (p->
F(time_name +
"end") - prev_end) / ((
float) i);
575 for (i = 1; s !=p ; s = s->next(), ++i)
577 s->
set(time_name +
"end", (prev_end + ((
float) i * inc)));
579 s->
set(time_name +
"start", (prev_end+((
float) (i - 1 )* inc)));
582 prev_end = s->
F(
"end");
594 *utt.
relation(
"Match"), 7.0, 7.0, 7.0);
596 map_match_times(*utt.
relation(target_name),
"Match", time_name, do_start);
606 for (p = mlf.head(); p; p = p->next())
612 for (p = mlf.head(); p; p = p->next())
613 if (mlf(p).name() == filename)
616 cerr <<
"No match for file " << filename <<
" found in mlf\n";
623 shift_label(lab, al.
fval(
"-shift"));
628 al.
fval(
"-extend",0) * lab.
tail()->
F(
"end"));
632 quantize(lab, al.
fval(
"-q"));
637 cerr <<
"-start option must be used with -end option\n";
639 extract(lab, al.
fval(
"-start"), al.
fval(
"-end"), lab);
643 convert_to_broad_class(lab, al.
val(
"-class"), op);
649 convert_to_broad(lab, bclass);
652 edit_labels(lab, al.
val(
"-sed"));
656 if (map.
load(al.
val(
"-map")) != format_ok)
669 for (s = stream.
head(); s; s = s->next())
671 cout << s->name() <<
"\t:";
672 for(p.
begin(s->features()); p; ++p)
687 for (p = mlf.head(); p; p = p->next())
691 for (p = mlf.head(); p; p = p->next())
708 d=hash_table.
val(fname,found);
715 cerr <<
"No match for file " << fname <<
" found in mlf\n";
EST_TokenStream & get(EST_Token &t)
get next token in stream
Utility IO Function header file.
void remove_item(EST_Item *item)
EST_Relation * create_relation(const EST_String &relname)
create a new relation called n.
int override_fval(const EST_String rkey, const float rval)
add to end of list or overwrite. If rval is empty, do nothing
float fval(const EST_String &rkey, int m=1) const
void set(const EST_String &name, int ival)
A specialised hash table for when the key is an EST_String.
EST_String make_tmp_filename()
Make a unique temporary filename.
EST_Item * as_relation(const char *relname) const
View item from another relation (const char *) method.
int open_string(const EST_String &newbuffer)
open a EST_TokenStream for string rather than a file
void set(const EST_String &name, int ival)
const EST_String & name() const
EST_read_status load(const EST_String &filename, const EST_String &comment=";")
V & val(const K &key, int &found) const
void StringtoStrList(EST_String s, EST_StrList &l, EST_String sep)
Convert a EST_String to a EST_StrList by separating tokens in s delimited by the separator sep...
const int present(const K &rkey) const
Returns true if key is present.
const V & val(const K &rkey, bool m=0) const
return value according to key (const)
void append(const T &item)
add item onto end of list
EST_String basename(EST_String full, EST_String ext="")
This acts like the bourne shell basename command. By default, it strips any leading path from a strin...
int add_item(const K &key, const V &value, int no_search=0)
Add an entry to the table.
void begin(const Container &over)
Set the iterator ready to run over this container.
const EST_String S(const EST_String &name) const
EST_Relation * relation(const char *name, int err_on_not_found=1) const
get relation by name
const float F(const EST_String &name) const
EST_Item * daughter1(const EST_Item *n)
return first daughter of n
void clear(void)
remove all items in list
EST_Litem * remove(EST_Litem *ptr)
Utility EST_String Functions header file.
int f_present(const EST_String &name) const