関係アルゴリズムったー

こんにちは.北山です.ネタに困ったら実装しようぜってことで,今回は関係アルゴリズムの実装をしましょう.

まず,関係アルゴリズムってな~に?というところからスタートするわけですが,最近買った「アイディア大全」にも載っている発想法の1つです.AとBのキーワードの間に関係を表す言葉を当てはめて,ピンときたものについて深く考えるというやり方です.

例えば,何かイベントを考えるとしましょう.例えば「追いコン(追い出しコンパ)」の企画を考えたいとします.「盛り上げたい」ですよね?「追いコン」「盛り上がる」をキーワードとしましょう.テンプレートとして42語(手法によっては更に+19語)の関係語句をランダムに当てはめるだけの手法です.これから実装するプログラムで「追いコン」「盛り上がる」を実行してみると…【盛り上がる – の前に – 追いコン】となりました.「の前に」が関係語句です.はい,脳みそが刺激されますね.盛り上がる前に追いコンしてしまえなんて,常識的に考えていたら生み出せないアイディアです.実現するとしたら何でしょうかね?苦行のような(すごく短い)企画を追いコンと称して,2次会(ホントの追いコン)を楽しみにさせるようなやり方でしょうか.

とまぁ,非常にお手軽なので,ちゃっちゃと実装したいと思います.

続きを読む

広告

Google Mapで遊ぼう

こんにちは.北山です.

まずは宣伝から.今週末(というか明日)から工学院大学の学園祭である新宿祭が始まります.その中の企画の一つに「研究室公開」というやつがあるのですが,19日だけ当研究室も出展しております.内容は「卒業論文中間発表〜ポスターを添えて〜」です.

  • 研究室配属されるとどんな生活をするの?
  • 卒業研究ってどうやって進めるの?
  • 研究ってどんなことするの?

ということがいろいろ気になるお年頃の皆さんは積極的に参加して,当研究室の学生と楽しく歓談をフルボッコにしてもらえればと思います.

さて,今日の本題ですが,卒業論文も佳境を迎え,UIとして地図を使うという人たちも出てくる(よね?)でしょうからGoogle Maps APIについてつらつらと書いていきましょう.興味のない方はここで脱落してください.

続きを読む

Pythonで形態素解析+α

こんにちは.北山です.技術系担当日じゃなくても技術的なことを書いてプレッシャーを与えていきましょう!!

今回はpythonで形態素解析がテーマですが「どんだけ枯れた話なんだよ!!」とツッコミを入れたみなさんさようなら.+αが気になったみなさん,これは複合名詞抽出や品詞でのフィルタの話です.「なんだよ,がっかりだよ!!」と思ったみなさんさようなら.いやいや,それ以前に「pythonで形態素解析ってどうやるの?」というみなさんは下記のURLへどうぞ.そしてさようなら.

PythonからMeCab(とCaboCha)を使うまで – Qiita  http://qiita.com/yoshikyoto/items/1a6de08a639f053b2d0a

さようならしなかったみなさんこんにちは.では始めましょう.

続きを読む

データベースでTF-IDF

こんにちは.北山です.

今日はなんの脈絡もなく,データベースでTF-IDF法をやってみよう!! という話をしましょう.データベースは以下のように設計されているとします.

スクリーンショット 2016-08-05 16.07.53.png

このテーブルにはWebページを形態素解析して得られた単語が登録されています.urlには解析元のurl,termには形態素解析した単語が格納されているものとします.

さて,これで下準備は完了です.まずはTF値(単語頻度)を出しましょう.

select url, term, count(*)  from terms group by url, term;

たったこれだけです.urlとtermに同じ値が入っている行の数を数えると… ある文書に出てくるある単語の数,すなわち単語頻度になりますね.

次は,DF値(文書頻度)です.

select term,count(*) from (select distinct url, term from terms) as D group by term;

こちらもこれだけです.副問い合わせを使っていますが,(select distinct url, term from terms)の部分で,1つの文書に重複して出てくる単語を集約して1つにしています.そのあとは,ただただ同じtermの数を数えるだけで文書頻度になりますね.

ここで,TF-IDFの式を tf * log(N / df) としましょう.Nは全文書数で,以下で求まります.

select count(distinct url) from terms;

さて,あとはこれらを使って計算するだけです.

select TFT.url, TFT.term, tf, N, df, tf * log(N/df) as tfidf
from (select url, term, count(*) as tf from terms group by url, term) as TFT,
     (select term,count(*) as df from (select distinct url, term from terms) as D group by term) as DFT,
     (select count(distinct url) as N from terms) as NT
where TFT.term = DFT.term;

とまあ,from句の中がややこしいことになってますが,これまでやったことを書いているだけです.where句で単語同士で繋げています.

何かの言語で書こうとすると,少々面倒くさいコードになりがちですが,SQLだとほぼほぼ集約関数だけでできてしまうという例でした.まあ,これこのまま実行すると,where句での結合がネックになって非常に時間がかかるのですが…インデクスをつけるとか,tfを計算したテーブルを流用してdfを計算するとか色々高速化する余地はありますし,tfとかdfとかの集計だけデータベースに任せて,残りの計算はプログラム側で行うなどのことも考えられます.まあ,ようは使い方ということで.

それでは今日はこの辺りで.ではでは.