Byte Pair Encoding
Updated:
Reference
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의 토크나이저의 경우 이 vocabulary
가 vocab.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으로 구현해봤습니다.
Comments