.

Ruby/CHISEの実装,
IDSによる字形構造分析の試み

独立行政法人産業技術総合研究所 特別研究員
江渡 浩一郎 http://staff.aist.go.jp/k-eto/

.

まずはデモ。

require 'chise'
include CHISE
p "字"					#"字"
p "字".ucs				#23383
p "字".total_strokes		#6
p "字".inspect_all			#いろいろでてくる。
p "字".ideograph_daikanwa	#6942	#大漢和番号6942である。

このように実行することができる。 つまり文字そのものが自分の持つ属性を知っていて、そこにメソッドとしてアクセスできる。

.

Character class

p "字字".ucs		#エラー

Character classのオブジェクトを生成し、それを直接用いることもできる。

char = "字".char			#Character classのインスタンスを生成。
char = Character.get("字")	#上記とまったく同じ。

flyweightパターンを用いている。同じ字の場合は同じインスタンスとなる。

Characterは文字データベースに問い合わせを行い、属性の値を取得する。

.

実体参照

p "字". to_er			#"字"	#実体参照化する
p "字".de_er		#"字"			#実体参照を解除
p "&J90-3B7A;".de_er		#JISX0208-1990による実体参照を解除
p "&M-06942;".de_er		#大漢和番号による実体参照を解除

このように、様々なCCSにおける実体参照を解除することができる。

.

Stringの拡張

String#each_character
Stringの一文字毎にイテレータを実行。引数としてCharacterがはいる。
String#map_character
同様にmapした結果の文字列を返す。
String#char_length
UTF-8的な文字列の長さを返す。

他に、to_er, de_erなど、Characterと共通の要素を各文字毎に摘要するというメソッドもいくつか用意されている。

.

my属性の定義

"木".mydepth = 1
"林".mydepth = 2
"森".mydepth = 3

実行すると自動的にデータベースに保存されるため、
プログラム終了後も属性は保存される。

p "木".mydepth
p "林".mydepth
p "森".mydepth

このようにして、自分独自の必要な属性を作り、
その属性に基づいたプログラムを書くことができる。

.

IDS

IDSによる字形分解・合成ができる。

p "字".decompose		#"⿱   宀子"	#分解する
p "⿱   宀子".compose		#"字"	#合成する
p "鬱".decompose		#"木缶木冖鬯彡"	#難しい字もOK
p "鬱".decompose_all		#再帰的に分解する。
p "木缶".find		#この二つの部品を含む漢字をリストアップ

字形構造は内部的にはできるだけ集約した形で持っている。

.

IDSによる字形構造分析

漢字の字形内部の構造をデータとして扱うことができる。

JISX0208集合(6355字)において:
要素 3525.5%
384660.5%
146523.1%
180.3%
741.2%
420.7%
771.2%
50.1%
140.2%
2403.8%
390.6%
1632.6%
200.3%

このようにして、字形構造分析を効率的に行うための基盤が構築された。
この基盤を元に、より詳細な字形構造分析を予定である。

.

不足している機能

CES関連は不足している。

ドキュメントが不足している。

.

How to GET

http://eto.com/2003/ruby/

現時点では、XEmacs CHISEにおいてビルドされた文字データベースが必要

Windows, Linuxでも同様に動作する。

開発は主にWindows上でおこなった。

テストプログラム: test1.rb, test2.rb, test3.rb, test4.rb, test5.rb, count1.rb

.
1
2
3
4
5
6
7
8
9
10