GithubHelp home page GithubHelp logo

hyunwoongko / kss Goto Github PK

View Code? Open in Web Editor NEW
380.0 4.0 57.0 196.4 MB

KSS: Korean String processing Suite

License: BSD 3-Clause "New" or "Revised" License

Python 91.52% Cython 0.33% C++ 8.15%
nlp korean kss sentences split-sentences korean-nlp

kss's Introduction

Who is Kevin Ko?

Twitter Facebook Instagram Linkedin Youtube

Currently, I am a ...

In the past, I was a ...

  • (2022.02 ~ 2023.09) Lead ML Scientist at EleutherAI.
  • (2021.03 ~ 2023.05) ML Engineer and Co-Founder at TUNiB.
  • (2021.03 ~ 2021.12) Host of Jiphyeonjeon paper review group.
  • (2020.08 ~ 2021.03) ML Engineer at Kakao Brain.

For more details, please refer to here.

kss's People

Contributors

aiden-jeon avatar combacsa avatar donghyun-daniel avatar hyunwoongko avatar kimdwkimdw avatar leeseungchae avatar snoop2head avatar taeminlee avatar uoneway avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar

kss's Issues

문장 분리중 에러 발생

kss.split_sentences('야타카라스의 힘을 가져온 그녀는 그 영향으로 원래의 모습에서 크게 변화한 것으로 알려졌다. 왼발은 전자와 같은 것이 주위를 감도는 "분해의 발", 오른발은 금속 덩어리와 같은 "융합의 발", 오른손은 다각형의 제어봉인 "제 3의 다리"가 되고, 이러한 "세 개의 다리"에서 핵융합 반응을 조작한다. 또한 가슴에는 거대한 새의 눈과 같은 \'붉은 눈\'이 존재한다. 대전시는 핵력을 이용한 마법 카드를 사용하고 스펠 카드 발동 시에는 방사능 마크와 사이렌 경고음과 함께 "☢ CAUTION!"의 문자가 표시된다.')

위의 문장을 실행하면 에러가 생기네요 이유가 뭘까요?

split_sentences 하트 이모지 깨지는 문제

안녕하세요 🙂
split_sentences 사용할때 input의 하트 이모지와 output의 하트 이모지가 다르게 출력됩니다.

test = '이모지가 어떻게 되나 테스트해봅시다. 첫 번째는 ❤️❤️하트입니다. 두 번째는 😊😊웃는얼굴입니다. 세 번째는 👍👍엄지입니다.'
print(test)
sentences = split_sentences(
    text=test,
    use_heuristic=True,
    use_quotes_brackets_processing=False,
    num_workers=1,
    disable_gc=True
)
print(sentences)

출력값은 아래 사진과 같습니다.
스크린샷 2022-03-24 오후 2 47 18

모든 이모지를 실험해 보지는 않았지만, 하트 이모지에 대해서 깨지는 것을 확인했습니다.

아마 빨간색 하트 \u2764\uFE0F 가 까만색 하트 \u2764 로 변경되는 것 같습니다.

문장 분리시 불규칙한 괄호 행방불명 문제

안녕하세요

아래와 같은 문장을 split_sentences 이용하여 문장을 분리하면, 불규칙하게 괄호가 삭제됩니다.

ttst = '''고교·대학 연계 ‘조기 직업교육’ 아시나요? 
대경대학교가 국내 최초로 도입한 ‘조기 직업교육’ 시스템이 눈길을 끌고 있다. 대경대는 2014년 9월 국제조기전공 선택 인재육성학교로 ‘유파스’(UPAS`Universal Preforming Arts School)를 설립했다. 고등 과정 3년과 대학 2, 3년 과정을 연계한 새로운 개념의 학교이다. 대학 과정에서는 본교와 해외 유명 직업교육 대학을 연계한다. ◆교육 혁신 유파스 입학생들은 고교 과정에서부터 1개 분야가 아닌 다중 전공을 선택할 수 있다. 고교 2년까지 전공을 바꿀 수 있으며 3년 과정에서 전공을 확정해 대학교육과 연계한다. 전공 분야는 모델, 연극영화, 실용음악, 동물조련, IT(프로그래밍, 게임제작, 디자인), 호텔매니지먼트, 호텔조리, 제과제빵, 항공운항, 실용댄스, 뮤지컬, 뷰티계열 등으로 다양하다. 고교 3년 과정 동안 고교 일반 교과, 교양, 방과 후 활동, 협동수업, 인문학 수업 등을 공통으로 진행한다. 전공을 선택한 학생들은 유파스가 운영하고 있는 국내 유일의 커리큘럼을 통해 전문 직업인으로 성장한다.'''

print(split_sentences(ttst))

>>> ['고교·대학 연계 ‘조기 직업교육’ 아시나요?', '대경대학교가 국내 최초로 도입한 ‘조기 직업교육’ 시스템이 눈길을 끌고 있다.', "대경대는 2014년 9월 국제조기전공 선택 인재육성학교로 ‘유파스’ UPAS'Universal Preforming Arts School)를 설립했다. 고등 과정 3년과 대학 2, 3년 과정을 연계한 새로운 개념의 학교이다. 대학 과정에서는 본교와 해외 유명 직업교육 대학을 연계한다. ◆교육 혁신 유파스 입학생들은 고교 과정에서부터 1개 분야가 아닌 다중 전공을 선택할 수 있다. 고교 2년까지 전공을 바꿀 수 있으며 3년 과정에서 전공을 확정해 대학교육과 연계한다. 전공 분야는 모델, 연극영화, 실용음악, 동물조련, IT(프로그래밍, 게임제작, 디자인 , 호텔매니지먼트, 호텔조리, 제과제빵, 항공운항, 실용댄스, 뮤지컬, 뷰티계열 등으로 다양하다.", '고교 3년 과정 동안 고교 일반 교과, 교양, 방과 후 활동, 협동수업, 인문학 수업 등을 공통으로 진행한다.', '전공을 선택한 학생들은 유파스가 운영하고 있는 국내 유일의 커리큘럼을 통해 전문 직업인으로 성장한다.']

(위 내용에 가독성을 위해 문장 별로 줄바꿈을 삽입)

ttst = '''고교·대학 연계 ‘조기 직업교육’ 아시나요? 
대경대학교가 국내 최초로 도입한 ‘조기 직업교육’ 시스템이 눈길을 끌고 있다. 
대경대는 2014년 9월 국제조기전공 선택 인재육성학교로 ‘유파스’(UPAS`Universal Preforming Arts School)를 설립했다. 
고등 과정 3년과 대학 2, 3년 과정을 연계한 새로운 개념의 학교이다. 대학 과정에서는 본교와 해외 유명 직업교육 대학을 연계한다. 
◆교육 혁신 유파스 입학생들은 고교 과정에서부터 1개 분야가 아닌 다중 전공을 선택할 수 있다. 
고교 2년까지 전공을 바꿀 수 있으며 3년 과정에서 전공을 확정해 대학교육과 연계한다. 
전공 분야는 모델, 연극영화, 실용음악, 동물조련, IT(프로그래밍, 게임제작, 디자인), 호텔매니지먼트, 호텔조리, 제과제빵, 항공운항, 실용댄스, 뮤지컬, 뷰티계열 등으로 다양하다. 
고교 3년 과정 동안 고교 일반 교과, 교양, 방과 후 활동, 협동수업, 인문학 수업 등을 공통으로 진행한다. 
전공을 선택한 학생들은 유파스가 운영하고 있는 국내 유일의 커리큘럼을 통해 전문 직업인으로 성장한다.'''

print(split_sentences(ttst))

