そもそもC#からPythonにくら替えしようと思ったきっかけが、Recurrent Neural Network(RNN)だった。 RNNに関するネット上の情報のほとんどがPythonで説明されている。
今回もこの記事を参考にして途中までコーディングしてみた。 ほぼ丸々コピーしているので、意味ないと思うかもしれないけど、Python自体とRNNを同時に学習するのには十分役にたつ。
今回も記事を参考にしながら入力して実行させると、3か所ぐらいエラーが出た。 それをPythonの文法を調べながらデバッグしていくと結構理解できる。
という訳で今回やったのは、形態素とインデックスインデックスを相互に変換する辞書と、その辞書を使って文をインデックス列に変換し、また逆変換するメッソドの作成。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 |
import MeCab # text fileを読み込んで分かち書きされたtextを得る # 引数:text fileの名前、 戻り値:分かち書きされたtext def file2wakachi(filename): with open(filename) as f: text = f.read() tagger = MeCab.Tagger('-O wakati') result = tagger.parse(text) tbl = str.maketrans({'。' : '。\n'}) result = result.translate(tbl).replace('\n ', '\n') return result # 形態素をインデックスに、インデックスを形態素に変換する辞書を作成 # 引数:分かち書きされた文字列のリスト、戻り値:形態素→インデックス、インデックス→形態素に変換する辞書 def make_dic(text_list): w2id = {} id2w = {} for line in text_list: if line == '': continue for word in line.split(' '): if word not in w2id: id = len(w2id) + 1 w2id[word] = id id2w[id] = word return w2id, id2w # 分かち書きされた文字列のリストを形態素→インデックス変換辞書を使ってインデックスベクトルに変換 # 引数:分かち書きされた文字列のリスト、形態素→インデックス変換辞書、最大文字数 # RNNに入力する文字数が固定のため、最大文字数以上の文字列は変換しない。 最大文字数以下の文字列は0で埋める def word2id(text_list, wtoid, max_len): result = [] for line in text_list: if line == '': continue temp = [wtoid[word] for word in line.split(' ')] if len(temp) > max_len: continue temp += [0] * (max_len - len(temp)) result.append(temp) return result # インデックスベクトルを文字列に変換 def id2word(id_data, idtow): result = "" for line in id_data: result += ''.join([idtow[i] for i in line if i != 0]) + '\n' return result str_morph = file2wakachi('砂漠の少年.txt') corpus = str_morph.split('\n') wd2id, id2wd = make_dic(corpus) id_data = word2id(corpus, wd2id, 20) ward_data = id2word(id_data[0:2], id2wd) print(corpus[0:2]) print(id_data[0:2]) print(ward_data) |
実行結果
Markov連鎖は単純なので理解できたけど、RNNはちょっと複雑で未だ理解できていないけど、しばらく続けてみたい。