2013-01-08 :-(
_ 胃が重い
昨日の昼飯を 鳥元 ミューザ川崎店 で鶏のから揚げらしきものを食べたんだが、それ以来 胃が重い。ずーっと満腹感が続いている。腹減らない。そばにしておくべきだったかなあ。
_ [k近傍法][ネガポジ][自然言語処理][機械学習]k近傍法もどきで文章をネガポジ判定してみた
辞書
ネガポジ辞書はこちらを使った。名詞と用言があるのだが両方使った。
k近傍法
k近傍法(k - Nearest Neighbor)は目的のわからないデータから、全既知データまでの距離を測ります。そして距離の短い順k個で多数決し判断します。k近傍法(k - Nearest Neighbor)は目的のわからないデータから、全既知データまでの距離を測ります。
kNN法とか呼ばれるアレ。
実装
距離を測るのが正攻法なんだけど、今回使うネガポジ辞書を全ての単語への距離を 1 とみなして処理しておく。処理が簡単になる。
また、ポジティブを +1 、ネガティブを -1 とし、たんに文章のポジティブ、ネガティブの点数を数えるようにした。k近傍の由来の k個の近傍を処理していないので k近傍ですらないか。
コード
前処理とかいろいろ省略。
#!/usr/bin/ruby # -*- encoding: utf-8 -*- require 'pp' class Dictionary attr_accessor :item def initialize(v_dic, n_dic) @item ||= {} v_dic = verb_dictionary(v_dic) n_dic = noun_dictionary(n_dic) @item.update(v_dic) @item.update(n_dic) end # 識別辞書 日本語評価極性辞書(用言編) def verb_dictionary(filepath) dic ||= {} lines = File.open(filepath).readlines() lines.each {|line| line.rstrip! sp = line.split(/\t/) tag = sp[0] pn = tag[0] + tag[1] # 単語が書いてない行があるので無視する verb = sp[1] next if verb == nil verb.gsub!(/ /, '') score = 0 if pn == "ポジ" score = 1 elsif pn == "ネが" score = -1 end dic[verb] = score } return dic end # 識別辞書 日本語評価極性辞書(名詞編) def noun_dictionary(filepath) dic ||= {} lines = File.open(filepath).readlines() lines.each {|line| sp = line.split(/\t/) noun = sp[0] pn = sp[1] score = 0 if pn == "p" score = 1 elsif pn == "n" score = -1 else score = 0 end dic[noun] = score } return dic end end class KNN def initialize(dictionary) @dictionary = dictionary end # 前処理部 def pretreatment(statement) end # 特徴抽出部 def extraction(statement) end # 識別部 def identification(statement) score = 0 @dictionary.item.each {|word, pn| hits = statement.scan(word).size score += (pn * hits) } if score > 0 return "ポジティブ" elsif score < 0 return "ネガティブ" else return "ニュートラル" end end def build(statement) pretreatment(statement) extraction(statement) identification(statement) end end def main(argv) verb_dic_path = argv[0] noun_dic_path = argv[1] statement = argv[2] dictionary = Dictionary.new(verb_dic_path, noun_dic_path) knn = KNN.new(dictionary) pn = knn.build(statement) puts "#{pn}" end main(ARGV)
実行
死にたくない。
% ruby193 -Ku kNN.rb ./NLP/dic/wago.121808.pn ./NLP/dic/pn.csv.m3.120408.trim 死にたい ネガティブ
じつはツンデレ?
% ruby193 -Ku kNN.rb ./NLP/dic/wago.121808.pn ./NLP/dic/pn.csv.m3.120408.trim 働きたくないでござる ポジティブ
ルイズコピペ (クンカクンカ/ 同人用語の基礎知識)
% ruby193 -Ku kNN.rb ./NLP/dic/wago.121808.pn ./NLP/dic/pn.csv.m3.120408.trim ルイズ!ルイズ!ルイズ!ルイズぅぅうううわぁああああああああああああああああああああああん!!!あぁああああ…ああ…あっあっー!あぁああああああ!!!ルイズルイズルイズぅううぁわぁああああ!!!あぁクンカクンカ!クンカクンカ!スーハースーハー !スーハースーハー!いい匂いだなぁ…くんくんんはぁっ!ルイズ・フランソワーズたんの桃色ブロンドの髪をクンカクンカしたいお!クンカクンカ!あぁあ!!間違えた!モフモフしたいお!モフモフ!モフモフ!髪髪モフモフ!カリカリモフモフ…きゅんきゅんきゅい!!小説11巻のルイズたんかわいかったよぅ!!あぁぁああ…あああ…あっあぁああああ!!ふぁぁあああんんっ!!アニメ2期決まって良かったねルイズたん!あぁあああああ!かわいい!ルイズたん!かわいい!あっああぁああ!コミック2巻も発売されて嬉し…いやぁああああああ!!!にゃああああああああん!!ぎゃああああああああ!!ぐあああああああああああ!!!コミックなんて現実じゃない!!!!あ…小説もアニメもよく考えたら…ル イ ズ ち ゃ ん は 現実 じ ゃ な い?にゃあああああああああああああん!!うぁああああああああああ!!そんなぁああああああ!!いやぁぁぁあああああああああ!!はぁああああああん!!ハルケギニアぁああ ああ!!この!ちきしょー!やめてやる!!現実なんかやめ…て…え!?見…てる?表紙絵のルイズちゃんが僕を見てる?表紙絵のルイズちゃんが僕を見てるぞ!ルイズちゃんが僕を見てるぞ!挿絵のルイズちゃんが僕を見てるぞ!!アニメのルイズちゃんが僕に話しかけてるぞ!!!よかった…世の中まだまだ捨てたモンじゃないんだねっ!いやっほぉおおおおおおお!!!僕にはルイズちゃんがいる!!やったよケティ!!ひとりでできるもん!!!あ、コミックのルイズちゃああああああああああああああん!!いやぁあああああああああああああああ!!!! あっあんああっああんあアン様ぁあ!!セ、セイバー!!シャナぁああああああ!!!ヴィルヘルミナぁあああ!!ううっうぅうう!!俺の想いよルイズへ届け!!ハルケギニアのルイズ へ届け! ポジティブ
さすが、ポジティブですと (・ω・)
[ツッコミを入れる]