前提
配列をファイルに保存するために、
配列を一度JSON文字列にし、その後配列に戻そうとしました。
JSON(markov)
1Markov { 2 data: { 3 null: [ '我輩', 'メロス' ], 4 '我輩': [ 'は' ], 5 'は': [ '猫', '激怒' ], 6 '猫': [ 'で' ], 7 'で': [ 'ある' ], 8 'ある': [ null ], 9 'メロス': [ 'は' ], 10 '激怒': [ 'し' ], 11 'し': [ 'た' ], 12 'た': [ null ] 13 } 14}
上記の配列をこのように配列→JSON→配列にしたところ、
(一度JSONにしているのはファイルに書き込むためです。)
Node.js
1arr = JSON.stringify(markov); 2markov2 = JSON.parse(arr);
JSON(markov2)
1{ 2 data: { 3 null: [ '我輩', 'メロス' ], 4 '我輩': [ 'は' ], 5 'は': [ '猫', '激怒' ], 6 '猫': [ 'で' ], 7 'で': [ 'ある' ], 8 'ある': [ null ], 9 'メロス': [ 'は' ], 10 '激怒': [ 'し' ], 11 'し': [ 'た' ], 12 'た': [ null ] 13 } 14}
このようにMarkov
がなくなってしまいました。
実現したいこと
markov2にMarkov
のキーを加えたい。
試したこと
"Markov " + markov2
と書いてみましたが、やはりMarkov [object Object]
と返ってきました。
arr = "Markov " + arr
と書いてみましたが、JSON文字列と判断されずJSON.parse(arr)
ができませんでした。
Markov
の無いmarkov2だと、TypeError: markov2.make is not a function
と言われ読み込んでもらえませんでした。
補足情報(FW/ツールのバージョンなど)
Replitで動かしています。
元々やろうとしていることはマルコフ連鎖です。ここのサイトを参考に作りました。
また、Discordで動くbotを作っています。
しかしこれらの情報は今回は関係無いだろうと思い上記には書きませんでした。
一応、全体のコードを載せておきます。
js
1if (command === "あ") { 2 var fs = require('fs'); 3 var moji = require('kuromoji'); 4 var builder = moji.builder({ 5 dicPath: 'node_modules/kuromoji/dict' 6 }); 7 class Markov { 8 constructor(n) { 9 this.data = {}; 10 } 11 // データ登録 12 add(words) { 13 for (var i = 0; i <= words.length; i++) { 14 var now = words[i]; 15 if (now === undefined) { 16 now = null 17 }; 18 var prev = words[i - 1]; 19 if (prev === undefined) { 20 prev = null 21 }; 22 23 if (this.data[prev] === undefined) { 24 this.data[prev] = []; 25 } 26 this.data[prev].push(now); 27 } 28 } 29 // 指定された文字に続く文字をランダムに返す 30 sample(word) { 31 var words = this.data[word]; 32 if (words === undefined) { 33 words = []; 34 } 35 return words[Math.floor(Math.random() * words.length)]; 36 } 37 // マルコフ連鎖でつなげた文を返す 38 make() { 39 var sentence = []; 40 var word = this.sample(null); 41 while (word) { 42 sentence.push(word); 43 word = this.sample(word); 44 } 45 return sentence.join(''); 46 } 47 } 48 49 var markov = new Markov(); 50 51 builder.build(function(err, tokenizer) { 52 if (err) { 53 throw err; 54 } 55 56 // アシタカ先輩の台詞を読み込む 57 fs.readFile('TEST.txt', 'utf-8', function(err, data) { 58 if (err) { 59 throw err; 60 } 61 62 var lines = data.split("\n"); // 一行ごとに分割 63 wordlist = "" 64 lines.forEach(function(line) { 65 var tokens = tokenizer.tokenize(line); 66 67 // トークンを文中表記にすべて変換 68 words = tokens.map(function(token) { 69 return token.surface_form; 70 }); 71 markov.add(words); 72 }); 73 arr = JSON.stringify(markov) 74 markov2 = JSON.parse(arr) 75 76 console.log(markov) 77 console.log("〜〜〜〜〜〜〜〜〜〜〜〜") 78 console.log(markov2); 79 80 fs.writeFile("all_3.json", arr, (err1) => { 81 if (err1) throw err; 82 }); 83 message.channel.send(markov2.make()) 84 }); 85 }); 86 return; 87 }
TEST.txt
1我輩は猫である 2メロスは激怒した
all_3.json
1{"data":{"null":["我輩","メロス"],"我輩":["は"],"は":["猫","激怒"],"猫":["で"],"で":["ある"],"ある":[null],"メロス":["は"],"激怒":["し"],"し":["た"],"た":[null]}}
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2022/04/05 05:34
2022/04/05 05:51
2022/04/05 07:08
2022/04/05 07:13
2022/04/05 07:20