外部仕様
コマンド一覧
- コマンドと引数の間は半角スペース1文字で区切ってください。
コマンド | 引数 | 動作 | 権限 | 返信SSTPEvent | Ref.0 | Ref.1~ | 備考 |
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"を返します。
オプション一覧
isSQLEnableやisExternalFileEnableをtrueにした状態でIRC-BOTなどで不特定の第三者にコマンド公開するのは大変危険です。
例えば、DBをクリアした上で、ローカルファイルを学習させ、それを取り出すことで、パスワード等が盗まれる可能性もあります。
trueにする場合はその影響を充分に考えて行ってください。
第三者に公開しない場合は特に問題ないと思います。
コマンドでの記述 | 設定ファイルでの記述 | 形式 | 内容 |
maxlength | maxlength | 数値 | 毒電波文生成時の最大長 |
lineend | lineend | 文字列 | 毒電波文の最後につく文字の候補 |
balloon | isBalloonHint | true/false | バルーン表示あり/なし |
mode | mode | 文字列 | モード文字列 |
不可 | deleteRegexp | 正規表現文字列 | 入力文字列から取り除く正規表現を指定します*1。 |
不可 | bunsyoRegexp | 正規表現文字列 | 入力文字列を文章に分解する際の正規表現を指定します。詳しくは「モード」を参照してください。*2。 |
不可 | notBunsyoRegexp | 正規表現文字列 | 文章として認識したもののうち、学習しないものを指定します。*3。 |
不可 | databasename | 文字列 | データベースファイル名を指定します。 |
不可 | isTraceWnd | true/false | 起動時のトレースウィンドウ出力あり/なし |
不可 | isSQLEnable | true/false | SQLコマンドを受け付ける/受け付けない |
不可 | isExternalFileEnable | true/false | 外部ファイル読み込みコマンドを受け付ける/受け付けない |
不可 | isMecabUse | true/false | 単語の分解にMecabを用いる(true)/簡易分解ロジックを用いる(false) |
不可 | isBusyOnGakusyu | true/false | 学習中の毒電波生成はbusyとする(true)/しない(false) |
モード
- モードは、IRCのログを読むような場合に利用可能な機能です。
- 文を学習した際のモードをDB内に記録し、modeオプションがその文字列内に含まれるレコードのみを検索対象とします。
- bunsyoRegexpは、グループ mode 、 グループ sentence を持つ必要があります。(sentenceは必須)
- グループ mode にヒットした文字列があると、「学習時の現在のモード」がその文字列に切り替わります。
- グループ sentence にヒットした文字列は、「学習時の現在のモード」とともにDBに書き込まれます。
- 毒電波生成時に、mode オプションが空でなかった場合、マルコフ連鎖の検索対象として、where mode like '%option.mode%' という条件が加わります。
- つまり、modeオプションが、レコードのmodeに含まれるレコードのみが検索対象となります。
DB構造
カラム名 | 内容 |
main | メインとなる単語 |
pre | mainの前につく可能性のある単語、空欄の場合あり |
post | mainの後につく可能性のある単語、空欄の場合あり |
mode | この文を学習した際のモード文字列 |
count | pre-main-postの組み合わせが何回出てきたか(1ずつカウントアップ) |
- DBの切り詰めを行うと、countの最小値のレコードが削除されます。
毒電波生成方式概要
入力文のクリーンアップ
まず入力文を日本語文字列のみに分解します。
- 最初に、 deleteRegexp にマッチするものを入力から削除します。
- 次に、bunsyoRegexpにマッチする文字列を複数取り出します。
- 複数取り出した文字列が、notBunsyoRegexp にマッチした場合は読み捨てます。
(例)
各オプションが初期値の場合;
(wizwiz) hogehoge \s[0]へもへもは「foobar」
これにdeleteRegexpをかけると
(wizwiz) hogehoge へもへもはfoobar
これをbunsyoRegexpで取り出すと
wizwiz←これを読んだ時点で、「学習時のモード」が wizwiz になる
hogehoge
へもへもはfoobar
これのうち、hogehogeはnotBunsyoRegexpにマッチするので、最終的に得られるのは
へもへもはfoobar←これは、モード wizwiz としてDBに書き込まれる。
形態素解析
- Mecab を使う場合、Mecab で分かち書きをするだけです。
- Mecab を使わない場合、かなりヒューリスティックなルールになります。
- 文字種(ひらがな、カタカナ、漢字、その他)の区切りや、「から」といった助詞によって分解します。
- 「ー」は何かの単語の後に付くはず、といったルールも適用されます。
DBへの書き込み
- 分解された単語の組み合わせを、pre-main-post の形式で(1単語ずつずらして)DBに書き込みます。すでにあればカウントアップします。
どくでんぱ生成
マルコフ連鎖
方式としては2単語によるマルコフ連鎖?です。
count の大きさが、そのレコードが選ばれる確率の大きさになります。
- 毒電波生成にはキーワードを用います。
- まず、キーワードが main と合致(或いはキーワードを含む)レコードを選びます。
- そのレコードの pre を新しいキーワードとします。
- レコードを選んだら、次は post が最初のキーワード、mainが新しいキーワードになるようなレコードを選びます。
- 同様にずらしながらレコード選択を繰り返し、preが空欄になるまで文字列を合成していきます。
- preを辿っていき、空欄になるまで文字列を合成します。
- 次に最初に選んだキーワードからpostを辿っていき、同じことを行います。
上記に加え、オプションの mode が空でない場合は、mode文字列によってさらに候補が絞り込まれます。
その後のヒューリスティックルール
- 最後に、オプションのlineendから1文字選んでくっつけます。
- 先頭の「ー」や末尾の「、」と言った、日本語としておかしいゴミを取り除きます。
- 最終的な結果が与えられたキーワードと同じであった場合は何も返しません。