jonghwanhyeon/python-mecab-ko

AssertionError 관련

Closed this issue · 13 comments

빌드 문제는 해결되었는데요, 이번엔 AssertionError가 발생하네요.

>>> import mecab
>>> m = mecab.MeCab()
>>> m.parse('학생부종합전형으로는 수시모집 선발인원의 약 58%인 1173명을 선발한다.')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/home/djlee/workspace/python/mecab-ko-dic/.venv/lib/python3.7/site-packages/mecab/mecab.py", line 62, in parse
    for node in lattice
  File "/home/djlee/workspace/python/mecab-ko-dic/.venv/lib/python3.7/site-packages/mecab/mecab.py", line 62, in <listcomp>
    for node in lattice
  File "/home/djlee/workspace/python/mecab-ko-dic/.venv/lib/python3.7/site-packages/mecab/mecab.py", line 33, in _extract_feature
    assert len(values) == 8
AssertionError

Originally posted by @dongjinleekr in #9 (comment)

@dongjinleekr
안녕하세요! 이전 이슈에서 예시로 보여주신 문장으로 제가 직접 테스트 해봤을 때는 AssertionError가 발생하지 않습니다 😓
혹시 사용하고 계신 환경(OS, Python 버전 등)을 자세히 알려주실 수 있으신가요?

