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>
主に配列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>
> 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 つのデータしか保持できない事になってしまいますから。