我无法理解keras中的skipgrams()函数

时间:2018-05-15 10:06:02

标签: python machine-learning nlp keras text-processing

我试图通过使用以下代码来理解keras中的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,如keras中所定义:

([i, money], love)
([love], i)
([love], money)

根据我在Keras文档中的理解,如果(word, word in the same window),它将输出标签1,如果(word, random word from the vocabulary)则标签为0。

由于我使用的是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 :(得分:1)

那是因为你的词汇量非常小:它是相同的(i , sit ) -> 0 (love , i ) -> 1 (love , money ) -> 1 (love , ut ) -> 0 (love , sit ) -> 0 (money , consectetur ) -> 0 (money , love ) -> 1 (i , love ) -> 1 个词。这就是为什么“词汇中的随机词”总是来自同一个句子,而且来自同一个语境。

作为实验,请执行以下操作:

IBOutlet

基本上,让令牌器知道文本中有更多单词。您应该看到负面示例现在主要来自第二句,例如:

IBOutlet