どらちゃんのポッケ

R・統計・技術メモなど勉強ログ置き場

ダイバーシティについて思うこと ~おまけ: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を使って見ることにした。手順通りでさっくり動いた。素晴らしい。

はまったこと と その他やったことメモ

分かち書き

いままで、MecabはRバインディングしかつかったことなかったので、Pythonバインディングを使って見ることにした。

Unicode正規化問題:NFDからNFCへ変換

ここで超はまった。濁点がついているものが、なぜか2つの文字に認識されてしまっていた・・・。 たとえば、下記のスクリーンショットでは、上の段がその場の手打ち、下の段がPDFからのコピペで形態素解析にかけた例。 f:id:sleeping_micchi:20160501220048p:plain

???

どういうことだ???

どうやら、調べているうちに以下のことがわかった

それを踏まえ、一回iconvをかませてみてコマンドラインで実行させると、コピペの方でも動いた f:id:sleeping_micchi:20160501220022p:plain

NFD、NFCなどのUnicode正規化についての公式ソースはここっぽいが、ちゃんと読めていない。

同じ文字コードでも、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をかけているので、コードも汚いし、管理しずらいし、人手の作業感がハンパない。この辺をもっとスマートにする方法は探さないとなと思っている。すくなくとも、コードについてはもっと綺麗に描く方法あると思うので、そこは調べたい。