ダイバーシティについて思うこと ~おまけ:Word2Vecでテキストマイニング~
モチベーション
先日のブログで書いたダイバーシティについて思うことで読んだ、平成 27 年度 新・ダイバーシティ経営企業100選ベストプラクティス集
をテキストマイニングでみたら、どうなるのかなーと思った。文章の内容がジェンダーを扱っているから、
word2vecの単語ベクトル演算hoge - 女性 + 男性 = ??
でいい感じの結果がでそうじゃね?と思った。
だから、やってみた。
前準備
PDFから文字列の抽出
平成 27 年度 新・ダイバーシティ経営企業100選ベストプラクティス集はPDF形式だったので、txt形式での抽出が必要。なので、今回は下記のように、MacのAutomaterをつかった。 MacのAutomaterにこんな便利機能があるなんてしらなかった。 他にいい方法あるのか?
オープンデータを推進していくのであれば、PDF/Excel/Wordではなく、マシンリーダブルな形式で公開してほしいなーと思う。(今回はPDFからtext抽出が簡単にできるフォーマットだったので、まだ良かったけれども)
mecab-ipadic-neologdのインストール
新語も多そうだし、今まで使ったことなかったので、mecab-ipadic-neologdを使って見ることにした。手順通りでさっくり動いた。素晴らしい。
- https://github.com/neologd/mecab-ipadic-neologd
- ここの通りにインストール
はまったこと と その他やったことメモ
分かち書き
いままで、MecabはRバインディングしかつかったことなかったので、Pythonバインディングを使って見ることにした。
Unicode正規化問題:NFDからNFCへ変換
ここで超はまった。濁点がついているものが、なぜか2つの文字に認識されてしまっていた・・・。 たとえば、下記のスクリーンショットでは、上の段がその場の手打ち、下の段がPDFからのコピペで形態素解析にかけた例。
???
どういうことだ???
どうやら、調べているうちに以下のことがわかった
- 同じUTF8でもiconvコマンドでいう
UTF-8-MAC
というものがあるらしい - 同じエンコードでも、
NFD(Normalization Form Canonical Decomposition)
とNFC(Normalization Form Canonical Composition)
などのUnicode正規化形式があるようだ。
それを踏まえ、一回iconvをかませてみてコマンドラインで実行させると、コピペの方でも動いた
NFD、NFCなどのUnicode正規化についての公式ソースはここっぽいが、ちゃんと読めていない。
pythonでのNDFからNFCへの変換
上記のように、NFDとNFCの差を吸収するために、python標準モジュールのunicodedataというものがあって、こんな感じでいけた
input_txt = unicodedata.normalize("NFC", input_txt)
結果の解釈
正直、あまりいい結果ではなかった。
ダイバーシティと近い単語
indexes, metrics = model.cosine('ダイバーシティ') model.generate_response(indexes, metrics).tolist() [('経営', 0.9777175954393049), ('推進', 0.9493488836863957), ('背景', 0.9405226121981172), ('ねらい', 0.9167086474147148), ('成果', 0.8915281137436668), ('による', 0.8864413561932385), ('具体', 0.8492109090847545), ('トッブ', 0.8172590026184905), ('', 0.8033173111492387), ('役', 0.8032359500447465)]
「ダイバーシティ経営」とか、「ダイバーシティ推進」とか、そういう単語が多いんだろうな。
今回、面倒くさくてユーザ辞書を登録しなかったツケが・・・。
女性と近い単語
indexes, metrics = model.cosine('女性') model.generate_response(indexes, metrics).tolist() [('', 0.9516504744458031), ('比率', 0.9482203061129624), ('チャレンジド', 0.9392766193318395), ('外国人', 0.9371635739772827), ('正規', 0.9352772454507972), ('うち', 0.9328574628570115), ('管理職', 0.9317884908726096), ('対象', 0.9309495163793361), ('高齢者', 0.9293685720356456), ('8', 0.9286893905539622)]
「チャレンジド」「外国人」「高齢者」などダイバーシティで語られる多い属性が近い単語としてでてきてるっぽい。 「管理職」「比率」など、目指すものも出てきてる。
indexes, metrics = model.analogy(pos=['ダイバーシティ', '女性'], neg=['男性'], n=10) model.generate_response(indexes, metrics).tolist() [('経営', 0.38084921913518816), ('背景', 0.3606686110326993), ('推進', 0.3583549736063167), ('ねらい', 0.34780189415256557), ('による', 0.3189438602826802), ('成果', 0.31085862071206216), ('', 0.30317875191302024), ('具体', 0.29927134673262445), ('トッブ', 0.28671072270938336), ('層', 0.2769030190342583)]
ダイバーシティ - 女性 + 男性 = ??
女性におけるダイバーシティは、男性におけるものは何か?というベクトル演算。???なんだ?ほぼ変わらない・・・。かの有名な例king - man + woman = queen
って本当にでるのかいな!?と疑心暗鬼になるレベルで全然結果がでなかった。
ダイバーシティという単語は、男性・女性ともに関係がないということか。
感想
- テキストマイニングで何かを導き出すって難しい
文章量がまだまだ全然足りない?
- よく見るサンプルでは、wikipediaのデータをつかって、何時間/何日とトレーニングの計算をしているのに比べ、今回のものは一瞬でトレーニングの計算が終わってしまうぐらいの量だった。それでは全然足りないのか。
stop the wordsを除外するための効率のいいコーディング
- 現状、1文字1文字、replaceをかけているので、コードも汚いし、管理しずらいし、人手の作業感がハンパない。この辺をもっとスマートにする方法は探さないとなと思っている。すくなくとも、コードについてはもっと綺麗に描く方法あると思うので、そこは調べたい。