-
Notifications
You must be signed in to change notification settings - Fork 9
Open
Labels
enhancementNew feature or requestNew feature or request
Description
기초정보
- 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
Labels
enhancementNew feature or requestNew feature or request