日本語文書のTFIDF値を計算するGoのパッケージを作った
先日、メルペイさんのGopher道場に参加させてもらってGoの知識が増えたので、何かアウトプットしてみよう!ということでGoのパッケージを作ってみました😁
Gopher道場に関する記事はこちら ramenjuniti.hatenablog.com
作ったもの
日本語文書のTF値, IDF値, TFIDF値を計算するパッケージです。
このパッケージでは、形態素解析器としてikawahaさんのkagomeを利用しています。
テストやGoDocも書いてみました!
以下のコマンドでインストールできます!
go get -u github.com/ramenjuniti/jtfidf
TFIDFとは
そもそもこのパッケージが提供しているTF、IDF、TFIDFが何かと言うと、自然言語処理などで、文書中に含まれる単語の重要度を評価する手法の一つとして使用されているものです。
TFIDFは、TF(Term Frequency、単語の出現頻度)とIDF(Inverse Document Frequency、逆文書頻度)の二つの指標から計算されます。
TF
TFは、文書内の単語の出現頻度です。
実装
func Tf(t, d string) float64 { terms := splitTerm(d) n := len(terms) var count int for _, term := range terms { if t == term { count++ } } return float64(count) / float64(n) }
IDF
IDFは、単語の文書頻度の逆数です。
実装
func Idf(t string, ds []string) float64 { n := len(ds) termsList := make([][]string, n) var df int for i, d := range ds { termsList[i] = splitTerm(d) } for i := 0; i < len(termsList); i++ { for j := 0; j < len(termsList[i]); j++ { if t == termsList[i][j] { df++ break } } } if df == 0 { return 0 } return math.Log(float64(n) / float64(df)) }
TFIDF
TFIDFは、TFとIDFの積です。 しかし、IDFが0である場合、TFに関係なくTFIDFが0になってしまいます。 そのため、このパッケージではIDFに1を足して、それを防ぎます。
実装
func Tfidf(t, d string, ds []string) float64 { return Tf(t, d) * (Idf(t, ds) + 1) }
使用方法
GoDocに書きました!
まとめ
TFIDF自体はシンプルなもので実装自体にはそこまで時間は掛かりませんでしたが、「使いやすさ」を大事にしたかったので、「どのように実装したら使いやすいのか」を考えるのに時間を掛けました。
また、テストやGoDocなどにも力を入れました。Gopher道場で学んだテーブル駆動テストをバリバリ使っています笑f
GoDocの書き方はこちらの記事を読んで勉強しました。
シンプルなパッケージの実装でしたが、色々学ぶことができました!
GoでTFIDFを求めたい人がいましたら、ぜひ使ってみてくださいー