Как следующий вызов экземпляра класса преобразовывает токены в индексы? - PullRequest
0 голосов
/ 21 апреля 2020

У меня есть определение класса, которое преобразует список токенов в их частоты, а затем сортирует их по частотам в обратном порядке (сначала максимум). Токены имеют следующий формат: 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]]

Я надеюсь, что я смысл, я сейчас немного запутался .. Спасибо!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...