(SlackBot) 古見さんとすこしだけ仲良くなった

f:id:panchiga:20161019211004p:plain

新機能

古見さんとちょっと仲良くなった
- -> なにか一緒にしようって言うとやりたい感じの反応を返してくれるようになった。
かわいい。

gistcc48ee3542c3f70c3df34656875150e8

(コードがドンドン長くなってくのでここからはgistのリンクだけになるよ。)

スクショ

f:id:panchiga:20161029030224p:plain

しかし問題がある。

f:id:panchiga:20161029030531p:plain

これじゃ大変スケベでよろしくないので卑猥フィルタを実装する。


卑猥フィルタ

1. 卑猥ワードリストでフィルタ

予めテキストファイルでスケベワードリストを作ってフィルタをかけてみた

スケベワードが来ると理解が追いつかず石になっちゃう様のナレーションが入る

ソース

gist5f1768f59707f09b0afa098415655617

(wordlist.txtには適当に弾きたいワードが入ってる)

しかし、コレではBot製作者が言ってほしくないワードに反応するだけのただのロボットである。

古見さんBotはロボットじゃないのでこれはよくない。


2. 検索エンジンに判断させてみる

ワードリストを使わない手法として検索エンジンを使う方法を思いついた。手順は以下の通り
1. 古見さんに対して「~しよう」の構文で投げられた言葉に対して「~」をWebで検索する
2. 検索によって得られた検索結果の件数を覚えておく
3. エロコンテンツにフィルタをかけて再度「~」で検索する
4. 今回得られた検索結果の件数と、2で覚えておいた検索結果の件数で差を計る。
5. 得られた差が閾値より大きかったらエロだよ!って判断する

(閾値はてきとう。今回は倍以上離れてたらエロってした。)

課題: リクエスト数

なんか検索エンジンAPI使おうとすると軒並み制限が厳しいっぽい。
参考: 無料で使える画像検索APIとリクエスト数制限まとめ - Qiita

とりあえず自分の知ってる強そうな検索エンジンだとGoogleとBingかなあとおもって比較

  1. Google APIの場合、1日に100リクエスが限界
  2. Bing Search APIの場合、1日に166リクエスト(5000リクエスト/月)が限界


この事からちょっとはBing有利かなと思って、画面からセーフサーチ「オフ」と「厳しめ」で比較してみると、

  1. セーフサーチ オフ(アダルトコンテンツ出すモード)
    f:id:panchiga:20161029031320p:plain

  2. セーフサーチ 厳しめ(いやらしそうなのは許さない)
    f:id:panchiga:20161029031433p:plain

Bingお前マジか…

ってことで今回はGoogle APIを使うぞ!!!Googleサイコー!!!!

Google Custom Search APIを使う

このブログのとおりに進めた
google custom search engine(CSE)を使って、検索結果をjsonで取得する - ryutamaki

やったこと
1. Google Custom search API keyの取得・設定
2. Custom search engine IDの作成・設定

https://www.googleapis.com/customsearch/v1?key={API_KEY}&cx={CUSTOM SEARCH ENGINE ID}&q={SEARCH_WORDS}

こんなので試せる

RubyAPIを叩く

これも以下のQiita記事
http://qiita.com/mogulla3/items/a4bff2e569dfa7da1896

スケベワード反応フィルタその2

ソース

gistf4d75dabda3a5b28cf8b865f0b6e4630

結果

f:id:panchiga:20161029034615p:plain

古見さんが自分で判断してすることを決めてくれるようになった…感動する…





ところが、「ゲームしてからスケベしよう」とかいうと喜んじゃう。
これじゃ何個も言われると判断できないアホの子だ。これもよくない。

形態素解析を使って名詞だけで検索して比較

Mecabを使って名詞だけを取り出す。

mecabとは

MeCabは 京都大学情報学研究科−日本電信電話株式会社コミュニケーション科学基礎研究所 共同研究ユニットプロジェクトを通じて開発されたオープンソース 形態素解析エンジンです。 言語, 辞書,コーパスに依存しない汎用的な設計を 基本方針としています。 パラメータの推定に Conditional Random Fields (CRF) を用 いており, ChaSenが採用している 隠れマルコフモデルに比べ性能が向上しています。また、平均的に ChaSen, Juman, KAKASIより高速に動作します。 ちなみに和布蕪(めかぶ)は, 作者の好物です。

Mecab: http://taku910.github.io/mecab/


こんなことができます。
例: ゲームしよう f:id:panchiga:20161029034750p:plain


コレを使って、

「ゲームしてからスケベしよう」=> 「ゲーム スケベ」

にしたい


mecab

インストールするまで

Macにmecabインストール - Qiita

  1. mecabインストール
  2. mecabの辞書インストール

$brew install mecab $brew install mecab-ipadic

インストールしたらmecabって打つと立ち上がるので、上のサンプルみたいにゲームしようとか打つと上のサンプルみたいな結果が得られる

こんなのもあるみたいですね

mecab-ipadic-neologd

http://diary.overlasting.net/2015-03-13-1.html
mecabのipadicより強い辞書

Rubymecab

gemコマンドで入る

$gem install mecab


ゲームしてからスケベしようから名詞だけ取り出す

gist99540c9fa26ef64a291987283fdb7952

できた。続いて古見さんに組み込む。

gistb350e265f654d1b8e25e53ae75f43359

さあ動け!

f:id:panchiga:20161029040103p:plain

ダメみたいですね。
今回は古見さんはエッチでしたということで…

github

GitHub - panchiga/Komi-Slack

まとめ

  • 卑猥フィルタを実装した(精度を上げるのが課題っぽい)
  • google Custom search APIを使った

    ドキュメントが読みたらないのでブラウザで見れる様なTotalResultを取ってくる手段が分からん
    (なぜかフィルターを厳しくすると検索結果の件数がでかくなることがある。)

  • mecabを使った

    製作者に感謝


感想

知らないことだらけで調べては真似してるからツギハギになってコードがすごいことになってしまった。
だいたいのことは先人がうまくやってるもんなんで調べればなんでも出てくるのはすごいなと思った。
きっとエロワードデータベースとかもあったりするんだろうなーなんて思ったけど結局見つかんなかったしググり力足りてない。
(ニコニコのコメントとかその辺のチャットツールとかって不適切な表現のフィルタリングとかどうしてるんだろ)

古見さんbotの中身をきれいにするか、できることを増やすか。次回はどうしようかな。