メガソフト トップサポートユーザーフォーラム > テキストエディタ MIFESフォーラム
テキストエディタ MIFESフォーラム
[フォーラムトップ]
一括表示

マイフェス8のマクロコマンドの記述について - sigue-san 2012/10/28(Sun) 07:59 No.2799
マイフェス8のマクロコマンドの記述について

「出現頻度」、「用語」、「用語の英訳語」の順番で並んだタブ区切りレコードからなるファイル(1)と、
これらの用語が含まれている文データファイル(2)を作製しました。

ファイル(1)
598 遺伝子型 genotype
302 既知 known
224 動的プロファイル0005 dynamic profile
199 および and
189 各 each

ファイル(2)
0001; 特表JP2012-5236450(WO2010120800)(US2011010103)
0002; (54)【発明の名称】動的シグナルの相関分析による、パターン認識、機械学習、および自動遺伝子型分類の迅速な方法
0003; (57)【要約】
0004; 核酸の解離挙動の分析、およびある遺伝子型が生体試料中に存在するかどうかを判定する同定のための方法およびシステム。

ファイル(1)内のそれぞれの用語に対して、順に、ファイル(2)内の各用語の初出文番号(文頭に付けた4桁の数字列)を検索し、用語の前にこの数字列およびタブ記号を付加するマクロプログラム(マイフェスのキーボードマクロからマクロソースに変換したもの)を以下のように、マクロソースから書き換えましたが、期待する結果が得られません。

*SEN-NumAdd 検索文字列を含む文番号をfreqデータの前に付加
0001 search(2,0x0004,"\t")
0002 move("r")
0003 @selmode=3
0004 execmd(36);↓方向再検索
0005 @1=getselstring(@str1) ;選択中の文字列を変数@str1に取り込む。キーボードマクロcopy()の書き換え
0006 execmd(46);↑方向再検索
0007 move("r")
0008 execmd(50);ウィンドウ切り替え
0009 jump(0,1)
0010 @2=search(2,0x0004,[ぁ-ん]@str1) ;取り込んだ文字列を検索する。キーボードマクロsearch(2,0x0004,"[ぁ-ん]遺伝子型")の書き換え
0011 execmd(61);行の左端へ
0012 @selmode=3
0013 search(2,0x0004,";")
0014 @3=getselstring(@str2) ;選択中の文字列を変数@str2に取り込む。キーボードマクロcopy()の書き換え
0015 execmd(50);ウィンドウ切り替え
0016 insstring(@str2);取り込んだ文字列を挿入する。キーボードマクロpaste(1)の書き換え
0017 insstr("\t")
0018 execmd(61);行の左端へ
0019 move("d")
0020 *

私が期待する結果は、ファイル(2)を以下のようなファイル(3)にすることです。

ファイル(3)
598 0004 遺伝子型 genotype
302 既知 known
224 動的プロファイル dynamic profile
199 および and
189 各 each


私の書いたプログラム(参照のために行番号を付加しています)のおかしい個所をご教示くださいますようお願いします。
マイフェスの製造元メガソフト社に問い合わせましたが、マクロはサポートの対象外と断られて弱っています。

よろしくお願いしますm(__)m。

Re: マイフェス8のマクロコマンドの記述について - 田中徹 2012/10/28(Sun) 17:52 No.2800
> マイフェス8のマクロコマンドの記述について
>
> 「出現頻度」、「用語」、「用語の英訳語」の順番で並んだタブ区切りレコードからなるファイル(1)と、
> これらの用語が含まれている文データファイル(2)を作製しました。
>
> ファイル(1)
> 598 遺伝子型 genotype
> 302 既知 known
> 224 動的プロファイル0005 dynamic profile
> 199 および and
> 189 各 each
>
> ファイル(2)
> 0001; 特表JP2012-5236450(WO2010120800)(US2011010103)
> 0002; (54)【発明の名称】動的シグナルの相関分析による、パターン認識、機械学習、および自動遺伝子型分類の迅速な方法
> 0003; (57)【要約】
> 0004; 核酸の解離挙動の分析、およびある遺伝子型が生体試料中に存在するかどうかを判定する同定のための方法およびシステム。
>

