プログラマでありたい

おっさんになっても、プログラマでありつづけたい

cabochaでUTF8

 昨日気づいたのですが、cabocha 0.60が開発中のようです。今は、pre2まで出ています。

変更点は、以下の通りのようです。何が嬉しいかというと、UTF8に対応しているところ。内部的には、ほぼフルスクラッチで書き直しの力作のようです。また、chasenのサポートをやめてmecabオンリーになっているので、mecabが必須になっています。

変更点:
- UTF8対応 (./configure --with-charset=UTF8)
- 文節区切りと固有表現抽出に CRF (実装はCRF++)を使用
- ChaSenへの依存を廃止し、MeCab のみのサポートに
- 固有表現を行う前に文字列の正規化を行うことで若干の精度向上
- 簡易並列処理の廃止。係り受けのみ
- APIの一新、より粒度の細かい制御が可能
- PerlやMakefileに依存していた部分の排除。
- 単一バイナリ cabocha-learn による学習の簡易化 (Windows でも学習が可能)
- TinySVMへの依存を排除。単体で学習可能
- Juman のサポートを復活。ただし、形態素解析は mecab-juman に限定
- 評価ツール caboca-system-eval の提供 


 早速、インストールしようとしたのですが、下記のようにエラーが出ました。

$ ./configure --with-charset=UTF8
略
$ make
make  all-recursive
Making all in src
/bin/sh ../libtool --tag=CXX   --mode=compile g++ -DHAVE_CONFIG_H -I. -I.. -DCABOCHA_DEFAULT_POSSET="\"IPA"\" -DCABOCHA_DEFAULT_CHARSET="\"UTF8"\" -DMODEL_VERSION=100  -DCABOCHA_DEFAULT_RC="\"/usr/local/etc/cabocharc\""    -O3 -Wno-deprecated -Wall -c -o chunk_learner.lo chunk_learner.cpp
mkdir .libs
 g++ -DHAVE_CONFIG_H -I. -I.. -DCABOCHA_DEFAULT_POSSET=\"IPA\" -DCABOCHA_DEFAULT_CHARSET=\"UTF8\" -DMODEL_VERSION=100 -DCABOCHA_DEFAULT_RC=\"/usr/local/etc/cabocharc\" -O3 -Wno-deprecated -Wall -c chunk_learner.cpp  -fno-common -DPIC -o .libs/chunk_learner.o
chunk_learner.cpp:1:19: error: crfpp.h: No such file or directory
chunk_learner.cpp: In function 'bool CaboCha::ChunkingTrainingWithCRFPP(CaboCha::ParserType, CaboCha::CharsetType, CaboCha::PossetType, int, const char*, const char*, const char*)':
chunk_learner.cpp:158: error: 'crfpp_learn' was not declared in this scope
make[2]: *** [chunk_learner.lo] Error 1
make[1]: *** [all-recursive] Error 1
make: *** [all] Error 2

crfpp.hが無いと怒られています。調べてみると、CRF++に含まれているようです。

$wget http://kent.dl.sourceforge.net/sourceforge/crfpp/CRF++-0.51.tar.gz
$tar xzvf CRF++-0.51.tar.gz
$cd CRF++-0.51
$./configure
$make
$make install

この後に、cabochaのディレクトリに戻って、make; make install;で入ります。

$cabocha
北京五輪の柔道男子66キロ級が10日、行われ、アテネ金メダリストの内柴正人(30)(旭化成)が、決勝でバンジャマン・ダルベレ(仏)を破って優勝し、連覇を達成した。
 <LOCATION>北京</LOCATION>五輪の-D                              
                                     柔道男子-D                            
                                   66キロ級が---D                        
                            <DATE>10日</DATE>、-D                        
                                           行われ、-----------------------D
            <LOCATION>アテネ</LOCATION>金メダリストの-D                   |
                                                     内-------------------D
                                  <PERSON>柴正人</PERSON>-----------------D
                                                   (30)---------------D
                  (<ORGANIZATION>旭化成</ORGANIZATION>)が、-------------D
                                                         決勝で-------D   |
                                           バンジャマン・ダルベレ-----D   |
                                      (<LOCATION>仏</LOCATION>)を-D |   |
                                                               破って-D   |
                                                               優勝し、---D
                                                                   連覇を-D
                                                                 達成した。

macのコンソール、日本語フォントが読みにくいなぁ。。。

