チャンスシステムの実現に向けた取り組み
この記事はぴょこりんクラスタアドベントカレンダーのために書かれたものです。
本記事はちょっとだけサナララのネタバレを含みます(ストーリとはほとんど関係ないです)。
サマリ
チャンスシステム実現のために、文書を入力した時に、それが無茶なお願いかを判別する判別器を作った。評価はしていない、出る気もしない。
はじめに
ぴょこりんが好きなゲームに、サナララ(もしくはサナララR)があります。(年齢制限あるので扱い注意)
本ゲームにおいて、チャンスシステムというシステムが存在します。詳細は公式ページをご覧頂きたいのですが、とあるご都合主義により、人のお願いを一個だけ叶えてくれるシステムです。
ここで特徴が一つあり、無茶なお願いについてはスルーされます。
さて、常に6億円ほしいと思っている私としても、こんなチャンスシステムがあったらいいなと思う訳です。しかし、そんなご都合主義は存在しないのです。そこでこう考えました。
システムのうち、お願いを叶える部分はきっとだれかが作ってくれるから、来る日に備えて、お願いが無茶かどうかを判断する部分を作ろうと。
実装方針
・入力:お願いが書かれた文書(例:「世界征服したい」)→出力:お願いが無茶かどうか(0,1)
・入力から名詞のBag of words(面倒なので次元削減はしてない)ベクタを作って、線形SVMによる判別を実装
ソースコード
正直殴り書きレベルです、ごめんなさい。うまく動きそうかもまともに見れてません。。
文書の形態素解析はMeCab, Bag of wordsベクトル作成と、線形SVMによる判別はscikit-learnを
使ってます。
#!/usr/bin/python # -*- coding: utf-8 -*- import MeCab from sklearn.feature_extraction.text import CountVectorizer from sklearn.svm import LinearSVC def check_feature(feature): if feature[0].decode('utf-8') == u'名詞': return True return False def analyzer(text): words = [] t = MeCab.Tagger('-Ochasen') e_text = text.encode('utf-8') node = t.parseToNode(e_text) while node: feature = node.feature.split(',') if check_feature(feature): words.append(feature[6].decode('utf-8')) node = node.next return words def get_count(texts): cv = CountVectorizer(analyzer=analyzer) count_vect = cv.fit_transform(texts) return count_vect def get_feature_vector(train_text,test_text): all_text = train_text all_text.extend(test_text) feature_vector = get_count(all_text) train_feature = feature_vector[0:len(train_text)-1,:] test_feature = feature_vector[len(train_text)-1:,:] return train_feature,test_feature def classify_lsvm(train_vector,train_label,test_vector): lsvc = LinearSVC() lsvc.fit(train_vector,train_label) print lsvc.predict(test_vector) if __name__ == '__main__': train_text = [u'キウイをいっぱい手に入れる',u'記憶喪失にならない'] train_label = [1,0] test_text = [u'神様になる'] train_f,test_f = get_feature_vector(train_text,test_text) classify_lsvm(train_f,train_label,test_f)
おわりに
・チャンスシステム下さい。
・ぐだぐだですみません。