七転八転

よしなしごとを。

チャンスシステムの実現に向けた取り組み

この記事はぴょこりんクラスタアドベントカレンダーのために書かれたものです。
本記事はちょっとだけサナララのネタバレを含みます(ストーリとはほとんど関係ないです)。

サマリ

チャンスシステム実現のために、文書を入力した時に、それが無茶なお願いかを判別する判別器を作った。評価はしていない、出る気もしない。

はじめに

ぴょこりんが好きなゲームに、サナララ(もしくはサナララ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)

おわりに

・チャンスシステム下さい。
・ぐだぐだですみません。