<jupyter_start><jupyter_text>subword model  Neural Machine Translation of Rare Words with Subword Units데이터 압축으로 쓰이던 bpe를 자연어에 쓴 논문이다.단어보다 작은 subword unit을 사용하여 음운론적이고 형태학적으로 번역함으로써, open-vocabulary NMT모델을 소개한다.    Introductionagglutination and compounding 단계가 포합된 언어의 경우, word level에서 하위 수준으로 내려가는 메커니즘이 필요하다.- subword를 통한 open-vocabulary은 back-off dictionay나 큰 large vocabularies보다 효과적이다.- byte pair encoding (BPE)(Gage, 1994)은 가변 길이의 문자열을 고정크기의 어휘를 통해 표현 할수 있기 때문에 인공신경망에서 효과적인 방법이다.  Neural Machine Translation모델은 Bi-direction GRU 유닛 사용subword로 정보를 투영할 때의 장점- named entities- cognates and loanwords(의미 분화 및 외래어)- morphologically complex words(복합어)  Bytr Pair Encoding (BPE)알고리즘은 모든 쌍을 인덱싱하고, 데이터 구조(dictionary)를 점진적으로 업데이트 한다.예를 들어 ('A', 'B')안에서 모든 기호 쌍을 반복적으로 계산해서 가장 빈도가 높은 쌍을 새로운 기호 'AB'로 교체한다.허프만 인코딩 처럼 하위 단어를 기반으로 새로운 단어를 번역하고 새성한다.<jupyter_code>import re, collections
def get_stats(vocab):
    pairs = collections.defaultdict(int)
    for word, freq in vocab.items():
        symbols = word.split()
        for i in range(len(symbols)-1):
            pairs[symbols[i], symbols[i+1]] +=freq
    return pairs

def merge_vocab(pair, v_in):
    v_out = {}
    bigram = re.escape(' '.join(pair))
    p = re.compile(r'(?<!\S)'+bigram+r'(?!\S)')
    for word in v_in:
        w_out = p.sub(''.join(pair), word)
        v_out[w_out] = v_in[word]
    return v_out

vocab ={'l o w </w>' : 5, 'l o w e r </w>' : 2,
       'n e w e s t </w>' :6, 'w i d e s t </w>': 3}
num_merges = 10
for i in range(num_merges):
    pairs = get_stats(vocab)
    best = max(pairs, key=pairs.get) 
    vocab = merge_vocab(best, vocab) 
    print(best)<jupyter_output>('e', 's')
('es', 't')
('est', '</w>')
('l', 'o')
('lo', 'w')
('n', 'e')
('ne', 'w')
('new', 'est</w>')
('low', '</w>')
('w', 'i')
{'fraction_non_alphanumeric': 0.148564997186269, 'fraction_numerical': 0.006752954417557681, 'mean_word_length': 3.547314578005115, 'pattern_counts': {'":': 0, '<': 12, '<?xml version=': 0, '>': 11, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'chain_length': '1', 'dir': 'jupyter-structured-clean-dedup', 'id': '35666', 'license': 'MIT', 'n_tokens_mistral': 969, 'n_tokens_neox': 1106, 'n_words': 232, 'path': 'diary.py/machine_learning/paper/subword.ipynb', 'repo_name': 'indexxlim/indexxlim.github.io', 'size': '1777'}