2017-06-19 4 views
0

私の関数への入力は、h5pyファイルとテキストファイルです。テキストファイルには2つの列があります。最初の列にはいくつかの発話情報があり、2番目の列には発言者の情報があります(その発言に対して)。 h5pyファイルのキー(create_datasetsを使用して作成)は、発声(ファイルの最初の列)です。これらのデータセットのそれぞれは、固定ディメンション(600、)の配列が1つしかありません。 h5pyファイルには、テキストファイルの発声よりも多くの発声があります。テキストファイル内の発話の一部は、h5pyファイルに存在しない場合があります。私の機能のh5pyファイルのデータセットの内容をnumpy配列に読み込む方法は、キーのリストを参照してください。

期待される出力:2つのnumpyの配列

第一のアレイ(形状の((nutts、600)、DTYPE = 'フロート')

第二の配列でなければなりません(私たちはX、それを呼びましょう)

ここで、nuttsは、実際にはh5ファイルに存在するテキストファイルの発声数です(ナット< = total_lines_in_text_file)

注:私はナッツを知らない あらかじめ。私はXとYを動的に作成しなければならない。その発話がh5fileにキーとして存在する場合、私がチェック、テキストファイル内の最初の発声について

:Xを作成するため

方法は、上記の説明から明らかであろう。それが存在する場合、私はnumpyの配列(600次元)をとり、Xの最初の行に入れて、次に繰り返します(私は 'nutts'を事前に知らないので、Xをゼロで初期化することはできません。私は場所でのyに関する

もっとそれらすべてを持っていたら、numpyの配列に辞書を変換する辞書と試してみました:。。 すべてnuttsは(nspkrs < = nutts)nspkrsに対応することができ、複数の発話が同じ話者にマッピングされ得ることができますI 。。numpyの配列形式で、各発話の話者の情報をエンコードしたいspkr1ために、私はSPKRのために、0のラベルを与えるN Iは、n-1のラベルを与える

ここでは、私がやったことです:

h5f = h5py.File('some.h5', 'r') 
 

 
import pandas as pd 
 

 
import numpy as np 
 

 

 
def load_data(h5f, src_u2s_list): 
 

 
    with open(src_u2s_list) as f: 
 

 
     content = f.read().splitlines() 
 

 
    utt2ivec = {} 
 
    utt2lbl = {} 
 
    spk2spk_class = {} 
 
    spk_id = -1 
 
    for u2s in content: 
 
     utt, spk = u2s.split() 
 
     if spk not in spk2spk_class.keys(): 
 
      spk_id += 1 
 
      spk2spk_class[spk] = spk_id 
 

 
     if utt in h5f.keys(): 
 
      utt2ivec[utt] = h5f[utt][:] 
 
      utt2lbl[utt] = spk2spk_class[spk] 
 
     else: 
 
      print("Utterance {0} does not exist in h5file".format(utt)) 
 

 
    data_X = pd.Series(utt2ivec) 
 
    data_y = pd.Series(utt2lbl) 
 

 
    return data_X.values, data_y.values

主な検討事項:

  1. h5fileは約10万発話を持っており、テキストファイルは約70000発話を持っています。このコードは非常に遅いです
  2. 私はh5pyファイルを使い慣れていません。コードの提案や全体の再構築は大歓迎です。
  3. パンダの使用を避けたい。
  4. 非常に重要:Xとyの発声の順序は同じでなければなりません。つまり、XとYの行は同じ発話に対応する必要があります。

大変申し訳ありませんが、私は混乱を避けるために物事を明確にしたい。

たちは、2D配列に(同じサイズの)アレイの束を収集する際、通常、我々は最初のリストにそれらを追加して、最後にそれから配列を作成し、事前に

+0

スピード以外は、 'utt2ivec adn'と' utt2lbl'の作成に満足していますか?配列の値を持つ辞書のように見えます。あなたの説明はあなたには分かりやすいかもしれませんが、カジュアルな視聴者には複雑に見えます。具体的な例をいくつか使用することができます。 – hpaulj

答えて

0

をありがとう:

utt2ilist = [] 
... 
    if utt in h5f.keys(): 
     utt2ilist.append(h5f[utt][:]) 
    ... 
utt2iarr = np.array(utt2ilist) 

私は少なくともないh5pyで、一度に複数のデータセットをロードするのいずれかの方法を知っていません。あなたは関連するkeyを見つけて、それをロードするだけです。多数のデータセットを持っている場合、それぞれ比較的小さい(600個の要素)これには時間がかかります。データセットのサイズが異なる場合は注意してください。結果は2次元配列ではなくオブジェクトdtype配列になります。

spk2spk_class[spk]は同様のリストで収集することができます。

このようなリストを使用すると、読み込まれた順に並べ替えられます。辞書とパンダを使用すると、uttでそれらのインデックスを作成します。辞書の仲介をすると、読んだ注文に関する情報が失われる可能性があります。

私はspk2spk_classのためにdefaultdictを提案しようとしていましたが、あなたはオブジェクトを数えていませんが、ユニークなIDを与えています。

私の推測では、遅さは収集メカニズム自体からではなく、多数のuteranceを読むことから来ていると思います。しかし、私はあなたのデータをテストする必要はありません。

関連する問題