У меня есть определение класса, которое преобразует список токенов в их частоты, а затем сортирует их по частотам в обратном порядке (сначала максимум). Токены имеют следующий формат: tokens[0:2]
Out [5]: [['the', 'time', 'machine', 'by', 'h', 'g', 'wells', ''], [' ']]
Это класс, который работает с токенами:
class Vocab(object):
def __init__(self, tokens, min_freq=0, use_special_tokens=False):
# Sort according to frequencies
counter = count_corpus(tokens)
self.token_freqs = sorted(counter.items(),
key=lambda x: x[1],
reverse=True)
if use_special_tokens:
# padding, begin of sentence, end of sentence, unknown
self.pad, self.bos, self.eos, self.unk = (0, 1, 2, 3)
uniq_tokens = ['<pad>', '<bos>', '<eos>', '<unk>']
else:
self.unk, uniq_tokens = 0, ['<unk>']
uniq_tokens += [token for token, freq in self.token_freqs
if freq>= min_freq and
token not in uniq_tokens]
self.idx_to_token, self.token_to_idx = [], dict()
for token in uniq_tokens:
self.idx_to_token.append(token)
self.token_to_idx[token] = len(self.idx_to_token) - 1
def __len__(self):
return len(self.idx_to_token)
def __getitem__(self, tokens):len()
if not isinstance(tokens, (list, tuple)):
return self.token_to_idx.get(tokens, self.unk)
return [self.__getitem__(token) for token in tokens]
def to_tokens(self, indices):
if not isinstance(indices, (list, tuple)):
return self.idx_to_token[indices]
return [self.idx_to_token[idx] for idx in indices]
def count_corpus(sentences):
# Flatten a list of token lists into a list of tokens
tokens = [tk for line in sentences for tk in line]
return collections.Counter(tokens)
Этот код:
for i in range(8, 10):
print('words:', tokens[i])
print('indices:', vocab[tokens[i]])
Создает это:
слов : ['' ',' время ',' путешественник ',' для ',' так ',' это ',' будет ',' будет ',' удобно ',' to ',' говорить ',' of ', «его», «» показатели: [1, 20, 72, 17, 38, 12, 116, 43, 681, 7, 587, 5, 109, 2] слова: ['был', 'разъясняющий', ' индексы ',' тайный ',' материя ',' to ',' us ',' his ',' grey ',' eyes ',' shone ',' и ']: [8, 1421, 6, 2186, 588, 7, 127, 26, 331, 128, 440, 4]
Мой вопрос: как получается, что к экземпляру "vocab" можно получить доступ через vocab [токены]? Я только когда-либо видел что-то вроде vocab.idx_to_token, например, никогда не доступ к экземпляру класса, как если бы это был словарь .. к чему конкретно обращаются даже?
Насколько я знаю, vocab содержит две переменные: idx_to_token и token_to_idx, я не знаю, к какому из них обращаются vocab [tokens [i]]
Я надеюсь, что я смысл, я сейчас немного запутался .. Спасибо!