集合知プログラミングが凄すぎる件について

 ようやく集合知プログラミングが届きました。まだ30分くらいざっと目を通しただけですが、これだけは言えます。自然言語処理をテーマとして扱う書籍の中で、実用度No.1です。文句なしにお勧めです。これで3,400円は安すぎます。倍の値段であっても買います。
 気に入った点といえば、例えばです。2章「推薦を行う」は、所謂リコメンドエンジンをテーマにしているのですが、この方法に複数のアプローチを紹介しつつ解説しています。レコメンドエンジンの代表的な方法に強調フィルタリングというのがあるのですが、この方法は類似スコアを出す必要があります。スコアの出し方に、ユークリッド距離やピアソン相関などの例を挙げ、それぞれの長所短所を述べています。また相関の種類にもユーザ相関とアイテム相関があり、それぞれどのようなデータの時に向いているのか等を解説してくれています。ですので、複数の手法は知っていてもどちらの方が良いか解らないという時に、非常に参考になります。
 また、テーマも多岐に渡っているので、自然言語処理に対する引き出しが非常に増えます。まだざっと読んでいるだけで、コードを動かしたりしていないので、これから取り組んで行くつもりです。何故か自然言語処理のサンプルコードはPythonが多いので、これを機会にPythonを習得しようかと思います。

集合知プログラミングに関するエントリ

リコメンドエンジンを作る 集合知プログラミング

随時、追加する予定



以下、目次。目次の内容をググるだけでも、勉強になります。

訳者まえがき
はじめに

1章 集合知への招待
	1.1 集合知とは何か?
	1.2 機械学習とは何か?
	1.3 機械学習の限界
	1.4 実生活における例
	1.5 学習アルゴリズムのその他の使用

2章 推薦を行う
	2.1 協調フィルタリング
	2.2 嗜好の収集
	2.3 似ているユーザを探し出す
		2.3.1 ユークリッド距離によるスコア
		2.3.2 ピアソン相関によるスコア
		2.3.3 どちらの類似性尺度を利用すべきなのか?
		2.3.4 評者をランキングする
	2.4 アイテムを推薦する
	2.5 似ている製品
	2.6 del.icio.us のリンクを推薦するシステムを作る
		2.6.1 del.icio.usのAPI
		2.6.2 データセットを作る
		2.6.3 ご近所さんとリンクの推薦
	2.7 アイテムベースのフィルタリング
		2.7.1 アイテム間の類似度のデータセットを作る
		2.7.2 推薦を行う
	2.8 MovieLensのデータセットを使う
	2.9 ユーザベース VS アイテムベース
	2.10 エクササイズ

3章 グループを見つけ出す
	3.1 教師あり学習 VS 教師なし学習
	3.2 単語ベクトル
		3.2.1 ブロガーを分類する
		3.3.2 フィード中の単語を数える
	3.3 階層的クラスタリング
	3.4 デンドログラムを描く
	3.5 列のクラスタリング
	3.6 K 平均法によるクラスタリング
	3.7 嗜好のクラスタ
		3.7.1 データの取得と準備
		3.7.2 Beautiful Soup
		3.7.3 Zeboの結果をすくい取る
		3.7.4 距離の基準を定義する
		3.7.5 結果をクラスタリングする
	3.8 データを2次元で見る
	3.9 クラスタについてその他のこと
	3.10 エクササイズ

4章 検索とランキング
	4.1 検索エンジンとは?
	4.2 シンプルなクローラ
		4.2.1 urllib2を使う
		4.2.2 クローラのコード
	4.3 インデックスの作成
		4.3.1 スキーマの設定
		4.3.2 ページ内の単語を探し出す
		4.3.3 インデックスへの追加
	4.4 問い合わせ
	4.5 内容ベースの順位付け
		4.5.1 正規化関数
		4.5.2 単語の頻度
		4.5.3 ドキュメント中での位置
		4.5.4 単語間の距離
	4.6 インバウンドリンクの利用
		4.6.1 単純に数えあげる
		4.6.2 PageRankアルゴリズム
		4.6.3 リンクのテキストを利用する
	4.7 クリックからの学習
		4.7.1 クリックを追跡するネットワークの設計
		4.7.2 データベースのセットアップ
		4.7.3 フィードフォワード
		4.7.4 バックプロパゲーションによるトレーニング
		4.7.5 トレーニングのテスト
		4.7.6 検索エンジンとつなげる
	4.8 エクササイズ

