Я пытаюсь понять функцию skipgrams()
в керасе, используя следующий код
from keras.preprocessing.text import *
from keras.preprocessing.sequence import skipgrams
text = "I love money" #My test sentence
tokenizer = Tokenizer()
tokenizer.fit_on_texts([text])
word2id = tokenizer.word_index
wids = [word2id[w] for w in text_to_word_sequence(text)]
pairs, labels = skipgrams(wids, len(word2id),window_size=1)
for i in range(len(pairs)): #Visualizing the result
print("({:s} , {:s} ) -> {:d}".format(
id2word[pairs[i][0]],
id2word[pairs[i][1]],
labels[i]))
Для предложения "Я люблю деньги" я ожидал бы следующие (context, word)
пары с размером окна = 1, как определено в керасе:
([i, money], love)
([love], i)
([love], money)
Из того, что я понимаю в документации Keras, он выведет метку 1, если (word, word in the same window)
, и метку 0, если (word, random word from the vocabulary)
.
Поскольку я использую размер окна 1, я ожидаю метку 1 для следующих пар:
(love, i)
(love, money)
(i, love)
(money, love)
И метка 0 для следующих пар
(i, money)
(money, i)
Тем не менее, код дает мне такой результат
(love , i ) -> 1
(love , money ) -> 1
(i , love ) -> 1
(money , love ) -> 1
(i , i ) -> 0
(love , love ) -> 0
(love , i ) -> 0
(money , love ) -> 0
Как пара (love , i )
и (money , love )
может быть помечена как 0 и 1?
а также где результаты (i, money)
и (money, i)
?
Я неправильно понимаю, что все метки 0 не соответствуют моим ожиданиям? Но, похоже, я хорошо понимаю метку 1.