残り3週間で完成できるのか?ーWebアプリ制作日記その11

AIアプリ制作
my MacBook Air大活躍中!

さて、前回(こちら)のつづき、
Keras
辞書の作成と単語のID化を行う。

ID化した単語を、
Seq2SeqモデルEmbedding層(単語の埋め込み。分散表現)に入力すると、
One-hot 表現に置き換えられ、分散表現に変換されるのだ。

ここらへんは読むだけでは

「ちょっとなに言ってるかわかんない」(by サンドイッチマン富澤)

状態になるので、
コードを写経するだけではなく、
『ゼロから作るDeep Learning 2-自然言語処理編』
で確認しながら進めたい。

もう何度お勧めしたかわからんが、NLP必読書No.1!

まずは、

from tensorflow.keras.preprocessing.text import Tokenizer

で、KerasTokenizerクラスをインポート。

このTokenizerに読み込ませたい文章を,

texts = [“さりながら道の悪さよ日の始”, “家なしも江戸の元日したりけり”]

のようにリストで宣言するのだが、
実際には、
例のようにいちいち入力するのではなく、
別途データを作る。
(今回、俳句は17,000近くもあるのだから)

ただ、ここで気をつけるべき点が一点。
データ型だ。
ここのデータ型がstr(string:文字列)型でなければいけないのだ。

なんでそんなことをいうかと言うと、
前回先生からいただいたコードで、
Encoderデータを作ろうと思ったら、
まさかのエラーが出たのだ。

エラーメッセージ、多すぎるんじゃない?

エラーメッセージをそのままググったら、

「この問題はPandasとはあまり関係なく、Mecabの mecab.parse(text) に渡している textの形式が異なるために起きているように見えます。」

という回答にヒット。(そのサイトは、こちら

さっそく、

print(type(x))

で大元のEncoderデータのデータ型を確認したら、

>>〈 class ‘pandas.core.series.Series’ 〉

って、これ、なに?
よくわからん。
なので、

print(type(text))

で、変数textのデータ型を確認したら、

>>〈 class ‘float’ 〉

と出た。

これだ!

parse関数引数がとるデータ型は、
str型でなければいけないのに、
float型:浮動小数点(小数点を含む数値)になっていたのだ。

なので、

text = str(text)

str型に変換したら通った!
(このくらいのコードは知っている。)

で、話を元に戻し、
Tokenizerの手続きを続けると、

tokenizer = Tokenizer()

で、Tokenizer を初期化(インスタンス化)し、

tokenizer.fit_on_texts(texts)

fit_on_texts() メソッド引数に、宣言した文章のリストを与える。
これで、文章を解析して集計を行なってくれるのだ。

さらに、

tokenizer.texts_to_sequences(texts)

で、単語をリスト化し、辞書を作成。

次に、
Decoder データ

① 入力値(‘EOS’不要)と目標値(‘BOS’不要)に切り分け、
ゼロパディングして、長さを統一(可変長→固定長)する。

ゼロパディングとは、つまり、
長さの不揃い部分を0で埋めることだ。

from tensorflow.keras.preprocessing.sequence import pad_sequences

pad_sequencesクラスをインポート。

pad_sequences(sequences, padding=’post’)

で、0を後ろ(post)に埋め込み、すべての単語(ベクトル)を同じ長さのIDにする。

あ〜、しんど。

だんだん自分が何やってるかわかんなくなってくる

でもこれで、いよいよ明日からモデルの構築だ!

Follow me!