5章 最適化
	5.1 グループ旅行
	5.2 解の表現
	5.3 コスト関数
	5.4 ランダムサーチ(無作為探索)
	5.5 ヒルクライム
	5.6 模擬アニーリング
	5.7 遺伝アルゴリズム
	5.8 実際のフライトを検索する
		5.8.1 Kayak API
		5.8.2 minidomパッケージ
		5.8.3 フライト検索
	5.9 嗜好への最適化
		5.9.1 学寮の最適化
		5.9.2 コスト関数
		5.9.3 最適化の実行
	5.10 ネットワークの可視化
		5.10.1 レイアウト問題
		5.10.2 交差線のカウント
		5.10.3 ネットワークの描画
	5.11 さらなる可能性
	5.12 エクササイズ

6章 ドキュメントフィルタリング
	6.1 スパムフィルタリング
	6.2 ドキュメントと単語
	6.3 分類器のトレーニング
	6.4 確率を計算する
		6.4.1 推測を始める
	6.5 単純ベイズ分類器
		6.5.1 ドキュメント全体の確率
		6.5.2 ベイズの定理の簡単な紹介
		6.5.3 カテゴリの選択
	6.6 フィッシャー法
		6.6.1 特徴たちのカテゴリの確率
		6.6.2 確率を統合する
		6.6.3 アイテムを分類する
	6.7 トレーニング済みの分類器を保存する
		6.7.1 SQLiteを利用する
	6.8 Blogフィードをフィルタする
	6.9 特徴の検出の改良
	6.10 Akismetを利用する
	6.11 その他の手法
	6.12 エクササイズ

7章 決定木によるモデリング
	7.1 サインアップを予測する
	7.2 決定木入門
	7.3 ツリーのトレーニング
	7.4 最高の分割を選ぶ
		7.4.1 ジニ不純度
		7.4.2 エントロピー
	7.5 再帰的なツリー構築
	7.6 決定木の表示
		7.6.1 グラフィック表示
	7.7 新しい観測を分類する
	7.8 ツリーの刈り込み
	7.9 欠落データへの対処
	7.10 数値による帰結への対処
	7.11 住宅価格のモデリング
		7.11.1 Zillow API
	7.12 "Hotness"のモデル化
	7.13 決定木を使うべき場面
	7.14 エクササイズ

8章 価格モデルの構築
	8.1 サンプルデータセットの構築
	8.2 K近傍法
		8.2.1 近傍群の数
		8.2.2 類似度を定義する
		8.2.3 K近傍法のコード
	8.3 重み付け近傍法
		8.3.1 反比例関数
		8.3.2 減法(引算)関数
		8.3.3 ガウス関数
		8.3.4 重み付けK近傍法
	8.4 クロス評価
	8.5 異質な変数
		8.5.1 データセットの追加
		8.5.2 次元のリスケール(縮尺変更)
	8.6 縮尺の最適化
	8.7 不均一な分布
		8.7.1 確率密度の推測
		8.7.2 確率のグラフ化
	8.8 実データの利用  eBay API
		8.8.1 ディベロッパキーの取得
		8.8.2 コネクションのセットアップ
		8.8.3 検索する
		8.8.4 アイテムの詳細を得る
		8.8.5 価格予測器の構築
	8.9 K近傍法はどこで使うべきか
	8.10 エクササイズ

9章 高度な分類手法:カーネルメソッドとSVM
	9.1 matchmakerデータセット
	9.2 このデータセットの難点
		9.2.1 決定木による分類器
	9.3 基礎的な線形分類
	9.4 カテゴリーデータな特徴たち
		9.4.1 Yes/Noクエスチョン
		9.4.2 「興味があるもの」リスト
		9.4.3 Yahoo! Mapsを使って距離を決定する
		9.4.4 新たなデータセットの作成
	9.5 データのスケーリング
	9.6 カーネルメソッドを理解する
		9.6.1 カーネルトリック
	9.7 サポートベクトルマシン
	9.8 LIBSVMを使う
		9.9.1 LIBSVM の入手
		9.9.2 セッション中での使用例
		9.9.3 SVMをmatchmakerデータセットに適用する
	9.9 Facebookでのマッチ
		9.9.1 Developer Keyを取得する
		9.9.2 セッションを作成する
		9.9.3 友人データをダウンロードする
		9.9.4 マッチのデータセットを作る
		9.9.5 SVMモデルを構築する
	9.10 エクササイズ

