(자연어처리/형태소 분석기) Khaiii 의 두 가지 이슈...
카카오에서 내놓은 형태소 분석기 Khaiii를 유용하게 사용하려는데, 이런 오류가 떨어진다.
Traceback (most recent call last):
File "khaiii_sentences.py", line 14, in <module>
analyzed = api.analyze(s)
File "/home/don/.local/lib/python3.8/site-packages/khaiii/khaiii.py", line 226, in analyze
raise KhaiiiExcept(self._last_error())
khaiii.khaiii.KhaiiiExcept
무슨 오류인지 알려주면 좋은데 도대체 정체를 알 수 없다.
어떤 텍스트 문서를 불러서 '\n' 기준으로 split()을 한 다음, 각 라인(문장)을
analyzed = api.analyze(s)
하는 코드에서 발생했다.
원인을 알고 보니 문서의 제일 마지막에 '\n'이 연달아 2개 있는데, 그 나머지 하나에 대해 파싱하려고 시도하는 과정에서 벌어진 일이었다. 아래 코드를 보자.
from khaiii import KhaiiiApi
api = KhaiiiApi()
s = "" # 공허
#s = " " # 공백 하나
#s = " " # 탭
#s = "\n" # 개행문자
#s = "스스로 바보인줄 아는 자는 얼마나 현명한가"
#if s.strip() == "": return # for 문 내 일 경우 break 혹은 continue
analyzed = api.analyze(s)
morph_list = []
for word in analyzed:
for morph in word.morphs:
morph_list.append(morph.lex)
text = ' '.join(morph_list)
print(text)
형태소 분석기 '카이'를 사용해 공백 문자, 탭 문자, 빈 문자열에 대해 파싱을 시도하고 있다.
analyzed = api.analyze(s)
이때 위의 에러 메시지가 떨어진다.
빈 문자열(""), 공백 문자(" "), 탭 문자("\t"), 개행 문자("\n")를 형태소 분석 시도하면 에러를 내고 종료해버리는 것이다.
마지막 정상 문자열은 잘 분석해준다.
갑자기 종료하는 이 문제를 방지하려면
if s.strip() == "": return # for 문 내 일 경우 break 혹은 continue
형태소 분석하려는 문장을 strip()해서 빈 문자열인지 아닌지 확인하고 넘어가는 것이다.
빈 문자열일 경우, for 문 내에서라면 break나 continue를 써서 다음으로 넘어갈 수 있다.
다른 하나의 오류는 참 황당했는데, 어떻게 이런 일이 벌어질지 아직도 이해가 안 된다. '카이'의 사용자가 아직 많지 않아서 오류 보고가 잘 없어서 업데이트가 더딘 게 아닌가 싶기도 하다.
시가 담긴 텍스트 파일을 읽어와서 '카이'로 파싱했는데, 이 어휘 데이터를 나중에 정수로 바꾸는 시퀀스 작업을 하는데, 그 시퀀스를 넘파이 어레이로 변환하는 과정에서 에러가 나는 것이다. 분명히 전부를 (200000, 51)로 shape을 맞춰서 리스트를 numpy array로 변환하려는데 못하겠다는 것이다. 알고 보니 일부 데이터의 컬럼 길이가 50짜리가 있었다. 원본 텍스트에는 전처리를 깔끔하게 해서 쉼표(,)와 물음표(?)가 전혀 없는데, '카이'로 형태소 분석한 토큰 2개에 각각 쉼표와 물음표가 하나씩 들어가 있는 것이었다. (순간 섬찟했다. 인류의 종말을 앞당기는 바이러스 2개가 이런 식으로 컴퓨터에 심어진다면...ㅎㄷㄷ) 그 쉼표가 물음표가 시퀀스 작업 도중에 삭제되면서 컬럼 길이가 50개로 변하는 것이었다. 그래서 변환한 토큰이 쉼표와 물음표인지 확인하는 코드를 삽입하여 문제를 해결했는데....
'카이'는 속도도 준수하고 형태소 분석도 분석기 중에서 아주 잘하는 편이다. 그래서 mecab이랑 애호하고 있는데...
아무튼 이런 문제점들이 잘 공유되어서 조금씩 해결됐으면 좋겠다.