Путать с созданием пакетных данных для модели пропуска грамм - PullRequest
0 голосов
/ 24 июня 2018

Итак, когда я проверял реализацию модели с пропуском грамм в тензорном потоке, используя набор данных фильма. Я сталкивался с этой функцией:

def generate_batch_data(sentences, batch_size, window_size, method='skip_gram'):
    # Fill up data batch
    batch_data = []
    label_data = []
    while len(batch_data) < batch_size:
        # select random sentence to start
        rand_sentence = np.random.choice(sentences)
        # Generate consecutive windows to look at
        window_sequences = [rand_sentence[max((ix-window_size),0):(ix+window_size+1)] for ix, x in enumerate(rand_sentence)]
        # Denote which element of each window is the center word of interest
        label_indices = [ix if ix<window_size else window_size for ix,x in enumerate(window_sequences)]

        # Pull out center word of interest for each window and create a tuple for each window
        if method=='skip_gram':
            batch_and_labels = [(x[y], x[:y] + x[(y+1):]) for x,y in zip(window_sequences, label_indices)]
            # Make it in to a big list of tuples (target word, surrounding word)
            tuple_data = [(x, y_) for x,y in batch_and_labels for y_ in y]
        elif method=='cbow':
            batch_and_labels = [(x[:y] + x[(y+1):], x[y]) for x,y in zip(window_sequences, label_indices)]
            # Make it in to a big list of tuples (target word, surrounding word)
            tuple_data = [(x_, y) for x,y in batch_and_labels for x_ in x]
        else:
            raise ValueError('Method {} not implemented yet.'.format(method))

        # extract batch and labels
        batch, labels = [list(x) for x in zip(*tuple_data)]
        batch_data.extend(batch[:batch_size])
        label_data.extend(labels[:batch_size])
    # Trim batch and label at the end
    batch_data = batch_data[:batch_size]
    label_data = label_data[:batch_size]

    # Convert to numpy array
    batch_data = np.array(batch_data)
    label_data = np.transpose(np.array([label_data]))

    return(batch_data, label_data)

Но я пытался понять код в течение нескольких дней, но не понял его. Весь код здесь , если вы хотите иметь более широкую перспективу.

Итак, в коде у нас есть номер для наиболее часто встречающихся 10000 слов. И мы передаем предложения в числовой форме в функцию выше. Поскольку это модель скип-граммы, мы должны взглянуть на смежные слова. Но как это сделать в этом алгоритме? Разве window_sequences = [rand_sentence[max((ix-window_size),0):(ix+window_size+1)] for ix, x in enumerate(rand_sentence)] не создал бы окно слов, которые являются смежными по частоте, но не в использовании предложения?
Я хотел бы получить разъяснение здесь.

Большое спасибо!

1 Ответ

0 голосов
/ 24 июня 2018

Рассмотрим следующее предложение как токены:

sentence = ["the","book","is","on","the","table"]

и рассмотрим window_size из 3. Код, который строит window_sequences, можно переформулировать так:

for ix in range(len(sentence)):
    x = sentence[ix] #so this is the ix-th word of the sentence
    from_index = max((ix-window_size) # this is the initial index of the window
    to_index = (ix+window_size+1) # this is the final index of the windows (excluding itself)
    window = sentence[from_index, to_index] # we pick the words of the sentence

Теперь давайте запустим этот код для некоторых ix:

ix=0, x="the", from_index=0, to_index=4, window = ["the", "book", "is", "on"]
ix=3, x="on", from_index=0, to_index=7, window = ["the", "book", "is", "on", "the", "table"]

Как вы видите, он строит окна слов, и они представляют собой в точности части оригинальных предложений.

Проблема, с которой вы могли столкнутьсяПри анализе этого кода слова предложения заменяются числовым идентификатором таким образом, что чем чаще встречается слово, тем ниже его идентификатор.

Таким образом, предложение до этого будет выглядеть так:

sentence = [2,45,7,13,2,67]

Они не отсортированы по частоте, но они точно сохраняют порядок в предложении.Только их форма поверхности изменяется с string на int, но вы можете легко понять код строковой версии.

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