JSでのマルコフ連鎖をVB2008EEで書きたいのですが・・・

タグの編集
投稿者 マイマイ  () 投稿日時 2009/6/19 20:38:09
以下のJSで書かれたソースをVBに書き換えたいのですが、
主に配列dicの扱いに戸惑っています。
dicの宣言は次のように宣言しています。
Dim dic As Dictionary(Of String,String)

dic[token[0]]をdic(token(0))に書き換えています。

実行すると
「String "メロス" から型 'Boolean' への変換は無効です。」
とエラーが出ました。
Dim dic As Dictionary(Of Boolean,String)
と書き換えると今度は
「String "_START_" から型 'Boolean' への変換は無効です。」
とエラーが出ました。

このソースにおけるdicの扱いに困っています。
どのように書けば良いのでしょうか。


<script type="text/javascript">
function $(id){return document.getElementById(id)}
var MAX = 300;
function generator() {
  // 辞書
  var dic = {};
  var str = $('text').value;
  if (str) {
    var s = str.split("。");
    for (var i = 0; i < s.length; i++) {
      if (s[i]) morph(s[i] + "。", dic);
    }
    var resArea = $("result");
    if (resArea.firstChild) {resArea.removeChild(resArea.firstChild)};
    resArea.appendChild(document.createTextNode(morkov(dic)));
  } else {
    return false;
  }
}



/* 簡易形態素解析の正規表現 */
var re = new RegExp;
re.compile("[一-龠]+|[ぁ-ん]+|[ァ-ヴー]+|[a-zA-Z0-9]+|[a-zA-Z0-9]+|[、。!!??]+", 'g');
function morph(text, dic) {
  var token = text.match(re);
  token.unshift('_START_');
  token.push('_END_');
  while (token[1]) {
    if (dic[token[0]]) {
      dic[token[0]].push(token[1]);
    } else {
      dic[token[0]] = [token[1]];
    }
    token.shift();
  }
}

function morkov(dic) {
  var w1 = dic['_START_'][Math.floor(Math.random() * dic['_START_'].length)];
  var w2 = '';
  var sentence = w1;
  for (var i = 0; i <= MAX; i++) {
    w2 = dic[w1][Math.floor(Math.random() * dic[w1].length)];
    if (w2 == '_END_') {break}
    sentence += w2;
    var w3 = w1;
    w1 = w2;
    w2 = w3;
  }
  return sentence;
}

</script>
<form action="" onSubmit="generator();return false;">
<textarea rows="12" cols="50" id="text">メロスは激怒した。必ず、かの邪智暴虐(じゃちぼうぎゃく)の王を除かなければならぬと決意した。メロスには政治がわからぬ。メロスは、村の牧人である。笛を吹き、羊と遊んで暮して来た。けれども邪悪に対しては、人一倍に敏感であった。きょう未明メロスは村を出発し、野を越え山越え、十里はなれた此(こ)のシラクスの市にやって来た。</textarea><br />
<input type="submit" value="文章生成" />
<input type="button" value="クリア" onClick="$('text').value=''" />
</form>
<div id="result">
ここに文章が作成されます。
</div></div>
投稿者 魔界の仮面弁士  (社会人) 投稿日時 2009/6/19 23:53:32
JavaScript の連想配列ならば、Hashtable か Dictionary(Of TKey, TValue) が近いでしょうね。


> dic[token[0]]をdic(token(0))に書き換えています。
> 「String "メロス" から型 'Boolean' への変換は無効です。」
> とエラーが出ました。
現象を再現可能なコードを示す事は可能でしょうか?

また、上記の場合、「token(0)」のデータ型が何であるかも確認してみてください。
TKey が String なら、キーは常に String でなければなりません。


> Dim dic As Dictionary(Of Boolean,String)
これでは都合が悪いと思います。TKey を Boolean 型にしてしまうと、
dic(True) と dic(False) の 2 つのデータしか保持できない事になってしまいますから。