
人工知能に「ニュアンス」を伝えたい!
突然ですが!みなさんは、誰かの名前を聞いたときにまず女性か男性かが頭に思い浮かびませんか?あれってよく考えたら不思議だと思います。
「子」で終わる名前は女性?でもそんな単純じゃないはず。。。
答えは簡単です!それは、人は言葉にニュアンスを感じているのです!
名前を聞いた時のニュアンスで女性か男性かを判断しているんですね。人はたくさんの人の名前と性別を見聞きする経験によってこのニュアンスを得ているのです。
ここでまた新たな疑問が生まれました。
人工知能にこの主観的なニュアンスを伝えることができるのか!?
つまりまとめるとこんな感じです!
どうして名前を聞いたら性別が分かるの??
⇓
人は名前にニュアンスを感じるからだよ。
⇓
人工知能にニュアンスを伝えることはできるの??
⇓
人工知能が名前から性別を判別できればニュアンスを伝えれたということ!
ということで今回は、人工知能に名前と性別を学習させて性別判定機を作ります!
では、さっそく開発していきましょう!
目次[非表示]
開発環境
今回は、Google Colaboratory を利用しました! Google社のGPU,TPUを利用できる有り難い代物です。
- OS : ubuntu 17.10
- CPU : Intel(R) Xeon(R) CPU @ 2.30GHz
- GPU : Tesla K80
- メモリ : 12GB
- プログラミング言語 : python
今回の開発で使用したライブラリはこちらです!
データの取得
まずはデータ集めから始めていきましょう!
方法としては、スクレイピングを行っていきます。スクレイピングとは、webサイトなどからデータを抽出することです。機械学習をするなら必須のスキルとなってくるのでぜひ習得しましょう!
男性の名前(ひらがな)5000個、女性の名前(ひらがな)5000個のデータを集めていきます!
今回は、以下のサイトを利用しました。
お名前辞典
スクレイピングにはBeautifulSoupを利用しました!
以下がスクレイピングのプログラムです!
プログラム
1つのページから50個の名前データを取得することができます!
男性名、女性名、それぞれ100ページ分(合計10,000個)のデータを取得し、テキスト形式として保存します。
データの加工
さて、必要なデータは集まりましたが、このままの形では学習に使えません。
不要なデータを削除したり、適当な形に変形していきます!
不要な文字の削除
取得したデータには不要な空白や文字が含まれています。
以下のプログラムを使って、それを削除していきます!
プログラム
これできれいな名前だけのデータに整形することが出来ました!
文字のベクトル表現
きれいなデータが用意できたので早速学習!といきたいところですが、今回は深層学習を扱うので文字のままだと学習できません。そこで、文字を深層学習に対応したベクトル表現に変えていきます!
One-hot表現
ベクトル化の手法には、One-hot表現やBOW表現などがあります!
BOW表現は単純で、単語内にその文字がどのくらいの頻度で含まれているかに着目したベクトルです。しかし今回は、文字の順番に注目したモデルを作っていこうと思っているので、頻度に注目したBOW表現は扱いません。
そして、今回の開発ではOne-hot表現を扱いたいと思います。
One-hot表現というのはある要素のみが1でその他の要素が0であるような表現方法のことです。各次元に 1 か 0 を設定することで「その文字か否か」を表します。
後に紹介するRNNモデルとOne-hot表現を利用することで、文字の順番を考慮したモデルを作っていきます!
以下のプログラムでベクトル化をしていきます!
プログラム
letterToIndex()関数は該当文字のインデックスを返す関数です。lineToTensor()関数は letterToIndex()関数を利用して文字列をOne-hot表現に変換しテンソルとして返してくれます。
One-hot表現に変換したデータはdata_listに、ラベルデータはバイナリデータに変換してlabel_listに保管します。
これでデータの準備が整いました!
RNN
今回の開発では、学習モデルとしてRNNを選択しました。ざっくりですが、RNNの概要を説明していきます!
RNNの概要
RNN(Recurrent Neural Network)とは、ニューラルネットワークに時間の概念を加えたものです!
RNNのR(Recurrent)は再帰的構造を持つという意味です。言い換えれば、出力が入力に影響を与えるということになります!
データをループさせることがRNNのネットワークの特徴であり、ループをするメリットは、「過去の情報を記憶しながら絶えず最新のデータを持ち続けられる」ことです。
RNNでは時間の概念をニューラルネットワークに取り入れるために、過去の情報をモデル内で保持しています。
このような仕組みが、前後の文脈を保持したまま情報の伝達・解釈を行うことを可能にしています。
下の図はRNNの簡単な流れを表した図になります。
今回扱う名前データは、連続した文字を連結したものです。
RNNを用いることで、文字の順番という文脈を考慮して学習を行うことができます!
学習モデルの構築
それでは実際に学習モデルを構築していきます!
学習モデルの構築にはkerasを用いて設計します。kerasはpythonで書かれた深層学習用のライブラリで、直感的なコーディングをすることができ、初学者に扱いやすい設計となっています。
以下がモデルのプログラムになります!
プログラム
損失関数にはcategorical_crossentropyを、optimizerにはadamを使用しています。
モデルを定義する際に、関数型にするとチューニングが分かりやすくなって良いです!
結果
それでは実際に学習を始めていきましょう!
まず、学習用データ、教師ラベルを、トレーニングデータ、テストデータに分割します!
X_train, y_trainは学習用データ、X_test, y_testは教師ラベルとなります。
今回はトレーニングデータ:テストデータを7:3で分割します。
バッチサイズは100で100エポック学習させます。
上のプログラムを実行した結果がいかになります!


