我无法理解 keras 中的 skipgrams() 函数
I cannot understand the skipgrams() function in keras
我试图通过使用以下代码来理解 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]))
对于句子 "I love money",我希望以下 (context, word)
对与 keras 中定义的 window size=1:
([i, money], love)
([love], i)
([love], money)
根据我在 Keras 文档中的理解,如果 (word, word in the same window)
它将输出标签 1,如果 (word, random word from the vocabulary)
.
将输出标签 0
由于我使用的 windows 大小为 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这个标签我好像很懂
那是因为你的词汇量很小:都是一样的 ("love", "i", "money")
个词。这就是为什么 "random word from the vocabulary" 总是来自同一个句子,而且来自同一个上下文。
作为一个实验,这样做:
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
我试图通过使用以下代码来理解 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]))
对于句子 "I love money",我希望以下 (context, word)
对与 keras 中定义的 window size=1:
([i, money], love)
([love], i)
([love], money)
根据我在 Keras 文档中的理解,如果 (word, word in the same window)
它将输出标签 1,如果 (word, random word from the vocabulary)
.
由于我使用的 windows 大小为 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这个标签我好像很懂
那是因为你的词汇量很小:都是一样的 ("love", "i", "money")
个词。这就是为什么 "random word from the vocabulary" 总是来自同一个句子,而且来自同一个上下文。
作为一个实验,这样做:
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