kakao / khaiii

Kakao Hangul Analyzer III
Apache License 2.0
1.41k stars 284 forks source link

python에서 실행결과와 ./bin/khaiii의 출력 결과가 다릅니다. #44

Closed gyholee closed 5 years ago

gyholee commented 5 years ago

'게바라는 이때 결심했다고 한다.' 이문장을 python코드를 통해 분석하면

from khaiii import KhaiiiApi
api = KhaiiiApi()
for word in api.analyze('게바라는 이때 결심했다고 한다.'):
    print(word)

아래와 같이 출력됩니다.

게바라는 게/NNP + 바/NNG + 라는/ETM 이때 이때/NNG 결심했다고 결심/NNG + 하/XSV + 였/EP + 다고/EC 한다. 하/VV + ㄴ다/EF + ./SF

하지만, build/bin/khaiii를 실행하고 같은 문장을 입력하면 아래와 같이 출력됩니다.

게바라는 게바라/NNP + 는/JX 이때 이때/NNG 결심했다고 결심/NNG + 하/XSV + 였/EP + 다고/EC 한다. 하/VV + ㄴ다/EF + ./SF

'게바라'를 '게바'로 줄여서 입력해봐도 둘의 결과가 다릅니다.

python

게바는 게/NNG + 바/NNP + 는/JX 이때 이때/NNG 결심했다고 결심/NNG + 하/XSV + 였/EP + 다고/EC 한다. 하/VV + ㄴ다/EF + ./SF

bin

게바는 게바/NNP + 는/JX 이때 이때/NNG 결심했다고 결심/NNG + 하/XSV + 였/EP + 다고/EC 한다. 하/VV + ㄴ다/EF + ./SF

'게바라'를 '체게바라'로 줄여서 입력해봐도 둘의 결과가 다릅니다.

python

체게바라는 체/NNG + 게/NNP + 바/NNG + 이/VCP + 라는/ETM 이때 이때/NNG 결심했다고 결심/NNG + 하/XSV + 였/EP + 다고/EC 한다. 하/VV + ㄴ다/EF + ./SF

bin

체게바라는 체게바라/NNP + 는/JX 이때 이때/NNG 결심했다고 결심/NNG + 하/XSV + 였/EP + 다고/EC 한다. 하/VV + ㄴ다/EF + ./SF

krikit commented 5 years ago

bin 프로그램과 python 바인딩의 결과가 다른 이유는 아래와 같은 상황을 생각해 볼 수 있습니다.

libkhaiii.so 파일이 다른 경우

소스를 빌드하면 build/lib 아래에 libkhaiii.so 파일이 생성됩니다. make install 하시면 /usr/local/lib 아래에 복사됩니다. 그리고 python 바인딩을 pip install .과 같이 설치하셨다면, 그 설치 위치에 khaiii 디렉터리가 생성되고, 그 아래에 lib/libkhaiii.so 파일이 복사됩니다.

따라서 이들 위치에 있는 libkhaiii.so 파일 중 어느 것을 사용하느냐에 따라 다릅니다. 만약 C++ 소스 코드를 수정하거나 각기 다른 버전을 사용하지 않았다면, 어느 위치든 모두 동일할 것이므로 이 경우에 해당하지는 않을 것으로 생각합니다.

리소스 디렉터리(share/khaiii)가 다른 경우

라이브러리와 마찬가지로 리소스 디렉터리도 build/share/khaiii, /usr/local/share/khaiii, python 환경에서의 khaiii 아래에 share/khaiii 와 같이 각기 다른 디렉터리가 존재할 수 있습니다.

따라서 어느 리소스를 사용하느냐에 따라 분석 결과가 달라질 가능성이 있습니다. 위에 말씀하신 예들로 봐서는 이처럼 리소스 경로가 각기 다르고 그 내용도 다른 것으로 추정이 됩니다.

오분석에 대해

"게바라", "체게바라"의 경우 오분석이 나는 것으로 확인됩니다. 제가 실행해 봐도 오분석이 나니까요. 이것은 학습 코퍼스에 없는 고유명사, 특히 외래어에서 자주 발생할 수 있는 현상입니다.

khaiii는 현재 긴 명사 형태에 대해 일반명사(NNG)와 고유명사(NNP)를 번갈아가면 태깅해서, 잘개 쪼개지며 오분석이 나오는 알려진 문제가 존재합니다. 이 부분에 대해서 어떻게 해결할지는 아직 고민 중에 있습니다.

그러면 위에서 정분석이 되는 현상은 어떻게 된 것일까요? khaiii에서는 오분석에 대응하기 위한 사용자 사전 기능을 제공하는데, 아무래도 기분석 사전이나 오분석 패치를 사용하여 리소스를 다시 만드신 것이 아닌가 생각합니다. 이렇게 새로 빌드되어 기존과 다른 리소스를 각각 사용해서 분석 결과도 다르게 나나탄 것으로 생각합니다. 리소스를 새로 빌드하셨다면, 설치도 한번 더 해주셔야 반영이 될 것입니다.