bab2min / kiwipiepy

Python API for Kiwi
Other
282 stars 27 forks source link

kiwi tokenizer의 randomness 제어 #140

Closed smbslt3 closed 1 year ago

smbslt3 commented 1 year ago

안녕하세요 최근 연구에서 kiwi tokenizer를 계속 사용하고 있는 대학원생입니다. kiwi를 사용해서 한국어 토픽 모델링을 진행중인데, 모든 random seed를 통제한 상황에서도 결과 재현이 안되어서 다방면으로 해결책을 찾고 있습니다.

혹시 kiwi tokenizer에 randomness 요소가 있나요? tokenizer를 단순히 str.split()으로 바꿨을 때 결과가 고정이 되네요.

현재 세팅은 다음과 같습니다

kiwi = Kiwi(num_workers= os.cpu_count()-2,            # 활용할 멀티 코어 수
            load_default_dict=True,   # 표제어 사전 사용
            integrate_allomorph=True, # 어미 형태 변동 통합
            model_type='sbg',         # 개선된 언어 모델 사용, 기본값 'knlm'
            typos='basic',            # 기본적인 오탈자 교정, 기본값 None
            )

corpus에 대해서 분석은 kiwi를 활용한 문장 분리 -> 통계치 확인 -> kiwi를 사용한 tokenizng -> 토픽모델링 순으로 분석하고 있습니다.

문장분리, 오탈자교정, 토크나이징 3개 부분이 적용되면서 토크나이징 결과가 달라지고, 이 부분의 차이가 토픽모델링 결과의 차이를 만드는게 아닌가 하고 있습니다.

혹시 kiwi에 결과가 random하게 나타나는 부분이 있다면 어떻게 고정할 수 있을까요?

ByungjunKim commented 1 year ago

안녕하세요 저도 궁금하긴한데, 혹시 멀티 코어를 활용해서 그런건 아닐까합니다. 싱글코어로 하면 결과값 고정이 가능한 경우가 많아서요.

bab2min commented 1 year ago

@smbslt3 cc.@ByungjunKim 안녕하세요, 현재 Kiwi의 분석과정에서 랜덤과 관련된 연산은 없는 상황입니다. 그래서 원칙적으로는 단일코어 / 멀티코어 관계 없이 입력이 동일하면 출력 역시 동일해야 하며, 그렇지 않은 경우가 있다면 무조건 버그입니다. 현재 자체적으로 가지고 있는 Kiwi 테스트셋에서는 동일 입력에 대해서는 항상 동일한 출력이 나오고 있는데요, 그렇지 않은 사례에 대해서 보고를 해주시면 확인해보고 수정하도록 하겠습니다. 혹시나 데이터셋이 크거나 민감한 정보가 있어서 깃헙 이슈에 공유하기 어려우시다면 개인 메일로 공유해주셔도 됩니다.

smbslt3 commented 1 year ago

안녕하세요 확인해주셔서 감사합니다.

체크해보니 코퍼스 전처리 과정에서 중복 문장을 제거할 때, list(set(corpus))로 제거했는데, 여기서 set이 순서를 보장하지 않는지 여러 번 돌리면 그 중 몇 번은 문장 순서가 다르게 나왔고, 이 때문에 뒤에 있는 토크나이징 과정에서 다른 결과가 나온 것 같습니다. 오탈자 교정과 문장 분리 기능을 써서 더 그랬던 것 같네요. 말씀하신대로 멀티코어를 사용해도 결과가 랜덤하지 않고 고정된 결과로 나왔습니다.

늘 한국어 자연어 처리에 힘써주셔서 감사합니다. 좋은 하루 되세요.