bab2min / Kiwi

Kiwi(지능형 한국어 형태소 분석기)
https://lab.bab2min.pe.kr/kiwi
Other
418 stars 46 forks source link

문장분리 예외처리 #125

Closed tree1891 closed 1 year ago

tree1891 commented 1 year ago

아래와 같은 경우 문장분리가 되지 않게 하는 방법이 있을까요?

좋겠다하는데 => ["좋겠다", "하는데"]
뭘까요입니다 => ["뭘까요", "입니다,"]
bab2min commented 1 year ago

안녕하세요 @tree1891 아쉽게도 현재 Kiwi에는 문장 분리의 예외를 처리하는 기능이 없는데요, 질문해주신 사례들을 보니 문장 분리를 금지하는 패턴을 직접 지정할 수 있게 해주는게 좋을 것 같네요. 차기 업데이트에 고려하도록 하겠습니다.

그 전까지는 다음과 같이 임시방편으로 후처리를 통해 분리된 문장을 강제로 붙여서 쓰는 방법을 추천드립니다.

import re

from kiwipiepy import Kiwi, Sentence

def split(kiwi:Kiwi, text:str, dont_split_pattern:str = None):
    ranges = []
    if dont_split_pattern:
        for m in re.finditer(dont_split_pattern, text):
            ranges.append(m.span())

    ret = []
    sents = kiwi.split_into_sents(text)
    concat = False
    for sent in sents:
        if concat:
            ret[-1] = Sentence(
                text=text[ret[-1].start:sent.end],
                start=ret[-1].start,
                end=sent.end,
                tokens=None,
                subs=ret[-1].subs + sent.subs
            )
        else:
            ret.append(sent)
        concat = any(s <= sent.end <= e for s, e in ranges)
    return ret

kiwi = Kiwi()
sents = split(kiwi, '다들 좋겠다하는데 사실 뭘까요입니다.')
print(sents)
# [Sentence(text='다들 좋겠다', start=0, end=6, tokens=None, subs=[]),
#  Sentence(text='하는데 사실 뭘까요', start=6, end=16, tokens=None, subs=[]), 
#  Sentence(text='입니다.', start=16, end=20, tokens=None, subs=[])]
sents = split(kiwi, '다들 좋겠다하는데 사실 뭘까요입니다.', dont_split_pattern=r"(좋겠다하는데|뭘까요입니다)")
print(sents)
# [Sentence(text='다들 좋겠다하는데 사실 뭘까요입니다.', start=0, end=20, tokens=None, subs=[])]

위의 split함수에서는 정규표현식을 이용해 붙일 구간을 찾는 방법을 사용하고 있으니 이를 참조하셔서 원하시는 기능을 구현하시면 될듯합니다.

tree1891 commented 1 year ago

가능한 모든 패턴을 지정해 주는것은 무리일것 같은데요

bab2min commented 1 year ago

@tree1891 아 예외처리가 아니라 분석 오류 개선에 대한 요청이신건가요? 두 건 모두 공백이 없이 연결되어 있고, 어미 다음에 하/VV, 이/VCP와 같은 동사가 바로 이어지는 경우로 묶어볼 수 있겠는데요, 이 규칙에 의해 분리 오류가 악화되는 경우가 있는지 살펴보고 문제 없으면 반영하도록 하겠습니다~