def _parse(self): """ 오분석 패치 한 라인을 파싱한다. """ if len(self.line) >= 2 and self.line.startswith('# '): self.is_sharp = True self.line = self.line[2:] cols = self.line.split('\t') if len(cols) != 3: if not self.is_sharp: self.err_msg = '[PARSE] number of columns must be 3, not {}'.format( len(cols)) return self.raw, left_str, right_str = cols if not self.raw: self.err_msg = '[PARSE] no raw string' return try: self.left = Morph.parse(left_str) except ParseError as par_err: self.err_msg = '[PARSE] {}'.format(par_err) try: self.right = Morph.parse(right_str) except ParseError as par_err: self.err_msg = '[PARSE] {}'.format(par_err)
def _set_align(rsc_src, entries): # pylint: disable=invalid-name """ 음절과 형태소 분석 결과를 정렬한다. Args: rsc_src: (Aligner, restore dic, vocab out) resource triple Word: Word 타입 entries: 엔트리 리스트 """ bad_entries = [] for entry in entries: if entry.is_sharp: continue entry.left_align = align_patch(rsc_src, entry.raw, Morph.to_str(entry.left)) if not entry.left_align: entry.err_msg = 'fail to align left' bad_entries.append(entry) continue entry.right_align = align_patch(rsc_src, entry.raw, Morph.to_str(entry.right)) if not entry.right_align: entry.err_msg = 'fail to align right' bad_entries.append(entry) continue assert len(entry.left_align) == len(entry.right_align) print_errors(bad_entries)
def __str__(self): file_num = '{}:{}: '.format(self.file_name, self.line_num) if self.file_name else '' line = '# {}'.format(self.line) if self.is_sharp else self.line if self.err_msg: return '{}{}: "{}"'.format(file_num, self.err_msg, line) if self.is_sharp: return '{}: "{}"'.format(file_num, line) return '{}\t{}\t{}'.format(self.raw, Morph.to_str(self.left), Morph.to_str(self.right))
def _parse(self): """ 기분석 사전 한 라인을 파싱한다. """ if len(self.line) >= 2 and self.line.startswith('# '): self.is_sharp = True self.line = self.line[2:] cols = self.line.split('\t') if len(cols) != 2: if not self.is_sharp: self.err_msg = '[PARSE] number of columns must be 2, not {}'.format(len(cols)) return self.word, morph_str = [c.strip() for c in cols] if not self.word: self.err_msg = '[PARSE] no word' return if len(self.word) > 2 and self.word[-1] == '*': self.is_pfx = True self.word = self.word[:-1].strip() elif ' ' in self.word: self.err_msg = '[PARSE] space in word' return try: self.morphs = Morph.parse(morph_str) except ParseError as par_err: self.err_msg = '[PARSE] {}'.format(par_err)
def key_str(self): """ 패치의 중복 검사를 하기 위해 원문과 left를 이용하여 키를 생성 Returns: 중복 생성 검사를 위한 키 """ return '{}\t{}'.format(self.raw, Morph.to_str(self.left))
def __str__(self): file_num = '{}:{}: '.format(self.file_name, self.line_num) if self.file_name else '' line = '# {}'.format(self.line) if self.is_sharp else self.line if self.err_msg: return '{}{}: "{}"'.format(file_num, self.err_msg, line) elif self.is_sharp: return '{}: "{}"'.format(file_num, line) return '{}{}\t{}'.format(self.word, '*' if self.is_pfx else '', Morph.to_str(self.morphs))
def _set_align(aligner, Word, entries): # pylint: disable=invalid-name """ 음절과 형태소 분석 결과를 정렬한다. Args: aligner: Aligner 객체 Word: Word 타입 entries: 엔트리 리스트 """ bad_entries = [] for entry in entries: if entry.is_sharp: continue word = Word.parse('\t'.join(['', entry.word, Morph.to_str(entry.morphs)]), '', 0) try: entry.align = aligner.align(word) except AlignError as map_exc: entry.err_msg = 'fail to align' logging.error(map_exc) bad_entries.append(entry) print_errors(bad_entries)