社内の会議情報を機械学習して有識者検索エンジンを開発するというHRTechしてみた
09
- 1月
2020
Posted By : boomin
社内の会議情報を機械学習して有識者検索エンジンを開発するというHRTechしてみた
Advertisements

TL; DR

社内に眠るダークデータ、会議関連のデータを活用することで、有識者検索エンジンを作ります。

これで、社内の有識者やその有識者へのコンタクトパスを探せるようにします。

1. 背景。。。

1.1 働き方改革とはなんぞ

働き方改革あるあるとして、ジタハラがよく言われますね。

ジタハラ:
残業時間削減のための具体策がないまま、社員に「残業をするな」「定時に帰れ」などと退社を強要すること

とあります。真面目な皆さんは、言われたとおりに帰ります 持ち帰ってサービス残業することになります。

んなアホな!!!

Advertisements

1.2 会議・・・減らしてみる?

朝日新聞によると、

大企業でのムダな会議の損失 年間67万時間と15億円

だそうですよ。単刀直入に聞きます。

あなた、会議減らせます?
15億円削減できたら、ゴーン氏くらい報奨があってもいいんじゃない?

世の中には、こんなにたくさんのノウハウにあふれていますしね!!!!

なのに、なぜ何年たっても変わらないのでしょうね。。。。。 個人的には結局のところ、本気で会議回数や時間を減らそうと思っていないんだと思います。要するに、ググって出てくるようなノウハウって、結局のところそれだけでは無策に等しいんでしょうね。

1.3 会議・・・データを活用しちゃう?

ベンチャーならまだしも、300人※を超えるような規模になってくれば、従業員一人の力でできることも限られてきます。
※中小企業の定義によれば、業種によって異なれど少なくとも300人を超えれば大企業ということらしい

といって、何もしないでいる訳にはいきません。 あなたや僕の会社で実施されているように(暴言)何も考えずに会議を減らすのではなく、少しでも活用してみようではありませんか。

2. 課題と解決方針

2.1 大企業でありそうな課題

グループ含めた従業員数が、一定数を超えた組織でありがちな課題として、

  • 〇〇について知りたいんだけど、誰に聞いていいかわからない
  • 聞く人はわかったけど、面識がないからいきなり話しかけづらい

なんてことはありませんか?ありますよね?

ということで、これを解決すべき課題と設定することにします。

2.2 解決方針

無駄に蓄積されていて、ダークデータの筆頭なのではないか?と思われる、会議データを活用してみることにします。

ダークデータ
「企業内で価値を生む可能性があるのに活用できていないデータ」を指す

蓄積するだけして活用されていない。ググっても、活用事例なんて出てこなかった。なんて、もったいない。
※もし普通に出てくるようなら、僕のググりスキルがとても残念だなって。。。。

2.3 会議データの特徴

ここで、会議データの特徴ついて考えてみることにします。

メリット

  • (一般的に)社内ではオープンデータ
  • 全社員を網羅(経営層はもしかしたら非公開かもしれないけど)
  • リアルタイム

デメリット

  • 個人情報かもしれない
  • もしそうなら、取扱方針とかを考えて多く必要があるかもしれない(面倒)

デメリットもあるけど、、、、、まずはやってみるか!

3. データ収集と前処理