> 私が期待する結果は、ファイル(2)を以下のようなファイル(3)にすることです。
>
> ファイル(3)
> 598 0004 遺伝子型 genotype
> 302 既知 known
> 224 動的プロファイル dynamic profile
> 199 および and
> 189 各 each

(3) のファイルはフィールドが 4つあるはずですが、最初の遺伝子型以外は 3つしかないようです。(それともヌル??)

1つめの「遺伝子型」は(2)の 0002 にも出現していますが「初出文番号」の意味が把握できません。
4つめの「および」なども(2)ではかなり出現しているのに(3)ではありません。

期待する結果の仕様をもう少し例を挙げてくださればお力になれるかもしれません。

Re^2: マイフェス8のマクロコマンドの記述について - sigue-san 2012/10/29(Mon) 11:10 No.2801
メールありがとうございます。

ファイル(1),(2)および(3)の記載が誤っていました。

ファイル(1)

598 遺伝子型 genotype
302 既知 known
224 動的プロファイル dynamic profile
199 および and
189 各 each

ファイル(2)

0001; 特表JP2012-5236450(WO2010120800)(US2011010103)
0002; (54)【発明の名称】動的シグナルの相関分析による、パターン認識、機械学習、および自動遺伝子型分類の迅速な方法
0003; (57)【要約】
0004; 核酸の解離挙動の分析、およびある遺伝子型が生体試料中に存在するかどうかを判定する同定のための方法およびシステム。
0005; @ 未知の遺伝子型の動的プロファイルを生成することによって、ある遺伝子型が生体試料中に存在するかどうかを判定すること、動的プロファイルを、既知の遺伝子型のアベレージプロファイルと相関させることによって、相関値を生成すること、および相関値が、許容できる閾値内に入るかどうかを判定することによって、未知の遺伝子型が既知の遺伝子型であるかどうかを判定すること。

ファイル(3)

598 0004 遺伝子型 genotype ## ファイル(2)の0002の文中の「自動遺伝子型分類」にはマッチさせない。ひらがな文字列で囲まれた検索文字列をマッチさせるようにする。
302 0005 既知 known
224 0005 動的プロファイル dynamic profile
199 0002 および and
189 ???? 各 each ## マッチしなかった場合、「????」を表示する。

「初出文番号」とは、ファイル(1)内の検索対象用語をファイル(2)の中で検索したときに、ファイル(2)内の、当該検索対象用語が最初にヒットした文の文番号のことです。

私の記載ミスのためにご迷惑をおかけし、申し訳ありませんでした。
マクロ言語初心者ですので、何卒よろしくお願いします。

森山茂靖

Re^3: マイフェス8のマクロコマンドの記述について - 田中徹 2012/10/30(Tue) 00:10 No.2802
> メールありがとうございます。
私的メールではありませんという突っ込みは後にして

No.2799 のソースで気づいたこと
 [1]
  (1) のファイルを (3) に変更しているが (1) のデータが増えたとき
  もう一回この操作を行おうとしてもそのままではできないので
  (1),(2) のファイルから (3)のファイルを新規作成した方が良さそうです。
 [2]
  0010 @2=search(2,0x0004,[ぁ-ん]@str1) とあるところで
  これだと自動遺伝子型分類に「遺伝子型」はマッチしませんが
  (2) ファイルの「および」の前は「、」なので0010 のサーチではヒットしません。

*SEN-NumAdd のソース作成については
 1. ウィンドウ 0番に(1), ウィンドウ 1番に(2)をセットし、ウィンドウ 2番に新規ファイルをオープンする。
 2. ウィンドウ 0番にジャンプする。
 3. カーソルを左端に移動しカーソル行の 3つのフィールドを @str1 〜@str3 にセットする。
 4. ウィンドウ 1番にジャンプして[2]を考慮した上で @str2 を用いて文頭からサーチする。
 5. ヒットした場合はその行の先頭から「;」までを @str4 にセット、
   ヒットしない場合は ???? を @str4 にセットする。
 6. ウィンドウ 2番にジャンプして printf() 関数を用いて @str1\t@str4\t@str2\t@str3 の順で書き出す。

まずこれで(1行のみですが) (3)のファイルがうまく作成できたら
 2. に ウィンドウ 0番にジャンプ後ファイル先頭に移動を追加する。
 3. と 4. の間にカーソルを 1行下げるを追加する。
 3.〜 6. を while 〜 wend ではさんで (1) ファイルの先頭から最終行まで実行できるようにする。
ということで何回でも繰り返して実行できるマクロが作成できると思います。

[2] のルールをもう少しもう少し明確にしていただければと思います。

Re^4: マイフェス8のマクロコマンドの記述について - sigue-san 2012/10/30(Tue) 18:53 No.2803
No.2799 のソースは、キーボードマクロのソースを手直ししたものです。
MIL/Wのマクロを書いた経験がなく、単純にキーボードマクロのマクロソースをそのままMIL/Wマクロに適用できると思っていました。
今回キーボードマクロcopy()がMIL/Wマクロで動かないので、サポートに問い合わせたところ、No.2799 のソース0005番目の@1=getselstring(@str1)を教えてもらいましたが、それ以上のサポートはできないとの返事でした。

ご指摘の、「(1) のファイルを (3) に変更しているが (1) のデータが増えたとき、もう一回この操作を行おうとしてもそのままではできない」ということは、No.2799のソースの0016番目はMIL/Wマクロには適用できないということですね。

1.*SEN-NumAdd のソース作成については
> 1. ウィンドウ 0番に(1), ウィンドウ 1番に(2)をセットし、ウィンドウ 2番に新規ファイルをオープンする。
> 2. ウィンドウ 0番にジャンプする。
> 3. カーソルを左端に移動しカーソル行の 3つのフィールドを @str1 〜@str3 にセットする。
> 4. ウィンドウ 1番にジャンプして[2]を考慮した上で @str2 を用いて文頭からサーチする。
> 5. ヒットした場合はその行の先頭から「;」までを @str4 にセット、
>   ヒットしない場合は ???? を @str4 にセットする。
> 6. ウィンドウ 2番にジャンプして printf() 関数を用いて @str1\t@str4\t@str2\t@str3 の順で書き出す。

と書かれていましたので

上記ご指摘の1をMIL/Wマクロで書こうと、マクロマニュアル(Windows Ver.6.0)を探してみましたが、それらしいものが見当たりません。
@text=0, @text=1と書いて、カレントウィンドウにファイル(1)を開き、ウィンドウ1番にファイル(2)を開き、ウィンドウ2番は新規ファイルとして開いておけばよいということでしょうか。「セットし」とお書きになっているので、何等かのセットコマンドが存在するのでしょうか。あるいは単にファイルをオープンしておくだけでよいのでしょうか。
それとも、open ("c:\temp\file1.txt."",OPEN_TEXT)、("c:\temp\file2.txt."",OPEN_TEXT)(2番目のプリプロセッサのセットについてはよく解りません)でよいのでしょうか?
「ウィンドウ 0番に(1), ウィンドウ 1番に(2)をセット」するためには、どのように書けばよいのかご教示ください。
「ウィンドウ 2番に新規ファイルをオープンする」は、newopen()でよいのでしょうか?

> 2.について

file(1)の「および」のような、ひらがな文字列のみでできている文字列はヒットしなくても構いません。

file(1)を次のように変更して、ご教示いただいた1.*SEN-NumAdd のソース作成についての1.〜6.を、
マクロマニュアル(Windows Ver.6.0)を参照しながら、以下のように書いてみましたが、
まったく作動しません。コンパイルさえしてくれません(-_-メ)。

file(1)
598 遺伝子型
302 既知
224 動的プロファイル
123 相関ベクトル
114 未知のプロファイル
114 未知の遺伝子型

*sen-NUM 文番号の挿入
@text=0
@text=1
open("c:\キャノンDATA\file01.txt,"miweuc.ppp".OPEN_TXT)
open("c:\キャノンDATA\file02.txt,"miweuc.ppp".OPEN_TXT)
newopen("c:\キャノンDATA\file03.txt,"miweuc.ppp".OPEN_TXT)

jump(0,"c:\キャノンDATA\file01.txt)
@1=getword
move("r")
@selmode=3
execmd(36)
@2=getselstring(@str1)

jump(0,"c:\キャノンDATA\file02.txt)
@3=search(2,0x0004,[ぁ-ん]@str2)
move(()
@str4=getword

jump(0,"c:\キャノンDATA\file03.txt)
printf(@str1\t@str4\t@str2\n)
*

Re^5: マイフェス8のマクロコマンドの記述について - 田中徹 2012/10/30(Tue) 21:27 No.2804
> MIL/Wのマクロを書いた経験がなく、単純にキーボードマクロのマクロソースをそのままMIL/Wマクロに適用できると思っていました。

たいていのことはできますが万能ではないようです。


> ご指摘の、「(1) のファイルを (3) に変更しているが (1) のデータが増えたとき、もう一回この操作を行おうとしてもそのままではできない」ということは、No.2799のソースの0016番目はMIL/Wマクロには適用できないということですね。

そうではなくて、in と out のファイルが同じだと
例えば索引に用いたい単語が増えたとき整形し直す必要が出てくるということです。

やっていただきたいこと

file(1) を in.txt
file(2) を doc.txt
新規空テキストファイルを out.txt として 3つのテキストファイルを準備する。

次のマクロをコンパイルしてライブラリ登録する
Test という名前で登録されるはずです。

いったん mifes を終了して
in.txt doc.txt out.txt の順で起動する。
マクロ Test を実行すると out.txt にお望みの形で出力されるはずです。

/* search の引数はご自分で工夫なさってください */

; 以下 マクロソース
*Test
jump(0,"in.txt")
@num=1
while @code!=0xffff
move("(")
@selmode=0
@selmode=3
search(2,0x0004,"\t")
@1=getselstring(@str1)
move("r")
@selmode=3
search(2,0x0004,"\t")
@2=getselstring(@str2)
move("r")
@selmode=3
move(")")
@3=getselstring(@str3)
@selmode=0
move("d")
jump(1,"doc.txt")
@5=search(4,0,@str2)
if @5==0
strcpy(@str4,"????")
else
move("(")
@selmode=3
search(2,0x0004,";")
@4=getselstring(@str4)
@selmode=0
endif
;
jump(2,"out.txt")
move("(")
printf("%s\t%s\t%s\t%s\n",@str1,@str4,@str2,@str3)
;
jump(0,"in.txt")
wend

Re^6: マイフェス8のマクロコマンドの記述について - sigue-san 2012/11/03(Sat) 00:31 No.2807
マクロソースを作っていただきありがとうございました。
ご指示通りにコンパイルして、実行してみました。
in.txt(700行、17KB)、doc.txt(822行、131KB)で試してみました。
残念ながら、何回試しても、その度に途中で止まり、「マクロエラー(中間コード異常)」というエラーメッセージがでました。
out.txtに正常に出力されたものがある一方で、期待しない出力が書き込まれている場合もありました。さらに、in.txtにも出力が行われている部分がありました。

ただ、これ以上田中様にお手数をおかけするのは心苦しいので
今回の件はこれで打ち切りにしたいと思います。
キーボードマクロがマイフェスのマクロコードに完全には対応していないことがわかりました。
自分自身としては、Pythonの習得に挑戦して、今回の問題を解決したいと思っております。

いろいろとありがとうございましたm(__)m。

森山茂靖