第3章の目的:データだけからパターンを見つけ出す。
      課題:Q&Aサイト運営で、ユーザの「質問」と同じような過去の「質問」「回答」を提示する。

【おさらい】
 1.テキストデータを bag-of-word に変える。
  CountVectorizer を使って、単語の出現回数を数えて、ベクトル表記する。

 2.新しい文書と既存の文書を類似度を計算する。
  norm関数でユークリッド距離を測る。



この続き。正規化するところから。


(1)単語の出現回数ベクトルを正規化する。

dist_raw を dist_norm に変える。
----------------------
# norm 
def dist_raw(v1, v2):
    delta = v1 - v2
    return sp.linalg.norm(delta.toarray())

# norm version up
def dist_norm(v1, v2):
    v1_normalized = v1 / sp.linalg.norm(v1.toarray())
    v2_normalized = v2 / sp.linalg.norm(v2.toarray())
    delta = v1_normalized - v2_normalized
    return sp.linalg.norm(delta.toarray())
----------------------


(2)重要度の低い単語を取り除く:stop word

処理の対象外の単語(stop word)を考慮する。例に習って english を設定。予め用意されているのはこの englishのみ。他は list化するしかないようだ。

----------------------
#vectorizer = CountVectorizer(min_df=1)
vectorizer = CountVectorizer(min_df=1,stop_words='english')
----------------------


(3)語形の変化に対処する:stemming

ここからダウンロードしたrel_post_01.py を使う。
nltk.stem が import できないと言う。
$ python rel_post_01.py 
Traceback (most recent call last):
  File "rel_post_01.py", line 20, in <module>
    import nltk.stem
ImportError: No module named nltk.stem
 
本のとおり、nltk(自然言語処理用ライブラリ) を入れる。

 $ sudo pip install -U nltk
 

今度は、別のエラー。
$ python rel_post_01.py 
Traceback (most recent call last):
  File "rel_post_01.py", line 43, in <module>
    min_df=1, stop_words='english', charset_error='ignore')
TypeError: __init__() got an unexpected keyword argument 'charset_error'

ググる。StemmedTfidfVectorizer が、CountVectorizer、TfidfVectorizer を継承しているとして、scikit learnでの、この2つの関数のパラメータに charset_error が見当たらなかった。
charset_error を decode_error に変えると動いた。