精度は80%とまずまずですね!
上の図は精度の、下の図は損失関数の推移を示したものです。30エポックほどでテスト時はほぼ横ばいですね。これ以上行くと過学習気味になるので100エポックでストップです。
テストデータを使った検証
つぎに、いくつかのテストデータを使ってどのように判定がされているか見てみようと思います!
上のプログラムを実行した結果が以下になります!
テストデータとして、女性的な名前4個、男性的な名前4個と中性的な名前を4個を用意しました。男性的、女性的な名前に関しては正答率が100%ですが、中性的な名前に関しては、4個中2個誤判定となっています。

ひらがな → アルファベットに変換してチャレンジ!
こんどは、ひらがなをアルファベットに変換して挑戦してみます。
アルファベットに変換することで、1文字を母音+子音に分解できるので、モデルの表現度が上がるのではないかと考えました!
プログラム
ひらがな → アルファベットへの変換にはpykakasiを利用しました。pykakasiは、日本語をローマ字に変換するモジュールです。
まず、pykakasiのkakasi()というインスタンスを作成します。
次に、kakasi.setMode("H", "a")でひらがな→アルファベットに変換する設定をしています。そして、kakasi.getConverter()インスタンスを作成し、conv.do(name)でnameに入っているひらがな文字列をアルファベットに変換しています。
pykakasiは標準ライブラリではないため、実行する際はいかのコマンドを用いてインストールしてください!
結果
それでは結果を見ていきましょう!

精度は77%と下がってしまいましたね。。。
アルファベットはひらがなに比べて少ないため、モデルの表現度が下がってしまったのかもしれません。
考察
[精度が上がらない原因] 名前の多様性が高くなっている!?
精度が80%どまりで向上しなかった理由を考察したいと思います。
理由の1つとして考えられることは、現代において、名前の多様性が高くなっているということです。今回スクレイピングに用いたwebページの名前一覧から、いくつか例をあげましょう。「そら」、「るか」といったように昔は女性にしか見られなかった名前が男性にあったり、「ぽっぺんぱいん」(男性名)、「めいふぁ」(女性名)といったような、中性的な名前も多くありました(20代の自分から見て)。
このように、現代における名前は多様化していて、人工知能も判別率が下がったと考えました。
今後の展望
[提案] 構成要素間の相互作用を考慮
今回の開発では、名前の構成要素を文字(ひらがなとアルファベット)として扱ってきました。
そして、RNNをモデルとして採用することにより、文字の順番を考慮しました。しかし、人間の印象のような主観的な事象を扱うには単純すぎる気がします。
そこで、名前の構成要素間の相互作用を考慮することを考えました。
例えば、一音目の母音が「あ段」で三音目の子音が「か行」の場合の相互作用といったような感じです。これを変数化することができればより表現力のあるモデルが構築できそうだと考えました!
具体的な手法についてはまた考えていければいいなと思っています!
結果的に、まあまあニュアンスを伝えられたんじゃないでしょうか!?
PythonやAIプログラミングを学ぶなら、オンライン制スクールのアイデミープレミアムプラン。
「機械学習・ディープラーニングに興味がある」
「AIをどのように活用するのだろう?」
「文系の私でもプログラミング学習を続けられるだろうか?」
少しでも気になることがございましたら、ぜひお気軽にAidemy Premium Planの無料相談会にお越しいただき、お悩みをお聞かせください!このほかにも、Aidemy MagazineとTwitter(@AidemyMagazine)ではたくさんのAI活用事例をご紹介しています。どちらも要チェック!それではまた次の記事でお会いしましょう。最後までご覧くださりありがとうございました。