これまでパラメータのキーワードは「xtcut -f」のようにアルファベット一文字であった。多くのパラメータをとるコマンドが増えてきたため、「xtbar --title」のように複数文字のキーワードを導入した。複数文字のキーワードは「--」(マイナス2文字)に続けて記述する。
技術的なポイント
複数文字のキーワードを扱うCの関数(getopt_long)が利用できない環境もあり、パラメータのparse関数を独自に実装した。
parsingのルールは以下の通り。
・ロングキーワードを短縮して記述することはできない。「--title」のところを「--ti」はだめ。
・ロングキーワードが引数をとるとき、一文字以上の空白がが必要。「--title
タイトル」のことろを「--titleタイトル」はだめ。
・シングルキーワードはまとめて記述可能。「-t -q」は「-tq」と記述できる。
・引数をとるシングルキーワードの後ろはスペースを入れても入れなくてもよい。「-f項目」と「-f 項目」は同じ意味。
簡単な棒グラフと折れ線グラフをSVGで出力するコマンドを追加した。フォントサイズなどの細かな設定はできないため、データのちょっとした確認用に利用するとよいであろう。なお、SVGを表示するためには専用のViewerが必要となる(例えばADOBE SVG Viewer)。
サンプルを以下に示しておく。
例1 | xtbar -k ブランド -e エリア -c 性別 -r 年代 -f 粗利金額 -i dat.xt -o xtbar01.svg |
xtbar01.svgをSVG Viewerで表示した画面。
例1 | xtcut -f ブランド,粗利金額 -i dat.xt | xtagg -k ブランド -f 粗利金額 -c sum | xtbar -k ブランド -f 粗利金額 --title ブランド別粗利金額 -o xtbar02.svg |
xtbar02.svgをSVG Viewerで表示した画面。
これまでXMLtableのある項目名だけを変更したい場合、簡単な方法がなかった。
例えば、A,B,C,D,Eの五つの項目名を持つデータにおいて、CをXに変えたい場合、
xtheader -a A,B,X,D,E
もしくは、
xtcut -f A,B,C:X,D,E
のように全項目を指定する必要があり、特に項目数が多くなると(例えば200項目!!)非常に面倒くさいこととなる。
そこでxtheaderコマンドに-fオプションを追加した。上記の例では、
xtheader -f C:X
のように、変更したい項目名のみを指定すれば、部分的な項目名の変更が簡単にできる。
鷲尾研究室で研究・開発されたグラフマイニングのアルゴリズム「AGM」をMUSASHIのプラットフォームで利用できるよう実装していただいた(コマンド名:agm)。AGMとは、Apriori
based Graph Mining Algorithmの略称で、マーケットバスケット分析などで用いられるアソシエーションルールのグラフ構造データへの拡張アルゴリズムである(AGMに関する詳しい資料1,資料2)。
グラフ構造をXMLtableで表現することが困難なため、同研究室で独自に定義されたGraphML(サンプルデータ)を利用している。またagmは結果をPMML形式で出力する。PMMLでは、データタイプとしてグラフ構造をサポートしていないために、今回の実装においては、GraphMLをPMMLに埋め込む形で表現している(GraphPMML)。将来的には、PMMLの拡張機能に準拠するか、もしくはPMML標準としてグラフタイプをサポートしてもらうよう働きかける予定である。GraphMLおよびGraphPMMLに関しては[資料3、資料4]に詳しく解説されている。なお、簡単なグラフ構造データであれば、XMLtableからGraphMLに変換するコマンドgml2xtにより作成できる。
以下に鷲尾研究室より提供いただいた利用例を示す。
ここで解説するケースは、発ガン性有機化合物の構造解析の初歩的な例である。今、12種類の発ガン性有機化合物の化学式で記述された分子構造データがある。各化学式は原子をノード、その間の結合をエッジで記述するグラフで表される。12種類の有機化合物に対応する12個分のグラフのノード(原子)データがファイルnode.xt、エッジ(結合)データがファイルedge.xtに、XMLtable形式でまとめて格納されている。
node.xt内の1行は1つの原子を表す。1つの化合物分子には複数の原子が含まれるので、複数の行がひとまとまりとなって1つの化合物分子内の原子を表す。1列目は化合物番号を表す。同一の化合物分子に含まれる原子は同じ化合物番号を有する。2列目は1つの化合物分子内の原子の番号を表す。更に3列目は炭素Cや塩素Clといった各原子の元素名を表す。
edge.xt内の1つの行は1つの原子間結合を表す。1つの化合物分子には複数の結合が含まれるので、node.xtの場合と似て、複数の行がひとまとまりとなって1つの化合物分子内の結合を表す。1列目は化合物番号を表す。同一の化合物分子に含まれる結合は同じ化合物番号を有する。2列目と3列目は1つの化合物分子内のどの番号の原子とどの番号の原子の間の結合であるかを示す。4列目は芳香族結合r、単結合s、二重結合d、三重結合tといった結合の種類を表す。
まず、これらのデータをxt2gmlコマンドでXMLtableからGraphMLに変換する。node.xtについては、化合物番号を最初のオプション-kでキーとして指定し、化合物分子毎に1つのグラフとして扱うことを指定する。更に化合物内の原子の番号を表す2列目をオプション-vでノード識別データとして指定する。そして、元素をオプション-fで各ノードに付随した属性として指定する。また、オプション-iでnode.xtが入力ファイルであることを指定する。edge.xtについては各結合をオプション-bとオプション-eで指定される2つの原子間の結合として読み込み、更に結合の種類をオプション-Fで各エッジに付随した属性として指定する。また、オプション-Iでedge.xtが入力ファイルであることを指定する。最後にオプション-oでGraphMLデータへの変換結果を出力するファイル名agmGraphML.xmlを指定する。
xt2gml -k 化合物 -v 原子 -f 元素 -i node.xt -b 原子1 -e 原子2 -F 結合 -I edge.xt -o agmGraphML.xml |
agmコマンドでは入力GraphMLファイルagmGraphML.xmlでマイニングした得た結果を、PMMLファイルagmPmml.xmlに出力する。agmPmml.xmlには、12種類の化合物分子構造中に一定頻度(最小サポート)以上含まれる全ての部分グラフが出力される。最小サポートの値は-Sオプションで指定する。指定しなければデフォルトとして30%である。下の例では、最小サポートの値を60%としている。この結果を見ることで、発ガン性化合物分子が一定頻度以上有する部分分子構造を明らかにできる。これらの中には、発ガン性を引き起こす部分分子構造が含まれている可能性が高い。
agm -S 60 -i agmGraphML.xml -o agmPmml.xml |
これまでxtnultoコマンドは、-fで指定した項目のNULL値のみが変換対象であった。しかし場合によっては、NULL値以外を全てある特定の値に変換したいケースがある。そのような場合-OオプションでNULL値以外の値の変換文字列を指定できるようになった。そして変換された値は-Aの指定により新しい項目としても出力可能である。例えば、
xtnulto -f 顧客番号:会員区分 -V 非会員 -O 会員 -A
とすれば、「顧客番号」がNULLのデータは「非会員」という値に変換され、それ以外は「会員」という値に変換される。そして変換結果は、「会員区分」項目として出力される。
これまでxtbucketコマンドでは、分割されたバケットの数値範囲の扱いが貧弱であった。数値範囲を出力したければ、-F1もしくは-F2を指定して、データの一部として数値範囲が出力されていた。しかし、「データとしては単にバケット番号のみ出力したい、しかし数値範囲も知りたい」というケースが多くあり、今回-Oオプションを追加した。-Oオプションに続いてファイル名を指定すれば、そのファイルに各バケットの数値範囲情報のみ含まれたXMLtableが出力される。
これまで参照ファイルの項目結合コマンドとして、xtjoin、xtnjoinの二つのコマンドがあったが、これらはキー項目が完全一致する行の項目を結合するというものであった。今回の1.0.4では、数値もしくは文字列の範囲により項目を結合するコマンドが2つ(xtrjoin,xtnrjoin)追加された。
|
|
ref.xtは日付範囲を表したデータである。範囲の意味は次の通りである。2004年05月01日から10日まで(正確には20040501以上20040510未満)を「5月上旬」とし、同様に10日から20日までを「5月中旬」、20日以降を「5月下旬」とする。この時、input.xtの日付項目をref.xtの日付範囲と突合せ、その範囲に入る「期間区分」項目を結合したいとすると、以下のように実行すればよい。
xtrjoin -v 日付 -m ref.xt -f 期間区分 -i input.xt -o result.xt |
結果は以下の通りである。
日付 | 期間区分 |
20040508 | 5月上旬 |
20040509 | 5月上旬 |
20040510 | 5月中旬 |
20040511 | 5月中旬 |
20040522 | 5月下旬 |
範囲はデフォルトでは文字列範囲として扱われる。数値範囲として指定したい場合は、「-v
金額%n」のように項目名に続けて「%n」を指定すればよい。
また、キー項目の指定も可能で(-k)、キーの値に応じて異なる範囲条件で結合することも可能である。
上に説明したxtrjoinでは、入力ファイルの一行に対して参照ファイルの一行を結合する(xtjoinと同様一対一の結合)。それに対してxtnrjoinは、入力ファイルの一行に対して参照ファイルの複数行を結合する(xtnjoinと同様)。範囲の記述方法がxtrjoinとは異なる。以下に例を示す。
|
|
小売店で行われたセールの名称を結合することを考える。参照ファイルref.xtにおいて、範囲は「開始日付」と「終了日付」として指定する。それぞれの範囲に対応したセール名を図示すると上図のようになる。ここで、入力ファイルinput.xtの「日付」が参照ファイルの日付範囲にマッチすれば、マッチした全ての行の「セール名」を結合したい場合、xtnrjoinコマンドで以下のように指定すればよい。
xtnrjoin -v 日付 -m ref.xt -R 開始日付,終了日付%e -f 期間区分 -i input.xt -o result.xt |
-Rにて範囲の開始と終了を示す項目を指定するが、デフォルトでは「開始」以上「終了」未満として解釈する。イコール条件をつけるためには「%e」を、イコール条件を外すためには「%n」を付ければよい。上記の例での範囲は、「開始日付」以上「終了日付」以下となる。
結果は以下の通りである。
日付 | 期間区分 |
20040508 | 会員特価セール |
20040508 | 紳士服フェア |
20040509 | 会員特価セール |
20040509 | お菓子フェア |
20040509 | 紳士服フェア |
20040510 | 会員特価セール |
20040510 | お菓子フェア |
20040510 | 紳士服フェア |
20040511 | お菓子フェア |
xtrjoinと同様に、キー項目の指定も可能で(-k)、キーの値に応じて異なる範囲条件で結合することも可能である。
範囲としてのNULL値("*")は無限大(無限小)として扱われる。
複数範囲によりデータを選択するコマンドxtnrcommonが追加された。範囲の指定方法は、xtnrjoinと同様である。参照ファイルの複数の範囲条件に一つでもマッチすれば選択される。
以下に例を示す。
|
|
xtnrcommon -v 日付 -m ref.xt -R 開始日付,終了日付%e -i input.xt -o result.xt |
結果は以下の通りである。
日付 |
20040508 |
20040509 |
20040510 |
20040511 |
xtnrjoinと同様に、キー項目の指定も可能で(-k)、キーの値に応じて異なる範囲条件で選択することも可能である。
xtnumberは、-sで指定した項目でソートさせ上から順に番号を付けるコマンドであるが、-sで指定した項目に同じ値が存在した場合の番号付けに関するオプション-eを追加した。-eは「seq」、「skip」、「same」の3つの値のうち一つを指定する。それぞれの意味を以下に例示する。
|
→ |
|
→ |
|
|
→ |
|
→ |
|
|
→ |
|
→ |
|
XMLtableデータをWEKA用のデータフォーマットARFFに変換するコマンドxt2arffでは、これまで数値型とカテゴリ型にのみ対応していたが、今回、文字型と日付型にも対応可能とした。文字型項目は-s、日付型項目は-Dにて指定する。
空白区切りのTEXTやCSVフォーマットのデータをXMLtableに変換するコマンドtxt2xtもしくはcsv2xtは、これまで項目数の異なるレコードがあれば、その時点でエラー終了する仕様であった。今回、-fオプションを追加し、項目数が異なるレコードについては、以下のルールに基づいて調整して出力できるようになった。
XMLtableをHTML文書(Table要素による)を使って変換するコマンドxt2htmlに-bオプションを追加した。これまでxt2htmlコマンドでは、完全なHTML文書(html要素から始まる)のみ出力していたが、-bオプションを指定することによって、table要素のみを出力できるようになった。このことにより、テンプレートとして既に作成したHTML文書に、xt2htmlで作成したtable要素を埋め込むといったことが可能となる。埋め込みに関してはMUSASHIが提供するptrepfileコマンド(正式リリースではないが)を使えばよい。
複数のXMLtableを「縦」に併合するコマンドxtcatのファイル存在チェック機能を見直した。これまでは、-iで指定したワイルドカードを含まない入力ファイルを指定してもエラーとならなかったが、場合によっては、エラーとする方が都合がよい。そこで、ワイルドカードを伴わないファイル名が存在しなければエラーとすることにした。
ほとんど全てのコマンドについて、出力ファイル名(-o)を指定しなければ標準出力に結果が出力される。-zオプションを付ければ、出力結果はgzip圧縮され仕様であった。しかしこのオプションは利用価値がないと判断し無効(指定できるが効果なし)とした。
もちろん、-oで指定したファイル名に拡張子「.gz」を付ければ圧縮されるという仕様に関しては変更していない。
その他、以下に示すような細かな変更およびバグ修正をおこなった。