TinySegmenter を TypeScript に移植してみた

最近 TypeScript をまったく書いてなくて、

……あれ? TypeScript ってどうやって書いてたんだっけ?

ってなっていたのと、あと、

nextapps-de/flexsearch

Next-Generation full text search library for Browser and Node.js - nex...

https://github.com/nextapps-de/flexsearch

というのを見つけて、

オッ、これ TinySegmenter 使えば良い案件じゃん!

と思ったので、先日、まるっと一日ぐらいを掛けて、

を TypeScript に移植していました。そしてその成果がこちら:

Naoki OKAMURA / japanese-tokenizer

A TinySegmenter implementation of TypeScript

https://gitlab.com/nyarla/japanese-tokenizer

今の段階ではnpm への publish の仕方を忘れ切っている関係で、パッケージングが全然ダメダメな都合上、 npm publish も何も出来てないんですが、とりあえず想定している使い方としてはこんな感じです。

import { tokenize, createJapaneseTokenizer } from '@nyarla/japanese-tokenizer';

// basic usage
console.log(tokenize('今日は良い天気ですね'))
    // => ["今日", "は", "良い", "天気", "です", "ね"]

// customize dictionary and bias
const BIAS: number = ....;
const Dictionary: { [key: string]: { [key: string]: number } } = { ... }
const customTokenize = createJapaneseTokenizer(BIAS, Dictionary);

console.log(customTokenize('今日は良い天気ですね'))
    // => [ ... ]

また、今回 TypeScript に移植するに当たって工夫した点としては、

  • TinySegmenter.jl の手法(文字列を配列にせずに取り扱う )を取り入れた
  • 辞書を手軽に入れ替えられる様にした(JSON ファイルを用意するだけになった)
  • 正規表現(RegExp)を使わずに文字を分類できる様にした

という辺りです。

まーベンチマークとか取ってないんで、あんまり速度的にどうとか言えないんですが、 これらの手法が上手く効力を持っているならば、多少はオリジナルより早くなっているとは思います。 が、やっぱりベンチは取らないとダメですね。はい。

それと、あともうちょっとやる気が続けばパッケージングなりベンチマークなりドキュメントを揃えるなどした後、 GitHub の方へ移して正式に自分がメンテするプロジェクトになると思います。が、まぁその辺りはやる気次第かな。

それで、今私の GitHub と GitLab の使い分けが、

  • 自分でキッチリメンテする予定のプロジェクト → GitHub
  • 個人用やとりあえず作ったレベルのプロジェクト → GitLab

という感じなんで、今回作ったモノも、もうちょっとやる気が出たら GitHub に移したいと思います。

nyarlaが大体

Scrapbox.io でコメントや意見を書く