Skip to content

miyako/4d-plugin-mecab-v2

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

99 Commits
 
 
 
 
 
 
 
 

Repository files navigation

version platform license downloads

4d-plugin-mecab-v2

4D implementation of MeCab

できること

  • システム辞書のコンパイル(コールバックメソッド付き)

  • ユーザー辞書のコンパイル(コールバックメソッド付き)

  • 辞書の切り替え(システム辞書1+任意数のユーザー辞書)

TODO

オリジナル辞書/コーパスからのパラメータ推定に必要なmecab-cost-trainおよびmecab-dict-genに相当するコマンド

Install

プラグインには辞書ファイルが含まれていません。

下記のファイルをダウンロードしておき,スタートアップでMeCab SET MODELを実行してください。

サンプルプログラムのResourcesフォルダーには,これらのファイルが含まれています。

C_OBJECT($model)
$model:=JSON Parse(MeCab Get model ;Is object)

If ($model=Null)
	
	$model:=New object
	$model.dicdir:=Get 4D folder(Current resources folder)+"jumandic"
	
	MeCab SET MODEL (JSON Stringify($model))
	
end if

コスト自動計算モード(assignUserDictionaryCosts)でユーザー辞書を作成するためには

  • rewrite.def
  • char.bin
  • model.bin
  • feature.def

が必要です。

rewrite.defchar.binは辞書に含まれています。

model.binfeature.defは下記からダウンロードすることができます。

サンプルプログラムのResourcesフォルダーには,これらのファイルが含まれています。

システム辞書からmodel.binを作成するためには,model.defが必要です。IPA辞書の学習モデルはmecabやmecab-ipadicのソースコードと一緒に配布されていませんでした。

システム辞書を作成するには,CSVファイルおよび設定ファイル群が必要です。公式版IPA辞書のように,EUC-JPのCSVから作成することもできますが,その場合,モデルファイルもEUC-JPとなるため,コスト自動計算モードでユーザー辞書を作成することができません。UTF-8版のCSVファイルは,下記からダウンロードすることができます。

なお,サンプルプログラムは,これらのファイルがデスクトップにあるという前提で書かれています。

Syntax

model:=MeCab Get model
Parameter Type Description
model TEXT JSON

現在のmecab設定を返します。この設定は,アプリケーション全体,つまりすべてのプロセスに対して共通です。

