我想用机器学习方法编码输入字符串。目前,我的列车数据以这种方式显示:
score text
1 show photos
1 show photos
2 who are you
正如您所看到的,所有文本都具有相同的长度。在底部是我的源代码。我想知道是否可以使用不同长度的载体?例如:
score text
1 show my photos
1 show me my photos
2 can you tell me who are you?
源代码:
train_set = pd.read_csv("train3.tsv", sep="\t", header = None, names=['score', 'text'], skip_blank_lines=False, quoting=csv.QUOTE_NONE, error_bad_lines=False)
test_set = pd.read_csv("test.tsv", sep="\t", header = None, names=['text'], skip_blank_lines=False, quoting=csv.QUOTE_NONE, error_bad_lines=False)
dictionary = {}
i=0
for index, row in train_set.iterrows():
list2 = list(row.text.lower())
for n, key in enumerate(list2):
if key in dictionary:
list2[n] = dictionary[key]
else:
dictionary[key] = i
list2[n] = i
i += 1
train_set.set_value(index,'text', list2)
for index, row in test_set.iterrows():
list2 = list(row.text.lower())
for n, key in enumerate(list2):
if key in dictionary:
list2[n] = dictionary[key]
else:
dictionary[key] = i
list2[n] = i
i += 1
test_set.set_value(index,'text', list2)
# Create first network with Keras
score = np.array([np.array(xi) for xi in train_set.score.values.tolist()])
text = np.array([np.array(xi) for xi in train_set.text.values.tolist()])
test = np.array([np.array(xi) for xi in test_set.text.values.tolist()])
# create model
model = Sequential()
model.add(Dense(12, input_dim=11, init='uniform'))
model.add(Dense(11, init='uniform'))
model.add(Dense(1, init='uniform'))
# Compile model
model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])
# Fit the model
model.fit(text, score, epochs=150, batch_size=10, verbose=2)
# calculate predictions
predictions = model.predict(test)
print(predictions)
答案 0 :(得分:0)
是的,你可以有不同的长度;但是,您需要一个可以处理不同长度的图层。例如,您可以使用LSTM处理不同长度的句子,方法是设置input_shape=(None, vocab_size)
None
表示未知单词数。
您还需要使用utils中的pad_sequences
将序列填充到相同的长度。然后,您需要使用Masking
图层告诉LSTM要跳过这些条目。如果你只是设置为-1而不是掩码,那么你将根据训练集中句子的长度引入偏差。
答案 1 :(得分:-1)
您的输入必须始终具有相同的大小。所以你可以做的是在较小的输入结束时插入一个值(让我们说-1)。然后神经网络将解决它并处理它。