おしまい日記

さようなら

tf-idfについて

ノートにメモしてると思ったら、そんなことがなかった

来年度の後輩に向けた課題の一つとして、tf-idfを利用したキーワード抽出を

考えている。

 

目的:テキストデータから重要そうな単語を見つけてみよう!

 

手法:tf-idf

 

データ:分かち書きされたテキストデータ + 単語リスト

 

tfidf ~ 文書に出現した単語に重みを与える手法。

   重みとは、単語の持つ特徴量で、これを求めると色々できる。

   例えば、今回のキーワード抽出や文書要約にも使える。(らしい)

 

{ \displaystyle tfidf = tf \times idf }

{ \displaystyle tf = \frac{n_ij}{ \sum_{k}{n_{k,j}}} }

 

日本語だと、 tf = 単語iの文書における出現回数 / 文書jに出現した単語すべての出現回数の和 である。

* i:単語のid、 j:文書のid

 

{ \displaystyle idf = log|D| - log|{d; d \ni t_i}|}

* D:全文書数、 { \displaystyle log|{d; d \ni t_i}| }:単語iを含むドキュメント数

 

重要用語

 bag of words ~ 文書の単語ベクトル表現。単語の順序情報を欠く文書データ。

 Nグラム ~ 隣接する文字(文字列)のN単位での共起性。

 コーパス ~ 分析用のテキストデータ。

 素性 ~ 分析に用いるデータの特徴量。(単語の頻度等)

 

発展として、授業で学んだC言語だけじゃなく、スクリプトでも書いて分析して欲しい。

スクリプトが出来たら、クローラや形態素解析といった、準備や前処理もやって欲しい。 

c++仮想関数

Pythonの拡張ライブラリとか、ちょっとスピードが欲しいときのために

c++を勉強するようにしました。

 

仮想関数について

 c言語の基本は抑えている”つもり”なので、勉強するのは

 c++でのクラス・メソッドの書き方、使い方+拡張ライブラリへの利用方法

 

 今日は、なぜか仮想関数について

 今のところの理解は、仮想関数とはvirtualというキーワードを与えられた、

 クラス内の関数。

 

 なぜこんなことするのかというと、継承クラスで基底クラスの関数を再定義、

 これをオーバーライドする時に必要となってくる。*詳しくは下のリンク

 C++の基礎 : 仮想関数

 

 Javaとは違って、c++では上書きと再定義を区別してるということ。

螺旋弾幕

対数螺旋 - Wikipedia

 

javascriptで書いた関数

    function px(a,b,dir){

return a*Math.exp(b*dir)*Math.cos(dir);

    }

    function py(a,b,dir){

return a*Math.exp(b*dir)*Math.sin(dir);

    }

 

を,enchan.jsのシューティングサンプルに書き足して弾幕を描画。

f:id:azumanga0420:20140203003037j:plain

 

グラフにただ描画するだけじゃなく、弾幕として動いてくれるのがゲームのいいところですね。

 

*PS

クラス内のメソッド中で他のクラスメソッドを呼び出す時、thisを忘れてしまう癖がある。

Pythonとか、他のスクリプトでも良くハマるので注意しよう。

 

参考

wise9 › JSで驚くほど簡単にアニメーションが扱える! tl.enchant.jsの使い方を先輩に説明してみる

JavaScriptでクラスを実現する方法

MySQL入門しました

というわけで、研究に利用するデータを整理するため、MySQLを利用することに決めました。

理由は、jsonで固めたままデータ使うのに飽きたからです。

 

以下の詳しすぎるサイトを斜め読み

MySQLクイック・リファレンス

 

以下にざっと基本的な使い方をメモ

  1.データベースにアクセス(MySQLの起動)
   > mysql -u root -p
            > パスワード入力

  2.テーブルの作成

            mysql> create table book

            ->(

            -> id int(11),

            -> title varchar(64),

            -> detail text,

            -> published date

            -> );

            Query OK, 0 rows affected (0.03 sec)

 

  3.テーブル構造の閲覧

            mysql> desc book;

 

  4.データの閲覧

            mysql> select * from book

 

            直接カラムを指定する場合は

            mysql> select id from book;

 

  5.テーブルへのデータの挿入

            mysql> insert into book (id, title, detail, published) values (1234, 'hogehoge', '超ヤバい', '2013-10-01') 

 

その他、カラムのTypeとPythonを利用したMySQLDBへのアクセス方法のリンク

MySQLのデータ型 - MySQLの使い方

MySQL - Python入門から応用までの学習サイト

 

*PS

  DBにダンプしたいテキストに'や"が入っている時の対処方法、誰か教えて下さい。

  例) /* 面倒くさいテキスト */ text = 'X'masケーキ(^q^)'

 

*追記

 SELECTにおけるパターンマッチについて

MySQL :: MySQL 4.1 リファレンスマニュアル :: 3.3.4.7 パターンマッチ

 

 例) SELECT * FROM db_name WHERE col(テーブルの要素) LIKE "パターン";

 

 COUNTを利用した行のカウント

MySQL :: MySQL 5.1 リファレンスマニュアル (オンラインヘルプ) :: 1.3.4.8 行のカウント

 

 例) SELECT user, COUNT(*) FROM recipe WHERE name LIKE "%ケーキ%" GROUP BY user; ~ ユーザの料理レシピのうち、キーワード"ケーキ"を含む料理レシピをカウント

 これは、便利!

 

 日付を指定してSELECT

日付を指定してデータをSELECTするMySQL|プログラムメモ

 

 例)SELECT * FROM recipe WHERE date_col > '2014-01-01';

  ~ 2014年元旦以降のデータを取得

 

 基礎的な統計量の計算

カウント・合計・平均・最大値・最小値(GROUP BY節で使う関数)|MySQL内部関数|MySQL|PHP & JavaScript Room

 

 例)select *, avg(c.co) from ( select from_user, count(*) as co from tsukurepos group by from_user ) as c;

  ~ つくれぽを送った料理レシピ数の平均値

 

 MySQLエイリアスの使い方とかは、ここからつまんだ

匂臭さん MySQLの件数(COUNT)の最大値とか

 

 まだまだ、SQLに入門したてなので、もっと便利な使い方を知っていきたい。