본문 바로가기

프로그래밍/AI:ML:DL

[gensim|fasttext] KeyError: 'all ngrams for word absent from model'

반응형

gensim 의 FastText 모델을 이용하여, pretrained 된 fasttext word vector 를 이용해 보려 했다.


github.com/Kyubyong 의 pretrained model 을 다운받아서, fasttext word vector 를 구하려고 해봤다. fasttext 는 word2vec 과는 달리 train 시에 없었던 단어에 대한 word vector 도 구해준다고 알고 있었기 때문에, 단어가 아닌 단어로 테스트를 해 보았다.


그런데, 에러가 발생했다. 아래를 보자.



from gensim.models import FastText

model = FastText.load_fasttext_format('kyubyong_pretrained/fasttext/ko.bin')

model.wv['바람'][:8]

array([-0.00775098, -0.06798584, -0.0007719 , 0.05895196, 0.01006114,

-0.04542638, 0.02671195, -0.07366264], dtype=float32)


'바람'이라는 단어에 대해서는 vector 값을 구해서 보여준다.


model.wv.most_similar('바랄')

--------------------------------------------------------------------------- KeyError Traceback (most recent call last) <ipython-input-4-b5c285b21db0> in <module>() 1 # absent word error 2 ----> 3 model.wv.most_similar('바랄') c:\pyenvs\fc_textanal\lib\site-packages\gensim\models\keyedvectors.py in most_similar(self, positive, negative, topn, restrict_vocab, indexer) 363 mean.append(weight * word) 364 else: --> 365 mean.append(weight * self.word_vec(word, use_norm=True)) 366 if word in self.vocab: 367 all_words.add(self.vocab[word].index) c:\pyenvs\fc_textanal\lib\site-packages\gensim\models\keyedvectors.py in word_vec(self, word, use_norm) 1620 return word_vec / max(1, ngrams_found) 1621 else: # No ngrams of the word are present in self.ngrams -> 1622 raise KeyError('all ngrams for word %s absent from model' % word) 1623 1624 def init_sims(self, replace=False): KeyError: 'all ngrams for word 바랄 absent from model'


단어가 아닌 '바랄'이라는 문자열에 대해서는 most_similar 로도 에러가 발생했다.


마지막 에러메시지를 잘 해석해 보아야 했다. 해석해 보면, 

키에러: '주어진 단어 바랄의 어떤 ngram도 모델에 존재하지 않습니다'

즉, fasttext 가 word2vec 등과 달리 유추해 주는 단어는, 아무 단어가 아니라, 훈련시 사용됐던 단어의 substring 인 단어만 가능한 것이기에 이런 에러가 발생한 것으로 보인다.


즉, '바랄'은 KeyError 가 발생하겠지만, '바람돌이'는 '바람돌이'란 단어가 없었다고 해도, 그 일부인 '바람'이 있기 때문에 vector 를 돌려줄 것이란 뜻이다.


728x90