value値がidの場合のkeyのとり方

chainerなどで言語処理を行うときには単語をidに変換して使うため、単語→idの関係を格納する辞書をvocabularyとして用いる。そのため、単語や文章を生成したいという場合にはid→単語に直す作業が必要になる。

逆引きの辞書をつくる手もあるが、idはint型なのでkeyにするためにstrに変換するのはちょっとな・・・と思うので別の方法をとる。idは単純に単語の番号なのでdictのkeyをid(value)から呼び出すにはkeyをリスト化してやればよい。例として以下のような場合を考える。

id_dict = {"love":1,"i":2,"you":3} #vocabulary例
output = [2,1,3] #目標は「i love you」を出力すること

このとき、出力outputを単語に変換するには以下のようにリスト化を行えばよい。word_listがリスト化によってできたリストだ。

word_list = [0]*(len(id_dict)+1)      #リスト初期化 word_list[0]はout of vocabulary用にとっておく  
for key,value in id_dict.items(): #dictの各要素の呼び出し
    word_list[value] = key      #word_listの番号に注意

唯一注意点はword_listのインデックスをidと合わせることである。特に文頭文末記号を入れたり、id=0を未知語に割り当てたりするとずれることが往々にしてある。

words = []
for id_ in output:
    words.append(word_list[id_])

print(" ".join(words))
# 'i love you'