Я не могу понять функцию skipgrams () в керасе - PullRequest
0 голосов
/ 15 мая 2018

Я пытаюсь понять функцию 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.

1 Ответ

0 голосов
/ 15 мая 2018

Это потому, что ваш словарный запас очень мал: это те же самые ("love", "i", "money") слова. Вот почему «случайное слово из словаря» всегда происходит из одного и того же предложения и, более того, из одного и того же контекста.

В качестве эксперимента сделайте следующее:

text = "I love money" #My test sentence
text2 = "Lorem ipsum dolor sit amet, consectetur adipiscing elit, " \
        "sed do eiusmod tempor incididunt ut labore et dolore magna aliqua"
tokenizer = Tokenizer()
tokenizer.fit_on_texts([text, text2])
...

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

(i , sit ) -> 0
(love , i ) -> 1
(love , money ) -> 1
(love , ut ) -> 0
(love , sit ) -> 0
(money , consectetur ) -> 0
(money , love ) -> 1
(i , love ) -> 1
...