テキストデータから特徴ベクトルを作って何かやろうと思ったときに,私の場合は何も考えずに単語文書行列を作ってナイーブベイズのようなベースライン的な手法を試すところからはじめます。単語文書行列というのは以下のページに載っているような行列です。Matrixといいます。WikipediaWikipediaに載っているように,行方向に単語,列方向に文書を並べるのが普通です。scikit-learnの慣習では行方向に事例,列方向に素性を並べるため,逆になります。シンプルでおすすめです。一方で,scikit-learnにはsklearn.feature_extraction.textという,テキストデータから特徴ベクトルを作るためのモジュールがあるのですが,このモジュールの中では先ほど述べた手法とは少し違った方法で単語文書行列を作っています。sklearn.feature_extraction.text.CountVectorizerで使われている方法と呼ぶことにします。scikit-learnにはDictVectorizerという便利なクラスがありながら,どうして別の方法を使っているんでしょうか?もしかして,(a)の方法は(b)の方法と比べて100倍くらい遅かったりするんでしょうか?実際に計測してみました。collections.Counterとsklearn.feature_extraction.DictVectorizerを使う方法collections.Counterは標準ライブラリに含まれているクラスで,iterableを投げつけるとカウントしてくれます。変換してくれるクラスです。2.]])この2つを組み合わせると単語文書行列が作れます。v.fit_transform(tf_list)sortというオプションは素性名の順番にソートするかどうかを決めるものでデフォルトはTrueですが,特に必要無いのでFalseに設定しました。以下のコードを参考にしました。日本語の処理に使いたい場合には,文書を引数に取って語のリストを返す関数を定義して,コンストラクタの引数のanalyzerに渡せばよいです。最初にcollections.defaultdictを使った怪しいコードがありますが,これはアイテムにIDを振るときの一般的なテクとして一部で知られています。defaultdictは基本的にはPythonの普通のdictとして振る舞いますが,存在しない要素をgetしようとしたときにはdefault_factory関数を呼び,その結果を返します。実装と関係があります。実装の詳細は以下のページが分かりやすいです。indptrの組を引数にとるものもあり,CountVectorizer内の実装ではこれを利用しています。3.5.0で動かします。方法で単語文書行列を作る関数の入力として,単語文書行列であるscipy.sparse.csr_matrixを構築する時間を計測します。ソースコードを以下に示します。比べて約1.6倍時間がかかっています。sklearn.feature_extraction.text.CountVectorizerで使われている方法と比較して遅いです。処理時間は2倍以内には収まります。タスクによるかとは思いますが,機械学習するときに最も計算コストがかかるのはこの後の処理なので,全体としてみれば小さな差と言えるのではないかと思います。DictVectorizerはカテゴリ素性を含むデータをOneHot表現の疎ベクトルに変換する際にも汎用的に使うことができるので,この程度の差しか無いのであればDictVectorizerを使う方法だけ覚えておいても良いのではないでしょうか。おまけscikit-learnを使ってできることを一通り試してみたいという方には,以下の書籍がおすすめです。実践寄りの内容ですが,理論的な背景についても少なくない分量を割いています。「数学をバリバリ使っている本がほしい!」「厳密さが足りない!」という人には物足りないかもしれませんが,scikit-learnを初めて触る人には有益な情報を与えてくれると思います。(1)はてなブログをはじめよう!kujira16さんは、はてなブログを使っています。ブログを報告するスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。