import re import collections class BytePairEncoder: def __init__(self): self.merges = None self.characters = None self.tokens = None self.vocab = None def format_word(self, text, space_token='_'): return ' '.join(list(text)) + ' ' + space_token def initialize_vocab(self, text): text = re.sub('\s+', ' ', text) all_words = text.split() vocab = {} for word in all_words: word = self.format_word(word) vocab[word] = vocab.get(word, 0) + 1 tokens = collections.Counter(text) return vocab, tokens def get_bigram_counts(self, vocab): pairs = {} for word, count in vocab.items(): symbols = word.split() for i in range(len(symbols)-1): pair = (symbols[i], symbols[i+1]) pairs[pair] = pairs.get(pair, 0) + count return pairs def merge_vocab(self, pair, vocab_in): vocab_out = {} bigram = re.escape(' '.join(pair)) p = re.compile(r'(?