我有如下文本数据。
X_train_orignal= np.array(['OC(=O)C1=C(Cl)C=CC=C1Cl', 'OC(=O)C1=C(Cl)C=C(Cl)C=C1Cl', 'OC(=O)C1=CC=CC(=C1Cl)Cl', 'OC(=O)C1=CC(=CC=C1Cl)Cl', 'OC1=C(C=C(C=C1)[N+]([O-])=O)[N+]([O-])=O'])
显然,不同的序列长度不同。我如何能对序列的两侧进行零填充至某个最大长度?然后基于每个字符将每个序列转换为独热编码?
尝试:
我使用了以下Keras API,但它不适用于字符串序列。
keras.preprocessing.sequence.pad_sequences(sequences, maxlen=None, dtype='int32', padding='pre', truncating='pre', value=0.0)
我可能需要先将我的序列数据转换为独热向量,然后再进行零填充。为此,我尝试使用Tokanize
如下所示。
tk = Tokenizer(nb_words=?, split=?)
但是,我的序列数据没有空格,split
值和nb_words
应该是什么?如何将其用于基于字符的独热编码?
我的总体目标是在将序列输入到RNN之前,对其进行零填充并转换为独热编码。
回答:
所以我找到了一个方法,先使用Tokenizer
,然后使用pad_sequences
在序列开始处进行零填充,如下所示。
from keras.preprocessing.text import Tokenizertokenizer = Tokenizer(char_level=True)tokenizer.fit_on_texts(X_train_orignal)sequence_of_int = tokenizer.texts_to_sequences(X_train_orignal)
这会给我如下输出。
[[3, 1, 4, 2, 3, 5, 1, 6, 2, 1, 4, 1, 7, 5, 1, 2, 1, 1, 2, 1, 6, 1, 7], [3, 1, 4, 2, 3, 5, 1, 6, 2, 1, 4, 1, 7, 5, 1, 2, 1, 4, 1, 7, 5, 1, 2, 1, 6, 1, 7], [3, 1, 4, 2, 3, 5, 1, 6, 2, 1, 1, 2, 1, 1, 4, 2, 1, 6, 1, 7, 5, 1, 7], [3, 1, 4, 2, 3, 5, 1, 6, 2, 1, 1, 4, 2, 1, 1, 2, 1, 6, 1, 7, 5, 1, 7], [3, 1, 6, 2, 1, 4, 1, 2, 1, 4, 1, 2, 1, 6, 5, 8, 10, 11, 9, 4, 8, 3, 12, 9, 5, 2, 3, 5, 8, 10, 11, 9, 4, 8, 3, 12, 9, 5, 2, 3]]
现在我不明白为什么sequence_of_int[1], sequence_of_int[4]
的输出是以列格式显示的?
在获取标记后,我应用了pad_sequences
如下所示。
seq=keras.preprocessing.sequence.pad_sequences(sequence_of_int, maxlen=None, dtype='int32', padding='pre', value=0.0)
它会给我如下输出。
array([[ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 1, 4, 2, 3, 5, 1, 6, 2, 1, 4, 1, 7, 5, 1, 2, 1, 1, 2, 1, 6, 1, 7], [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 1, 4, 2, 3, 5, 1, 6, 2, 1, 4, 1, 7, 5, 1, 2, 1, 4, 1, 7, 5, 1, 2, 1, 6, 1, 7], [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 1, 4, 2, 3, 5, 1, 6, 2, 1, 1, 2, 1, 1, 4, 2, 1, 6, 1, 7, 5, 1, 7], [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 1, 4, 2, 3, 5, 1, 6, 2, 1, 1, 4, 2, 1, 1, 2, 1, 6, 1, 7, 5, 1, 7], [ 3, 1, 6, 2, 1, 4, 1, 2, 1, 4, 1, 2, 1, 6, 5, 8, 10, 11, 9, 4, 8, 3, 12, 9, 5, 2, 3, 5, 8, 10, 11, 9, 4, 8, 3, 12, 9, 5, 2, 3]], dtype=int32)
然后,我将其转换为独热编码如下所示。
one_hot=keras.utils.to_categorical(seq)