You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于jsPsych的认知实验:自动生成逻辑语句组合方案咨询

自动生成jsPsych认知实验的逻辑语句刺激

嘿,我正好做过类似的jsPsych实验刺激生成,给你一套高效的方案,完全不用手动录入那200条内容!核心思路是把所有变量(真值、运算符、间距)拆成可枚举的集合,然后通过代码自动生成所有组合,直接输出符合要求的刺激字符串。

第一步:明确所有变量集合

先把你需要的核心元素都定义成可遍历的数组,方便后续组合:

  • 三种真值:这里假设你指的是['T', 'F', 'U'](如果是其他真值类型,直接替换数组内容即可)
  • 两种逻辑运算符:保留HTML实体格式,定义为['∧', '∨']
  • 四种间距类型:根据你描述的样式,补全另外两种常见间距,你可以按需调整:
    • 类型1:无空格(如T∧T∨T)
    • 类型2:运算符后加两个空格(如T∧--T∨--T)
    • 类型3:运算符前后各加一个空格(如T ∧ T ∨ T)
    • 类型4:运算符前加空格、后无空格(如T ∧T∨T)

第二步:生成所有组合的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 07:58:39