第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.pyTraceback (most recent call last):File "rel_post_01.py", line 20, in <module>import nltk.stemImportError: No module named nltk.stem$
$ sudo pip install -U nltk
今度は、別のエラー。
$ python rel_post_01.pyTraceback (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 に変えると動いた。
コメント