10章 特徴を発見する
	10.1 ニュースのコーパス
		10.1.1 情報源の選択
		10.1.2 情報源をダウンロードする
		10.1.3 行列に変換する
	10.2 これまでのアプローチ
		10.2.1 ベイジアン分類器
		10.2.2 クラスタリング
	10.3 非負値行列因子分解
		10.3.1 行列に関する数学の簡単な紹介
		10.3.2 これは記事の行列とどのような関わりがあるの?
		10.3.3 NumPyを使う
		10.3.4 アルゴリズム
	10.4 結果を表示する
		10.4.1 記事を表示する
	10.5 株式市場のデータを使用する
		10.5.1 取引量とは何か?
		10.5.2 Yahoo! Financeからデータをダウンロードする
		10.5.3 行列の準備
		10.5.5 NMFを走らせる
		10.5.6 結果を表示する
	10.6 エクササイズ

11章 進化する知性
	11.1 遺伝的プログラミングとは?
		11.1.2 遺伝的プログラミング VS 遺伝アルゴリズム
	11.2 ツリー構造のプログラム
		11.2.1 Pythonでツリーを表現する
		11.2.2 ツリーの構築と評価
		11.2.3 プログラムを表示する
	11.3 最初の集団を作る
	11.4 解決法をテストする
		11.4.1 単純な数学的テスト
		11.4.2 成功の度合いを計測する
	11.5 プログラムの突然変異
	11.6 交叉(Crossover)
	11.7 環境を作り上げる
		11.7.1 多様性の大事さ
	11.8 シンプルなゲーム
		11.8.1 ラウンドロビントーナメント
		11.8.2 実際の人間とプレイしてみる
	11.9 さらなる可能性
		11.9.1 数学的な関数を増やす
		11.9.2 メモリ
		11.9.3 さまざまなデータタイプ
	11.10 エクササイズ

12章 アルゴリズムのまとめ
	12.1 ベイジアン分類器
		12.1.1 トレーニング
		12.1.2 分類
		12.1.3 ベイジアン分類器のコードの使用
		12.1.4 強みと弱み
	12.2 決定木による分類器
		12.2.1 トレーニング
		12.2.2 決定木分類器の利用
		12.2.3 強みと弱み
	12.3 ニューラルネットワーク
		12.3.1 ニューラルネットワークのトレーニング
		12.3.2 ニューラルネットワークのコードの利用
		12.3.3 強みと弱み
	12.4 サポートベクトルマシン
		12.4.1 カーネルトリック
		12.4.2 LIBSVMの利用
		12.4.3 強みと弱み
	12.5 K近傍法
		12.5.1 スケーリングと過剰変数
		12.5.2 K 近傍法コードの利用
		12.5.3 強みと弱み
	12.6 クラスタリング
		12.6.1 階層的クラスタリング
		12.6.2 K平均法クラスタリング
		12.6.3 クラスタリングコードの利用
	12.7 多次元尺度構成法
		12.7.1 多次元尺度構成法のコードの利用
	12.8 非負値行列因子分解
		12.8.1 NMFコードの利用
	12.9 最適化
		12.9.1 コスト関数
		12.9.2 模擬アニーリング
		12.9.3 遺伝アルゴリズム
		12.9.4 最適化コードの利用

付録A サードパーティによるライブラリたち
	A.1 Universal Feed Parser
	A.2 Python Imaging Library
	A.3 Beautiful Soup
	A.4 pysqlite
	A.5 NumPy
	A.6 matplotlib
	A.7 pydelicious

付録B 数式
	B.1 ユークリッド距離
	B.2 ピアソン相関係数
	B.3 加重平均
	B.4 Tanimoto係数
	B.5 条件付き確率
	B.6 ジニ不純度
	B.7 エントロピー
	B.8 分散
	B.9 ガウス関数
	B.10 ドット積

付録C 日本語のテキスト処理
	C.1 形態素解析ツール
	C.2 Yahoo!日本語形態素解析Webサービス

索引

MeCabで、キーワード抽出

 形態素解析器として圧倒的な性能を誇るMeCabですが、出来る事は形態素解析にとどまりません。公式ページにも載っているように、辞書さえカスタマイズすればひらがな⇔カタカナ変換やAutoLinkの作成といったことまで出来ます。
 WikipediaのデータとMeCabを使えば、高速なキーワード抽出が出来ないかなと思い試してみました。辞書の定義にコストを書けば、長いキーワードを優先して抽出する最長一致法が出来そうです。それが出来れば、辞書にキーワードを登録すればおっけいかなと思い実験です。


