29 last_ids = db.insert(
'seg_filters',
30 'class_name args'.split(),
31 [[self.__class__.__name__, str(self.
get_db_args())]]
33 self.
db_id = last_ids[0]
37 db.delete(
'seg_filters',
48 for cur_row
in filter_rows:
49 cls = eval(cur_row[1])
50 args = eval(cur_row[2])
51 filter_obj =
cls(*args)
52 filter_obj.db_id = cur_row[0]
53 filter_list.append(filter_obj)
60 rows = db.select(
'seg_filters',
62 DBObject._build_where_cond_from_ids(ids),
65 return SegFilter._reconstruct_from_db(rows)
76 rows = db.select(
'%s rel join seg_filters sf on rel.%s=sf.id' % (rel_table, filter_id_col),
77 'sf.id sf.class_name sf.args'.split(),
78 '%s=?' % (rel_id_col),
82 return SegFilter._reconstruct_from_db(rows)
152 if isinstance(seg, FilteredSeg):
166 SegFilter.__init__(self, db_id, negate)
175 while i < len(seg.utters)
and not passed:
176 if seg.utters[i].trans_codes
and len(seg.utters[i].trans_codes) >= 4:
178 cond = ( seg.utters[i].trans_codes[3].find(
'Q') >= 0
and
179 re.search(
r'\bwh|\bhow\b', seg.utters[i].trans_phrase.lower()) )
183 if (
not negate
and cond)
or (negate
and not cond):
184 utters.append(seg.utters[i])
207 while cur
and not found:
210 found = ( cur.trans_codes[3].find(
'Q') >= 0
and
211 re.search(
r'\bwh|\bhow\b', cur.trans_phrase.lower()) )
216 if (
not negate
and found)
or (negate
and not found):
227 return '"WH" Question'
231 return 'Is %sa "WH" question' % (
' not' if self.
negate else '')
244 def __init__(self, filter_type, time_cutoff, inclusive=True, negate=False, db_id=None):
245 SegFilter.__init__(self, db_id, negate)
256 options = DBConstants.COMBO_OPTIONS[DBConstants.COMBO_GROUPS.SEG_FILTER_TIME]
259 include_dict = {options.START_TIME_BEFORE:
lambda data_obj: (data_obj.start <= self.
time_cutoff)
if self.
inclusive else (data_obj.start < self.
time_cutoff),
268 for utter
in seg.utters:
269 include_utter = include_dict[self.
filter_type](utter)
270 if (
not negate
and include_utter)
or (negate
and not include_utter):
271 utter_list.append(utter)
280 if (
not negate
and include_seg)
or (negate
and not include_seg):
290 options = DBConstants.COMBO_OPTIONS[DBConstants.COMBO_GROUPS.SEG_FILTER_TIME]
293 tail = FilterManager.get_endpoint(FilterManager.ENDPOINT_TYPES.TAIL, head)
303 if (
not negate
and include)
or (negate
and not include):
322 options = DBConstants.COMBO_OPTIONS[DBConstants.COMBO_GROUPS.SEG_FILTER_TIME]
329 desc += {options.START_TIME_BEFORE:
'start%s before' % (
's' if not negate
else ''),
330 options.START_TIME_AFTER:
'start%s after' % (
's' if not negate
else ''),
331 options.END_TIME_BEFORE:
'end%s before' % (
's' if not negate
else ''),
332 options.END_TIME_AFTER:
'end%s after' % (
's' if not negate
else ''),
335 desc += BackendUtils.get_time_str(self.
time_cutoff)
336 desc = desc.capitalize()
347 SegFilter.__init__(self, db_id, negate)
355 for utter
in seg.utters:
356 if utter.trans_phrase:
357 trans_phrase = utter.trans_phrase.replace(
'<',
'<').replace(
'>',
'>')
358 cond = ( (utter.speaker
and utter.speaker.has_property(DBConstants.SPEAKER_PROPS.OVERLAPPING))
or
359 (re.search(
'(?:^\s*<.*>.*$)|(?:.*<\s*>\s*)', trans_phrase)) )
360 if (
not negate
and cond)
or (negate
and not cond):
361 utter_list.append(utter)
363 result = super(OverlappingVocalsSegFilter, self).
_to_filtered_seg(seg, utter_list)
368 while not found
and i < len(seg.utters):
369 if utter.trans_phrase:
370 trans_phrase = utter.trans_phrase.replace(
'<',
'<').replace(
'>',
'>')
371 found = ( (utter.speaker
and utter.speaker.has_property(DBConstants.SPEAKER_PROPS.OVERLAPPING))
or
372 (re.search(
'(?:^\s*<.*>.*$)|(?:.*<\s*>\s*)', trans_phrase)) )
375 if (
not negate
and found)
or (negate
and not found):
386 while not found
and cur:
388 trans_phrase = cur.trans_phrase.replace(
'<',
'<').replace(
'>',
'>')
389 found = ( (cur.speaker
and cur.speaker.has_property(DBConstants.SPEAKER_PROPS.OVERLAPPING))
or
390 (trans_phrase
and re.search(
'(?:^\s*<.*>.*$)|(?:.*<\s*>\s*)', trans_phrase)) )
393 if (
not negate
and found)
or (negate
and not found):
404 return 'Overlapping Vocals'
408 return 'Not marked by LENA as overlapping and not transcribed as overlapping' if negate
else 'Marked by LENA and/or transcribed as overlapping'
417 def __init__(self, code_str_list, negate=False, db_id=None):
418 SegFilter.__init__(self, db_id, negate)
429 for utter
in seg.utters:
431 utter_has_speaker =
False
433 utter_has_speaker = utter.speaker
and utter.speaker.speaker_codeinfo.get_code() == self.
code_str_list[i]
437 if not utter_has_speaker:
438 utter_list.append(utter)
440 if utter_has_speaker:
441 utter_list.append(utter)
443 result = super(SpeakerCodeSegFilter, self).
_to_filtered_seg(seg, utter_list)
446 speaker_in_list =
False
449 while not speaker_in_list
and i < len(seg.speakers):
451 speaker_in_list = seg.speakers[i].speaker_codeinfo.get_code() == self.
code_str_list[j]
456 if not speaker_in_list:
457 result = super(SpeakerCodeSegFilter, self).
_to_filtered_seg(seg, seg.utters)
460 result = super(SpeakerCodeSegFilter, self).
_to_filtered_seg(seg, seg.utters)
468 speaker_in_chain =
False
470 while not speaker_in_chain
and cur:
473 speaker_in_chain = cur.speaker
and cur.speaker.speaker_codeinfo.get_code() == self.
code_str_list[i]
477 include_chain =
False
479 include_chain =
not speaker_in_chain
481 include_chain = speaker_in_chain
498 desc =
'Speaker code is %s' % (
'not ' if self.
negate else '')
516 def __init__(self, trans_code_index, type_str, desc_noun, code_str_list, negate=False, db_id=None):
517 super(TransCodeSegFilter, self).
__init__(db_id, negate)
531 for utter
in seg.utters:
541 utter_list.append(utter)
544 utter_list.append(utter)
552 while not found
and i < len(seg.utters):
572 code_in_chain =
False
574 while not code_in_chain
and cur:
584 if not code_in_chain:
604 desc +=
'one of (%s)' % (
' or '.join( map(
lambda cd: DBConstants.TRANS_CODES[self.
trans_code_index].get_option(cd).get_code_desc(), self.
code_str_list) ))
613 def __init__(self, code_str_list, negate=False, db_id=None):
614 super(SpeakerTypeSegFilter, self).
__init__(0,
'Speaker Type',
'Speaker Type', code_str_list, negate, db_id)
623 def __init__(self, code_str_list, negate=False, db_id=None):
624 super(TargetListenerSegFilter, self).
__init__(1,
'Target Listener',
'Target Listener', code_str_list, negate, db_id)
633 def __init__(self, code_str_list, negate=False, db_id=None):
634 super(GrammaticalitySegFilter, self).
__init__(2,
'Gramaticality',
'Utterance', code_str_list, negate, db_id)
643 def __init__(self, code_str_list, negate=False, db_id=None):
644 super(UtteranceTypeSegFilter, self).
__init__(3,
'Utterance Type',
'Utterance', code_str_list, negate, db_id)