jonghwanhyeon@fa81beea4c26:/workspace/python-mecab-ko$ python3
Python 3.8.8 (default, Mar 15 2021, 03:18:23) 
[GCC 9.3.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> from pprint import pprint
>>> import mecab
>>> m = mecab.MeCab()
>>> pprint(m.parse('학생부종합전형으로는 수시모집 선발인원의 약 58%인 1173명을 선발한다.'))
[('학생',
  Feature(pos='NNG', semantic=None, has_jongseong=True, reading='학생', type=None, start_pos=None, end_pos=None, expression=None)),
 ('부',
  Feature(pos='NNG', semantic=None, has_jongseong=False, reading='부', type=None, start_pos=None, end_pos=None, expression=None)),
 ('종합',
  Feature(pos='NNG', semantic='행위', has_jongseong=True, reading='종합', type=None, start_pos=None, end_pos=None, expression=None)),
 ('전형',
  Feature(pos='NNG', semantic=None, has_jongseong=True, reading='전형', type=None, start_pos=None, end_pos=None, expression=None)),
 ('으로',
  Feature(pos='JKB', semantic=None, has_jongseong=False, reading='으로', type=None, start_pos=None, end_pos=None, expression=None)),
 ('는',
  Feature(pos='JX', semantic=None, has_jongseong=True, reading='는', type=None, start_pos=None, end_pos=None, expression=None)),
 ('수시',
  Feature(pos='NNG', semantic='정적사태', has_jongseong=False, reading='수시', type=None, start_pos=None, end_pos=None, expression=None)),
 ('모집',
  Feature(pos='NNG', semantic='행위', has_jongseong=True, reading='모집', type=None, start_pos=None, end_pos=None, expression=None)),
 ('선발',
  Feature(pos='NNG', semantic=None, has_jongseong=True, reading='선발', type=None, start_pos=None, end_pos=None, expression=None)),
 ('인원',
  Feature(pos='NNG', semantic=None, has_jongseong=True, reading='인원', type=None, start_pos=None, end_pos=None, expression=None)),
 ('의',
  Feature(pos='JKG', semantic=None, has_jongseong=False, reading='의', type=None, start_pos=None, end_pos=None, expression=None)),
 ('약',
  Feature(pos='MM', semantic='~수표현', has_jongseong=True, reading='약', type=None, start_pos=None, end_pos=None, expression=None)),
 ('58',
  Feature(pos='SN', semantic=None, has_jongseong=None, reading=None, type=None, start_pos=None, end_pos=None, expression=None)),
 ('%',
  Feature(pos='SY', semantic=None, has_jongseong=None, reading=None, type=None, start_pos=None, end_pos=None, expression=None)),
 ('인',
  Feature(pos='VCP+ETM', semantic=None, has_jongseong=True, reading='인', type='Inflect', start_pos='VCP', end_pos='ETM', expression='이/VCP/*+ᆫ/ETM/*')),
 ('1173',
  Feature(pos='SN', semantic=None, has_jongseong=None, reading=None, type=None, start_pos=None, end_pos=None, expression=None)),
 ('명',
  Feature(pos='NNBC', semantic=None, has_jongseong=True, reading='명', type=None, start_pos=None, end_pos=None, expression=None)),
 ('을',
  Feature(pos='JKO', semantic=None, has_jongseong=True, reading='을', type=None, start_pos=None, end_pos=None, expression=None)),
 ('선발',
  Feature(pos='NNG', semantic=None, has_jongseong=True, reading='선발', type=None, start_pos=None, end_pos=None, expression=None)),
 ('한다',
  Feature(pos='XSV+EF', semantic=None, has_jongseong=False, reading='한다', type='Inflect', start_pos='XSV', end_pos='EF', expression='하/XSV/*+ᆫ다/EF/*')),
 ('.',
  Feature(pos='SF', semantic=None, has_jongseong=None, reading=None, type=None, start_pos=None, end_pos=None, expression=None))]
>>> 

ubuntu 20.04 + python 3.7.11 + clang 10.0.0-4ubuntu1 입니다.

@dongjinleekr 안녕하세요! 죄송하지만 아래 코드를 실행하고, 출력 결과를 알려주실 수 있으신가요?

import _mecab
tagger = _mecab.Tagger('')
lattice = _mecab.Lattice()
lattice.add_request_type(_mecab.MECAB_ALLOCATE_SENTENCE)
lattice.set_sentence('학생부종합전형으로는 수시모집 선발인원의 약 58%인 1173명을 선발한다.')
tagger.parse(lattice)

for node in lattice:
    print(node.feature)

@jonghwanhyeon 문제 없이 잘 돌아가네요.

20210906-195410

@dongjinleekr 저와 다른 결과가 출력되네요 😥 혹시 사용자 사전 추가 기능을 사용하셔서 학생부종합전형 단어를 추가하신 적이 있나요?

NNG,*,T,학생,*,*,*,*
NNG,*,F,부,*,*,*,*
NNG,행위,T,종합,*,*,*,*
NNG,*,T,전형,*,*,*,*
JKB,*,F,으로,*,*,*,*
JX,*,T,는,*,*,*,*
NNG,정적사태,F,수시,*,*,*,*
NNG,행위,T,모집,*,*,*,*
NNG,*,T,선발,*,*,*,*
NNG,*,T,인원,*,*,*,*
JKG,*,F,의,*,*,*,*
MM,~수표현,T,약,*,*,*,*
SN,*,*,*,*,*,*,*
SY,*,*,*,*,*,*,*
VCP+ETM,*,T,인,Inflect,VCP,ETM,이/VCP/*+ᆫ/ETM/*
SN,*,*,*,*,*,*,*
NNBC,*,T,명,*,*,*,*
JKO,*,T,을,*,*,*,*
NNG,*,T,선발,*,*,*,*
XSV+EF,*,F,한다,Inflect,XSV,EF,하/XSV/*+ᆫ다/EF/*
SF,*,*,*,*,*,*,*
>>> 

혹시 사용자 사전 추가 기능을 사용하셔서 학생부종합전형 단어를 추가하신 적이 있나요?

네. 근데 1.0.9에서는 문제가 발생하지 않았거든요... 😓

@dongjinleekr
위에서 보여주신 학생부종합전형의 분석 결과를 보면, 해당 형태소만 총 9개의 값이 반환되고 있어서요.
사용자 사전에 추가하실 때 사용한 방법과 데이터를 알려주시면 제가 확인해보도록 하겠습니다!

아래와 같습니다:

대우,,,,NNP,*,F,대우,*,*,*,*,*
학생부종합전형,,,0,NNP,*,T,학생부종합전형,Compound,*,*,*,*

대우,,,,NNP,*,F,대우,*,*,*,*,*
<- 예제는 *가 다섯자리인데
보카시,,,,NNP,*,F,보카시,*,*,*,*,*
이렇게 mecab-ko 예제와 같이 하면 assert오류가 나고
보카시,,,,NNP,*,F,보카시,*,*,*,*
이렇게 4자리 까지만 입력하면 오류가 나지 않고 mecab도 동작에 지장이 없습니다.

더 뭐가 없어서 커맨트합니다.

@maddiekorea7577 알려주셔서 감사합니다. 어째 mecab 예제가 잘못되었을 수도 있다는 생각이 드네요...?

저도 해당 assert error를 마주했는데 1.0.9에서는 정상 작동하고 있습니다.

@Kyeongpil 1.0.9와 1.1.0 사이에 바뀐 것이라고는 mecab_config의 위치가 바뀐 것 (4fa89bc) 뿐인데요... 뭔가 영향이 있지 않았을까요 😓 (반응이 너무 늦어서 죄송합니다. 최근 한달동안 너무 바빠서 깃헙 자체를 못 들어왔습니다;)

@dongjinleekr

저도 이번에 업데이트를 진행하면서, 사용자 사전 기능을 테스트 해봤는데요, 제 생각에도 mecab-ko-dic의 공식 문서의 예제가 잘못 안내되어 있는 것 같습니다.

실제 mecab-ko-dic이 제공하는 파일을 보시면, 다음과 같이 12개의 엔트리만 입력이 되어야 합니다.

가,489,3554,8084,JKS+NP,*,F,가,Inflect,JKS,NP,가/JKS/*+누구/NP/*

그러나 사용자 사전 예제에는 총 13개의 엔트리가 작성되어 있습니다.

구글,,,,NNP,*,T,구글,*,*,*,*,*