Byte Pair Encoding

Updated:

Reference

BPE 알고리즘에 대한 설명은 링크한 곳에 잘 설명되어 있습니다. 여기서는 참고한 곳의 내용을 바탕으로 직접 구현했습니다.

https://ratsgo.github.io/nlpbook/docs/preprocess/bpe/

Get Vocabulary

토크나이징을 위해 문서내에 등장한 단어의 등장횟수가 기록된 dictionary를 사용하여 단어 집합인 vocabulary를 만들어야 합니다.

위 코드는 dictionary의 단어들을 구성하는 글자들만을 추출하여 vocabulary에 저장한 코드입니다. 알고리즘 내에서 vocabulary를 사용하고 다시 업데이트를 반복할 것입니다.

모든 단어에 대한 bigram 쌍을 pairs라는 딕셔너리에 저장하면서 횟수를 더해줍니다.

pairs에서 가장 많이 등장한 순대로 정렬 후 가장 많은 단어를 vocabulary에 저장합니다.

여기까지의 과정을 반복합니다.

이렇게 vocabulary['p', 'b', 'n', 'g', 'h', 'u', 's', 'ug', 'un', 'hug']를 얻을 수 있습니다. corpus에서 가장 많이 등장한 bigram 쌍이 순서대로 추가되었습니다.

Huggingface의 토크나이저의 경우 이 vocabularyvocab.json으로 출력되어 단어와 단어 인덱스 값이 key-value 형태로 저장되어 있습니다.

Tokenizing

토크나이징을 하려면 위에서 구한 vocabulary가 필요합니다. vocabulary에 따라 단어들을 병합합니다.

<unk> 토큰은 토크나이저가 vocabulary에 없는 단어를 대체할 때 사용합니다. 이런 문제를 OOV(Out of Vocabulary)라 하는데 여기서는 corpus의 크기가 크지 않아 발생합니다.

다시 돌아와서 위의 코드는 hugs를 h,u,g,s로 나누고 h,ug,s로 병합하는 과정이었습니다. 이 과정을 더 이상 병합하지 않을 때까지 반복하여 토크나이징을 수행합니다.

이 코드를 함수로 정의하고 문장에 대해 토크나아징할 수 있습니다.

이렇게 BPE 알고리즘을 통해 subword를 분리할 수 있어 합성어를 사전에 포함하지 않아도 되는 장점이 있습니다. 또한, 사전에 단어가 포함되지 않아 발생하는 OOV(Out of vocabulary) 문제를 해결하는 방법이기도 합니다.

여기까지 BPE 토크나이징 기법을 python으로 구현해봤습니다.

Tags:

Categories:

Updated:

Comments