Skip to content
No description, website, or topics provided.
Branch: master
Clone or download
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Permalink
Type Name Latest commit message Commit time
Failed to load latest commit information.
benchmark
templates
test
.gitignore
.travis-install.sh
.travis.yml
AdaBoost.py
JEITA_Genpaku_ChaSen_IPAdic.model
README.md
RWCP.model
RWCP.py
Segmenter.py
encodeamp.py
extract
jeita2txt.py
maker
segment
test.sh
train.cpp

README.md

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("私の名前は中野です")
You can’t perform that action at this time.
You signed in with another tab or window. Reload to refresh your session. You signed out in another tab or window. Reload to refresh your session.