準備
・Mecabのインストール
  省略
・Wikipediaのダウンロード
  wikipediaからコーパスの作成を参照
・辞書生成用のCSV作成
  xml2sqlで作ったpage.txtを変換します。
  この際、(曖昧さ回避)は除いておきます。
  併せて、カンマが入っている見出し文は、別のものに置き換えておくこと

cat page.txt | awk '{print $3}' | grep -v "(曖昧さ回避)" > wiki.txt

アップロードログ_2004年4月
削除記録/過去ログ_2002年12月
アンパサンド
Sandbox
Brion_VIBBER
言語
日本語
地理学
欧州連合


textからMeCabの辞書作成用のCSV作成のスクリプトです。
CSVの項目としては、左から見出し語,左文脈との連結コスト,右文脈との連結コスト,出現コスト,品詞となります。接続コストは、ともに0でおっけいです。出現コストは、長い言葉ほどコストを低くします。ただし、intの範囲内で。最後に品詞はなんでも良いです。URLでも入れればwikipediaへのAutoLinkが作れます。今回は面倒くさいので、見出し語をそのまま入れてあります。

#!/usr/bin/perl

use strict;
use warnings;

my $file = shift @ARGV;
open(IN, $file);

while (<IN>) {
  chomp;
  if (length($_) > 1) {
    #print $_,",0,0,",max(-36000,-400 * (length^1.5)),",$_\n" ;
    print "$_,0,0,",max(-36000,-400 * (length^1.5)),",$_\n" ;
  }
}

sub max {
    my $comp = shift @_;
    my $val  = shift @_;
    my $max  = $comp;
    if ( $comp <= $val ) {
      $max = $val;
    }
    return int($max);
}


・設定ファイルの作成
  以下、4ファイルを作成
matrix.def

1 1
0 0 0

unk.def

DEFAULT,0,0,0,*
SPACE,0,0,0,*

char.def

DEFAULT 1 0 0
SPACE   0 1 0
0x0020 SPACE

dicrc

dictionary-charset = utf-8
cost-factor = 800
bos-feature = BOS/EOS
output-format-type=extract

node-format-extract = %H\n
unk-format-extract =
eos-format-extract = \n

最後に改行コードが入るとエラーが出るので、注意しましょう。


・辞書作成

/usr/local/libexec/mecab/mecab-dict-index  -f utf-8 -c utf-8

# /usr/local/libexec/mecab/mecab-dict-index  -f utf-8 -c utf-8
./pos-id.def is not found. minimum setting is used
reading ./unk.def ... 2
emitting double-array: 100% |###########################################|
./pos-id.def is not found. minimum setting is used
reading ./title.csv ... 1272597
emitting double-array: 100% |###########################################|
reading ./matrix.def ... 1x1

done!


・試してみる

# mecab -d .
経済学の最も古い定義は、アダム・スミスが『諸国民の富の性質と原因の研究』によるものである。
経済
学
の
も
い
定義
は
、
ア
ダム
・
スミ
ス
が
『
諸国民の富の性質と原因の研究
』
に
よる
もの
で
ある
。

うーん。微妙に上手くいかない。
アダム・スミスや経済学で出てきてほしい。また、「に」やら「で」やらは出てきてほしくない。もうちょっと調べてみる必要がありそうです。

30分で理解する自然言語処理 まとめ

今まで何本か日本語処理のエントリーを書いてきました。後で振り返り易いように、ここらで一覧にまとめておきます。

wikipediaのダウンロード&データベースにインポート

  コーパスとして、wikipediaの存在はありがたいです。まずはここから始めるのが良いですね。併せて紹介しているxml2sqlも秀逸です。

特徴語抽出のあれこれ

  あれこれと言いつつ形態素解析とYahoo APIを使った特徴語抽出のみを紹介しています。手軽に出来るのが魅力です。

ベイジアンフィルター Perlで作りたい人に教えてあげたいちょっとしたこと

  Algorithm::NaiveBayesの使い方を簡単なサンプルで紹介いたしました。割と好評です。ベイジアンフィルターの人気の高さを垣間みれますね。

TermExtract Perlで出来る特徴語抽出

  TermExtractという専門語抽出モジュールの紹介です。TermExtractはもっと評価されても良いモジュールだと思います。

