基于jsPsych的认知实验:自动生成逻辑语句组合方案咨询
自动生成jsPsych认知实验的逻辑语句刺激
嘿,我正好做过类似的jsPsych实验刺激生成,给你一套高效的方案,完全不用手动录入那200条内容!核心思路是把所有变量(真值、运算符、间距)拆成可枚举的集合,然后通过代码自动生成所有组合,直接输出符合要求的刺激字符串。
第一步:明确所有变量集合
先把你需要的核心元素都定义成可遍历的数组,方便后续组合:
- 三种真值:这里假设你指的是
['T', 'F', 'U'](如果是其他真值类型,直接替换数组内容即可) - 两种逻辑运算符:保留HTML实体格式,定义为
['∧', '∨'] - 四种间距类型:根据你描述的样式,补全另外两种常见间距,你可以按需调整:
- 类型1:无空格(如
T∧T∨T) - 类型2:运算符后加两个空格(如
T∧--T∨--T) - 类型3:运算符前后各加一个空格(如
T ∧ T ∨ T) - 类型4:运算符前加空格、后无空格(如
T ∧T∨T)
- 类型1:无空格(如
第二步:生成所有组合的JavaScript代码
用JS写一个生成函数,不仅能输出所有符合要求的逻辑语句,还能顺便计算每条语句的真值(如果实验需要的话):
// 定义基础变量 const truthValues = ['T', 'F', 'U']; // 三种真值,可按需替换 const operators = ['∧', '∨']; // 两种逻辑运算符 const spacingTypes = [ { name: 'no-space', beforeOp: '', afterOp: '' }, // 无空格 { name: 'after-two-spaces', beforeOp: '', afterOp: '--' }, // 运算符后双空格 { name: 'around-space', beforeOp: ' ', afterOp: ' ' }, // 运算符前后单空格 { name: 'before-space', beforeOp: ' ', afterOp: '' } // 运算符前单空格 ]; // 生成所有刺激组合的函数 function generateAllStimuli() { const stimuli = []; // 遍历所有真值三元组(val1, val2, val3) for (const val1 of truthValues) { for (const val2 of truthValues) { for (const val3 of truthValues) { // 遍历所有运算符组合(op1, op2) for (const op1 of operators) { for (const op2 of operators) { // 遍历所有间距类型 for (const spacing of spacingTypes) { // 拼接成符合间距要求的逻辑语句 const statement = `${val1}${spacing.beforeOp}${op1}${spacing.afterOp}${val2}${spacing.beforeOp}${op2}${spacing.afterOp}${val3}`; // 可选:计算语句的真值(不需要可删除这部分) let truthResult; if (![val1, val2, val3].includes('U')) { // 转换为布尔值计算逻辑结果 const v1 = val1 === 'T'; const v2 = val2 === 'T'; const v3 = val3 === 'T'; const op1Func = op1 === '∧' ? (a,b) => a && b : (a,b) => a || b; const op2Func = op2 === '∧' ? (a,b) => a && b : (a,b) => a || b; truthResult = op2Func(op1Func(v1, v2), v3) ? 'T' : 'F'; } else { truthResult = 'U'; // 包含不确定值时结果为U } // 存入刺激数组,方便直接给jsPsych调用 stimuli.push({ statement: statement, spacingType: spacing.name, correctTruth: truthResult }); } } } } } } return stimuli; } // 生成所有刺激 const allStimuli = generateAllStimuli(); console.log(`共生成${allStimuli.length}条刺激`); // 示例:输出前5条刺激 console.log(allStimuli.slice(0, 5));
第三步:在jsPsych中直接使用生成的刺激
生成的allStimuli数组可以直接用来构建jsPsych实验试次,比如用html-keyboard-response类型:
// 构建jsPsych试次 const trials = allStimuli.map(stim => ({ type: 'html-keyboard-response', stimulus: `<p style="font-size:24px;">${stim.statement}</p><p>请判断语句真值:按T=真,F=假,U=不确定</p>`, choices: ['t', 'f', 'u'], data: { statement: stim.statement, spacingType: stim.spacingType, correctAnswer: stim.correctTruth.toLowerCase() }, on_finish: function(data) { // 标记反应是否正确 data.correct = data.response === data.correctAnswer; } })); // 启动实验 jsPsych.run(trials);
小优化建议
- 如果生成的总刺激数(33322*4=432条)超过你的需求,可以随机抽取200条:
allStimuli.sort(() => Math.random() - 0.5).slice(0, 200) - 可以给间距类型设置更易懂的命名,方便后续数据分析
- 若第三种真值不是
U,直接替换truthValues数组即可
内容的提问来源于stack exchange,提问作者Van
相关产品推荐
相关产品推荐