ここで実際の社内データを全世界に公開するわけにいかないので(汗、ポイントポイントについて書いていきます。なお、会議というかグループウェアとして、Office Outlookを使っているものと仮定します。ただ、取得方法の違いはあれど、考え方は基本的に同じはずです。

3.1 o365 API

Outlookクライアントを介したVBScriptでもいいですし、o365ならAPI叩いてもいいです。 後々のため、以下の情報は取得しておきましょう。

  • 氏名
  • MailAddress
    • 同姓同名が存在する可能性があるので、Unique Keyとして便利
  • 所属
  • 役職
  • 会議件名
  • 会議開始時間
  • 会議終了時間
  • 会議本文
    • Outlookのスケジューラを開くと読める内容

繰り返し指定がされている予定もあるので、どう扱うのか含めて検討して取得してください。

3.2 データ加工(前処理:形態素解析など)

取得したデータを、機械学習できるように加工します。 以下に、実施すべきだろう加工内容を示します。

っているかぶっちゃけ、ここに書いてあります

実際にどうすべきかは解決すべき課題ごとに違うので、ここでは具体的には述べることはしません。

3.3 クレンジング

ここの処理は自動化は無理なので、自分で頑張るしかありません。 特に、形態素解析した結果の単語が、意味のあるものになっているかどうか、は特によく見る必要があります。

ありがちなのが

  1. 社内用語(部署名など)が意味不明な単語に区切られている
  2. 社内用語が(形態素解析の過程で)除去された
  3. 人名が頻出する
    • これをどうするかはケースバイケース
  4. 「会議」とか「打ち合わせ」が頻出する
  5. 表記ゆれが酷い

特に、#4は残しておいて学習させても、そこから何か情報を得られる可能性はかなり低いと思われます。こうした単語を一つ一つ確認し、除去したり表記ゆれを統一する必要があります。

Mecabなど形態素解析エンジンのユーザ辞書に、必要な単語を登録するのが手っ取り早いです

3.4 実際にデータを取得して適用する

ここで実際の社内の会議データを世界にさらすと、僕はクビになってしまいます。。。。ので、国会の議事録を取得して、これを使うことにします。

それらしく、

  • 機械学習
  • AI
  • ビッグデータ
  • 人工知能

を検索キーワードとして、2010年から2019年までの10年間を対象として取得しました。

国会の議事録の通りに取得してpandasのdataframeに格納してれば、以下のような内容となっているはずです。

In[5]: df.head()
Out[5]: 
        date speaker  ...     speakerGroup speakerPosition
0 2010-02-17    藤末健三  ...  民主党・新緑風会・国民新・日本                
1 2010-02-24    首藤信彦  ...       民主党・無所属クラブ                
2 2010-02-26   井戸まさえ  ...       民主党・無所属クラブ                
3 2010-02-26   井戸まさえ  ...       民主党・無所属クラブ                
4 2010-02-26   井戸まさえ  ...       民主党・無所属クラブ  

一部で文字コードの問題があったので、対処しています。 それと後々、会議のデータに挿げ替えても使えるように、カラム名を変更しておきます。

df.rename(columns={"speaker":"Name", "speech":"Subject","date":"StartTime"}, inplace=True)
df["Subject"] = df["Subject"].swifter.apply(lambda x: x.encode('utf-8').decode('utf-8'))
df["Subject"] = df["Subject"].fillna("")
pd.to_pickle(df, f"{pklDir}{spt}all_merged.pkl")

さらに、前節までで述べたようなクレンジングと形態素解析を行い、その結果をsub_mecabカラムに格納します。その結果がこちら。

df[["Name","sub_mecab"]]
Out[11]: 
       Name                                          sub_mecab
0      藤末健三  班 団長 いただく 藤末 健三 班 アメリカ合衆国 カナダ 視察 いただく 団員 泉信也 委...
1      首藤信彦  大臣 大臣 所信 総理大臣 新しい イニシアチブ 受ける 新しい公共 教育 分野 触れる 現...
2     井戸まさえ  ハーグ条約 締結 推進 いただく いらっしゃる dv 被害者 中心 国内 整備 締結 慎重 ...
3     井戸まさえ  先般 問題 報道 直後   閣議後 記者会見 大臣 このまま 問題 民法 性同一性障害 一定...
4     井戸まさえ  ある意味 議論 尽くす 最後 まとめる 段階 入る  議論 最初 たつ 法律 その間 ケース...
    ...                                                ...
4288    江藤拓  自民党 酪政 幹事長 都府県 酪農 中小 規模 方々 多い 乳価 いい 経営 悪い 高齢 休...
4289   浜田昌良  是非 丁寧 説明 お願い sip  いう シェア ード インフォメーション プラットフォーム...
4290   石井苗子  予断 許す  大臣 お答え 議事録 残る 信じる 質問 ジャンル 変える 先ほど 話題 畜産...
4291   緑川貴士  議題 決議案 つく 提出 代表 趣旨 説明 申し上げる 案文 朗読 趣旨 説明 かえす いた...
4292  萩生田光一  先生 指摘 自己採点 在り方 問題意識 持つ 解決 センター ai 使う シミュレーション ...

このsub_mecabカラムにあるデータを対象に機械学習などを行っていきます。 最後に、表記ゆれを押さえる為に、全て小文字にします。

# 全て小文字にする
df["sub_mecab"] = df["sub_mecab"].str.lower().fillna("")
# 念のため空行削除
df = df[(df["sub_mecab"]!="") & (df["sub_mecab"]!=None) & (len(df["sub_mecab"])>0)]
# 再index
df.reset_index(inplace=True, drop=True)
# 保存
pd.to_pickle(df, f"filterred_mecabdata.pkl")

4. 機械学習

長くなったので、ここは別記事にします。

5. ネットワーク分析

長くなったので、ここは別記事にします。

6. 可視化

Vue + Vuex + Vuetifyを使って開発しました。

6.1 まずはHome画面!

ホーム画面がダサいと、それだけで帰ってしまう人がいるかもしれません。 ので、自分基準でカッコイイ感じに頑張りました(配分間違い

6.2 有識者を検索

左側のペインメニューからKeyword Searchを選択して、単語による人の検索を行います。

をを! 機械学習という単語で検索すると、ちゃんと文部科学大臣が入っていますね

ちなみに、AIだとこんな感じ。

なお、色はある程度発言が似た人同士をクラスタリングして、クラスタ別の色となっています。 ここでは政党別とかにすればよかったかもしれないけど、もうめんどくさいのでそのままとします。

6.3 コネを検索

次はコネ検索です。 Member’s Searchから、安倍首相のコネ(ここでは似たような発言の人)を検索します。

ほほう。。。。(国会議事録データでこれを見ても、なんの感想も出てこなかったwww) きっと、自社で実際の会議データを食わせたら、少しは面白い、はず。。。。

6.4 人脈を検索

いよいよ、人脈検索です(一番やりたかったこと)。 それでは、安倍首相とその懐刀?の麻生太郎財務大臣とのつながりを調べてみます

発言の内容をもとにすると、途中で今別府敏雄氏をはさむんですね。 この辺は、学習させたモデルによるので、とりあえずはいいことにします。

次に、安倍首相と山本太郎議員とのつながりを調べてみます。 (なんとなく思いついた国会議員だったので)

途中で、3人もはさむんですね。そうですかそうですか。

6.5 検索対象語の候補提示

検索できる単語が多いし、対象の人も多いのですが、存在しない単語を検索しても何も結果が返りません。そこで、検索クエリを投げる前にvalidationを実施しています。といっても、どんな言葉ならOKなのか知るのは難しいので、単語を入力し始めると、検索語の候補を表示させる機能を実装しています。

これで、どんな言葉なら検索できるが分かって安心!

7 開発所感

ここまで作っておいて思ったことは、UXデザインとかUI設計というのは大事だなって。。。。

学習データの準備もクレンジングも形態素解析も機械学習もAPI開発も、どれもそんな大変じゃなかった。それなりにゴールが明確だったからかな、と思っています。

でも、フロントエンドははっきりとイメージを持たずに作り始めたこともあり、あーでもないこーでもないを繰り返しました。おかげでsource codeもちょっとイケていない感じなってしまい辛い。。。。

今のこの画面も、自分ではいまいちと思うものの、どうしたらいいのかさっぱりピーマンです。

8 最後に、働き方改革にむけて

ここでは国会議事録データをもとにした画面をお見せしましたが、学習データを自社の会議データを対象とし、自社内で(勝手に)運用してみることにしました。 そのうち、いろいろなご意見をいただけると思うので、どれもポジティブに捉えて、

あれ?これって誰が詳しんだっけ?
あ、これで検索すればコネも分かってラッキーだYO!

ってみんなが思ってくれたり、

この人はこんな仕事してるのか。
なら、今度、ちょっと相談させてもらって企画のアイデアのブレストしてみるか!

とか思ってくれたら嬉しいなって思います。

Advertisements

コメントを残す