D-7 <altijd in beweging>

Day to day life of a Perl/Go/C/C++/whatever hacker. May include anything from tech, food, and family.

2014年03月

3年たって思い起こすと、まだ当時は長男が産まれていなかったので本当に気持ちが楽だった。子供がいたらもっともっと辛いよなぁ。
3/11 の思い出
会社の比較的近くに住んでいたり、妻と自分二人とも健脚で歩くこと自体は何も問題がなかったり、家のあたりに停電等にもなかったり、本当にラッキーだった。
    このエントリーをはてなブックマークに追加 mixiチェック Share on Tumblr

golangでNgram処理をするためにgo-ngramを書きました。ngramによる類似文字列検索に関してはコードを読みながら逆算してこういうことか、という書き方をしたのでちょっと実装に自信はないのですが、まぁだいたい動くな、というところまでは確認しました。問題がありそうでしたら是非ご連絡ください。

使い方は以下の通り。まずただngramでトークナイズするならngram.NewTokenize()を使います。以下はいわゆるTrigramを使った例:

import (
"fmt"
"github.com/lestrrat/go-ngram"
)
func main() {
tok := ngram.NewTokenize(3, "ハローハローハロー") for _, token := range tok.Tokens() {
fmt.Printf("token = %s\n", token)
}

ちゃんと日本語も対応してます。

ユニークなトークンだけがほしい場合はTokenSet()を使ってください。
import (
"fmt"
"github.com/lestrrat/go-ngram"
)

func main () {
tok := ngram.NewTokenize(3, "ハローハローハロー")
set := tok.TokenSet() // see http://github.com/dackarep/golang-set
for x := range set.Iter() {
fmt.Printf("token = %s\n", x)
}
}

一応簡単なインメモリインデックスも作りました

import (
"fmt"
"github.com/lestrrat/go-ngram"
)

func main() {
index := ngram.NewIndex(3)
index.AddString(`....`) // 検索対象の文字列を登録しておく
....
matches := index.FindSimilarStrings(`ハロー`) // AddString()された物の中から`ハロー`に似ている文字列を持ってくる
for _, str := range matches {
fmt.Printf("matched %s\n", str)
}
}

これで登録されている文字列の中から似た単語を抽出できます。 デフォルト設定だと一個でもngramがマッチするとあたってしまいますが、SetMinScore()で閾値を設定することによって検索結果を絞り込めます。

さらに、一番良いマッチだけを持ってくる場合にはFindBestMatch()を使ってください。

あと自分で検索結果をフィルターする場合はIterateSimilar()を見てください。

ツッコミ、コメントお待ちしております。
    このエントリーをはてなブックマークに追加 mixiチェック Share on Tumblr

このページのトップヘ