Ejemplo n.º 1
0
 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)
Ejemplo n.º 2
0
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)
Ejemplo n.º 3
0
 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))
Ejemplo n.º 4
0
 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)
Ejemplo n.º 5
0
 def key_str(self):
     """
     패치의 중복 검사를 하기 위해 원문과 left를 이용하여 키를 생성
     Returns:
         중복 생성 검사를 위한 키
     """
     return '{}\t{}'.format(self.raw, Morph.to_str(self.left))
Ejemplo n.º 6
0
 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))
Ejemplo n.º 7
0
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)