-2

包的图像以及如何从中选择

想象一下,我有 10 个袋子,一个接一个地订购。即第 1 个袋子,第 2 个袋子……第 n 个袋子。

每个包都有不同的单词集。

为了理解包是什么,假设我们有一个 10,000 个单词的词汇表。第一个袋子包含单词 Hello , India , Manager 。

即 Bag 1 将在包中存在的单词索引处有 1。例如:如果 Hello 的索引为 1,则 Bag 1 的大小为 10000*1 印度的索引为 2 而经理的索引为 4 它将是 [0 , 1, 1, 0 , 1 ,0,0,0,0..... ....]

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

必须从每个袋子中选择一个词,并分配一个数字词 1(袋子 1 中的词)词 2(袋子 2 中的词),它们必须按数字顺序组成一个有意义的句子。!

4

2 回答 2

4

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

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

所以我们需要将权重的几代矩阵乘入字典的键中,然后将字典键范围之外的权重全部去掉,剩下的就可以用来获取字典中的值并造句了。或者,您还可以使用阈值来取消矩阵乘法的所有输出

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

和无聊的一点,不断地运行几代人,直到你的句子大部分时间都有意义(当然不能保证它总是有意义的,但这是 ANN 的本质)

如果您发现它不起作用,您可以使用更多层(更多矩阵)和/或我最近听说过一种动态改变网络的不同技术,但我对此无能为力。

于 2018-04-24T14:21:57.440 回答
3

拥有database数千/数百万个有效句子。

创建一个字典,其中每个单词代表一个数字(保留 0 表示“无”,1 表示“句子开头”,2 表示“句子结尾”)。

word_dic = { "_nothing_": 0, "_start_": 1, "_end_": 2, "word1": 3, "word2": 4, ...}
reverse_dic = {v:k for k,v in word_dic.items()}

请记住在数据库中所有句子的开头和结尾添加"_start_"和,并在结尾完成能够包含所有句子的所需长度。(理想情况下,使用 10 个或更少单词的句子,因此您的模型不会尝试创建更大的句子)。"_end_""_nothing_"

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

 #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_categorical()

 cat_sentences = to_categorical(indices) #shape (sentences,length,dictionary_size)

提示: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_train用和编译和拟合这个模型y_train

model.compile(....)
model.fit(x_train,y_train,....)

stateful=True在所有LSTM层中使用相同的模型:

newModel = ...... 

从训练模型转移权重:

newModel.set_weights(model.get_weights())

以明确的方式创建您的包,形状(10, dictionary_size)

使用模型从单词中预测一个_start_单词。

#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_size告诉(某种程度上)每个现有单词的概率。比较一下袋子里的字。您可以选择最高的概率,或者如果包中其他单词的概率也不错,则使用一些随机选择。

#example taking the most probable word:
firstWord = np.array(firstWord == firstWord.max(), dtype=np.float32)

再次执行相同操作,但现在firstWord在模型中输入:

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

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

于 2018-04-24T15:28:44.187 回答