2017-06-27 30 views
6

文字レベル予測のために文字列テンソルの文字を取得しようとしています。グラウンドトゥルースは、各キャラクターが辞書にIDを持つ単語です。私は、文字列の長さに対応するテンソルを持っています。Tensorflow - 文字列テンソル内の各文字を取得する

ここで、文字列テンソルの各文字を取得する必要があります。関連する投稿を確認した後、簡単な検索は次のようになります。例文字列は、「これは」

a= tf.constant("This",shape=[1]) 
b=tf.string_split(a,delimiter="").values #Sparse tensor has the values array which stores characters 

は今、私は「この」すなわち「T hをI S」の文字の間にスペースを含む文字列を作りたいです。私は開始時と終了時にも間隔が必要です。 どうすればいいですか?

私は

for i in xrange(b.dense_shape[1]): # b.dense_shape[1] has the length of string 
     x=b.values[i] 

以下のような文字を反復処理しようとしている。しかしループは整数ではなく、テンソルを期待しています。

どのように上記の作業を行う上でのアイデアですか?私はこれに関する文書を見つけることができませんでした(tf.string_split関数とは別に)。どんな提案も大歓迎です。ありがとう

答えて

5

あなたの問題は、あなたがTensorを反復しようとしていることです。これは反復可能ではありません。このタスクには、numpyの配列にeval()に変換するか、tf.map_fnを使用するなど、いくつかの選択肢があります。

あなただけ.values前にコール.eval()を追加し、次のように結果を反復処理する必要がnumpy arrayとしてあなたが脅威bする場合:

with tf.Session() as sess: 
    a = tf.constant("This", shape=[1]) 
    b = tf.string_split(a, delimiter="").values.eval() 

    for i in b: 
     print(i) 

第二の代替は、それのために、より適切であるがTensorFlowのを利用していますグラフ。これは、Tensorを「マップする」関数の使用に基づいています。これは、以下のように(どこfnにあなたが反復のデ振る舞いを定義することができます)行うことができます。

with tf.Session() as sess: 
    a = tf.constant("This", shape=[1]) 
    b = tf.string_split(a, delimiter="").values 

    fn = lambda i: i 

    print(tf.map_fn(fn, b).eval()) 
+0

実は私の問題ではなく、各文字を取得し、テンソルを反復することではありません。 テンソルの形の文字が必要なので、ここではeval()を使うことはできません。私の主な仕事は、元の文字列の間にスペースを挿入した文字列テンソルを取得することです。私の考えは、各文字テンソルをスペースで交互に追加して、希望の文字列テンソルを得ることです。しかし、私はそれをどうやって行うのか分かりません。 –

+1

2番目のアプローチでは簡単です。 'tf.string_split(tf.map_fn(lambda i:i +" "、b)、delimiter =" ")。values'は、各文字の最後にスペースを入れてから、 - 得られたテンソルを分割する。 – garciparedes

+0

魅力的な作品です。ありがとうございました –

関連する問題