Skip to content

ikawaha/dartsclone

Repository files navigation

dartsclone : Double Array TRIE liblary

Build Status Build status Coverage Status GoDoc

Port of Sudachi's dartsclone library to Go.

Build & Save

package main

import (
	"os"

	"github.com/ikawaha/dartsclone"
)

func main() {
	keys := []string{
		"電気",
		"電気通信",
		"電気通信大学",
		"電気通信大学大学院",
		"電気通信大学大学院大学",
	}

	// Build
	builder := dartsclone.NewBuilder(nil)
	if err := builder.Build(keys, nil); err != nil {
		panic(err)
	}
	// Save
	f, err := os.Create("my-double-array-file")
	if err != nil {
		panic(err)
	}
	builder.WriteTo(f)
	f.Close()
}

Load & Search

package main

import (
	"fmt"
	"github.com/ikawaha/dartsclone"
)

func main() {
	trie, err := dartsclone.Open("my-double-array-file")
	if err != nil {
		panic(err)
	}
	ret, err := trie.CommonPrefixSearch("電気通信大学大学院大学", 0)
	for i := 0; i < len(ret); i++ {
		fmt.Printf("id=%d, common prefix=%s\n", ret[i][0], "電気通信大学大学院大学"[0:ret[i][1]])
	}
}

outputs

id=0, common prefix=電気
id=1, common prefix=電気通信
id=2, common prefix=電気通信大学
id=3, common prefix=電気通信大学大学院
id=4, common prefix=電気通信大学大学院大学

Use memory mapping

  • Build Tags : mmap
  • Support OS : linux, osx, windows
$ go build -tags mmap ./...
package main

import (
	"fmt"
	"github.com/ikawaha/dartsclone"
)

func main() {
	trie, err := dartsclone.OpenMmaped("my-double-array-file") // ← ★
	if err != nil {
		panic(err)
	}
	defer trie.Close() // ← ★

	ret, err := trie.CommonPrefixSearch("電気通信大学大学院大学", 0)
	for i := 0; i < len(ret); i++ {
		fmt.Printf("id=%d, common prefix=%s\n", ret[i][0], "電気通信大学大学院大学"[0:ret[i][1]])
	}
}