いっきのblogスマートフォン用の表示で見るいっきのblog技術とか色々この広告は、90日以上更新していないブログに表示しています。2018-07-26TF-IDFの理論をざっくり理解する1最近、自社のプロダクトで自然言語処理がよく使われるようになってきたので、勉強も兼ねてまとめてみる。TF-IDFとは?tf-idfは、文書中に含まれる単語の重要度を評価する手法の1つであり、主に情報検索やトピック分析などの分野で用いられている。Frequency、逆文書頻度)の二つの指標に基づいて計算される。WikipediaWikipediaだと少し難しい言葉でかいてあるので噛み砕いていくと、ある人のブログから重要度の高い言葉(特徴量)を抽出したいとする。tfはある人のブログ内の言葉を分解し「頻度」を計算し、idfはある人のブログ内の言葉がWikipediaの全ての言葉と比べた中での「希少性」を計算する。どこの言葉と比較してidf(希少性)を計算するかは重要で、本来は他人を含めた全てのブログの言葉を使ったほうがいいと考えられるけど、今回はテストするので取れるデータということでWikipediaにしてある。図にすると、こんな感じ・・・なのかな。今はこれくらいの理解にしておこう。論よりなんたらっていうので、早速Pythonで試してみる。自分のブログを元にやってみる。下準備が多めなので別の記事に書いた。kzkohashi.hatenablog.comkzkohashi.hatenablog.com今回は、tf値を測るのを過去に書いた自分のブログをまずは分かち書きにする。wiki_wakati_neo.txtを使おうとしたが2000万行あって処理が遅すぎるのでとりあえず適当に100万行くらいにしておく。blog_wakati_neo.txtを使って色々計算してみる。ブログのTF値を計算Pythonもよくわからないのとコードは汚いのでそこはお気にせずに。token_pattern=u'(?u)\\b\\w+\\b')CountVectorizerはデフォルトで一文字の物を消してしまうため、その対策でtoken_patten設定すると良いみたい。Words(単語の袋)と言われる、ある文章における単語の出現回数を表したものに変換する。以下のように、すすも1回、も2回、もも2回...のように数えてくれる。名詞,非自立,副詞可能,*,*,*,うち,ウチ,ウチEOSあとはソートして頻度順にだしたいなーと思って調べてみたらぴったりやりたいことをやってくれてる方がいたのでそちらのを真似させていただく。reverse=True)words_freq結果以下になるが、いろんな記事に書かれてたけど単語分割する前にノイズを除去しなきゃいけないと思わせるいい例になってしまった。助詞などが多くなるのは当たり前か・・。名詞だけにしたいが、idfにおける希少性を利用するとこう行った一般用語は消えると思うので、このまま続けて見る。6),省略------追記------よくよく計算式を確認したら、単語数数えるだけなのはTF値ではないので、単語ごとにカウントした値を文章全体の単語数で割る必要がある。0.05714285714となる。-------追記終わり----ただ、以下のようにCountVectorizerを呼び出す際に低すぎる・高すぎる頻度の単語は除去できるっぽい。token_pattern=u'(?u)\\b\\w+\\b')TF-IDFの計算TF-IDFの計算はTfidfVectorizerを使えば良い。features.toarray()tfidfs結果は以下のようにそれっぽさそうな数値になった。1.69282165e-06]])実際に上位の10単語を抽出して見る。print(x,)結果はTF値と一緒になってしまった。fit_transformあたりでミスってしまったのだろうか・・。長くなりそうなので次回に持ち越し。してからなない終わりに歯切れは若干わるかったが、理論を理解するという意味だと理解はできたかなと思う。このままだと悔しいので、次回はTF-IDFの正確な値にチャレンジして見る。(1)はてなブログをはじめよう!kzkohashiさんは、はてなブログを使っています。ブログを報告するスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。