2017-02-02 4 views
6

私は、ウェブチュートリアルと自分の直感から得た知識を使ってケラスで自分自身でLSTMを学ぶsequence to sequenceをコーディングしました。私はサンプルテキストをシーケンスに変換し、ケラでpad_sequenceの機能を使用して埋めました。私は私のパディングシーケンスがこのpad_sequencesを使用してケラスのテキストシーケンスをどのようにパッドする必要がありますか?

>>> X[0:6] 
array([[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1], 
     [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3], 
     [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2], 
     [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5], 
     [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4], 
     [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7]], dtype=int32) 
>>> X 
array([[ 0, 0, 0, ..., 0, 0, 1], 
     [ 0, 0, 0, ..., 0, 0, 3], 
     [ 0, 0, 0, ..., 0, 0, 2], 
     ..., 
     [ 0, 0, 0, ..., 0, 0, 13], 
     [ 0, 0, 0, ..., 0, 0, 12], 
     [ 0, 0, 0, ..., 0, 0, 14]], dtype=int32) 

のように見えた、慎重に検査した後

from keras.preprocessing.text import Tokenizer,base_filter 
from keras.preprocessing.sequence import pad_sequences 

def shift(seq, n): 
    n = n % len(seq) 
    return seq[n:] + seq[:n] 

txt="abcdefghijklmn"*100 

tk = Tokenizer(nb_words=2000, filters=base_filter(), lower=True, split=" ") 
tk.fit_on_texts(txt) 
x = tk.texts_to_sequences(txt) 
#shifing to left 
y = shift(x,1) 

#padding sequence 
max_len = 100 
max_features=len(tk.word_counts) 
X = pad_sequences(x, maxlen=max_len) 
Y = pad_sequences(y, maxlen=max_len) 

は次のように見えるように仮定パッド入りのシーケンスですか?配列の最後の列を除いて、残りはすべてゼロです。シーケンスにテキストを埋め込むのに間違いを犯したと思います。エラーが発生した場所を教えてください。

答えて

6

あなたはcharでトークン化したい場合は、手動でそれを行うことができ、それはあまりにも複雑ではありません。

まず、あなたの文字のための語彙を構築:

txt="abcdefghijklmn"*100 
vocab_char = {k: (v+1) for k, v in zip(set(txt), range(len(set(txt))))} 
vocab_char['<PAD>'] = 0 

これはあなたのtxtのすべての文字のための別個の番号を関連付けます。埋め込みのためにインデックス0の文字を保存する必要があります。

逆の語彙を使用すると、出力をデコードするのに便利です。

rvocab = {v: k for k, v in vocab.items()} 

あなたがこれをしたら、あなたは長さseq_len = 13のシーケンスを持ちたいと言う、シーケンスにテキストを最初に分割することができます。

[[vocab_char[char] for char in txt[i:(i+seq_len)]] for i in range(0,len(txt),seq_len)] 

あなたの出力は次のようになります。

[[9, 12, 6, 10, 8, 7, 2, 1, 5, 13, 11, 4, 3], 
[14, 9, 12, 6, 10, 8, 7, 2, 1, 5, 13, 11, 4], 
..., 
[2, 1, 5, 13, 11, 4, 3, 14, 9, 12, 6, 10, 8], 
[7, 2, 1, 5, 13, 11, 4, 3, 14]] 

最後のシーケンスは同じ長さではなく、破棄したり、シーケンスをmax_len = 13に埋め込んだりすることができます。それには0が追加されます。

あなたは1 :-)

私はこれが役に立てば幸いですべてをシフトすることにより、あなたの目標Yと同じ方法を構築することができます。

3

問題は、この行である:

tk = Tokenizer(nb_words=2000, filters=base_filter(), lower=True, split=" ") 

あなたのデータの性質のために、このような分割(" "ことによって)、設定した場合、あなたは各シーケンスは、単一の単語からなる取得します。そのため、パディングされたシーケンスには、非ゼロ要素が1つしかありません。その試みを変更するには:

txt="a b c d e f g h i j k l m n "*100 
+0

エラーを指摘していただきありがとうございますが、これを解決する最善の方法は何ですか? [keras](https://keras.io/preprocessing/text/#tokenizer)のドキュメントは非常に曖昧です。 – Eka

+0

あなたのシークエンスはどのように分かれていますか? –

+0

私のシーケンスは次のようなものです。 'abcdefghijklmnabcdefghijklmn ..... mn'文字(文字列順列学習) – Eka

関連する問題