MeCabで、キーワード抽出

  万能形態素解析器MeCabを使ってキーワード抽出です。

キーワード抽出モジュール Lingua::JA::Summarize

  お手軽要約です。ぜひ、ソースコードを読んでみましょう

cabochaでUTF8

  Version 0.60-pre2を入れてみました。

工藤拓さんが語るMecabの仕組み

MeCabの内部の世界です。


書籍紹介

集合知プログラミングが凄すぎる件について

  読み始め30分のメモ



これからもっと勉強して試したい分野です。リストには随時追加していきます。

特徴語抽出のあれこれ

 最近の特徴語抽出の手法ってどんなんかなと思って、はてなの注目のエントリーを見てみました。
タグ「特徴語抽出」を含む注目エントリー


 面白いものが目白押しです。
特にGigazinizeというのは、秀逸です。面白いなぁ〜。
http://blog.fulltext-search.biz/articles/2007/09/03/gigazinize
Gigazinize のなかみ


 私も何か作ってみたくなりました。書籍データやらWikipediaやらのデータは色々あるので、そのあたりを組み合わせてみようかと思います。その前に特徴語を抽出する為のツールです。(だいぶ昔に作ったものですが。)ロジックは、たつをさんが紹介している下記の方法です。


形態素解析と検索APIとTF-IDFでキーワード抽出
 形態素解析とYahoo APIを使って特徴語を抽出する方法です。さっくりと作れて、それなりに使えます。ただ、つどWeb検索に行っているのでそれなりに遅いです。要は文章の母集団があればよいので、Yahoo APIの部分をWikiPediaから作ったコーパス等に置き換えたらかなり早くなると思います。
下はYahoo APIを使った場合のサンプルです。

use LWP::Simple;
use MeCab;

my $file = shift @ARGV;
my $population = 19200000000;
my $hit;
my $content;
my @feature;
my %result;

$content = readFile($file);
@feature = &parseText($content);
%result = countFeature(@feature);

foreach $key (keys %result) {
  $hit = &get_num($key);
  $tfidf = calcTFIDF($result{$key},$hit,$population);
  print "key=$key,hit=$hit,tfidf=$tfidf\n";
}

sub parseText {
    my $content = shift @_;
    my $m = new MeCab::Tagger ("-Ochasen");
    my @feature = ();
    for (my $n = $m->parseToNode ($content); $n; $n = $n->{next}) {
        if ($n->{feature} =~ /名詞/) {
            push @feature,$n->{surface};
        }
    }
    return @feature;
}

sub countFeature {
    my @feature = sort(@_);
    my $str="";
    my $prev="";
    my $cnt=0;
    my %feature;
    foreach $str (@feature) {
      if ( defined  $feature{$str} ) {
        $feature{$str}++;
      } else {
        $feature{$str}=1;
      }
    }
    return %feature;
}

sub readFile {
    my $file = shift @_;
    open FH, "<$file";
    my $content = join '', <FH>;
    close FH;
    return $content;
}

sub get_num { # 検索ヒット数獲得 by Yahoo! API
    my ($key) = @_; # UTF-8
    $key =~ s/([^0-9A-Za-z_ ])/'%'.unpack('H2',$1)/ge;
    my $url = "http://api.search.yahoo.com/WebSearchService/V1/".
        "webSearch?appid=YahooDemo&query=$key&results=1";
    my $c;
    ($c = get($url)) or die "Can't get $url\n";
    my ($num) = ($c =~ /totalResultsAvailable="(\d+)"/);
    return $num;
}

sub calcTFIDF {
  my $tf = shift @_;
  my $df = shift @_;
  my $n = shift @_;
  
  my $tfidf;

  eval {
      $tfidf = $tf*log($n/$df);
  };
  return $tfidf;
}

次は、コーパス部分を変更したいと思います。
Yahoo APIからWikipedia

オノマトペ

皆様はオノマトペという言葉を知っていますか? ちょっと面白い語感の言葉ですが,「はらはら」や「しっかり」などのいわゆる擬音語・擬態語のことをオノマトペと呼びます. 日本語はオノマトペの種類がとても多い言語なのだそうで,日本語学習者がオノマトペを使いこなせるようになるのはとても難しいのだそうです.

全然知らなかった。面白そうな分野なので、ちょっと学んでみよう。
オノマトペディア・オノマトぺた!(仮)