Deep learning 如何建立深度学习模型,从几个不同的袋子中挑选单词,形成一个有意义的句子

Deep learning 如何建立深度学习模型,从几个不同的袋子中挑选单词,形成一个有意义的句子,deep-learning,keras,nltk,language-model,google-natural-language,Deep Learning,Keras,Nltk,Language Model,Google Natural Language,想象一下,我有10个袋子,一个接一个地订购。。。。。。。。。袋子 每个袋子都有不同的单词集 为了理解什么是包, 想想我们有10000个单词的词汇量。 第一个袋子里写着“你好,印度,经理” ie袋1在袋中的单词索引处有1。 例:1号袋的尺寸为10000*1 如果Hello的指数是1,那么India的指数是2,Manager的指数是4 会的 [0,1,1,0,1,0,0,0,0……] *我还没有模特儿。 *我想用故事书,但对我来说还是有点抽象 必须从每个袋子中选择一个单词,并分配一个数字单词1(袋子

想象一下,我有10个袋子,一个接一个地订购。。。。。。。。。袋子

每个袋子都有不同的单词集

为了理解什么是包, 想想我们有10000个单词的词汇量。 第一个袋子里写着“你好,印度,经理”

ie袋1在袋中的单词索引处有1。 例:1号袋的尺寸为10000*1 如果Hello的指数是1,那么India的指数是2,Manager的指数是4 会的 [0,1,1,0,1,0,0,0,0……]

*我还没有模特儿。 *我想用故事书,但对我来说还是有点抽象

必须从每个袋子中选择一个单词,并分配一个数字单词1(袋子1中的单词)
单词2(来自第二袋的单词),它们必须按照数字顺序组成一个有意义的完整句子

首先,我们需要一种计算机能够识别单词的方法,否则它无法选择正确的单词。这意味着在这个阶段,我们需要决定我们要教计算机从什么开始(即什么是动词、名词、语法),但我假设我们会将一本词典放入其中,除了单词本身之外,不提供任何信息

为了让计算机能够计算出句子是什么,我们需要将它们转换成数字(一种方法是从1开始按字母顺序排列,使用它们作为字典的键(这次是数字(!),并将单词作为值)。现在我们可以将同样的线性代数技术应用到这个问题上,就像其他任何问题一样

因此,我们需要生成权重矩阵,将其乘以字典的键,然后移除字典键范围以外的所有权重,剩余的权重可以用于获取字典中的值并生成一个句子。或者,还可以使用阈值来提取矩阵乘法的所有输出

现在来看最难的部分:学习。一旦你有了几个(比如说100个)矩阵,我们需要“培育”最好的矩阵(这是需要人工干预的地方),你需要挑选50个最有意义的句子(一开始可能很难)并用它们作为你下一个100个矩阵的基础(最简单的方法是随机加权50个矩阵,加权平均100次)

令人厌烦的是,不断重复几代人,直到你的句子大部分时间都是有意义的(当然不能保证它总是有意义的,但这是安的天性)


如果你发现它不起作用,你可以使用更多的层(更多的矩阵)和/或我最近听说的一种动态改变网络的不同技术,但我真的帮不了你。

拥有一个包含成千上万个有效句子的
数据库

创建一个字典,每个单词代表一个数字(0表示“无”,1表示“句子开始”,2表示“句子结束”)

请记住在数据库中所有句子的开头和结尾添加
“\u start”
“\u end”
,并在结尾后添加
“\u nothing”
,以完成能够包含所有句子的所需长度。(理想情况下,使用10个或更少单词的句子,这样你的模型就不会试图创建更大的句子)

将所有句子转换为索引序列:

 #supposing you have an array of shape (sentences, length) as string:
 indices = []
 for word in database.reshape((-1,)):
     indices.append(word_dic[word])
 indices = np.array(indices).reshape((sentences,length))
使用keras函数
to_category()

提示:keras有很多有用的文本预处理功能

单独的培训输入和输出数据:

#input is the sentences except for the last word
x_train = cat_sentences[:,:-1,:]
y_train = cat_sentences[:,1:,:]
让我们创建一个基于LSTM的模型,该模型将根据前面的单词预测下一个单词:

model = Sequential()
model.add(LSTM(dontKnow,return_sequences=True,input_shape=(None,dictionary_size)))
model.add(.....)
model.add(LSTM(dictionary_size,return_sequences=True,activation='sigmoid')) 
   #or a Dense(dictionary_size,activation='sigmoid')
x\u列
y\u列
编译并拟合此模型:

model.compile(....)
model.fit(x_train,y_train,....)
在所有
LSTM
层中使用
stateful=True
创建相同的模型:

newModel = ...... 
从经过训练的模型中传递权重:

newModel.set_weights(model.get_weights())
以分类方式创建您的包,形状
(10,字典大小)

使用该模型从
\u开始\u
单词中预测一个单词

#reset the states of the stateful model before you start a 10 word prediction:
newModel.reset_states()

firstWord = newModel.predict(startWord) #startword is shaped as (1,1,dictionary_size)
firstWord
将是一个向量,大小为
dictionary\u size
告诉(排序)每个现有单词的概率。和袋子里的字比较一下。您可以选择最高概率,或者如果包中其他单词的概率也很好,则使用一些随机选择

#example taking the most probable word:
firstWord = np.array(firstWord == firstWord.max(), dtype=np.float32)
再次执行相同操作,但现在在模型中输入
firstWord

secondWord = newModel.predict(firstWord) #respect the shapes

重复这个过程直到你得到一个句子。请注意,您可能会在包中的10个单词满足之前找到
\u end \
。你可能会决定用一个较短的句子来完成这个过程,尤其是在其他单词概率较低的情况下

这个问题我不清楚。这些袋子是什么,它们是如何组成和形状的(指数?一个热的?另一个?)?它们是不同的字典吗?他们共用一本字典吗?你已经有模特了吗?你有培训数据吗?等等。@Daniel Möller现在清楚了吗?这样更好,但是如果是一个热的,袋子应该是2D的,(10,dic_大小)。每个袋子都是1D数组,我认为他使用了术语1热端编码错误。在Bag中的单词索引中有1,10代表什么?回答得好。在第二个模型中,将state full设置为true的重要性是什么?每个批次都将被视为“相同”序列的一个新步骤。明白了,谢谢。还有一个疑问,如果对拣选顺序没有限制怎么办?如果有5个包,那么我可以选择120个不同的订单。除了尝试所有排列并以最大概率选择顺序外,还有其他方法吗?如果使用循环层,则应保持顺序。这可以作为输入,但很难获取全局向量并确定它是哪个单词(因为它是连续的,而不是离散的向量)
#example taking the most probable word:
firstWord = np.array(firstWord == firstWord.max(), dtype=np.float32)
secondWord = newModel.predict(firstWord) #respect the shapes