본문 바로가기
프로그램

[파이썬] 품사 구분 및 명사 Diagram(schemdraw)

by 오디세이99 2022. 8. 16.
728x90
반응형

글에서 1개의 문장에서 명사만 뽑아서 Diagram을 그려보려고 합니다.

KoNLPy Package를 사용해서 한글 품사를 처리합니다.

 

d += (A := flow.State().label(tmp1[0][0]).at((0, 6)))    # at : X, Y

에서 X, Y 좌표값을 좌하를 기점으로 시작하고 약 1.5 FlowState 크기로 보입니다.

 

여기서는 Diagram을 지정해서 그리지만 나중에는 자동으로 그려보려고 합니다.

from konlpy.tag import Kkma, Twitter
import schemdraw
from schemdraw import flow
import schemdraw.elements as elm

kkma = Kkma()
twt = Twitter()


text = '전기냉장고의 냉각작용은 압축기·방열기(放熱器)·모세관·냉각기로 된 냉동사이클에 의해 이루어진다. \
        냉동사이클 속에는 \'프레온12\'라는 휘발성이 강한 냉매가 봉입(封入)되어 있다.[2] 압축기로 고압이 된 냉매 가스는 \
        방열기의 가느다란 파이프를 지나는 동안에 열을 방출한다. 다시 말하면 바깥 공기로 냉각되어 액체 상태가 되어 \
        모세관을 지나서 냉각기에 오면 주위에서 열을 빼앗으면서 갑자기 증발하는데, 이 때 냉각작용을 일으킨다. \
        냉장고 속의 온도는 증발기의 온도로 작동하는 온도조절기(thermostat)의 스위치로 압축기를 작동시키거나 정지시키면서 \
        조절한다.[3]‘냉동실’은 냉동기로 둘러싸인 작은 칸을 특별히 별개의 문으로 차단시킨 것으로서 -20°C 정도까지 내려가게 \
        할 수 있다. 냉동기에 생기는 서리는 히터로 녹이거나 전환(轉換)코크로 온도가 높은 고압냉매를 응축기를 통과시키지 않고 \
        직접 냉동기로 흘려서 자동적으로 제거할 수 있는데, 이 기구를 ‘자동 서리 제거 장치’라고 한다.'

sts = kkma.sentences(text)  # 문장 구분

tag1 = twt.pos(sts[0])      # 품사 구분, 1번째 문장만 사용
tmp1 = []                   # 명사만
tmp1_p = []                 # 명사,동사,조사까지
nng_flag = 0                # 합성명사 작업 중 Flag
for i in range(len(tag1)-1):
    if tag1[i][1] == 'Noun' and tag1[i+1][1] == 'Noun':   # 합성명사는 하나로 한다.
        tmp1.append([tag1[i][0] + tag1[i+1][0], 'Noun'])
        tmp1_p.append(tmp1[-1])
        nng_flag = 1
        continue
    
    # if nng_flag == 0 and (tag1[i][1] == 'Noun' or tag1[i][1] == 'Verb' or tag1[i][1] == 'Josa' or tag1[i][1] == 'Adjection'):
    if nng_flag == 0 and (tag1[i][1] == 'Noun' or tag1[i][1] == 'Josa'):
        tmp1_p.append([tag1[i][0], tag1[i][1]])
    
    if nng_flag == 0 and tag1[i][1] == 'Noun':
        tmp1.append([tag1[i][0], tag1[i][1]])

    if nng_flag == 1:
        nng_flag = 0

schemdraw.config(lw=1, font='NanumGothic', fontsize=10)  # 한글 사용
with schemdraw.Drawing() as d:
    d += (A := flow.State().label(tmp1[0][0]).at((0, 6)))    # at : X, Y
    d += (B := flow.State().label(tmp1[1][0]).at((3, 7.5)))
    d += (C := flow.State().label(tmp1[2][0]).at((6, 9)))
    d += (D := flow.State().label(tmp1[3][0]).at((7, 6)))
    d += (E := flow.State().label(tmp1[4][0]).at((6, 3)))
    d += (F := flow.State().label(tmp1[5][0]).at((7, 0)))

    d += elm.ArcN(arrow='>').at(A.E).to(B.W).color('red')
    d += elm.ArcN(arrow='>').at(B.E).to(C.W).color('orange').label(tmp1[-1][0]) 
    d += elm.ArcN(arrow='>').at(C.S).to(D.N).color('blue')
    d += elm.ArcN(arrow='>').at(D.S).to(E.N).color('blue')
    d += elm.ArcN(arrow='>').at(E.S).to(F.N).color('blue')

728x90
반응형

댓글