monologg / DistilKoBERT

Distillation of KoBERT from SKTBrain (Lightweight KoBERT)
Apache License 2.0
187 stars 25 forks source link

토크나이저 에러 #5

Closed robinsongh381 closed 4 years ago

robinsongh381 commented 4 years ago

안녕하세요

좋은 프로젝트 감사합니다

다음과 같은 상황에서 에러가 발생합니다

tokenizer = KoBertTokenizer.from_pretrained('monologg/kobert')처럼 토크나이저를 가져와서

"한국어로는 안돼??ㅋ' 의 문장을 tokenizer.tokenize( ) 하게 되면 다음과 같은 아웃풋이 나옵니다 image

하지만 마지막 값은 한글 자음 'ㅋ'과 다른 값입니다. (작은 'ㅋ')

실제로 tokenizer.convert_tokens_to_ids('ㅋ') 하게 되면 unknown 값인 0이 리턴되고, 작은 'ㅋ' 값을 넣으면 정상적으로 나옵니다. image image

이 때문에 다음과 같은 상황에서 에러가 발생합니다

image

monologg commented 4 years ago

SKTKoBERT의 Tokenizer에서도 동일한 현상을 보이는 것 같습니다.

from gluonnlp.data import SentencepieceTokenizer
from kobert.utils import get_tokenizer

tok_path = get_tokenizer()
sp  = SentencepieceTokenizer(tok_path)

text = "한국어로는 안돼??ㅋ"
tokens = sp(text)
print("tokens:", tokens)
print("text[-1]:", text[-1])
print("tokens[-1]:",tokens[-1])
print("text[-1] == tokens[-1]:", text[-1] == tokens[-1])

# Output
tokens: ['▁한국', '어', '로', '는', '▁안', '돼', '??', 'ᄏ']
text[-1]: ㅋ
tokens[-1]: ᄏ
text[-1] == tokens[-1]: False

tokenization_kobert.pysentencepiece 라이브러리를 가져오는 것 이외에는 추가적인 후처리를 하지 않습니다. 확실하진 않지만 sentencepiece 자체가 내부적으로 다른 형태의 으로 바꾸는 것일 수도 있습니다 (이는 저도 확인이 필요할 것 같습니다.)

아래는 Sentencepiece 라이브러리 자체의 normalization 관련 Documentation입니다.

monologg commented 4 years ago
from tokenization_kobert import KoBertTokenizer

tokenizer = KoBertTokenizer.from_pretrained("monologg/kobert")

text = "한국어로는 안돼??ㅋ"

tokens = tokenizer.tokenize(text)

print("tokens:", tokens)
print("text[-1]:", text[-1])
print("tokens[-1]:", tokens[-1])
print("text[-1] == tokens[-1]:", text[-1] == tokens[-1])

# Output
tokens: ['▁한국', '어', '로', '는', '▁안', '돼', '??', 'ᄏ']
text[-1]: ㅋ
tokens[-1]: ᄏ
text[-1] == tokens[-1]: False
monologg commented 4 years ago

이 부분은 아무래도 SKT 쪽에 직접 문의를 해보셔야 할 것 같습니다. 저도 그대로 가져와서 포팅을 한 것이어서 원인파악이 많이 어렵네요...

robinsongh381 commented 4 years ago

네 알겠습니다, 답변 감사합니다 !