Skip to content

Latest commit

 

History

History
224 lines (162 loc) · 4.78 KB

README.md

File metadata and controls

224 lines (162 loc) · 4.78 KB

TinySegmenterMaker

TinySegmenter用の学習モデルを自作するためのツール.

学習方法

スペースで分かち書きしたコーパスをあらかじめ準備しておきます. コーパスから分かち書きの情報と素性を取り出します.

$ ./extract < corpus.txt > features.txt

AdaBoostを用いて学習します. 新しい弱分類器の分類精度が0.001以下,繰り返し回数が10000回以上となったら学習を終了します.

$ g++ -O3 -o train train.cpp # コンパイル
$ ./train -t 0.001 -n 10000 features.txt model # 学習

きちんと分割できるか実際に試してみます.

$ ./segment model
私の名前は中野です
私 の 名前 は 中野 です

マルチスレッドで学習

学習プログラム train はマルチスレッドに対応しています. コンパイルにはboostが必要です.

$ g++ -DMULTITHREAD -lboost_thread-mt -O3 -o train train.cpp

学習済みモデル

JEITA_Genpaku_ChaSen_IPAdic.model は 電子情報技術産業協会(JEITA)が公開している形態素解析済みコーパス を学習したものです. プロジェクト杉田玄白を茶筌+IPAdicで解析したものを使用しました.

RWCP.model は オリジナルの TinySegmenter から モデルの部分のみを取り出したものです.

再学習

学習済みのモデルとコーパスから学習を再開し,性能を向上させることができます. コーパスは学習に使用したものを想定していますが,別のコーパスを使っても動作はするはずです.

$ ./train -t 0.0001 -n 10000 -M model features.txt model_new

ライブラリの作成

makerコマンドで各種言語用のライブラリを作れます. allを指定することで,対応しているすべての言語向けのライブラリを出力します.

$ ./maker javascript < model
$ ./maker perl < model
$ ./maker ruby < medel
$ ./maker python < model
$ ./maker cpp < model
$ ./maker tex < model
$ ./maker vim < model
$ ./maker go < model
$ ./maker jsx < model
$ ./maker csharp < model
$ ./maker all < model # 上のライブラリをすべて作成します

JavaScript

<script src="tinysegmenter.js"></script>
<script>

var segmenter = new TinySegmenter();                 // インスタンス生成

var segs = segmenter.segment("私の名前は中野です");  // 単語の配列が返る

alert(segs.join(" | "));  // 表示

</script>

もちろん node.js でも使えます.

var TinySegmenter = require('./tinysegmenter.js').TinySegmenter;

var segmenter = new TinySegmenter();                 // インスタンス生成

var segs = segmenter.segment("私の名前は中野です");  // 単語の配列が返る

console.log(segs);

Perl

use utf8;
use tinysegmenter;

my $str = '私の名前は中野です';
my @words = tinysegmenter->segment($str);

Ruby

require './tinysegmenter'
ts = TinySegmenter.new
puts ts.segment("私の名前は中野です");

Python

from tinysegmenter import TinySegmenter
segmenter = TinySegmenter()
print segmenter.segment(u'私の名前は中野です')

C++

#include <iostream>
#include <string>
#include <vector>
#include "tinysegmenter.hpp"

using namespace std;

int main() {
    TinySegmenter segmenter;
    string s = "私の名前は中野です";
    vector<string> v = segmenter.segment(s);
    for(int i = 0; i < v.size(); ++i) {
        cout << v[i] << endl;
    }
}

TeX

\documentclass{jsarticle}
\usepackage{tinysegmenter}
\begin{document}
\TinySegmenter{-}{私の名前は中野です}
\end{document}

Vim script

:echo tinysegmenter#segment('私の名前は中野です')

Go

package main

import (
	"fmt"
	"tinysegmenter"
)

func main() {
	s := tinysegmenter.NewSegmenter()
	segs := s.Segment("私の名前は中野です")
	for _, seg := range segs {
		fmt.Printf("%s\n", seg)
	}
}

JSX

import "tinysegmenter.jsx";

class _Main
{
    static function main(args : string[]) : void
    {
        log TinySegmenter.segment("私の名前は中野です");
    }
}

Csharp

static void Main(string[] args)
{
    tinysegmenter segmenter = new tinysegmenter();
    List<string> segments = segmenter.Segment("私の名前は中野です");

    for(int i = 0; i < segments.Count; i++)
    {
        Console.WriteLine(segments[i]);
    }
}

Julia

using TinySegmenter

tokenize("私の名前は中野です")