>>> ['고교·대학 연계 ‘조기 직업교육’ 아시나요?', 
'대경대학교가 국내 최초로 도입한 ‘조기 직업교육’ 시스템이 눈길을 끌고 있다.', 
"대경대는 2014 9 국제조기전공 선택 인재육성학교로유파스UPAS'Universal Preforming Arts School) 설립했다. 
고등 과정 3년과 대학 2, 3 과정을 연계한 새로운 개념의 학교이다. 대학 과정에서는 본교와 해외 유명 직업교육 대학을 연계한다. 
◆교육 혁신 유파스 입학생들은 고교 과정에서부터 1 분야가 아닌 다중 전공을 선택할  있다. 
고교 2년까지 전공을 바꿀  있으며 3 과정에서 전공을 확정해 대학교육과 연계한다. 
전공 분야는 모델, 연극영화, 실용음악, 동물조련, IT(프로그래밍, 게임제작, 디자인 , 호텔매니지먼트, 호텔조리, 제과제빵, 항공운항, 실용댄스, 뮤지컬, 뷰티계열 등으로 다양하다.",
 '고교 3년 과정 동안 고교 일반 교과, 교양, 방과 후 활동, 협동수업, 인문학 수업 등을 공통으로 진행한다.', 
'전공을 선택한 학생들은 유파스가 운영하고 있는 국내 유일의 커리큘럼을 통해 전문 직업인으로 성장한다.']

문장 분리가 제대로 되지 않는 것은 물론 (safe=True/False 두 경우 모두 해당), UPASIT(프로그래밍~ 부분의 괄호가 삭제됩니다.

kss 문장분리오류

import kss

s = "회사 동료 분들과 다녀왔는데 분위기도 좋고 음식도 맛있었어요 다만, 강남 토끼정이 강남 쉑쉑버거 골목길로 쭉 올라가야 하는데 다들 쉑쉑버거의 유혹에 넘어갈 뻔 했답니다 강남역 맛집 토끼정의 외부 모습."
for sent in kss.split_sentences(s):
print(sent)

kss 라이브러리를 설치하고 위 코드를 실행하였는데

[Korean Sentence Splitter]: Initializing Pynori...
[Korean Sentence Splitter]: Initializing Pynori...
계속적으로 위 오류가 뜨면서 문장분리가 안됩니다.

문장분리기 실행시 여러번 호출되면서 오류가 발생합니다.

image

안녕하세요. 텍스트 마이닝 공부를 하고 있는 학생입니다.

다름이 아니라, 문장 분리기 사용시 수없이 많이 호출되며 런타임 오류가 발생하는데, 이유가 무엇인지 알 수 있을까요?

이 오류는 vs code에서는 발생하며 jupyter notebook에서 실행하면 잘됩니다.

제가 아직 코딩 초보자라 검색해봤지만 이에 대한 해결법을 찾지 못해서 여쭤봅니다.

감사합니다.

오류 보고

안녕하세요, 다음과 같은 텍스트를 넣으면 제대로 분리가 되지 않습니다.

텍스트:

당사의 정관에 의한 발행할 주식의 총수는 500,000,000주(1주의 금액:5,000원)이며 2017년말 현재 당사가 발행한 기명식 보통주식(이하 보통주) 및 무의결권기명식 우선주식(이하 우선주)의 수는 각각 129,098,494주와 18,250,580주입니다(소각주식수 제외). 당사는 2017년말 현재까지 보통주 26,510,843주와 우선주 5,642,847주를 이사회결의에 의거 이익으로 소각한 바 있습니다.

분리 결과:

( '당사의 정관에 의한 발행할 주식의 총수는 500,000,000주(1주의 금액:5,000원)이며 2017년말 현재 당사가 발행한 기명식 보통주식(이하 보통주) 및 무의결권기명식 우선주식(이하 우선주)의 수는 각각 129,098,494주와 18,250,580주입니다',
 '(소각주식수 제외). 당사는 2017년말 현재까지 보통주 26,510,843주와 우선주 5,642,847주를 이사회결의에 의거 이익으로 소각한 바 있습니다.')

종결어미(~함, ~임)이 앞에 붙는 단어에 따라 종결 어미로 인식 안되는 이슈

테스트 해보니 ~함, ~임이 앞에 붙는 단어에 따라 문장을 분리시켜주지 못하는 이슈가 있습니다.

~함 : 형성함, 지원함 등
ex) 명확히 기대하는 바를 제시하고 이를 달성하기 위한 제반 여건을 지원함 편견 없이 다른 사람의 다양성에 집중하는
=> 분리안됨
~임 : ~편임

혹시, ~함, ~임 앞에 특정 요건이 있어야 ~함, ~임을 종결어미로 인식하여 앞뒤 문장을 분리시켜주는지 궁금합니다.

파이참에서, kss를 사용할 때에만 갑자기 멀티프로세싱이 일어납니다.

정확히는, kss 코드가 있으면 이상하게 kss가 2번 실행됩니다.

kss가 처음 실행 되는 순간 뭔가를 진행하다가 파일을 처음부터 다시 실행하고, 이후 2번째 kss 실행에서 크래시가 일어납니다.
만약 kss 부분 이외의 코드가 짧다면 kss의 2번째 실행이 진행되던 도중에 파일이 처음부터 실행되고 크래시가 일어납니다.

다른 분께서 적으신, close된 이슈를 보니 멀티프로세싱의 문제라고 하셨습니다.
그런데 제가 멀티프로세싱이 일어날 이유가 없는 기본 코드를 실행했음에도 두 번 실행됩니다.
즉, kss 내부 코드 문제로 멀티프로세싱이 되었다고 생각합니다.
파이참 기본 설정은 멀티프로세싱이 아닌 것으로 알고 있습니다.

image

테스트 코드 1입니다.

[Korean Sentence Splitter]: Initializing Pynori...
[Korean Sentence Splitter]: Initializing Pynori...
Traceback (most recent call last):
File "", line 1, in
File "C:\Users\USER\AppData\Local\Programs\Python\Python310\lib\multiprocessing\spawn.py", line 116, in spawn_main
exitcode = _main(fd, parent_sentinel)
File "C:\Users\USER\AppData\Local\Programs\Python\Python310\lib\multiprocessing\spawn.py", line 125, in _main
prepare(preparation_data)
File "C:\Users\USER\AppData\Local\Programs\Python\Python310\lib\multiprocessing\spawn.py", line 236, in prepare
_fixup_main_from_path(data['init_main_from_path'])
File "C:\Users\USER\AppData\Local\Programs\Python\Python310\lib\multiprocessing\spawn.py", line 287, in _fixup_main_from_path
main_content = runpy.run_path(main_path,
File "C:\Users\USER\AppData\Local\Programs\Python\Python310\lib\runpy.py", line 289, in run_path
return _run_module_code(code, init_globals, run_name,
File "C:\Users\USER\AppData\Local\Programs\Python\Python310\lib\runpy.py", line 96, in _run_module_code
_run_code(code, mod_globals, init_globals,
File "C:\Users\USER\AppData\Local\Programs\Python\Python310\lib\runpy.py", line 86, in _run_code
exec(code, run_globals)
File "C:\Users\USER\PycharmProjects\kiwiTest\main.py", line 4, in
kss.split_sentences('')
File "C:\Users\USER\PycharmProjects\kiwiTest\venv\lib\site-packages\kss\kss.py", line 122, in split_sentences
preprocessed_list = list(pool.map(build_preprocessed_list, _text))
File "C:\Users\USER\AppData\Local\Programs\Python\Python310\lib\concurrent\futures\process.py", line 761, in map
results = super().map(partial(_process_chunk, fn),
File "C:\Users\USER\AppData\Local\Programs\Python\Python310\lib\concurrent\futures_base.py", line 610, in map
fs = [self.submit(fn, *args) for args in zip(*iterables)]
File "C:\Users\USER\AppData\Local\Programs\Python\Python310\lib\concurrent\futures_base.py", line 610, in
fs = [self.submit(fn, *args) for args in zip(*iterables)]
File "C:\Users\USER\AppData\Local\Programs\Python\Python310\lib\concurrent\futures\process.py", line 732, in submit
self._adjust_process_count()
File "C:\Users\USER\AppData\Local\Programs\Python\Python310\lib\concurrent\futures\process.py", line 692, in _adjust_process_count
self._spawn_process()
File "C:\Users\USER\AppData\Local\Programs\Python\Python310\lib\concurrent\futures\process.py", line 709, in _spawn_process
p.start()
File "C:\Users\USER\AppData\Local\Programs\Python\Python310\lib\multiprocessing\process.py", line 121, in start
self._popen = self._Popen(self)
File "C:\Users\USER\AppData\Local\Programs\Python\Python310\lib\multiprocessing\context.py", line 336, in _Popen
return Popen(process_obj)
File "C:\Users\USER\AppData\Local\Programs\Python\Python310\lib\multiprocessing\popen_spawn_win32.py", line 45, in init
prep_data = spawn.get_preparation_data(process_obj._name)
File "C:\Users\USER\AppData\Local\Programs\Python\Python310\lib\multiprocessing\spawn.py", line 154, in get_preparation_data
_check_not_importing_main()
File "C:\Users\USER\AppData\Local\Programs\Python\Python310\lib\multiprocessing\spawn.py", line 134, in _check_not_importing_main
raise RuntimeError('''
RuntimeError:
An attempt has been made to start a new process before the
current process has finished its bootstrapping phase.

    This probably means that you are not using fork to start your
    child processes and you have forgotten to use the proper idiom
    in the main module:

        if __name__ == '__main__':
            freeze_support()
            ...

    The "freeze_support()" line can be omitted if the program
    is not going to be frozen to produce an executable.

Traceback (most recent call last):
File "C:\Users\USER\PycharmProjects\kiwiTest\main.py", line 4, in
kss.split_sentences('')
File "C:\Users\USER\PycharmProjects\kiwiTest\venv\lib\site-packages\kss\kss.py", line 122, in split_sentences
preprocessed_list = list(pool.map(build_preprocessed_list, _text))
File "C:\Users\USER\AppData\Local\Programs\Python\Python310\lib\concurrent\futures\process.py", line 570, in _chain_from_iterable_of_lists
for element in iterable:
File "C:\Users\USER\AppData\Local\Programs\Python\Python310\lib\concurrent\futures_base.py", line 621, in result_iterator
yield _result_or_cancel(fs.pop())
File "C:\Users\USER\AppData\Local\Programs\Python\Python310\lib\concurrent\futures_base.py", line 319, in _result_or_cancel
return fut.result(timeout)
File "C:\Users\USER\AppData\Local\Programs\Python\Python310\lib\concurrent\futures_base.py", line 458, in result
return self.__get_result()
File "C:\Users\USER\AppData\Local\Programs\Python\Python310\lib\concurrent\futures_base.py", line 403, in __get_result
raise self._exception
concurrent.futures.process.BrokenProcessPool: A process in the process pool was terminated abruptly while the future was running or pending.

Process finished with exit code 1

결과 1입니다.

image

테스트 코드 2입니다.

C:\Users\USER\PycharmProjects\kiwiTest\venv\Scripts\python.exe C:/Users/USER/PycharmProjects/kiwiTest/main.py
[Korean Sentence Splitter]: Initializing Pynori...
a
[Korean Sentence Splitter]: Initializing Pynori...
a
Traceback (most recent call last):
File "", line 1, in
File "C:\Users\USER\AppData\Local\Programs\Python\Python310\lib\multiprocessing\spawn.py", line 116, in spawn_main
exitcode = _main(fd, parent_sentinel)
File "C:\Users\USER\AppData\Local\Programs\Python\Python310\lib\multiprocessing\spawn.py", line 125, in _main
prepare(preparation_data)
File "C:\Users\USER\AppData\Local\Programs\Python\Python310\lib\multiprocessing\spawn.py", line 236, in prepare
_fixup_main_from_path(data['init_main_from_path'])
File "C:\Users\USER\AppData\Local\Programs\Python\Python310\lib\multiprocessing\spawn.py", line 287, in _fixup_main_from_path
main_content = runpy.run_path(main_path,
File "C:\Users\USER\AppData\Local\Programs\Python\Python310\lib\runpy.py", line 289, in run_path
return _run_module_code(code, init_globals, run_name,
File "C:\Users\USER\AppData\Local\Programs\Python\Python310\lib\runpy.py", line 96, in _run_module_code
_run_code(code, mod_globals, init_globals,
File "C:\Users\USER\AppData\Local\Programs\Python\Python310\lib\runpy.py", line 86, in _run_code
exec(code, run_globals)
File "C:\Users\USER\PycharmProjects\kiwiTest\main.py", line 5, in
kss.split_sentences('')
File "C:\Users\USER\PycharmProjects\kiwiTest\venv\lib\site-packages\kss\kss.py", line 122, in split_sentences
preprocessed_list = list(pool.map(build_preprocessed_list, _text))
File "C:\Users\USER\AppData\Local\Programs\Python\Python310\lib\concurrent\futures\process.py", line 761, in map
results = super().map(partial(_process_chunk, fn),
File "C:\Users\USER\AppData\Local\Programs\Python\Python310\lib\concurrent\futures_base.py", line 610, in map
fs = [self.submit(fn, *args) for args in zip(*iterables)]
File "C:\Users\USER\AppData\Local\Programs\Python\Python310\lib\concurrent\futures_base.py", line 610, in
fs = [self.submit(fn, *args) for args in zip(*iterables)]
File "C:\Users\USER\AppData\Local\Programs\Python\Python310\lib\concurrent\futures\process.py", line 732, in submit
self._adjust_process_count()
File "C:\Users\USER\AppData\Local\Programs\Python\Python310\lib\concurrent\futures\process.py", line 692, in _adjust_process_count
self._spawn_process()
File "C:\Users\USER\AppData\Local\Programs\Python\Python310\lib\concurrent\futures\process.py", line 709, in _spawn_process
p.start()
File "C:\Users\USER\AppData\Local\Programs\Python\Python310\lib\multiprocessing\process.py", line 121, in start
self._popen = self._Popen(self)
File "C:\Users\USER\AppData\Local\Programs\Python\Python310\lib\multiprocessing\context.py", line 336, in _Popen
return Popen(process_obj)
File "C:\Users\USER\AppData\Local\Programs\Python\Python310\lib\multiprocessing\popen_spawn_win32.py", line 45, in init
prep_data = spawn.get_preparation_data(process_obj._name)
File "C:\Users\USER\AppData\Local\Programs\Python\Python310\lib\multiprocessing\spawn.py", line 154, in get_preparation_data
_check_not_importing_main()
File "C:\Users\USER\AppData\Local\Programs\Python\Python310\lib\multiprocessing\spawn.py", line 134, in _check_not_importing_main
raise RuntimeError('''
RuntimeError:
An attempt has been made to start a new process before the
current process has finished its bootstrapping phase.

    This probably means that you are not using fork to start your
    child processes and you have forgotten to use the proper idiom
    in the main module:

        if __name__ == '__main__':
            freeze_support()
            ...

    The "freeze_support()" line can be omitted if the program
    is not going to be frozen to produce an executable.

Traceback (most recent call last):
File "C:\Users\USER\PycharmProjects\kiwiTest\main.py", line 5, in
kss.split_sentences('')
File "C:\Users\USER\PycharmProjects\kiwiTest\venv\lib\site-packages\kss\kss.py", line 122, in split_sentences
preprocessed_list = list(pool.map(build_preprocessed_list, _text))
File "C:\Users\USER\AppData\Local\Programs\Python\Python310\lib\concurrent\futures\process.py", line 570, in _chain_from_iterable_of_lists
for element in iterable:
File "C:\Users\USER\AppData\Local\Programs\Python\Python310\lib\concurrent\futures_base.py", line 621, in result_iterator
yield _result_or_cancel(fs.pop())
File "C:\Users\USER\AppData\Local\Programs\Python\Python310\lib\concurrent\futures_base.py", line 319, in _result_or_cancel
return fut.result(timeout)
File "C:\Users\USER\AppData\Local\Programs\Python\Python310\lib\concurrent\futures_base.py", line 458, in result
return self.__get_result()
File "C:\Users\USER\AppData\Local\Programs\Python\Python310\lib\concurrent\futures_base.py", line 403, in __get_result
raise self._exception
concurrent.futures.process.BrokenProcessPool: A process in the process pool was terminated abruptly while the future was running or pending.

Process finished with exit code 1

결과 2입니다.

제가 파이참에 대해서 잘못 알고 있는 것일 수도 있지만 확실히 뭔가 이상하다고 생각합니다.

M1 맥북에서 실행 실패

from kss import split_sentences
text = "강남역 맛집으로 소문난 강남 토끼정에 다녀왔습니다 회사 동료 분들과 다녀왔는데 분위기도 좋고 음식도 맛있었어요 다만, 강남 토끼정이 강남 쉑쉑버거 골목길로 쭉 올라가야 하는데 다들 쉑쉑버거의 유혹에 넘어갈 뻔 했답니다"
split_sentences(text)
[Korean Sentence Splitter]: Initializing Pynori...
concurrent.futures.process._RemoteTraceback:
"""
Traceback (most recent call last):
File "/Users/phy/opt/anaconda3/lib/python3.8/concurrent/futures/process.py", line 239, in _process_worker
r = call_item.fn(*call_item.args, **call_item.kwargs)
File "/Users/phy/opt/anaconda3/lib/python3.8/concurrent/futures/process.py", line 198, in _process_chunk
return [fn(*args) for args in chunk]
File "/Users/phy/opt/anaconda3/lib/python3.8/concurrent/futures/process.py", line 198, in
return [fn(*args) for args in chunk]
File "/Users/phy/opt/anaconda3/lib/python3.8/site-packages/kss/kss.py", line 266, in _split_sentences
eojeols = _morph.pos(text=text, backend=backend)
File "/Users/phy/opt/anaconda3/lib/python3.8/site-packages/kss/morph.py", line 46, in pos
_pos = self.pynori.do_analysis(
AttributeError: 'NoneType' object has no attribute 'do_analysis'
"""

예제 코드가 실행이 안 되네요. M1문제인지... 설치는 pip로 했습니다. conda를 써서 그런걸까요?

멀티프로세싱 이슈 발생시 필독

kss 이용시 멀티프로세싱 때문에 문제를 겪으시는 분들은 num_workers=1로 설정해보세요.
참고로 해당 이슈는 파이참 + 윈도우 환경에서만 발생하는듯 보이며 원인은 잘 모르겠습니다.

kss.split_sentences(..., num_workers=1)

반복되는 이슈가 많이 올라와서 이곳에 기록해두니 활용하시길 바랍니다.

'해', VV+EF` 글자가 사라지는 이슈

problem

QA task를 풀던 중 error 발생.

from kss import split_sentences
text = '감소한 반면에 해・공군의 점유율이 상대적으로 상승하였다. 해, 공 군 및 연구개발 분야의'
# split_sentences(text, backend="mecab") # backend mecab에서도 동일한 문제 발생
split_sentences(text, backend="pynori")
---------------------------------------------------------------------------
IndexError                                Traceback (most recent call last)
      1 from kss import split_sentences
      2 text = '감소한 반면에 해・공군의 점유율이 상대적으로 상승하였다. 해, 공 군 및 연구개발 분야의'
----> 3 split_sentences(text)

    186 
    187     if isinstance(text, str):
--> 188         return results[0]
    189     else:
    190         return results

IndexError: list index out of range

최근에 commit된 3.4.3에서는 disable_mp_post_process 옵션으로 위 에러가 발생하지는 않으나 여전히 라는 단어가 사라지는 현상이 발생합니다.

>>> Original text
'감소한 반면에 해・공군의 점유율이 상대적으로 상승하였다. 해, 공 군 및 연구개발 분야의'
<<< Apply split_sentences func
'감소한 반면에 해・공군의 점유율이 상대적으로 상승하였다. , 공 군 및 연구개발 분야의'

tokenized results (pynori)

[('감', NNG), ('소', NNG), ('한', XSV+ETM), (' ', SP), ('반', NNG), ('면', NNG), ('에', JKB), (' ', SP), ('해', VV+EC), 
('・', SY), ('공', NNG), ('군', NNG), ('의', JKG), (' ', SP), ('점', NNG), ('유', NNG), ('율', XSN), ('이', JKS), (' ', SP),
('상', NNG), ('대', NNG), ('적', XSN), ('으', JKB), ('로', JKB), (' ', SP), ('상', NNG), ('승', NNG), ('하', XSV), 
('였', EP), ('다', EF), ('.', SF), (' ', SP),
('해', VV+EF), # <-- 이 토큰이 사라짐
(',', SC), (' ', SP), ('공', NR), (' ', SP), ('군', NNBC), (' ', SP), ('및', MAJ), (' ', SP), ('연', NNG), ('구', NNG), 
('개', NNG), ('발', NNG), (' ', SP), ('분', NNG), ('야', NNG), ('의', NNG)]
  • backend pynori, mecab 둘 다 동일하게 이슈 발생합니다.

원인?

kss/kss/kss.py

Lines 527 to 528 in c488bfa

if cur_stat == Stats.DEFAULT or not (Table[cur_stat][eojeol.eojeol] & ID.NEXT1):
cur_sentence.append(eojeol)

위 코드에서 cur_statStats.DA_MORPH이라 False이며 not Table[cur_stat][eojeol.eojeol] & ID.NEXT1 또한 False로 (8이 나옴) ('해', VV+EF) 토큰이 사라지는데요, 해당 부분이 필요한 이유가 궁금합니다! (input text와 output text가 다른 경우가 많이 존재하는데 이쪽에서 이슈가 발생하는 것 같아서 질문드립니다.)

version

$ pip freeze | grep kss
$ python -V
kss==3.4.2
Python 3.8.12

문장 분리 결과가 원본과 달라지는 현상

유용한 라이브러리 공유해주셔서 감사합니다.

비정상 작동하는 경우가 있어 리포팅합니다.

input_text = "역사학자 'C.H.Firth'에 따르면 릴번은 그의 용기로 인해 훌륭한 명예를 얻게 되었고, 좋은 장교인 듯했으나, 그의 군 생활은 불행했다고 한다."
print(kss.split_sentences(input_text)[0])
>>> "역사학자 4576512453633786358787430073040149956rth'에 따르면 릴번은 그의 용기로 인해 훌륭한 명예를 얻게 되었고, 좋은 장교인 듯했으나, 그의 군 생활은 불행했다고 한다."

kss==4.5.1

KSS 설치이슈

안녕하세요, KSS를 사용하고 싶은데 설치가 되지 않아 문의드립니다.

아나콘다 쥬피터 노트북에서 파일을 실행하고 싶은데 kss 가 다운이 되지 않습니다. 아나콘다 prompt 에서 'pip install', 'conda install kss', 'conda install -c conda-forge kss' 를 모두 시도해도 계속 PackagesNotFoundError 에러가 발생합니다. 어떤 명령어로 설치가 가능한가요??

이전에 분리했던 텍스트들에 따라 문장분리 결과가 달라지는 사례

  • split_sentences()호출시 이전에 처리했던 텍스트에 따라서 현재 처리하는 텍스트가 달라질 요소가 있나요?
  • 있다면 어떤 옵션으로 방지할 수 있을까요?

  • kss version: 3.3.1.1
  • split_sentences(text, backend="mecab", num_workers=1)
  • text = "우리가 타이라는 단어는 원래 동사로 묶다 엮다라는 표현이고요 그다음에 명사로 하게 되면 묶음이라는 표현이죠 그런데"
    • 실행시 결과: "우리가 타이라는 단어는 원래 동사로 묶다 엮다라는 표현이고요 그다음에 명사로 하게 되면 묶음이라는 표현이죠. 그런데"
    • 이전에 500개의 문서 분리후 실행: "우리가 타이라는 단어는 원래 동사로 묶다 엮다. 라는 표현이고요 그다음에 명사로 하게 되면 묶음이라는 표현이죠. 그런데"

  • "묶다 엮다" 부분에서 문장 분리 결과가 달라집니다.

3.7.0) AttributeError: module 'emoji' has no attribute 'UNICODE_EMOJI'

❯ pip install kss
Collecting kss
  Using cached kss-3.7.0.tar.gz (42.4 MB)
  Preparing metadata (setup.py) ... error
  error: subprocess-exited-with-error
  
  × python setup.py egg_info did not run successfully.
  │ exit code: 1
  ╰─> [23 lines of output]
      Traceback (most recent call last):
        File "<string>", line 2, in <module>
        File "<pip-setuptools-caller>", line 34, in <module>
        File "/private/var/folders/my/6tpt42kd6cjclj6klhkjsf9h0000gn/T/pip-install-0gw7w00y/kss_dde11240c93144d69851b4d47e762b8b/setup.py", line 38, in <module>
          exec(version_file.read(), version)
        File "<string>", line 10, in <module>
        File "/private/var/folders/my/6tpt42kd6cjclj6klhkjsf9h0000gn/T/pip-install-0gw7w00y/kss_dde11240c93144d69851b4d47e762b8b/kss/__init__.py", line 10, in <module>
          from kss.kss import split_chunks, split_sentences
        File "/private/var/folders/my/6tpt42kd6cjclj6klhkjsf9h0000gn/T/pip-install-0gw7w00y/kss_dde11240c93144d69851b4d47e762b8b/kss/kss.py", line 23, in <module>
          from kss.base import (
        File "/private/var/folders/my/6tpt42kd6cjclj6klhkjsf9h0000gn/T/pip-install-0gw7w00y/kss_dde11240c93144d69851b4d47e762b8b/kss/base.py", line 17, in <module>
          from kss.morph import MorphExtractor
        File "/private/var/folders/my/6tpt42kd6cjclj6klhkjsf9h0000gn/T/pip-install-0gw7w00y/kss_dde11240c93144d69851b4d47e762b8b/kss/morph.py", line 15, in <module>
          from kss.pynori.korean_analyzer import KoreanAnalyzer
        File "/private/var/folders/my/6tpt42kd6cjclj6klhkjsf9h0000gn/T/pip-install-0gw7w00y/kss_dde11240c93144d69851b4d47e762b8b/kss/pynori/korean_analyzer.py", line 2, in <module>
          from kss.pynori.korean_tokenizer import KoreanTokenizer
        File "/private/var/folders/my/6tpt42kd6cjclj6klhkjsf9h0000gn/T/pip-install-0gw7w00y/kss_dde11240c93144d69851b4d47e762b8b/kss/pynori/korean_tokenizer.py", line 26, in <module>
          from kss.pynori.dict.user_dictionary import UserDictionary
        File "/private/var/folders/my/6tpt42kd6cjclj6klhkjsf9h0000gn/T/pip-install-0gw7w00y/kss_dde11240c93144d69851b4d47e762b8b/kss/pynori/dict/user_dictionary.py", line 2, in <module>
          from kss.pynori.dict.character_definition import CharacterDefinition
        File "/private/var/folders/my/6tpt42kd6cjclj6klhkjsf9h0000gn/T/pip-install-0gw7w00y/kss_dde11240c93144d69851b4d47e762b8b/kss/pynori/dict/character_definition.py", line 13, in <module>
          _emojis.update(emoji.UNICODE_EMOJI[lang])
      AttributeError: module 'emoji' has no attribute 'UNICODE_EMOJI'
      [end of output]

안녕하세요. 설치 시 위와 같은 에러가 발생하였습니다.
두시간 전에 업데이트 하셨길래 3.6.4로 낮춰서 설치하니 정상 설치 되었습니다.
m1맥 입니다.
감사합니다.

summarize 기능 추가

텍스트 서머라이징 기능을 추가한다. 알고리즘은 textrank를 기반으로 한다.
https://github.com/theeluwin/textrankr
현재 이 코드베이스에서 문장단위로 summarize를 하는데 종결부호를 기반으로 나이브 하게 수행하고 있다.
이를 kss와 mecab/pecab 기반으로 변경한다.

무한 재귀 호출 현상

#6
위 이슈와 같은 문제인지는 정확히 모르겠으나, 테스트해보는 도중 같은 이슈가 발생하여 코멘트납깁니다!

website를 크롤링 후 텍스트만 추출하여 kss 문장분리를 시도하고 있었는데,
정상적이지 않은 script 텍스트가 입력으로 들어가며 함수 내에서 못빠져나오는 현상을 경험했습니다.

제가 대략 코드를 살펴본 바로는
kss.py 내 split_sentences() 함수와 realign_by_quote()함수가 재귀함수로서 서로를 call하는 상황에서

split_sentence() 함수의 아래 코드 부분의 if 조건에 계속 빠지면서 realign_by_quote()함수가 다시 split_sentences()를 call하는 무한 function call 상황이 발생하는 것 같습니다.

if len(single_quote_stack) != 0:
    results = realign_by_quote(text, last_single_quote_pos, "'")

if len(double_quote_stack) != 0:
    results = realign_by_quote(text, last_double_quote_pos, "\"")

if len(bracket_stack) != 0:
    results = realign_by_quote(text, last_bracket_pos, " ")

Originally posted by @jaehyeongAN in #6 (comment)

문장분리가 안되는 현상 문의

안녕하세요, 문장분리 라이브러리를 우연히 발견해서 잘 쓰고 있습니다.
그런데 종종 어떤 문장에서 분리가 안되고 하나의 문장으로 넘겨주는 경우가 있어서 문의드립니다.

"사진은 이날 오후 서울 뉴코아아울렛 강남점 2,3층에 붙은 전산장애로 인한 조기 영업종료 관련 안내문. 2020.11.22▶코로나19 속보는 네이버 연합뉴스[구독 클릭]▶[팩트체크]프듀101 문자투표요금 환불 가능?▶제보하기저작권자(c) 연합뉴스(https://www.yna.co.kr/), 무단 전재-재배포 금지 (서울=연합뉴스) 박동주 기자 = 이랜드그룹은 22일 랜섬웨어 공격으로 인해 NC백화점 등 자사 오프라인 매장 절반 정도의 운영을 일시 중단했다고 밝혔다."

문제가된 문자열이 이런 형식으로 되어있는데요, 제가 생각한 분리는
1 사진은 이날 오후 서울 뉴코아아울렛 강남점 2,3층에 붙은 전산장애로 인한 조기 영업종료 관련 안내문.
2 ▶코로나19 속보는 네이버 연합뉴스[구독 클릭]
3 ▶[팩트체크]프듀101 문자투표요금 환불 가능?
4 ▶제보하기저작권자(c) 연합뉴스 (https://www.yna.co.kr/), 무단 전재-재배포 금지 (서울=연합뉴스) 박동주 기자
5 이랜드그룹은 22일 랜섬웨어 공격으로 인해 NC백화점 등 자사 오프라인 매장 절반 정도의 운영을 일시 중단했다고 밝혔다.
이런식으로 분리 되는걸 생각했는데 실제로 돌려보면 저 문서 전체를 하나의 문장으로 보고 분리를 하지 않고 있습니다
제공해주신 문서를 보고 옵션을 달리 줘봐도 결과는 동일하게 나오는데 문장을 분리하는 방법에서 다른 방법이 있는 지 문의드립니다.

mecab 설치 도큐먼트 수정 요청

안녕하세요 현웅님,
좋은 레포 만들어 주셔서 감사합니다.

다름이 아니라
현재 python-mecab-ko의 1.0.10 이후 버전이 맥북 이외에 빌드가 되지 않는 이슈가 있어
1.0.9 이전버전으로 낮추길 권장하면 좋겠다는 생각이 들어서 제안드립니다.
jonghwanhyeon/python-mecab-ko#5 (comment)

참고로 저는
pip install -v python-mecab-ko==1.0.9
로 해결을 했습니다.

위 방법이 아닌 도큐먼트에 올려주신 방식으로 돌리면 현재는 아래 오류가 발생하네요. ㅠ (우분투 18.04)
pybind11::init(): factory function returned nullptr

그럼 좋은하루 되세요!
감사합니다 :)

split_sentences() function 내 class 호출?

안녕하세요. 우선 제가 애용하는 kss 라이브러리를 잘 관리해주셔서 감사드립니다.😀
그 동안 kss==1.3.1버전을 잘 사용해오다가 2. 버전으로 올려볼까하여 테스트를 진행하고 있었는데 생각보다 1.3.x 버전과 속도 차이가 많이 나는 것을 확인하여 아직 1.3.1 버전을 유지 중입니다.

저는 text가 배치로 들어올 때마다 split_sentences()를 여러번 호출하는 일이 많다 보니 속도 저하가 더 크게 느껴지는데요😥
kss.py 코드를 살펴보니 split_sentences() 함수 104번 라인
에서 2개의 class 호출이 이루어지고 있네요.(기존 1.3.1에서는 해당 function내 class 호출은 없었구요)
function 호출 시마다 class를 init하다보니 속도에 영향이 있지 않을까 생각됩니다. 어떻게 생각하시나요? (물론 기존 c++기반이 python기반으로 바뀌며 속도저하도 있으리라 생각됩니다)

KeyError: 'EMOJI'

개요

#51 이슈가 kss 3.7.3 버전에서도 이모지를 포함한 문서들에서 발생하는 것을 확인하고 리포트합니다. 모든 이모지에 대해서 에러가 발생하지는 않는 것 같고 첨부한 문서 (b.txt)와 같은 특정 조건에서 발생하는 것 같습니다.

재현 방법

  1. 첨부한 b.txt를 다운로드
  2. 아래 코드를 실행
import kss
with open("b.txt") as f:
    for line in f.readlines():
        print(kss.split_sentences(line))
  1. 아래와 같은 에러 발생
[Korean Sentence Splitter]: You can install `python-mecab-kor` for faster kss execution.
Try to install it using `pip install python-mecab-kor`.
Refer https://github.com/hyuwoongko/python-mecab-kor for more details.

[Korean Sentence Splitter]: Initializing Pynori...
[]
['}']
[]
[]
[]
Traceback (most recent call last):
  File "test.py", line 18, in <module>
    print(kss.split_sentences(line))
  File "/home/singleheart/.pyenv/versions/ksstest/lib/python3.8/site-packages/kss/kss.py", line 183, in split_sentences
    results += [
  File "/home/singleheart/.pyenv/versions/ksstest/lib/python3.8/site-packages/kss/kss.py", line 184, in <listcomp>
    _split_sentences(
  File "/home/singleheart/.pyenv/versions/ksstest/lib/python3.8/site-packages/kss/kss.py", line 302, in _split_sentences
    eojeols = _morph.pos(text=text, backend=backend)
  File "/home/singleheart/.pyenv/versions/ksstest/lib/python3.8/site-packages/kss/morph.py", line 65, in pos
    _pos = self.pynori.do_analysis(
  File "/home/singleheart/.pyenv/versions/ksstest/lib/python3.8/site-packages/kss/pynori/korean_analyzer.py", line 63, in do_analysis
    while self.kor_tokenizer.increment_token():
  File "/home/singleheart/.pyenv/versions/ksstest/lib/python3.8/site-packages/kss/pynori/korean_tokenizer.py", line 356, in increment_token
    self.parse()
  File "/home/singleheart/.pyenv/versions/ksstest/lib/python3.8/site-packages/kss/pynori/korean_tokenizer.py", line 472, in parse
    if self.character_definition.isGroup(firstCharacter) is False:
  File "/home/singleheart/.pyenv/versions/ksstest/lib/python3.8/site-packages/kss/pynori/dict/character_definition.py", line 44809, in isGroup
    return groupMap[character_category_map(ch)]
KeyError: 'EMOJI'

테스트 데이터

b.txt

버전 정보

$ pip show kss  
Name: kss
Version: 3.7.3
Summary: A Toolkit for Korean sentence segmentation
Home-page: https://github.com/hyunwoongko/kss
Author: Hyunwoong Ko
Author-email: [email protected]
License: BSD 3-Clause "New" or "Revised" License
Location: /home/singleheart/.pyenv/versions/3.8.12/envs/ksstest/lib/python3.8/site-packages
Requires: emoji, more-itertools, regex
Required-by: 

30000자 이상 sentence split 시 과도하게 느려지거나 프리징 현상

환경 : ubuntu 18.04 python 3.8 kss python version 2.2.0.2
30000이상의 text를 split sentence 할 때 text에 따라 100배 이상 느리거나 혹은 끝나지 않는 문제가 있습니다.
정상적으로 처리되는 것도 있고요.
6시간이 지나도 끝나지 않아요 30000자 처리하는데.
혹시 time complexity 이슈인지 혹은 끝나지 않는 loop가 있는지 궁금합니다.
같은것을 1.3.1버전으로 처리해보면 잘 됩니다.
텍스트는 저작권 이슈로 올릴수가 없습니다.

특정 문자들이 사라지는 현상

>>> import kss
>>> print(kss.split_sentences("Shift + [."))
['Shift + .']
>>> print(kss.split_sentences("Shift + (."))
['Shift + .']
>>> print(kss.split_sentences("Shift + {."))
['Shift + .']

엣지 케이스로 보이는 현상을 발견하여 이슈를 남겨놓습니다.
위처럼 특정 커맨드를 설명하는 문장을 넣을 때 괄호들이 사라집니다.

$ pip freeze | grep kss
kss==2.5.1
$ python -V
Python 3.8.7

-하다, -합니다 split_sentences 결과 차이 오류

# 문장에 마침표 없는 경우 어떻게 문장 분리 수행하는지 확인
test = ['과연 어떻게 할지 궁금하다 이거는 마침표없는 문장인데 어떻게 분리해낼까 할 수 있을까나 걱정됩니다']
test = list(map(kss.split_sentences, test)) # 문장으로 split
test

# 출력 
[['과연 어떻게 할지 궁금하다 이거는 마침표없는 문장인데 어떻게 분리해낼까 할 수 있을까나 걱정됩니다']]
# 문장에 마침표 없는 경우 어떻게 문장 분리 수행하는지 확인
test = ['과연 어떻게 할지 궁금합니다 이거는 마침표없는 문장인데 어떻게 분리해낼까 할 수 있을까나 걱정됩니다']
test = list(map(kss.split_sentences, test)) # 문장으로 split
test

# 출력
[['과연 어떻게 할지 궁금합니다', '이거는 마침표없는 문장인데 어떻게 분리해낼까 할 수 있을까나 걱정됩니다']]

안녕하세요 해당 라이브러리로 문단에서 문장을 추출해보고 있습니다.
'-하다'로 끝나는 경우는 문장 분리가 안됩니다. :) 확인 부탁드려요. 감사합니다

EMOJI KeyError

backend="pynori" 이용 시, EMOJI KeyError 발생

Code:

import kss

text = "사랑해♥"
sentences = kss.split_sentences(text, backend="pynori")
print(sentences)

Output:

>>> sentences = kss.split_sentences(text, backend="pynori")
  File "C:\Users\mingu\anaconda3\envs\nlp\lib\site-packages\kss\kss.py", line 180, in split_sentences
    results += [
  File "C:\Users\mingu\anaconda3\envs\nlp\lib\site-packages\kss\kss.py", line 181, in <listcomp>
    _split_sentences(
  File "C:\Users\mingu\anaconda3\envs\nlp\lib\site-packages\kss\kss.py", line 292, in _split_sentences
    eojeols = _morph.pos(text=text, backend=backend)
  File "C:\Users\mingu\anaconda3\envs\nlp\lib\site-packages\kss\morph.py", line 65, in pos
    _pos = self.pynori.do_analysis(
  File "C:\Users\mingu\anaconda3\envs\nlp\lib\site-packages\kss\pynori\korean_analyzer.py", line 63, in do_analysis
    while self.kor_tokenizer.increment_token():
  File "C:\Users\mingu\anaconda3\envs\nlp\lib\site-packages\kss\pynori\korean_tokenizer.py", line 356, in increment_token
    self.parse()
  File "C:\Users\mingu\anaconda3\envs\nlp\lib\site-packages\kss\pynori\korean_tokenizer.py", line 472, in parse
    if self.character_definition.isGroup(firstCharacter) is False:
  File "C:\Users\mingu\anaconda3\envs\nlp\lib\site-packages\kss\pynori\dict\character_definition.py", line 44794, in isGroup
    return groupMap[character_category_map(ch)]
KeyError: 'EMOJI'

Process finished with exit code 1

특정 문장에서 오류를 뱉는 문제

버그인 듯 보입니다.
오류를 나타내는 문장은 다음과 같습니다.
'그것이 잘 적혀 있는지 확인해야 한다고 했기 때문이다. EBS 미래교육연구소 최홍규 박사도 그렇게 말했다'

아래 문장의 경우 정상적으로 작동합니다.

  1. 문장 사이의 whitespace를 삭제하는 경우
    '그것이 잘 적혀 있는지 확인해야 한다고 했기 때문이다.EBS 미래교육연구소 최홍규 박사도 그렇게 말했다'
  2. 문장 사이의 구두점을 삭제하는 경우
    '그것이 잘 적혀 있는지 확인해야 한다고 했기 때문이다 EBS 미래교육연구소 최홍규 박사도 그렇게 말했다'

아래는 오류 메세지 입니다.

>>> from kss import split_sentences
>>> tst = '그것이 잘 적혀 있는지 확인해야 한다고 했기 때문이다. EBS 미래교육연구소 최홍규 박사도 그렇게 말했다'
>>> split_sentences(text=tst, backend='mecab', use_heuristic=True)
Traceback (most recent call last):
  File "/Users/kintch/.conda/envs/newer/lib/python3.7/code.py", line 90, in runcode
    exec(code, self.locals)
  File "<input>", line 1, in <module>
  File "/Users/kintch/.conda/envs/newer/lib/python3.7/site-packages/kss/kss.py", line 185, in split_sentences
    return results[0]
IndexError: list index out of range

문장 분리 후 이모지가 제거되는 현상

안녕하세요. 문장 분리 적용 결과에서 이모지가 없어지는 현상이 있어서 이슈 남깁니다.

(이모지가 없어지는 것이 코드에서 의도하신거라면 doc_2 케이스가 잘못 처리된 케이스 같네요.)

doc_1, doc_3 의 경우 문장 분리 적용 후 이모지가 없어지는 케이스에 대한 예시고,

doc_2는 문장 분리 후 이모지가 없어지지 않는 케이스 입니다.

Python 3.8.10 | packaged by conda-forge | (default, May 11 2021, 07:01:05)
[GCC 9.3.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import kss
[Korean Sentence Splitter]: Initializing Kss...
>>> doc_1 = '이거 어떻게 처리할래?😀 배가 고파요'
>>> kss.split_sentences(doc_1, num_workers=1)
['이거 어떻게 처리할래?', '배가 고파요']
>>> doc_2 = "날씨가 좋네요~✨ 같이 나가서 놀까요?⚽"
>>> kss.split_sentences(doc_2, num_workers=1)
['날씨가 좋네요~✨ 같이 나가서 놀까요?', '⚽']
>>> doc_3 = "🌺한줄 평: 여름에 어울리는 상큼 자몽향 바디세트-이 세트 두 번째 구매입니다!🌷자몽향기너무 상큼한 자몽향기입니다!"
>>> kss.split_sentences(doc_3, num_workers=1)
['한줄 평: 여름에 어울리는 상큼 자몽향 바디세트-이 세트 두 번째 구매입니다!', '자몽향기너무 상큼한 자몽향기입니다!']

현재 사용하고 있는 kss 모듈 버전은 3.2.0 입니다.

C++ 버전 개발

속도를 비약적으로 향상시키기 위해 C++ 버전을 개발한다.

멀티프로세싱 환경에서 split_sentences 호출 시 문장분리 결과가 달라집니다.

멀티프로세싱 환경에서 split_sentences 호출 시 아래와 같이 문장분리 결과가 다른 경우가 있어서 문의드립니다.
케이스를 확인한 버전은 3.1.0.4 입니다. (현재 2.5.1 버전으로 downgrade 후에 문제가 해결된 상태입니다.)

  • 실행 1
    => 문장 4 : 또한 스마트 폰으로 웹캠 디바이스를 컨트롤 좌 우 상 하를 움직임 을하여 시야를 더 확장 시킬 수 있다.
    => 문장 5 : 결론적으로 폰으로 웹캠을 구동시켜 메시지전송 영상 및 사진전송 및 컨트롤 하는 것이 이번 프로젝트의 최종 목표이다.

  • 실행 2
    => 문장 4 : 또한 스마트 폰으로 웹캠 디바이스를 컨트롤 좌 우 상 하를 움직임
    => 문장 5 : 을하여 시야를 더 확장 시킬 수 있다.
    => 문장 6 : 결론적으로 폰으로 웹캠을 구동시켜 메시지전송 영상 및 사진전송 및 컨트롤 하는 것이 이번 프로젝트의 최종 목표이다.

※ 실행 코드의 구조는 multiprocessing pool에 document 목록을 넘겨주어 프로세스들이 document에 대하여 하나씩 split_sentences를 호출하는 형태입니다.

\u200b (no width whitespace) 있는 문장에 대한 에러

안녕하세요:)

특정 문자열이 포함된 문장에 대해 문장 분리가 되지 않는 이슈가 있어 보고합니다.

>>> kss.split_sentences('분리 할 수 ​​있다.')
[Korean Sentence Splitter]: Initializing Pynori...
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/home/ubuntu/anaconda3/envs/ir/lib/python3.7/site-packages/kss/kss.py", line 185, in split_sentences
    return results[0]
IndexError: list index out of range

위 예시 문장에 들어가 있는 '분리 할 수 ​​있다.' 에 \u200b가 포함되어 있어 문장 분리가 되지 않았습니다.

concurrent.futures.process.BrokenProcessPool: A process in the process pool was terminated abruptly while the future was running or pending.

python3.8에서만 유독 저 에러메세지를 뱉네요..
물론 num_workers=1로 하면 잘 작동하구요.
왜 그럴까요..

>>> tst = '그것이 잘 적혀 있는지 확인야 한다고 했기 때문이다.EBS 미래교육연구소 최홍규 박사도 그렇게 말했다.'
>>> split_sentences(text=tst, backend='mecab', use_heuristic=True, num_workers=-1)
Traceback (most recent call last):
  File "<string>", line 1, in <module>
  File "/Users/kintch/.conda/envs/pclur_beta0.1/lib/python3.8/multiprocessing/spawn.py", line 116, in spawn_main
    exitcode = _main(fd, parent_sentinel)
  File "/Users/kintch/.conda/envs/pclur_beta0.1/lib/python3.8/multiprocessing/spawn.py", line 125, in _main
    prepare(preparation_data)
  File "/Users/kintch/.conda/envs/pclur_beta0.1/lib/python3.8/multiprocessing/spawn.py", line 236, in prepare
    _fixup_main_from_path(data['init_main_from_path'])
  File "/Users/kintch/.conda/envs/pclur_beta0.1/lib/python3.8/multiprocessing/spawn.py", line 287, in _fixup_main_from_path
    main_content = runpy.run_path(main_path,
  File "/Users/kintch/.conda/envs/pclur_beta0.1/lib/python3.8/runpy.py", line 264, in run_path
    code, fname = _get_code_from_file(run_name, path_name)
  File "/Users/kintch/.conda/envs/pclur_beta0.1/lib/python3.8/runpy.py", line 234, in _get_code_from_file
Traceback (most recent call last):
  File "<string>", line 1, in <module>
    with io.open_code(decoded_path) as f:
FileNotFoundError: [Errno 2] No such file or directory: '/Users/kintch/PycharmProjects/pclur_beta0.1/<input>'
  File "/Users/kintch/.conda/envs/pclur_beta0.1/lib/python3.8/multiprocessing/spawn.py", line 116, in spawn_main
    exitcode = _main(fd, parent_sentinel)
  File "/Users/kintch/.conda/envs/pclur_beta0.1/lib/python3.8/multiprocessing/spawn.py", line 125, in _main
    prepare(preparation_data)
  File "/Users/kintch/.conda/envs/pclur_beta0.1/lib/python3.8/multiprocessing/spawn.py", line 236, in prepare
    _fixup_main_from_path(data['init_main_from_path'])
  File "/Users/kintch/.conda/envs/pclur_beta0.1/lib/python3.8/multiprocessing/spawn.py", line 287, in _fixup_main_from_path
    main_content = runpy.run_path(main_path,
  File "/Users/kintch/.conda/envs/pclur_beta0.1/lib/python3.8/runpy.py", line 264, in run_path
    code, fname = _get_code_from_file(run_name, path_name)
  File "/Users/kintch/.conda/envs/pclur_beta0.1/lib/python3.8/runpy.py", line 234, in _get_code_from_file
    with io.open_code(decoded_path) as f:
FileNotFoundError: [Errno 2] No such file or directory: '/Users/kintch/PycharmProjects/pclur_beta0.1/<input>'
Traceback (most recent call last):
  File "<string>", line 1, in <module>
  File "/Users/kintch/.conda/envs/pclur_beta0.1/lib/python3.8/multiprocessing/spawn.py", line 116, in spawn_main
    exitcode = _main(fd, parent_sentinel)
  File "/Users/kintch/.conda/envs/pclur_beta0.1/lib/python3.8/multiprocessing/spawn.py", line 125, in _main
    prepare(preparation_data)
  File "/Users/kintch/.conda/envs/pclur_beta0.1/lib/python3.8/multiprocessing/spawn.py", line 236, in prepare
    _fixup_main_from_path(data['init_main_from_path'])
  File "/Users/kintch/.conda/envs/pclur_beta0.1/lib/python3.8/multiprocessing/spawn.py", line 287, in _fixup_main_from_path
    main_content = runpy.run_path(main_path,
  File "/Users/kintch/.conda/envs/pclur_beta0.1/lib/python3.8/runpy.py", line 264, in run_path
    code, fname = _get_code_from_file(run_name, path_name)
  File "/Users/kintch/.conda/envs/pclur_beta0.1/lib/python3.8/runpy.py", line 234, in _get_code_from_file
    with io.open_code(decoded_path) as f:
FileNotFoundError: [Errno 2] No such file or directory: '/Users/kintch/PycharmProjects/pclur_beta0.1/<input>'
Traceback (most recent call last):
  File "/Users/kintch/.conda/envs/pclur_beta0.1/lib/python3.8/code.py", line 90, in runcode
    exec(code, self.locals)
  File "<input>", line 1, in <module>
  File "/Users/kintch/.conda/envs/pclur_beta0.1/lib/python3.8/site-packages/kss/kss.py", line 126, in split_sentences
    for input_text in preprocessed_list:
  File "/Users/kintch/.conda/envs/pclur_beta0.1/lib/python3.8/concurrent/futures/process.py", line 484, in _chain_from_iterable_of_lists
    for element in iterable:
  File "/Users/kintch/.conda/envs/pclur_beta0.1/lib/python3.8/concurrent/futures/_base.py", line 619, in result_iterator
    yield fs.pop().result()
  File "/Users/kintch/.conda/envs/pclur_beta0.1/lib/python3.8/concurrent/futures/_base.py", line 444, in result
    return self.__get_result()
  File "/Users/kintch/.conda/envs/pclur_beta0.1/lib/python3.8/concurrent/futures/_base.py", line 389, in __get_result
    raise self._exception
concurrent.futures.process.BrokenProcessPool: A process in the process pool was terminated abruptly while the future was running or pending.

문장 분리 오류

안녕하세요!
우선 자연어처리에 필수로 필요한 라이브러리를 공유해주셔서 진심으로 감사드립니다.
해당 라이브러리를 사용 중, 문장 분리가 이상하게 되는 경우를 발견해서 이슈로 남깁니다.

kss==2.2.0.2
"개그맨 김병만 씨가 아르바이트를 하다 목숨을 잃을 뻔한 사연을 TV조선 '별별톡쇼'에서 전했다."
->['개그맨 김병만 씨가 아르바이트를 하다', "목숨을 잃을 뻔한 사연을 TV조선 '별별톡쇼'에서 전했다."]

감사합니다 :-)

문장 분리오류

안녕하세요.

이 책은 각 시대의 중요 키워드를 설정하여 시대별로 서술하였다는 점에서 개설서의 역할을 하면서도 키워드가 지니고 있는 시공간성을 동시에 서술하고자 한 점에서 사전적인 의미도동시에 지니고 있다. 가령 중국의 대표적 관광지 중의 하나인 만리장성의 경우, 일반적으로 중국을 최초로 통일한 진시황제에 의해 축성된 것으로 기술되고 있지만, 오늘날 우리가 볼수 있는 만리장성은 실제로는 명대 북방의 몽골을 방비하기 위해 구축된 것이며, 나아가 일본과 신대륙으로부터 들어온 막대한 양의 은(銀)이 없었다면 불가능하였다는 것이다. 만리장성은 당시 전 세계 은을 흡수하는 블랙홀이었다.

위 문장이 분리가 안되네요.

환경은 linux(ubuntu), kss 버전 2.2.0.2 입니다.

이유없이 Kill되고있습니다.

import kss
print('test')

코드를 이런식으로만 작성해서 테스트해봤는데 프로세스가 자꾸 실행하자마자
아래와 같은 메세지를 출력하고 죽습니다.
[Korean Sentence Splitter]: Initializing Kss...
Killed

개발환경은 도커환경에서 돌렸고
Ubuntu 18.04
python3.6.9
kss 3.1.0.4
로 세팅해서 돌렸습니다.

오류 보고

from kss import split_sentences
para = 'TV산업은 1926년 흑백 TV 개발, 1954년 RCA사가 Color TV(21") 양산/판매를 시작한 이래로 트리니트론 브라운관(1967년), 완전평면 브라운관(1996년) 개발 등 기술적인 발전을 거듭해 왔으나, 주요 국가 보급률이 90%를 넘어서면서 브라운관 TV사업의 성장은 정체되었습니다. 그러나 Flat Panel TV(LCD, PDP) 출시, 디지털 방송 확산(영/미 1998년~ )을 통해 TV 시장은 성장 모멘텀을 되찾았으며, FPTV는 화질, 디자인 등 제품 성능 향상과 지속적인 Set가격 하락을 통해 성장을 지속하며 기존 CRT 시장을 빠르게 대체하였습니다. 또한 2010년 입체감을 느낄 수 있는 3D TV가 출시되었고, 2011년부터 2012년에 걸쳐 인터넷 동영상 서비스 업체들의 부상과 스마트기기에 대한 사용자들의 관심 확대로 스마트 TV 시장이 태동하였습니다. 2013년에는 화질 및 해상도가 혁신적으로 높아진 UHD TV, 2014년에는 새로운 Form Factor인 Curved TV가 출시되었으며 2015년에는 퀀텀닷TV가 상용화되는 등 TV 시장은 끊임없이 진화하였습니다.전체 TV 수요는 2017년 기준 2억 1,510만대 수준으로 LCD TV 수요가 2억 1천만대로 99% 이상의 시장 점유를 이어 나갔으며, OLED 수요는 159만대로 성장하였으나 비중은 0.7%로 영향이 미미하였습니다. 2018년도 전체 TV 수요는 2억 2,100만대 이상을 기록하며 전년 대비 2.9% 성장하였습니다. 최근 TV시장은 고해상도 대형화면에 대한 Needs가 지속적으로 증가하여, UHD TV는 전년비 26% 증가한 99.6백만대로 시장 비중 45% 수준이 될 전망이며, 60"이상 대형시장은 약 19.7백만대를 초과하여 전년비 35% 성장, 75"이상 초대형 시장도 당사의 판매 드라이브로 전년비 76% 이상 성장이 전망되고 있습니다.'
split_sentences(para)

결과: 문장 분리가 되지 않음

['TV산업은 1926년 흑백 TV 개발, 1954년 RCA사가 Color TV(21") 양산/판매를 시작한 이래로 트리니트론 브라운관(1967년), 완전평면 브라운관(1996년) 개발 등 기술적인 발전을 거듭해 왔으나, 주요 국가 보급률이 90%를 넘어서면서 브라운관 TV사업의 성장은 정체되었습니다. 그러나 Flat Panel TV(LCD, PDP) 출시, 디지털 방송 확산(영/미 1998년~ )을 통해 TV 시장은 성장 모멘텀을 되찾았으며, FPTV는 화질, 디자인 등 제품 성능 향상과 지속적인 Set가격 하락을 통해 성장을 지속하며 기존 CRT 시장을 빠르게 대체하였습니다. 또한 2010년 입체감을 느낄 수 있는 3D TV가 출시되었고, 2011년부터 2012년에 걸쳐 인터넷 동영상 서비스 업체들의 부상과 스마트기기에 대한 사용자들의 관심 확대로 스마트 TV 시장이 태동하였습니다. 2013년에는 화질 및 해상도가 혁신적으로 높아진 UHD TV, 2014년에는 새로운 Form Factor인 Curved TV가 출시되었으며 2015년에는 퀀텀닷TV가 상용화되는 등 TV 시장은 끊임없이 진화하였습니다.전체 TV 수요는 2017년 기준 2억 1,510만대 수준으로 LCD TV 수요가 2억 1천만대로 99% 이상의 시장 점유를 이어 나갔으며, OLED 수요는 159만대로 성장하였으나 비중은 0.7%로 영향이 미미하였습니다. 2018년도 전체 TV 수요는 2억 2,100만대 이상을 기록하며 전년 대비 2.9% 성장하였습니다. 최근 TV시장은 고해상도 대형화면에 대한 Needs가 지속적으로 증가하여, UHD TV는 전년비 26% 증가한 99.6백만대로 시장 비중 45% 수준이 될 전망이며, 60"이상 대형시장은 약 19.7백만대를 초과하여 전년비 35% 성장, 75"이상 초대형 시장도 당사의 판매 드라이브로 전년비 76% 이상 성장이 전망되고 있습니다.']

줄바꿈 문장 분리 오류 문제

text = '''1. 옆 자리의 직원이 ~~ 라고 말했다.
1-1. 아직도 3시밖에 안 됐네.
1-2. 빨리 집에 가고싶다. '''

s = split_sentences(text)

output : ['1. 옆 자리의 직원이 ~~ 라고 말했다.']

진행했을때, 문장 분리 결과로 첫번째 문장밖에 출력이 안됩니다.

kss==3.7.3 버전

'UNICODE_EMOJI' 이슈

emoji 모듈이 최근 업데이트 되면서 UNICODE_EMOJI가 attr에서 빠진듯합니다

kss/pynori/dict/character_definition.py:13: in <module>
    _emojis.update(emoji.UNICODE_EMOJI[lang])
E   AttributeError: module 'emoji' has no attribute 'UNICODE_EMOJI'

split_sentences 사용 시 assertionerror 발생

안녕하세요.

split_sentences 이용할 때 AssertionError가 발생합니다. 해당 에러에 대한 설명이 없어 무엇이 문제인지 모르겠습니다.

import kss

text = '딥 러닝 자연어 처리가 재미있기는 합니다. 그런데 문제는 영어보다 한국어로 할 때 너무 어렵습니다. 이제 해보면 알걸요?'
print('한국어 문장 토큰화 :', kss.split_sentences('테스트 해봅시다.'))
---------------------------------------------------------------------------
AssertionError                            Traceback (most recent call last)
Input In [24], in <cell line: 4>()
      1 import kss
      3 text = '딥 러닝 자연어 처리가 재미있기는 합니다. 그런데 문제는 영어보다 한국어로 할 때 너무 어렵습니다. 이제 해보면 알걸요?'
----> 4 print('한국어 문장 토큰화 :', kss.split_sentences('테스트 해봅시다.'))

File ~/miniforge3/envs/tens2/lib/python3.9/site-packages/kss/kss.py:179, in split_sentences(text, use_heuristic, use_quotes_brackets_processing, max_recover_step, max_recover_length, backend, num_workers, disable_gc, disable_mp_post_process)
    167     results += pool.map(
    168         partial(
    169             _split_sentences,
   (...)
    176         mp_input_texts,
    177     )
    178 else:
--> 179     results += [
    180         _split_sentences(
    181             text=t,
    182             use_heuristic=use_heuristic,
    183             use_quotes_brackets_processing=use_quotes_brackets_processing,
    184             max_recover_step=max_recover_step,
    185             max_recover_length=max_recover_length,
    186             backend=backend,
    187         )
    188         for t in mp_input_texts
    189     ]
    191 mp_output_final = []
    192 mp_temp.clear()

File ~/miniforge3/envs/tens2/lib/python3.9/site-packages/kss/kss.py:180, in <listcomp>(.0)
    167     results += pool.map(
    168         partial(
    169             _split_sentences,
   (...)
    176         mp_input_texts,
    177     )
    178 else:
    179     results += [
--> 180         _split_sentences(
    181             text=t,
    182             use_heuristic=use_heuristic,
    183             use_quotes_brackets_processing=use_quotes_brackets_processing,
    184             max_recover_step=max_recover_step,
    185             max_recover_length=max_recover_length,
    186             backend=backend,
    187         )
    188         for t in mp_input_texts
    189     ]
    191 mp_output_final = []
    192 mp_temp.clear()

File ~/miniforge3/envs/tens2/lib/python3.9/site-packages/kss/kss.py:292, in _split_sentences(text, use_heuristic, use_quotes_brackets_processing, max_recover_step, max_recover_length, backend, recover_step)
    289         text = text.replace(s, f"\u200b{s}\u200b")
    291 if use_morpheme:
--> 292     eojeols = _morph.pos(text=text, backend=backend)
    293 else:
    294     eojeols = [Eojeol(t, "EF+ETN") for t in text]

File ~/miniforge3/envs/tens2/lib/python3.9/site-packages/kss/morph.py:71, in MorphExtractor.pos(self, text, backend)
     61         except ImportError:
     62             raise ImportError(
     63                 "\n"
     64                 "You must install `python-mecab-kor` if you want to use `mecab` backend.\n"
     65                 "Please install using `pip install python-mecab-kor`.\n"
     66                 "Refer https://github.com/hyuwoongko/python-mecab-kor for more details.\n"
     67             )
     69     return [
     70         Eojeol(eojeol, pos[1])
---> 71         for pos in self.mecab.pos(text)
     72         for eojeol in pos[0]
     73     ]
     74 else:
     75     raise AttributeError(
     76         "Wrong backend ! currently, we only support `pynori`, `mecab`, `none` backend."
     77     )

File ~/miniforge3/envs/tens2/lib/python3.9/site-packages/kss/morph.py:102, in MecabTokenizer.pos(self, text, preserve_whitespace)
     99 text_ptr = 0
    100 results = list()
--> 102 for unit in self.mecab.pos(text):
    103     token = unit[0]
    104     pos = unit[1]

File ~/miniforge3/envs/tens2/lib/python3.9/site-packages/mecab/mecab.py:67, in MeCab.pos(self, sentence)
     65 def pos(self, sentence):
     66     return [
---> 67         (surface, feature.pos) for surface, feature in self.parse(sentence)
     68     ]

File ~/miniforge3/envs/tens2/lib/python3.9/site-packages/mecab/mecab.py:60, in MeCab.parse(self, sentence)
     57 if not self.tagger.parse(lattice):
     58     raise MeCabError(self.tagger.what())
---> 60 return [
     61     (node.surface, _extract_feature(node))
     62     for node in lattice
     63 ]

File ~/miniforge3/envs/tens2/lib/python3.9/site-packages/mecab/mecab.py:61, in <listcomp>(.0)
     57 if not self.tagger.parse(lattice):
     58     raise MeCabError(self.tagger.what())
     60 return [
---> 61     (node.surface, _extract_feature(node))
     62     for node in lattice
     63 ]

File ~/miniforge3/envs/tens2/lib/python3.9/site-packages/mecab/mecab.py:33, in _extract_feature(node)
     25 def _extract_feature(node):
     26     # Reference:
     27     # - http://taku910.github.io/mecab/learn.html
   (...)
     30     
     31     # feature = <pos>,<semantic>,<has_jongseong>,<reading>,<type>,<start_pos>,<end_pos>,<expression>
     32     values = node.feature.split(',')
---> 33     assert len(values) == 8
     35     values = [value if value != '*' else None for value in values]
     36     feature = dict(zip(Feature._fields, values))

AssertionError: 

특정 문장에 대한 에러 이슈

안녕하세요.
우선, 멋진 작업 감사드립니다. 잘 쓰고 있습니다 ㅎㅎ

특정 문자열에 대해 아래와 같은 에러가 발생하여 보고드립니다.

>>> kss.split_sentences("1'1″")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/opt/conda/lib/python3.8/site-packages/kss/kss.py", line 185, in split_sentences
    return results[0]
IndexError: list index out of range
  1. backend 에 무관한 듯 보입니다.
  2. ' 와 ″ 문자와 관계가 있는 것 같습니다.
  3. 위와 관련된 에러가 나는 문자열을 포함하는 문자열은 모두 에러가 발생합니다.

여러모로 테스트해봤는데, 에러가 발생하는 조건을 찾기가 쉽지 않더군요.

  1. 우선, 두 문자를 단독으로 사용하는 경우는 문제가 없습니다.
>>> kss.split_sentences("'″")
["'″"]
>>> kss.split_sentences("″'")
["″'"]
>>> kss.split_sentences("''")
["''"]
>>> kss.split_sentences("″″")
['″″']
  1. 기본적으로 [0-9a-zA-Z]'[0-9a-zA-Z]″ 세팅에서 에러가 발생하는 것으로 보입니다.
>>> kss.split_sentences("1'1″")
(에러)
>>> kss.split_sentences("s's″")
(에러)
>>> kss.split_sentences("1's″")
(에러)
>>> kss.split_sentences("s'1″")
["s'1″"] (이 경우는 예외의 예외(?)로 에러가 나지 않습니다.)
  1. 알파벳과 숫자의 경우에만 에러가 발생하는 듯 하며, 한글에서는 발생하지 않는 것 같습니다.
>>> kss.split_sentences("가'a″")
["가'a″"]
>>> kss.split_sentences("가'가″")
["가'가″"]
>>> kss.split_sentences("a'가″")
["a'가″"]
>>> kss.split_sentences("1'가″")
["1'가″"]
>>> kss.split_sentences("가'1″")
["가'1″"]
  1. [0-9a-zA-Z]'(이 사이에 문자 추가)[0-9a-zA-Z]″

추가한 문자열의 길이가 1 인 case

>>> kss.split_sentences("1'b2″")
["1'b2″"]
>>> kss.split_sentences("1'bb″")
["1'bb″"]
>>> kss.split_sentences("1'2b″")
["1'2b″"]
>>> kss.split_sentences("1'22″")
(에러)
>>> kss.split_sentences("c'22″")
["c'22″"]
>>> kss.split_sentences("c'2e″")
["c'2e″"]
>>> kss.split_sentences("c'ee″")
["c'ee″"]
>>> kss.split_sentences("c'e2″")
(에러)

사이에 추가되는 문자열의 길이가 2 이상일 경우에서는 에러가 발생하지 않는 듯 합니다.

>>> kss.split_sentences("8'111″")
["8'111″"]
>>> kss.split_sentences("8's11″")
["8's11″"]
>>> kss.split_sentences("8'1s1″")
["8'1s1″"]
>>> kss.split_sentences("8'11s″")
["8'11s″"]
>>> kss.split_sentences("8'1ss″")
["8'1ss″"]
>>> kss.split_sentences("8's1s″")
["8's1s″"]
>>> kss.split_sentences("8'ss1″")
["8'ss1″"]
>>> kss.split_sentences("8'sss″")
["8'sss″"]
>>> kss.split_sentences("c'111″")
["c'111″"]
>>> kss.split_sentences("c'11s″")
["c'11s″"]
>>> kss.split_sentences("c'1s1″")
["c'1s1″"]
>>> kss.split_sentences("c's11″")
["c's11″"]
>>> kss.split_sentences("c'ss1″")
["c'ss1″"]
>>> kss.split_sentences("c's1s″")
["c's1s″"]
>>> kss.split_sentences("c'1ss″")
["c'1ss″"]
>>> kss.split_sentences("c'sss″")
["c'sss″"]

확인 부탁드리겠습니다.

감사합니다.


추가 : [0-9a-zA-Z]'[0-9a-zA-Z]″ 뿐만 아니라, [0-9a-zA-Z]'[0-9a-zA-Z]" (″ 가 아닌 " 가 붙는 경우) 에도 에러가 발생하네요.

Fix bug on split_chunks

import kss

kss.split_chunks("", max_length=10)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "C:\Users\MY\Github\kss\kss\kss.py", line 261, in split_chunks
    for _txt in _text
  File "C:\Users\MY\Github\kss\kss\kss.py", line 261, in <listcomp>
    for _txt in _text
  File "C:\Users\MY\Github\kss\kss\kss.py", line 664, in _split_chunks
    chunk = get_chunk_with_index(text, span)
  File "C:\Users\MY\Github\kss\kss\base.py", line 447, in get_chunk_with_index
    start = span[0][0]
IndexError: list index out of range

kss 3.0

pecab 프로젝트가 끝나고 나면 kss 3.0 프로젝트를 시작한다.
kss 3.0은 기존의 휴리스틱 기반의 알고리즘 + mecab 형태소 분석기를 기반으로 한다.
이를 통해 얻을 수 있는 장점은 다음과 같다.

  • EC/EF 케이스 문제를 거의 완벽하게 해결 가능하다.
  • 따옴표나 괄호 등에서 발생하는 문제도 해결 가능하다.
  • 종결어미를 더 이상 임의로 설정하지 않아도 된다.

즉 kss 3.0은 휴리스틱 + 형태소 분석 기반으로 탈바꿈 하는 것.

단점으로는 속도가 지금보다 더 느려질 것이라는 것.
최대한 쓸모 없는 루프를 제거하여 속도를 그나마 빠르게 만드는 것이 관건일 듯.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.