ramenjunitiメモ

自分なりに調べたものをまとめたり、文章を書く練習したり

日本語文書のTFIDF値を計算するGoのパッケージを作った

先日、メルペイさんのGopher道場に参加させてもらってGoの知識が増えたので、何かアウトプットしてみよう!ということでGoのパッケージを作ってみました😁

Gopher道場に関する記事はこちら ramenjuniti.hatenablog.com

作ったもの

日本語文書のTF値, IDF値, TFIDF値を計算するパッケージです。

github.com

このパッケージでは、形態素解析器としてikawahaさんのkagomeを利用しています。

github.com

テストやGoDocも書いてみました!

以下のコマンドでインストールできます!

go get -u github.com/ramenjuniti/jtfidf

TFIDFとは

そもそもこのパッケージが提供しているTF、IDF、TFIDFが何かと言うと、自然言語処理などで、文書中に含まれる単語の重要度を評価する手法の一つとして使用されているものです。

TFIDFは、TF(Term Frequency、単語の出現頻度)とIDF(Inverse Document Frequency、逆文書頻度)の二つの指標から計算されます。

TF

TFは、文書内の単語の出現頻度です。


{{\mathrm{TF}_{i,j}} ={\frac {n_{i,j}}{\sum _{k}n_{k,j}}}}

{\displaystyle n_{i,j}}は文書{\displaystyle d_{j}}における単語t_{i}の出現回数

{\displaystyle {\sum _{k}n_{k,j}}}は文書{\displaystyle d_{j}}におけるすべての単語の出現回数の和

実装

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は、単語の文書頻度の逆数です。


{{\mathrm{IDF}_{i}} =\log {\frac {|D|}{|\{d:d\ni t_{i}\}|}}}

{\displaystyle |D|}は総文書数

{|\{d:d\ni t_{i}\}|}は単語t_{i}を含む文書数

実装

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を足して、それを防ぎます。


{{\mathrm{TFIDF}_{i,j}} = {\mathrm{TF}_{i,j}} \cdot ({\mathrm{IDF}_{i}} + 1) }

実装

func Tfidf(t, d string, ds []string) float64 {
    return Tf(t, d) * (Idf(t, ds) + 1)
}

使用方法

GoDocに書きました!

godoc.org

まとめ

TFIDF自体はシンプルなもので実装自体にはそこまで時間は掛かりませんでしたが、「使いやすさ」を大事にしたかったので、「どのように実装したら使いやすいのか」を考えるのに時間を掛けました。

また、テストやGoDocなどにも力を入れました。Gopher道場で学んだテーブル駆動テストをバリバリ使っています笑f

GoDocの書き方はこちらの記事を読んで勉強しました。

qiita.com

シンプルなパッケージの実装でしたが、色々学ぶことができました!

GoでTFIDFを求めたい人がいましたら、ぜひ使ってみてくださいー

参考文献

tf-idf - Wikipedia

TF-IDF - Qiita