JavaScript 없이 자기 조절 읽기 실험 만들기
YAML 설정만으로 라틴 방격 목록과 이해 질문을 갖춘 정원 경로 문장의 이동 창 연구를 실행하고, 단어별 읽기 시간을 분석합니다.
PCIbex에서 자기 조절 읽기를 실행하거나 jsPsych 플러그인을 찾아본 심리언어학자는 이 튜토리얼을 따라 JavaScript를 쓰지 않고 YAML 설정 하나와 JSON 설문 파일 세 개로 Potato 2.13.1에서 이동 창 연구를 만들 수 있습니다. 이 연구는 공개된 벤치마크의 정원 경로 항목 24개를 필러와 함께 라틴 방격 목록 두 개로 보여 주고, 모든 문장 뒤에 이해 질문을 하고, 참여자를 완료 코드와 함께 Prolific으로 돌려보냅니다. 내보내기는 단어당 한 행이며, 짧은 Python 스크립트가 그 행을 중의성 해소 동사에서의 잔차 읽기 시간으로 바꿉니다. 연구의 미로(maze) 버전과 PCIbex에서 가져오기는 끝에 나옵니다. 이 페이지의 설정, 명령, 내보낸 행은 헤드리스 Chrome에서 모의 독자 12명으로 Potato 2.12.1을 실행한 결과에서 나왔습니다.
자기 조절 읽기를 위한 도구
자기 조절 읽기는 독자가 문장의 각 단어에 쓰는 시간을 잽니다(Just, Carpenter & Woolley, 1982). 독자는 키를 눌러 한 단어에서 다음 단어로 넘어갑니다. 이동 창 버전에서는 문장이 먼저 대시로 나타나고, 키를 누를 때마다 다음 단어가 드러나며 앞의 단어는 다시 가려집니다. 한 단어에서 느려지면 독자가 어디에서 어려움을 겪었는지 알 수 있습니다.
PCIbex는 문장 처리 실험을 중심으로 만들어졌습니다. PCIbex의 DashedSentence와 Maze 컨트롤러는 PennController 스크립트에서 이동 창 읽기와 미로 과제를 실행하고, PCIbex Farm이 실험을 호스팅합니다. jsPsych 사용자는 jspsych-contrib의 plugin-self-paced-reading이나 plugin-spr 같은 자기 조절 읽기 플러그인을 중심으로 타임라인을 작성합니다. 시행에 newTimer나 newFunction의 사용자 JavaScript처럼 Potato에 키가 없는 PennController 요소가 필요하다면 PCIbex가 더 알맞습니다. Potato는 trial_timing 아래의 presentation 블록에서 읽기를 실행하며, 같은 YAML 파일이 동의부터 Prolific으로의 복귀까지 세션의 나머지를 설정합니다. 행동 실험 도구 비교가 도구들을 나란히 놓고 비교합니다.
연구
항목은 주동사/축약 관계절(MV/RR) 정원 경로 문장입니다. 중의적 버전은 "The suspect sent the file deserved further investigation given the new evidence."입니다. 독자는 sent를 주동사로 받아들이고 deserved에서 다시 분석해야 합니다. 비중의적 버전은 who was를 더하며("The suspect who was sent the file deserved further investigation given the new evidence.") 동사가 도착하기 전에 주동사 해석을 배제합니다. 예측은 중의적 버전에서 deserved와 그다음 한두 단어의 읽기 시간이 더 길다는 것입니다.
MV/RR 항목 24개, 이해 질문과 답, 각 중의성 해소 단어의 위치는 Syntactic Ambiguity Processing(SAP) 벤치마크(Huang et al., 2024)에서 가져왔습니다. SAP 저장소는 MIT 라이선스로 공개되어 있으며, 항목은 Items for all subsets.xlsx의 NPSNPZMVRR 시트에 있습니다. 필러 12개와 연습 문장 2개는 이 튜토리얼을 위해 작성했습니다.
각 참여자는 모든 항목을 한 버전으로 한 번씩 읽습니다. 목록 1은 홀수 번호 항목을 중의적 버전으로, 짝수 번호 항목을 비중의적 버전으로 갖고, 목록 2는 그 반대입니다. 따라서 각 목록은 조건당 항목 12개를 갖습니다. 두 목록 모두 같은 필러 12개를 더하고 연습 문장 2개로 시작합니다. 각 참여자는 문장 38개를 읽으며, 모든 문장 뒤에 예/아니요 질문이 이어집니다.
Potato 설치와 프로젝트 구성
이 튜토리얼에서 확인한 릴리스를 설치하세요.
pip install potato-annotation==2.13.1프로젝트 폴더에는 설정, 목록 파일 두 개, 설문 페이지 세 개가 있습니다.
spr-study/
├── config.yaml
├── data/list1.jsonl
├── data/list2.jsonl
├── surveys/consent.json
├── surveys/instructions.json
└── surveys/background.json두 목록 만들기
목록 파일은 한 줄에 문장 하나인 JSON Lines입니다. 아래 스크립트는 SAP 스프레드시트를 읽고, 각 항목을 두 목록에 반대 버전으로 배치하고, 각 목록을 고정된 시드로 한 번 섞고, 파일을 씁니다. 스크립트에는 pandas와 openpyxl이 필요하며 필러와 연습 문장은 fillers.jsonl과 practice.jsonl에서 읽습니다. 두 파일은 항목 줄과 같은 필드를 씁니다.
import json
import random
import pandas as pd
sap = pd.read_excel("Items for all subsets.xlsx", sheet_name="NPSNPZMVRR")
mvrr = sap[sap.condition == "MVRR_UAMB"]
fillers = [json.loads(line) for line in open("fillers.jsonl")]
practice = [json.loads(line) for line in open("practice.jsonl")]
rng = random.Random(20261029)
for n, name in enumerate(["list1", "list2"]):
rows = []
for _, r in mvrr.iterrows():
item = int(r["item"])
ambiguous = (item % 2 == 1) == (n == 0) # the Latin square
sentence = r["ambiguous"] if ambiguous else r["Unnamed: 3"]
verb = r["disambPositionAmb"] if ambiguous else r["disambPositionUnamb"]
rows.append({
"id": f"mvrr{item:02d}_{'amb' if ambiguous else 'unamb'}",
"item": item,
"condition": "ambiguous" if ambiguous else "unambiguous",
"sentence": " ".join(sentence.split()),
"question": r["Question"].strip(),
"answer": r["Option1"] if r["Answer"] == 1 else r["Option0"],
"critical_region": int(verb) - 1, # SAP counts words from 1
})
rows += [{**f, "id": f"{f['id']}_{name}"} for f in fillers]
while True: # no two items of one condition in a row
rng.shuffle(rows)
if all(a["condition"] == "filler" or a["condition"] != b["condition"]
for a, b in zip(rows, rows[1:])):
break
with open(f"data/{name}.jsonl", "w") as out:
for row in [{**p, "id": f"{p['id']}_{name}"} for p in practice] + rows:
out.write(json.dumps(row) + "\n")data/list1.jsonl의 한 줄은 다음과 같습니다.
{"id": "mvrr01_amb", "item": 1, "condition": "ambiguous", "sentence": "The suspect sent the file deserved further investigation given the new evidence.", "question": "Did the suspect send the file to someone?", "answer": "No", "critical_region": 5}critical_region은 Potato의 내보내기처럼 0부터 센 중의성 해소 동사의 위치입니다. Potato는 참여자가 누른 키를 기록하고 답을 채점하지 않으므로 answer 필드는 분석용입니다. 항목 ID는 두 파일 전체에서 고유해야 합니다. 따라서 필러와 연습 문장에는 filler01_list1처럼 목록 이름이 접미사로 붙습니다.
Potato는 목록의 항목을 파일 순서대로 제공합니다. 목록 1의 모든 참여자는 연습 문장이 먼저 오는 같은 의사 무작위 순서를 읽습니다. 두 번째 순서를 만들려면 list 요인에 list1b 같은 수준을 추가하고 각 수준에 별도 파일을 두세요.
설정
아래 설정은 완전하며 2.12.1과 2.13.1에서 python -m potato.validate_cli config.yaml --strict를 통과합니다.
annotation_task_name: Garden-path self-paced reading
task_dir: .
output_annotation_dir: annotation_output/
data_files: []
item_properties:
id_key: id
text_key: sentence
login:
type: url_direct
url_argument: PROLIFIC_PID
user_config:
allow_all_users: true
users: []
crowdsourcing:
provider: prolific
prolific:
completion:
code: C1READING
conditions:
factors:
list: [list1, list2]
assignment_strategy: batch
batch_assignment:
auto_assign_annotators: true
group_by_condition: list
groups:
- {name: list1, data_file: data/list1.jsonl}
- {name: list2, data_file: data/list2.jsonl}
phases:
order: [consent, instructions, annotation, background]
consent:
type: consent
file: surveys/consent.json
instructions:
type: instructions
file: surveys/instructions.json
annotation:
type: annotation
background:
type: poststudy
file: surveys/background.json
trial_timing:
enabled: true
fixation_ms: 400
iti_ms: 500
presentation:
mode: moving_window
field: sentence
advance_key: space
question_field: question
response:
schema: comprehension
keys: {f: "Yes", j: "No"}
annotation_schemes:
- annotation_type: radio
name: comprehension
description: Answer the question
labels: ["Yes", "No"]
label_requirement:
required: true
export_include_phase_data: truepresentation 블록은 각 항목을 이동 창 시행으로 바꿉니다. field: sentence는 보여 줄 항목 필드를 지정하며, region_separator가 없으면 각 단어가 영역 하나입니다. 단어 대신 구(phrase)의 시간을 재려면 문장에서 구의 경계를 |로 표시하고 region_separator: "|"를 설정하세요. question_field: question은 마지막 단어 뒤에 각 문장의 질문을 보여 주며, question이 빈 문장은 질문 없이 끝납니다. response 블록은 F를 예에, J를 아니요에 대응시키고, comprehension 스킴이 답을 저장합니다.
fixation_ms: 400은 각 문장 전에 응시점을 보여 주고, iti_ms: 500은 문장 사이에 0.5초를 둡니다. 읽기와 질문 모두 제한 시간이 없습니다. 2.13.1에서 trial_duration_ms는 질문에만 적용되며 읽기에는 적용되지 않습니다.
list 요인과 batch_assignment.group_by_condition: list는 각 참여자에게 목록 하나를 주며, Potato가 두 그룹 파일에서 항목을 불러오므로 data_files는 비워 둡니다. 할당은 기본적으로 balanced이며 각 새 참여자는 참여자가 더 적은 목록으로 갑니다. 설정은 balance_on을 기본값인 assigned로 둡니다. Potato 2.12.1의 balance_on: completed에서는 참여자가 끝낸 뒤에야 목록에 계산되었고, 1초 이내에 시작한 모의 독자 열두 명은 기본값에서 6과 6이던 것이 목록 사이에서 8과 4로 갈렸습니다. Potato 2.13.1은 마지막 활동 후 in_progress_minutes(기본값 60) 이내로 아직 진행 중인 참여자도 세므로, completed는 그런 불균형 없이 중도 이탈자를 대체합니다.
login.type: url_direct는 연구 링크의 PROLIFIC_PID에서 참여자 ID를 읽습니다. 끝에서 crowdsourcing 블록은 "Return to Prolific" 버튼과 함께 완료 코드 C1READING을 보여 줍니다. 자신의 서버에서 jsPsych로 Stroop 과제 실행하기는 Prolific 연구 URL, 선별 검사의 탈락 코드, 연구를 공개 서버로 옮기는 방법을 다룹니다. export_include_phase_data: true는 설문 답변을 내보내기에 추가합니다.
설문 페이지
각 설문 페이지는 질문의 JSON 리스트입니다. 동의 질문은 하나의 답을 required_label 아래에 나열합니다. 서버는 설문 페이지에서 required_label을 검사하며, 2.13.1부터는 required: true도 검사합니다. 2.12.1에서는 required: true가 브라우저에서만 검사되었습니다. surveys/consent.json은 다음과 같습니다.
[
{
"name": "study_information",
"annotation_type": "pure_display",
"description": "About this study",
"labels": [
"You will read 38 sentences one word at a time and answer a yes-or-no question after each. The study takes about 15 minutes.",
"Your key presses and answers are stored on a university server under your Prolific ID.",
"If you do not want to take part, close this page and return the study on Prolific."
]
},
{
"name": "consent",
"annotation_type": "radio",
"description": "Do you agree to take part in this study?",
"labels": ["I agree to take part"],
"label_requirement": {"required_label": ["I agree to take part"]}
}
]surveys/instructions.json의 안내 페이지는 연습 문장 전에 키를 알려 줍니다.
[
{
"name": "how_to_read",
"annotation_type": "pure_display",
"description": "How the reading works",
"labels": [
"Each sentence first appears as a row of dashes. Press the space bar to see the first word, and press it again for each next word. Each word disappears when the next one appears.",
"Read at your normal pace. After the last word, a question appears. Press F for yes and J for no.",
"The first two sentences are practice."
]
}
]surveys/background.json의 배경 페이지는 읽기 뒤에 모국어를 묻습니다. 두 답을 모두 required_label 아래에 나열하면 서버는 특정한 답을 요구하지 않고 답변을 요구합니다.
[
{
"name": "native_english",
"annotation_type": "radio",
"description": "Is English your native language?",
"labels": ["Yes", "No"],
"label_requirement": {"required_label": ["Yes", "No"]}
},
{
"name": "comments",
"annotation_type": "text",
"description": "Anything else you want to tell us? (optional)"
}
]자신의 컴퓨터에서 테스트하기
프로젝트 폴더에서 서버를 시작합니다.
potato start config.yaml -p 8000테스트 참여자마다 새 PROLIFIC_PID로 http://localhost:8000/?PROLIFIC_PID=TEST1&STUDY_ID=s1&SESSION_ID=x1을 여세요. 동의와 안내 페이지 뒤에 각 문장은 응시점으로 시작해 아래에 "Space = next word"가 있는 대시로 나타납니다. 화면은 고정폭 글꼴을 쓰며 각 마스크는 가려진 단어의 글자마다 대시 하나를 둡니다. 따라서 단어가 나타나도 줄이 밀리지 않습니다. 스페이스바를 처음 누르면 첫 단어가 보입니다. 이후 한 번 누를 때마다 다음 단어가 보이고 이전 단어는 가려지며, 마지막 단어 뒤의 누름은 질문 아래에 "F = Yes"와 "J = No"가 있는 질문을 띄웁니다. 답하면 다음 문장이 로드됩니다.
스페이스바가 문장을 넘기므로 참여자에게는 키보드가 필요합니다. trial_timing.disable_back_navigation의 기본값이 true이므로 Potato는 읽기 페이지에서 뒤로 버튼을 숨깁니다. 문장 도중에 페이지를 새로 고치면 문장이 처음부터 다시 시작됩니다. 그러면 그 시행은 reloads가 1이 되고 reloaded_mid_trial 플래그가 붙으며, 시행의 단어 시간은 두 번째 읽기에서 나옵니다. 테스트 참여자는 목록에 계산되고 내보내기에 나타납니다. 시작 전에 annotation_output/과 project.sqlite를 삭제하세요.
읽기 시간 내보내기
연구를 CSV로 내보냅니다.
python -m potato.export --config config.yaml --format csv --output results/모의 독자 12명의 실행은 다음 파일을 썼습니다.
| 파일 | 한 행의 단위 | 내용 |
|---|---|---|
regions.csv | 표시된 단어 | 참여자, 항목, 목록, 0부터 센 단어 위치, 단어, rt_ms, 시행의 결과와 시작 시간(6,132행) |
trials.csv | 문장 | 답의 key와 label, 답하는 데 걸린 시간, 의도한 응시 및 시행 간 시간과 측정된 값, frame_ms, timer_resolution_ms, reloads, 서버의 플래그(456행) |
participants.csv | 참여자 | condition_list와 선별 탈락 |
annotations.csv | 참여자와 문장 | 이해 답변, 라벨마다 열 하나 |
phase_responses.csv | 설문 답변 | 동의, 모국어, 의견 |
아래 행은 독자 한 명의 중의적 항목 하나의 4번부터 8번 단어입니다. 항목은 "The assistant manager assigned the training seemed unnecessarily demanding to new staff."이며, 중의성 해소 동사는 6번 단어 seemed입니다.
user_id,instance_id,condition_list,region,text,rt_ms,correct,side,errors,trial_outcome,onset_epoch_ms
r01,mvrr12_amb,list2,4,the,295.9,,,,response,1793287302649
r01,mvrr12_amb,list2,5,training,458.5,,,,response,1793287302649
r01,mvrr12_amb,list2,6,seemed,553.2,,,,response,1793287302649
r01,mvrr12_amb,list2,7,unnecessarily,564.2,,,,response,1793287302649
r01,mvrr12_amb,list2,8,demanding,433.9,,,,response,1793287302649rt_ms는 단어가 나타난 표시 프레임에서 스페이스바의 다음 누름까지입니다. correct, side, errors 열은 미로 과제 밖에서는 비어 있습니다. 문장이 답변된 질문으로 끝났으므로 trial_outcome은 response입니다. regions.csv에는 list 조건이 있지만 항목 자체의 필드는 없습니다. condition과 critical_region 같은 항목 필드는 instance_id로 조인하여 목록 파일에서 가져옵니다.
trials.csv에서 rt_ms는 질문의 시작에서 답까지입니다. 각 시행은 참여자의 브라우저가 측정한 프레임 간격과 브라우저의 타이머 해상도도 기록하며, 헤드리스 테스트에서는 8.3ms와 0.1ms였습니다. 두 열은 각 참여자의 컴퓨터가 제공할 수 있었던 것을 보여 줍니다.
Python에서 잔차 읽기 시간
원시 읽기 시간은 단어 길이에 따라 늘어나고 독자마다 다릅니다. 잔차 읽기 시간은 각 독자의 시간을 단어 길이로 적합하고 잔차를 남겨 두 효과를 모두 제거합니다(Ferreira & Clifton, 1986). 아래 분석 스크립트는 연습 문장, 질문 정확도가 80% 미만인 독자, 새로 고침된 시행, 100에서 2,000ms 밖의 시간을 제외합니다. 다음으로 스크립트는 독자별 잔차를 계산하고, 동사 앞 단어, 동사, 동사 뒤 두 단어에서 조건별로 잔차를 평균합니다. 마지막 단계는 동사와 그 뒤 두 단어에 참여자와 항목의 무작위 절편이 있는 혼합 모형을 적합합니다.
import numpy as np
import pandas as pd
import statsmodels.formula.api as smf
items = pd.concat([pd.read_json(f"data/{f}.jsonl", lines=True) for f in ("list1", "list2")])
items = items.rename(columns={"id": "instance_id"})
trials = pd.read_csv("results/trials.csv").merge(items, on="instance_id")
regions = pd.read_csv("results/regions.csv").merge(items, on="instance_id")
# Comprehension accuracy per participant, practice excluded.
trials = trials[trials.condition != "practice"]
trials["correct"] = trials.label == trials.answer
accuracy = trials.groupby("user_id").correct.mean()
keep = accuracy[accuracy >= 0.8].index
print(accuracy.round(2).to_dict())
# Drop practice, low-accuracy readers, reloaded trials, and extreme times.
flagged = trials[trials["flags"].fillna("").str.contains("reloaded_mid_trial")]
rt = regions[(regions.condition != "practice") & regions.user_id.isin(keep)]
rt = rt.merge(flagged[["user_id", "instance_id"]], how="left", indicator=True)
rt = rt[(rt._merge == "left_only") & rt.rt_ms.between(100, 2000)].copy()
# Residual reading time: each reader's times regressed on word length.
rt["length"] = rt.text.str.replace(r"[^A-Za-z]", "", regex=True).str.len()
def residuals(d):
slope, intercept = np.polyfit(d.length, d.rt_ms, 1)
return d.rt_ms - (intercept + slope * d.length)
rt["residual"] = pd.concat([residuals(d) for _, d in rt.groupby("user_id")])
# Positions relative to the disambiguating verb, critical items only.
crit = rt[rt.condition.isin(["ambiguous", "unambiguous"])].copy()
crit["position"] = (crit.region - crit.critical_region).astype(int)
window = crit[crit.position.between(-1, 2)]
window.to_csv("window.csv", index=False)
print(window.pivot_table(index="position", columns="condition",
values="residual", aggfunc="mean").round(1))
# Mixed model at the verb and the two words after it.
spill = window[window.position >= 0]
fit = smf.mixedlm("residual ~ condition", spill, groups="user_id",
vc_formula={"item": "0 + C(item)"}).fit()
print(fit.summary().tables[1])테스트 내보내기에 대해 프로젝트 폴더에서 실행하면 스크립트는 다음을 출력했습니다.
{'r01': 0.92, 'r02': 0.83, 'r03': 0.89, 'r04': 0.97, 'r05': 0.94, 'r06': 0.67, 'r07': 0.92, 'r08': 0.89, 'r09': 0.89, 'r10': 0.94, 'r11': 0.81, 'r12': 0.94}
condition ambiguous unambiguous
position
-1 0.8 2.3
0 80.7 -7.8
1 56.4 -13.8
2 18.5 -10.4
Coef. Std.Err. z P>|z| [0.025 0.975]
Intercept 51.865 2.559 20.268 0.000 46.850 56.881
condition[T.unambiguous] -62.542 3.626 -17.249 0.000 -69.648 -55.435
item Var 0.000 1.955이 실행은 Potato 2.12.1과 모의 독자를 썼습니다. 헤드리스 브라우저 드라이버는 각 단어의 지연을 단어 길이에 무작위 잡음을 더해 정했고, 모든 중의적 항목의 동사와 그 뒤 두 단어에 90, 60, 25ms를 더했습니다. 분석은 그 세 위치에서 조건 사이의 89, 70, 29ms 차이를 복원했습니다. 따라서 키 누름에서 내보내기, 잔차까지의 경로는 드라이버가 넣은 효과를 유지했으며, 이 차이는 사람이 이 문장들을 어떻게 읽는지에 대해서는 아무것도 말해 주지 않습니다. 독자 r06은 질문의 67%에만 맞게 답해서 제외되었습니다. 모의 항목에는 항목 효과가 없으므로 항목 분산은 0이며, statsmodels는 추정치가 모수 공간의 경계에 있다고 경고합니다.
스크립트는 R 분석을 위해 동사 주변의 네 위치도 window.csv에 씁니다. 아래의 lme4 모형은 참여자와 항목에 대한 무작위 조건 기울기를 추가합니다. 이 페이지를 위해 R은 실행하지 않았습니다.
library(lme4)
window <- read.csv("window.csv")
spill <- subset(window, position >= 0)
fit <- lmer(residual ~ condition + (1 + condition | user_id) + (1 + condition | item),
data = spill)
summary(fit)미로 버전
미로 과제는 각 위치에 단어 두 개를 나란히 보여 주고, 독자는 문장을 이어 가는 단어를 고릅니다(Boyce, Futrell & Levy, 2020). 연구의 미로 버전을 만들려면 위 설정의 trial_timing과 annotation_schemes 블록을 아래 블록으로 바꾸세요.
trial_timing:
enabled: true
fixation_ms: 400
iti_ms: 500
presentation:
mode: maze
field: sentence
distractor_field: distractors
maze_keys: {left: e, right: i}
on_error: redo
annotation_schemes:
- annotation_type: pure_display
name: maze_instructions
description: How to read
labels:
- Press E for the left word or I for the right word, whichever continues the sentence.그러면 각 항목에는 문장의 단어마다 틀린 단어 하나가 든 distractors 필드가 필요합니다. 필드가 문장보다 단어가 하나 적으면 Potato는 첫 단어를 x-x-x와 짝짓습니다.
{"id": "mvrr01_amb", "item": 1, "condition": "ambiguous", "sentence": "The suspect sent the file deserved further investigation given the new evidence.", "distractors": "ran very of went ninety whose upon slept seemed of often.", "critical_region": 5}위의 방해 단어는 테스트 실행을 위해 손으로 작성했습니다. A-maze는 문장을 잇지 않으면서 길이와 빈도가 비슷한 단어 가운데 언어 모델로 각 방해 단어를 고릅니다. Maze 저장소에 생성 코드가 있으며, 생성은 목록 파일을 만들기 전에 실행합니다.
미로 버전은 이해 질문을 하지 않으며 response 블록이 없습니다. response 블록이 없는 시간 제한 페이지에서 Potato는 pure_display 스킴만 받으며, 안내문이 페이지의 유일한 스킴입니다. on_error: redo는 틀린 선택을 표시하고 올바른 단어를 기다리며, on_error: stop은 대신 첫 오류에서 문장을 끝냅니다. 모의 독자 두 명의 테스트 실행에서 regions.csv는 모든 단어의 correct와 side를 채웠고, 이 설정에서는 미로 문장 뒤에 질문이 없으므로 trial_outcome이 completed였습니다. 한 독자는 deserved에서 잘못된 키를 한 번 눌렀습니다. deserved의 행은 errors가 1이며, 행의 rt_ms 1,072.6은 쌍의 시작에서 올바른 누름까지입니다.
PCIbex 실험 가져오기
potato import -f ibex는 기존 PCIbex 실험을 변환합니다. data_includes/와 chunk_includes/가 있는 폴더를 명령에 지정하세요.
potato import -f ibex -i my_experiment/ -o my-study/테스트 실험에는 Template("items.csv", ...) 시행 하나와 수준이 A와 B인 Group 열이 있었습니다. 시행은 newController("DashedSentence", {s: row.Sentence})를 보여 준 다음 newText(row.Question)과 newKey("FJ")로 질문을 했습니다. 가져오기는 list 요인과 그룹마다 데이터 파일 하나가 있는 이동 창 설정을 썼고, 설정은 validate_cli --strict를 통과했습니다. IMPORT_REPORT.md는 Sequence 순서와 newHtml 안내 화면을 변환되지 않은 것으로 나열했습니다. Potato 2.12.1에서는 이해 질문이 보고서에 한 줄도 없이 버려졌고, 위 설정처럼 question_field와 response 블록을 직접 추가해야 했습니다. 같은 실험에 실행하면 2.13.1의 가져오기는 질문을 question_field와 response 블록이 있는 comprehension 스킴으로 유지했고, 보고서는 F와 J 키가 Yes와 No가 되었다고 적습니다. Ibex에서 오신 분께는 가져오기가 변환하는 PCIbex 구성 요소를 나열합니다.
다음으로 볼 자료
- 자기 조절 읽기와 미로 과제, 누적 및 중심 모드,
mask_char, 서버가 설정하는 모든 플래그 - 실험 흐름, 목록, 조건, 선별 탈락
- 시간 제한 시행, 읽기 시행이 공유하는 응시, 제한 시간, 타이밍 기록
- 자신의 서버에서 jsPsych로 Stroop 과제 실행하기, Prolific 설정과 공개 서버로의 이전
- 온라인 행동 실험, 선별 검사, SONA, 다른 내보내기 형식
- Potato의 언어학 연구와 Potato의 심리학 연구, 각 분야가 쓰는 다른 기능
참고문헌
- Boyce, V., Futrell, R., & Levy, R. P. (2020). Maze Made Easy: Better and easier measurement of incremental processing difficulty. Journal of Memory and Language, 111, 104082. https://doi.org/10.1016/j.jml.2019.104082
- Ferreira, F., & Clifton, C. (1986). The independence of syntactic processing. Journal of Memory and Language, 25(3), 348-368. https://doi.org/10.1016/0749-596X(86)90006-9
- Huang, K.-J., Arehalli, S., Kugemoto, M., Muxica, C., Prasad, G., Dillon, B., & Linzen, T. (2024). Large-scale benchmark yields no evidence that language model surprisal explains syntactic disambiguation difficulty. Journal of Memory and Language, 137, 104510. https://doi.org/10.1016/j.jml.2024.104510
- Just, M. A., Carpenter, P. A., & Woolley, J. D. (1982). Paradigms and processes in reading comprehension. Journal of Experimental Psychology: General, 111(2), 228-238. https://doi.org/10.1037/0096-3445.111.2.228