dicdir: システム辞書のディレクトリパス (Path is system)
version: ライブラリのバージョン文字列(0.996
dict[]: 辞書情報(下記オブジェクトのコレクション)

filename: 辞書ファイル名 (Path is POSIX)
charset: 文字セット(utf8
size: 登録語数
type: 0 システム辞書 1 ユーザー辞書 2 未知語辞書
lsize: left属性数
rsize right属性数
version: 辞書バージョン(102

MeCab SET MODEL (model)
Parameter Type Description
model TEXT JSON

dicdir: システム辞書のディレクトリパス (Path is system)
userdic[] or userdic: ユーザー辞書のファイルパス (Path is system)

  • userdic(任意)には,文字列または文字列のコレクションが渡せます。
result:=MeCab (sentence)
Parameter Type Description
sentence TEXT sentence
result TEXT JSON

形態素分析の結果を返します。(下記オブジェクトのコレクション)

feature: 素性
value: 表層形
rcAttr: 右連接状態番号 lcAttr: 左連接状態番号 cost: コスト posid: 形態素ID
char_type: 文字種ID
stat: 形態素種類ID
isbest: 最適パス (true false)

素性CSVのフォーマット,各種IDは辞書依存です。

ipadic: 品詞,品詞細分類1,品詞細分類2,品詞細分類3,活用形,活用型,原形,読み,発音

辞書を切り替えるには

$model:=JSON Parse(MeCab Get model)

$model.dicdir:=Path to object($model.dicdir;Path is system).parentFolder+"jumandic"

MeCab SET MODEL (JSON Stringify($model))

形態素の配列を取り出すには

$sentence:="太郎は次郎が持っている本を花子に渡した。"

$result:=JSON Parse(MeCab($sentence);Is collection)
$words:=$result.extract("value")

2018-12-17 10 00 59

N-best解を取り出すには

$sentence:="ははははははと笑った"

C_OBJECT($options)
$options:=New object("nbest";2;"theta";0.5)

$results:=JSON Parse(MeCab ($sentence;JSON Stringify($options));Is collection)

C_COLLECTION($result;$words)
$words:=New collection()

For each ($result;$results)
	$words.push($result.extract("value"))
End for each 

2018-12-17 11 30 13

MeCab INDEX DICTIONARY (options{;method})
Parameter Type Description
model TEXT JSON
method TEXT callback (TEXT;LONGINT;LONGINT;LONGINT)

システム辞書またはユーザー辞書を作成します。mecab-dict-indexのようなものです。

コールバックメソッドの例

C_TEXT($1;$message)
C_LONGINT($2;$event;$3;$current;$4;$total)
C_BOOLEAN($0;$abort)

$event:=$2

Case of 
	: ($event=1)  //open file
		
		$message:="open "+$1
		MESSAGE($message)
		
	: ($event=2)  //create file
		
		$message:="create "+$1
		MESSAGE($message)
		
	: ($event=3)  //emit double array
		
		$message:="emitting double array "+String($3)+"/"+String($4)
		MESSAGE($message)
		
	: ($event=4)  //emit matrix
		
		$message:="emitting matrix "+String($3)+"x"+String($4)
		MESSAGE($message)
		
	: ($event=-1)
		
		$message:="missing "+$1
		MESSAGE($message)
		
	: ($event=-2)
		
		$message:="missing csv "+$1
		MESSAGE($message)
		
	: ($event=-3)
		
		$message:="invalid model "+$1
		MESSAGE($message)
		
	: ($event=-4)
		
		$message:="invalid csv "+$1
		MESSAGE($message)
		
	: ($event=5)  //error open file
		
		$message:="error open "+$1
		MESSAGE($message)
		
	: ($event=6)  //error create file
		
		$message:="error create "+$1
		MESSAGE($message)
		
	: ($event=-7)
		
		$message:="invalid def "+$1
		MESSAGE($message)
		
	: ($event=-8)
		
		$message:="invalid dicrc "+$1
		MESSAGE($message)
		
	: ($event=-9)
		
		$message:="error write "+$1
		MESSAGE($message)
		
End case 

システム辞書を作成するには

  • 必須プロパティ

options.outdir: 出力フォルダーパス
options.sysdicdir: 入力フォルダーパス(CSVファイルの場所)
options.dicdir: 設定フォルダーパス

  • 任意プロパティ

options.configCharset: 設定ファイルの文字コード(既定:EUC-JP
options.dictionaryCharset: 入力CSVファイルの文字コード(既定:EUC-JP

出力ファイルの文字コードはUTF-8固定です。

options.buildUnknown: unk.dicを出力(既定:false
options.buildMatrix: matrix.binを出力(既定:false, matrix.def必要)
options.buildCharCategory: char.binを出力(既定:false; char.def, unk.def必要)
options.buildSysdic: sys.dicを出力(既定:true
options.buildModel: model.binを出力(既定:false; model.def必要)
options.model: model.defのファイルパス(既定:$(dicdir)/model.def

matrix.def未指定の場合,既定(1 1\n0 0 0\n)が使用されます。

char.def未指定の場合,既定(DEFAULT 1 0 0\nSPACE 0 1 0\n0x0020 SPACE\n)が使用されます。

unk.def未指定の場合,既定(DEFAULT,0,0,0,*\nSPACE,0,0,0,*\n)が使用されます。

model.binを出力する場合,辞書の文字コード(dictionaryCharset)は出力ファイルの文字コード(utf8)と合致していなければなりません。

システム辞書ファイルとして使用するフォルダーにはdicrcファイルがなければなりません。

  //システム辞書を作成する例(ipadic-utf8)

  //作業フォルダーを用意
$dictPath:=System folder(Desktop)+"ipadic-sys"+Folder separator
DELETE FOLDER($dictPath;Delete with contents)
CREATE FOLDER($dictPath;*)

  //辞書データの設定
C_OBJECT($options)
$options:=New object

  //出力SYS.DICフォルダーパス
$options.outdir:=$dictPath

  //入力CSVファイルのフォルダーパス(ダウンロードした辞書のソースファイル群)
$options.sysdicdir:=System folder(Desktop)+"mecab-ipadic-utf8"+Folder separator
$options.dictionaryCharset:="UTF-8"  //入力CSVファイルの文字コード

  //設定ファイルの場所
$options.dicdir:=Get 4D folder(Current resources folder)+"ipadic"
$options.configCharset:="UTF-8"  //設定ファイルの文字コード

  //作成するファイルの指定 (カッコ内は依存設定ファイル)
$options.buildUnknown:=True  //unk.dic (unk.def)
$options.buildSysdic:=True  //sys.dic (unk.def)
$options.buildMatrix:=True  //matrix.bin (matrix.def)
$options.buildCharCategory:=True  //char.bin (char.def,unk.def)
$options.buildModel:=True  //model.bin (model.def)

  //辞書ファイルのコンパイル

$method:="mecab_progress"
MeCab INDEX DICTIONARY (JSON Stringify($options);$method)

  //辞書設定ファイルのコピー(システム)
COPY DOCUMENT($options.sysdicdir+"dicrc";$options.outdir+"dicrc";*)

  //辞書設定ファイルコピー(ユーザー)
COPY DOCUMENT($options.sysdicdir+"left-id.def";$options.outdir+"left-id.def";*)
COPY DOCUMENT($options.sysdicdir+"pos-id.def";$options.outdir+"pos-id.def";*)
COPY DOCUMENT($options.sysdicdir+"rewrite.def";$options.outdir+"rewrite.def";*)
COPY DOCUMENT($options.sysdicdir+"right-id.def";$options.outdir+"right-id.def";*)
COPY DOCUMENT($options.sysdicdir+"feature.def";$options.outdir+"feature.def";*)

  //システム辞書を使用
C_OBJECT($model)
$model:=New object
$model.dicdir:=$dictPath

MeCab SET MODEL (JSON Stringify($model))

$window:=Open form window("TEST")
DIALOG("TEST")

ユーザー辞書を作成するには

  • 必須プロパティ

options.userdic: 出力ファイルパス
options.userdicdir: 入力フォルダーパス(CSVファイルの場所)
options.dicdir: 設定フォルダーパス

  • 任意プロパティ

options.assignUserDictionaryCosts: 自動コスト計算で.csvを出力(既定:false; model, char, featureを参照)
options.model: model.defまたはmodel.binのファイルパス(既定:$(dicdir)/model.bin
options.feature: feature.defのファイルパス(既定:$(dicdir)/feature.def

  • dicdirに用意しておくもの(assignUserDictionaryCosts=trueの場合)

matrix.binまたはmatrix.def
dicrc
left-id.def
right-id.def
rewrite.def
char.bin

  • dicdirに用意しておくもの(assignUserDictionaryCosts=falseの場合)

matrix.binまたはmatrix.def
dicrc
left-id.def
right-id.def
rewrite.def
pos-id.def

ユーザー辞書を作成するには(自動コスト計算)

  //ユーザー辞書を作成する例(ipadic/コスト自動計算)

  //作業フォルダーを用意
$dictPath:=System folder(Desktop)+"ipadic-usr"+Folder separator
DELETE FOLDER($dictPath;Delete with contents)
CREATE FOLDER($dictPath;*)

  //CSVファイルを作成
C_COLLECTION($data;$datum)
$data:=New collection

  //1行目は空データにする(つぎの連結コストがマイナスにならないように)
$data.push(New collection("";0;0;0;"";"";"";"";"";"";"";"";""))

  //単語データは2行目以降に
$data.push(New collection("ルペック";1293;1293;10000;"名詞";"固有名詞";"地域";"一般";"*";"*";"ルペック";"ルペック";"ルペック"))
$data.push(New collection("リバルディエール";1291;1291;10000;"名詞";"固有名詞";"人名";"名";"*";"*";"リバルディエール";"リバルディエール";"リバルディエール"))

$csv:=New collection
For each ($datum;$data)
	$csv.push($datum.join(","))
End for each 
  //改行コードはLFで
TEXT TO DOCUMENT($dictPath+"data.csv";$csv.join("\n");"utf-8";Document unchanged)

  //辞書データの設定
C_OBJECT($options)
$options:=New object

  //出力DICファイルパス
$options.userdic:=$dictPath+"$"+Generate UUID+".csv"

  //入力CSVファイルのフォルダーパス
$options.userdicdir:=$dictPath
$options.dictionaryCharset:="UTF-8"  //入力CSVファイルの文字コード

  //設定ファイルの場所
$options.dicdir:=Get 4D folder(Current resources folder)+"ipadic"
$options.configCharset:="UTF-8"  //設定ファイルの文字コード

$options.assignUserDictionaryCosts:=True

  //追加の設定ファイル
$options.model:=Get 4D folder(Current resources folder)+"ipadic.utf8.model.bin"
$options.feature:=Get 4D folder(Current resources folder)+"ipadic.utf8.feature.def"

  //コストの自動計算
$method:="mecab_progress"
MeCab INDEX DICTIONARY (JSON Stringify($options);$method)

MOVE DOCUMENT($dictPath+"data.csv";$dictPath+"data.txt")
MOVE DOCUMENT($options.userdic;$dictPath+"data.csv")

$options.assignUserDictionaryCosts:=False  //コストの自動計算モードをここでオフにする
$options.userdic:=$dictPath+"data.dic"

  //辞書ファイルの作成
MeCab INDEX DICTIONARY (JSON Stringify($options);$method)

  //システム辞書+ユーザー辞書を使用
C_OBJECT($model)
$model:=New object
$model.dicdir:=Get 4D folder(Current resources folder)+"ipadic"
$model.userdic:=$options.userdic

MeCab SET MODEL (JSON Stringify($model))
$model:=JSON Parse(MeCab Get model )

$window:=Open form window("TEST")
DIALOG("TEST")

ユーザー辞書を作成するには(モデル無し)

  //ユーザー辞書を作成する例(ipadic/コスト指定)

  //作業フォルダーを用意
$dictPath:=System folder(Desktop)+"ipadic-usr"+Folder separator
DELETE FOLDER($dictPath;Delete with contents)
CREATE FOLDER($dictPath;*)

  //CSVファイルを作成
C_COLLECTION($data;$datum)
$data:=New collection

  //1行目は空データにする(つぎの連結コストがマイナスにならないように)
$data.push(New collection("";-1;-1;0;"";"";"";"";"";"";"";"";""))

  //単語データは2行目以降に
$data.push(New collection("ルペック";1293;1293;1;"名詞";"固有名詞";"地域";"一般";"*";"*";"ルペック";"ルペック";"ルペック"))
$data.push(New collection("リバルディエール";1291;1291;1;"名詞";"固有名詞";"人名";"名";"*";"*";"リバルディエール";"リバルディエール";"リバルディエール"))

$csv:=New collection
For each ($datum;$data)
	$csv.push($datum.join(","))
End for each 
  //改行コードはLFで
TEXT TO DOCUMENT($dictPath+"data.csv";$csv.join("\n");"utf-8";Document unchanged)

  //辞書データの設定
C_OBJECT($options)
$options:=New object

  //出力DICファイルパス
$options.userdic:=$dictPath+"data.dic"

  //入力CSVファイルのフォルダーパス
$options.userdicdir:=$dictPath
$options.dictionaryCharset:="UTF-8"  //入力CSVファイルの文字コード

  //設定ファイルの場所
$options.dicdir:=Get 4D folder(Current resources folder)+"ipadic"
$options.configCharset:="UTF-8"  //設定ファイルの文字コード

$options.assignUserDictionaryCosts:=False

  //辞書ファイルのコンパイル
$method:="mecab_progress"
MeCab INDEX DICTIONARY (JSON Stringify($options);$method)

  //システム辞書+ユーザー辞書を使用
C_OBJECT($model)
$model:=New object
$model.dicdir:=Get 4D folder(Current resources folder)+"ipadic"
$model.userdic:=$options.userdic
MeCab SET MODEL (JSON Stringify($model))
$model:=JSON Parse(MeCab Get model )

$window:=Open form window("TEST")
DIALOG("TEST")