diff --git a/src/Kiwi.cpp b/src/Kiwi.cpp index a24d877b..530bcd23 100644 --- a/src/Kiwi.cpp +++ b/src/Kiwi.cpp @@ -181,6 +181,12 @@ namespace kiwi } } + /* + * 문장 분리 기준 + * 1) 종결어미(ef) (요/jx)? (z_coda)? (so|sw|sh|sp|se|sf|(닫는 괄호))* + * 2) 종결구두점(sf) (so|sw|sh|sp|se|(닫는 괄호))* + * 3) 단 종결어미(ef) 바로 다음에 '요'가 아닌 조사(j)나 보조용언(vx), vcp, etm, 다른 어미(ec)가 뒤따르는 경우는 제외 + */ class SentenceParser { enum class State @@ -240,6 +246,7 @@ namespace kiwi case POSTag::jx: case POSTag::vcp: case POSTag::etm: + case POSTag::ec: if (t.tag == POSTag::jx && *t.morph->kform == u"요") { if (state == State::ef) @@ -262,9 +269,11 @@ namespace kiwi case POSTag::sh: case POSTag::sp: case POSTag::se: - case POSTag::sf: case POSTag::ssc: break; + case POSTag::sf: + state = State::sf; + break; case POSTag::sso: if (lineNumber == lastLineNumber) break; default: @@ -354,13 +363,6 @@ namespace kiwi */ inline void fillSentLineInfo(vector& tokens, const vector& newlines) { - /* - * 문장 분리 기준 - * 1) 종결어미(ef) (요/jx)? (z_coda)? (so|sw|sh|sp|se|sf|(닫는 괄호))* - * 2) 종결구두점(sf) (so|sw|sh|sp|se|(닫는 괄호))* - * 3) 단 종결어미(ef) 바로 다음에 '요'가 아닌 조사(j)나 보조용언(vx), vcp, etm이 뒤따르는 경우는 제외 - */ - SentenceParser sp; uint32_t sentPos = 0, lastSentPos = 0, subSentPos = 0, accumSubSent = 1, accumWordPos = 0, lastWordPos = 0; size_t nlPos = 0, lastNlPos = 0, nestedSentEnd = 0, nestedEnd = 0; @@ -536,7 +538,7 @@ namespace kiwi auto next = first; ++next; - while(next != last) + while (next != last) { TokenInfo& current = *first; TokenInfo& nextToken = *next; diff --git a/test/test_cpp.cpp b/test/test_cpp.cpp index c803fab7..2bc431b7 100644 --- a/test/test_cpp.cpp +++ b/test/test_cpp.cpp @@ -332,6 +332,7 @@ TEST(KiwiCpp, SentenceBoundaryErrors) Kiwi& kiwi = reuseKiwiInstance(); for (auto str : { + u8"어떻게 보면 신제품에 대한 기대 이런 모멘텀들이 국내 증시의 적감의 수세를 촉발시킬 수도 있는 요인이 될 수도 있다라고 보시면 될 것 같습니다.", u8"관련 법령 이전에 만들어져 경사로 설치 의무 대상은 아닙니다.", u8"적법절차의 실질적인 내용을 침해하였는지 여부 등에 관하여 충분히 심리하지", u8"2023. 5. 10 주식회사 키위(이하 '회사'라 한다) 대표이사 XXX는 저녁을 직원들에게 사주었다.",