TF-IDFを用いたCPS月別流行語大賞2018

この記事は、CPS Lab Advent Calendar 2018の21日目の記事です。

adventar.org

はじめに

本記事では「slackのログデータから流行語を決定する」という題材に取り組みます.

データ

この記事を参考にしました. motemen.hatenablog.com

とれました.

f:id:aj1m0n:20181221090842p:plain
データ

1万件の制約上8月までしか遡れませんでした.

データ加工

本題ですね.

ここを参考にしてスプレッドシートと対話していきます. note.nkmk.me

会話本文を抽出してリストで管理します.

wb = {}
for i in [8,9,10,11,12]:
    wb[i] = openpyxl.load_workbook("../input/iwailab/2018-%s.xlsx"%(str(i).zfill(2)))
test = {}
for i in [8,9,10,11,12]:
    test[i] = []
    sheets = wb[i].sheetnames
    sheets.remove("シート1")
    for sheet in sheets:
        wb_sheet = wb[i][sheet]
#         print(wb_sheet)
        for cell_obj in list(wb_sheet.columns)[2]:
            test[i].append(cell_obj.value)

分かち書きをして,単語を抽出します.

df = {}
import sys
import MeCab
mecab = MeCab.Tagger ("-Owakati")
for i in [8,9,10,11,12]:
    df[i] = []
    for textdata in test[i]:
    #   print(textdata)
        text = mecab.parse(str(textdata))
        df[i].extend(text.split(' '))

TF-IDF

最低限の処理を施します.

  • 自然言語処理の世界ではStop wordsと呼ばれるような単語の除去

  • 単純な登場回数ではなく、他の年にあまり出てこない単語を重要視して評価

slothlib_path = 'http://svn.sourceforge.jp/svnroot/slothlib/CSharp/Version1/SlothLib/NLP/Filter/StopWord/word/Japanese.txt'
slothlib_file = urllib.request.urlopen(slothlib_path)
slothlib_stopwords = [line.decode("utf-8").strip() for line in slothlib_file]
slothlib_stopwords = [ss for ss in slothlib_stopwords if not ss==u'']
slothlib_stopwords.append("です")
slothlib_stopwords.append("ます")

結果発表

どの月でも出てくる単語を除き,その月を振り返りながら流行語を決定します.

それでは,発表したいと思います!!

8月「遅れ」

f:id:aj1m0n:20181221093339p:plain
8月
ミーティングに遅刻していることが容易に想像できてしまいます.

9月「研究」

f:id:aj1m0n:20181221093041p:plain
9月
後期に入って焦っている先輩がいましたね.

10月「16」

f:id:aj1m0n:20181221094311p:plain
10月
ちょうど16生の配属が決定した時期でもありました.

11月「発表」

f:id:aj1m0n:20181221093120p:plain
11月
11月に入ると学会発表をする先輩がチラホラと

12月「画像」

f:id:aj1m0n:20181221093114p:plain
12月
12月の表は正直良くわからないです.輪郭,関数,抽出など何か画像系の作業をしている人がいるんでしょうか?

まとめ

いかがでしたか?CPS内の素性を知ることができたような気がしますね.

今回はデータが半年分しかなかったので,月毎という形になりました.

来年はログがいい感じに溜まっていると思うので,アドベントカレンダー2019でリベンジしたいと思います!

コードはgithub上で公開しています

github.com

おわり

Labmartの顔認証を実装してみる

この記事は,CPS Labo Advent Calendar 2018の14日目の記事です.

adventar.org

13日目の記事はこちら

qiita.com

 

ご挨拶

こんにちは,B3のanzyです.この度無事CPSに配属されました.よろしくお願いします.

Labmart is 何?

こちらをご覧ください.

unotovive.hatenablog.jp

顔認証システム

流れはこうです.

webcamが起動 → 顔検出 → 予測 → いわいっぺい!

開発環境

python3.5.2

ubuntu16.04

webカメラから画像を抽出

import cv2 # OpenCV のインポート
cap = cv2.VideoCapture(int(cameraid))

簡単ですね.あとはcap.read()をすれば1フレームを読み込むことが可能です.

リサイズとグレースケール化

frame = cv2.resize(frame, (int(frame.shape[1]*0.7), int(frame.shape[0]*0.7)))
 
# 処理速度を高めるために画像をグレースケールに変換したものを用意
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)

画像サイズが大きいと処理が重くなってしまいます.リサイズとグレースケール化してあげます.

顔検出

cascade = cv2.CascadeClassifier('models/haarcascade_frontalface_default.xml')
facerect = cascade.detectMultiScale(gray)

簡単ですね.これだけで顔を検出できます.

Haar like特徴量とは(専門でなければ飛ばす)

Haar like特徴量とは,よくわかりませんがここが全てです.

簡単に説明すると,

  • 探索窓の任意の位置に矩形領域を配置する.
  • 矩形領域に任意のパターンを設定する.
  • パターンの黒領域、白領域それぞれの画素値の和の平均A_1, A_2を求める.
  • それらの差を特徴量Hとする.
  • 矩形領域の位置・サイズ・パターンを変えて繰り返す.
  • 検索窓の位置を変えて上記を繰り返す.

こうして無数の特徴量Hを得られました.お疲れ様です.

予測

recognizer = cv2.face.LBPHFaceRecognizer_create()
recognizer.read("models/test/LBPHF.xml")
def test_get_images_and_labels(image):
face = np.array(image, 'uint8')
label, confidence = recognizer.predict(face)
return label, confidence
 
label,con = test_get_images_and_labels(cv2.resize(face_gray,(200, 200),
interpolation=cv2.INTER_LINEAR))

LBPHとはLocal Binary Patterns Histogramの略です.顔を小さなセルに分割し、それぞれのエリアのヒストグラムを比較します。

参考記事

towardsdatascience.com

 labelが特定した人のid,conが信頼度みたいなものです.

conの閾値を設けることで,よりセキュア(?)な認証になります.今回は経験則から60以下としました.

さらに,labelが30フレーム連続で同一人物であるなどの条件をいくつか設けています.

 

いわいっぺい

こうして,ボスイケボな「いわいっぺい」を聞くことができます.

まとめ

まだまだ,決算システムとしては未熟です.

顔を登録して顔認証してもらうと分かると思いますが,高確率で私のidになってしまいます.顔が平べったいからかもしれない

 vueオタクとまた残留して頑張りたいと思います.

おわり