Skip to content

Tagger API를 통해서 문장을 분석하면 원문의 띄어쓰기가 무조건 변경되어 분석의 어려움이 있습니다. #3

@TaeHwan-Lee

Description

@TaeHwan-Lee

기초정보

  • Python 버전이 얼마입니까? 3.6
    • 3.5.x
    • 3.6.x
  • KoalaNLP 버전이 얼마인가요? 2.0.9
    • 1.x
    • 2.x
  • 문제의 유형은 어떤 것인가요? 개선점제안
    • 버그리포트
    • 개선점제안
    • 사용법질문
    • 기타

재연을 위한 정보

  • 어떤 문장을 시도하셨습니까?
[1989년 2월 15일 여의도 농민 폭력 시위를 주도한 혐의(폭력행위등처벌에관한법률위반)으로 지명수배되었다. 1989년 3월 12일 서울지방검찰청 공안부는 임종석의 사전구속영장을 발부받았다. 같은 해 6월 30일 평양축전에 임수경을 대표로 파견하여 국가보안법위반 혐의가 추가되었다. 경찰은 12월 18일~20일 사이 서울 경희대학교에서 임종석이 성명 발표를 추진하고 있다는 첩보를 입수했고, 12월 18일 오전 7시 40분 경 가스총과 전자봉으로 무장한 특공조 및 대공과 직원 12명 등 22명의 사복 경찰을 승용차 8대에 나누어 경희대학교에 투입했다. 1989년 12월 18일 오전 8시 15분 경 서울청량리경찰서는 호위 학생 5명과 함께 경희대학교 학생회관 건물 계단을 내려오는 임종석을 발견, 검거해 구속을 집행했다. 임종석은 청량리경찰서에서 약 1시간 동안 조사를 받은 뒤 오전 9시 50분 경 서울 장안동의 서울지방경찰청 공안분실로 인계되었다.]
  • KoalaNLP를 사용한 코드 부분을 보여주세요.
from koalanlp.Util import initialize, finalize
from koalanlp.proc import *
from koalanlp import API

#초기화 합니다.
initialize(java_options="-Xmx4g -Dfile.encoding=utf-8", KMR="2.0.6", EUNJEON="2.0.6", DAON="2.0.6")

# mecab(은전한닢) 품사분석기
tagger_ej = Tagger(API.EUNJEON)

# -> return : koalanlp.data.Sentence
tt =  "1989년 2월 15일 여의도 농민 폭력 시위를 주도한 혐의(폭력행위등처벌에관한법률위반)으로 지명수배되었다. 1989년 3월 12일 서울지방검찰청 공안부는 임종석의 사전구속영장을 발부받았다. 같은 해 6월 30일 평양축전에 임수경을 대표로 파견하여 국가보안법위반 혐의가 추가되었다. 경찰은 12월 18일~20일 사이 서울 경희대학교에서 임종석이 성명 발표를 추진하고 있다는 첩보를 입수했고, 12월 18일 오전 7시 40분 경 가스총과 전자봉으로 무장한 특공조 및 대공과 직원 12명 등 22명의 사복 경찰을 승용차 8대에 나누어 경희대학교에 투입했다. 1989년 12월 18일 오전 8시 15분 경 서울청량리경찰서는 호위 학생 5명과 함께 경희대학교 학생회관 건물 계단을 내려오는 임종석을 발견, 검거해 구속을 집행했다. 임종석은 청량리경찰서에서 약 1시간 동안 조사를 받은 뒤 오전 9시 50분 경 서울 장안동의 서울지방경찰청 공안분실로 인계되었다."
position = 0
text = ''
text_encoding = ''
morp_list = []
position_list = []
lemma_list = []

#1.문장전체 파싱
tagged_ej = tagger_ej.tagSentence(tt)

#1.1.원문장 인코딩
tt_encoding = tt.encode()

#2 koalanlp 파싱
for i, sentence in enumerate(tagged_ej):
  print(i+1,'번째 문장')
  print(sentence) #koalanlp.data.Sentence 
  for _, word in enumerate(sentence):
    #2.2.1 위치정보 계산
    tt_temp_encoding = tt_encoding

    word_surface = word.getSurface()
    m_word_encoding = word_surface.encode()
    print('word_surface :', word_surface)

    tt_len = len(m_word_encoding)

    print(tt_temp_encoding.decode())

    for j, _ in enumerate(tt_temp_encoding):
      if ( m_word_encoding == tt_encoding[:tt_len] ):
        text += word_surface
        tt_encoding = tt_temp_encoding[tt_len + j:]
        print('OK')
        break
      else if ( m_word_encoding == tt_encoding[:tt_len] ):
        print(j)
        print(tt_temp_encoding[j:j+1])
        text += tt_temp_encoding[j:j+1].decode()
        position += 1
        tt_encoding = tt_temp_encoding[j+1:]

    #2-2-3. 각 형태소의 위치 최종위치계산
    start_position = position
    end_position = start_position + len(word_surface.encode())
    position = end_position

    #단어의 형태소별로 처리
    print(word.surface,'=', word.singleLineString()) #koalanlp.data.Word
    morphemes_m = word.morphemes #koalanlp.data.Morpheme	
    for _, morp_pos in enumerate(morphemes_m):
      #2-2-4. 품사별로 생성처리
      morp = morp_pos.getSurface() + '/' + str(morp_pos.getTag()) + '/' + str(start_position)
      morp_list.append(morp)
      position_list.append( int(start_position) )
      lemma_list.append( morp_pos.getSurface() )
    
#2-2-5
text += tt_encoding.decode()

tt==text, morp_list, position_list, lemma_list

본문

  • 아래에 본문을 입력해주세요.
    위와 같은 코드를 통해서 Tagger API를 통해 나온 문장과 원문의 문장을 순차적으로
    byte비교하여 형태소/품사/원문에서의 byte 위치를 만드는 전처리를 하고 있습니다.
    하지만
    -> word_surface : 분경
    -> 분 경 서울청량리경찰서는 호위 학생 5명과~
    원문은 '분 경'으로 띄어서 처리되어있는데, Tagger API를 통해 분석을 하고나면 '분경'으로 붙어서 처리되어 원문에서의 위치를 찾을 수가 없습니다. Tagger API 통해 분석된 문장이 기존의 띄어쓰기를 유지할 수 있는 option이 있었으면 좋겠습니다.

Metadata

Metadata

Assignees

No one assigned

    Labels

    enhancementNew feature or request

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions