* U K I Y A H O N P O *
Nel mezzo del cammin di nostra vita mi ritrovai per una selva oscura,
che la diritta via era smarrita.
リロード   新規 下位ページ作成 編集 凍結 差分 添付 コピー 名前変更   ホーム 一覧 検索 最終更新 バックアップ リンク元   ヘルプ   最終更新のRSS
浮子屋商店もよろしく。

自作ソフト一覧/どくでんぱ。/仕様 の変更点


* 外部仕様 [#f67f607c]

** コマンド一覧 [#v1a81baf]

- コマンドと引数の間は半角スペース1文字で区切ってください。

|コマンド|引数|動作|権限|返信SSTPEvent|Ref.0|Ref.1~|備考|h
|close|-|毒電波を終了します。|○|-|-|-|-|
|dokudenpa|キーワード|キーワードに基づいて毒電波文を生成します。|○|OnDokudenpaDokudenpaResult|毒電波文|-|キーワードを省略した場合は適当に単語をみつくろって反応します。|
|dokudenparandom|文章|文章から単語をランダムに選んで、それをキーワードとして毒電波文を生成します。|○|OnDokudenpaDokudenpaResult|毒電波文|-|-|
|mode|モード文字列|毒電波生成時のモード文字列を指定されたものにします。|○|-|-|-|-|
|gakusyu|文章|文章を学習します。|○|-|-|-|-|
|gakusyufromfile|ファイル名|ファイルから学習を行います。|※1|-|-|-|ファイルが指定されない場合ダイアログを開きます。|
|gakusyufromurl|URL|指定したURLの内容を学習します。|※1|-|-|-|URLが指定されない場合ダイアログを開きます。|
|count|-|現在の単語数を数値で返します。|○|OnDokudenpaCommandResult|1|単語数|-|
|option|key=value|オプションを設定します。|○|-|-|-|key=valueを指定しない場合、現在のオプション一覧を表示します。|
|analyze|-|DBにanalyzeをかけます。|○|-|-|-|-|
|compact|-|DBの切り詰めを行います。|※2|-|-|-|-|
|@~|-|@が先頭に付いた場合、それをSQLとして解釈し結果を返します。|※2|OnDokudenpaCommandResult|結果行数|結果(複数行)|結果は100行までしか返しません。|

- ※1…isExternalFileEnable オプションが有効で無いと permission denied を返します。
- ※2…isSQLEnable オプションが有効で無いと permission denied を返します。
- 毒電波生成時に、Ref.0が"busy"になることがあります。その場合は現在毒電波を生成中ですので、生成し終わるまで待って再実行してください。
- マルコフ連鎖がうまくいかない等、毒電波生成に失敗すると、"none"を返します。

** オプション一覧 [#m8241698]

&color(Red){isSQLEnableやisExternalFileEnableをtrueにした状態でIRC-BOTなどで不特定の第三者にコマンド公開するのは大変危険です。&br;例えば、DBをクリアした上で、ローカルファイルを学習させ、それを取り出すことで、パスワード等が盗まれる可能性もあります。&br;trueにする場合はその影響を充分に考えて行ってください。&br;第三者に公開しない場合は特に問題ないと思います。};

|コマンドでの記述|設定ファイルでの記述|形式|内容|h
|maxlength|maxlength|数値|毒電波文生成時の最大長|
|lineend|lineend|文字列|毒電波文の最後につく文字の候補|
|balloon|isBalloonHint|true/false|バルーン表示あり/なし|
|mode|mode|文字列|モード文字列|
|不可|deleteRegexp|正規表現文字列|入力文字列から取り除く正規表現を指定します((デフォルトでは全角記号とさくらスクリプト要素が取り除かれます))。|
|不可|bunsyoRegexp|正規表現文字列|入力文字列を文章に分解する際の正規表現を指定します。詳しくは「モード」を参照してください。((デフォルトでは「単語形成文字」と「、」など一部記号の繋がりを文章として認識します))。|
|不可|notBunsyoRegexp|正規表現文字列|文章として認識したもののうち、学習しないものを指定します。((デフォルトでは英数字だけからなるものは英単語とみなし学習しません))。|
|不可|databasename|文字列|データベースファイル名を指定します。|
|不可|isTraceWnd|true/false|起動時のトレースウィンドウ出力あり/なし|
|不可|isSQLEnable|true/false|SQLコマンドを受け付ける/受け付けない|
|不可|isExternalFileEnable|true/false|外部ファイル読み込みコマンドを受け付ける/受け付けない|
|不可|isMecabUse|true/false|単語の分解にMecabを用いる(true)/簡易分解ロジックを用いる(false)|
|不可|isBusyOnGakusyu|true/false|学習中の毒電波生成はbusyとする(true)/しない(false)|

** モード
** モード [#t3fba07e]

- モードは、IRCのログを読むような場合に利用可能な機能です。
- 文を学習した際のモードをDB内に記録し、modeオプションがその文字列内に含まれるレコードのみを検索対象とします。
- bunsyoRegexpは、グループ mode 、 グループ sentence を持つ必要があります。(sentenceは必須)
- グループ mode にヒットした文字列があると、「学習時の現在のモード」がその文字列に切り替わります。
- グループ sentence にヒットした文字列は、「学習時の現在のモード」とともにDBに書き込まれます。
- 毒電波生成時に、mode オプションが空でなかった場合、マルコフ連鎖の検索対象として、where mode like '%option.mode%' という条件が加わります。
- つまり、modeオプションが、レコードのmodeに含まれるレコードのみが検索対象となります。

** DB構造 [#mf64b9f6]

- テーブルは tangotbl のみです。

|カラム名|内容|h
|main|メインとなる単語|
|pre|mainの前につく可能性のある単語、空欄の場合あり|
|post|mainの後につく可能性のある単語、空欄の場合あり|
|mode|この文を学習した際のモード文字列|
|count|pre-main-postの組み合わせが何回出てきたか(1ずつカウントアップ)|

- DBの切り詰めを行うと、countの最小値のレコードが削除されます。

* 毒電波生成方式概要 [#x8396d96]

** 入力文のクリーンアップ [#d445db01]

まず入力文を日本語文字列のみに分解します。

- 最初に、 deleteRegexp にマッチするものを入力から削除します。
- 次に、bunsyoRegexpにマッチする文字列を複数取り出します。
- 複数取り出した文字列が、notBunsyoRegexp にマッチした場合は読み捨てます。

(例)

各オプションが初期値の場合;

 (wizwiz) hogehoge \s[0]へもへもは「foobar」 

これにdeleteRegexpをかけると

 (wizwiz) hogehoge へもへもはfoobar

これをbunsyoRegexpで取り出すと
 
 wizwiz←これを読んだ時点で、「学習時のモード」が wizwiz になる
 hogehoge
 へもへもはfoobar

これのうち、hogehogeはnotBunsyoRegexpにマッチするので、最終的に得られるのは

 へもへもはfoobar←これは、モード wizwiz としてDBに書き込まれる。


** 形態素解析 [#j7304b78]

-Mecab を使う場合、Mecab で分かち書きをするだけです。
-Mecab を使わない場合、かなりヒューリスティックなルールになります。
--文字種(ひらがな、カタカナ、漢字、その他)の区切りや、「から」といった助詞によって分解します。
--「ー」は何かの単語の後に付くはず、といったルールも適用されます。

** DBへの書き込み [#o905a167]

- 分解された単語の組み合わせを、pre-main-post の形式で(1単語ずつずらして)DBに書き込みます。すでにあればカウントアップします。

** どくでんぱ生成 [#ac8fdd14]

*** マルコフ連鎖 [#jbbec4c3]

方式としては2単語によるマルコフ連鎖?です。

count の大きさが、そのレコードが選ばれる確率の大きさになります。

- 毒電波生成にはキーワードを用います。
- まず、キーワードが main と合致(或いはキーワードを含む)レコードを選びます。
- そのレコードの pre を新しいキーワードとします。
- レコードを選んだら、次は post が最初のキーワード、mainが新しいキーワードになるようなレコードを選びます。
- 同様にずらしながらレコード選択を繰り返し、preが空欄になるまで文字列を合成していきます。
- preを辿っていき、空欄になるまで文字列を合成します。
- 次に最初に選んだキーワードからpostを辿っていき、同じことを行います。

上記に加え、オプションの mode が空でない場合は、mode文字列によってさらに候補が絞り込まれます。

*** その後のヒューリスティックルール [#f89f922a]

- 最後に、オプションのlineendから1文字選んでくっつけます。
- 先頭の「ー」や末尾の「、」と言った、日本語としておかしいゴミを取り除きます。
- 最終的な結果が与えられたキーワードと同じであった場合は何も返しません。