Potato 為新聞文章、社交媒體帖子、演講和評論串編碼立場、框架、毒性和虛假資訊,每個條目由多位編碼者處理,並按問題報告 Krippendorff's alpha。Potato 以宣告的模型 ID 記錄 LLM 的標籤,並把模型與人的一致性同人與人之間的一致性分開報告。
計算社會科學用計算方法研究社會行為,該領域的大量工作把文本當作資料。Grimmer 和 Stewart(2013)綜述了用於政治文本的自動內容分析方法。在這類工作中,人工編碼的標籤有三種用途。標籤用來訓練分類器,標籤是檢驗模型輸出的參照,當語料庫小到可以全部編碼時,標籤本身就是測量。由於每種用途都要求編碼者以同樣的方式應用編碼手冊,編碼的可靠性也是結果的一部分。Potato 把條目分配給編碼者,分別儲存每位編碼者的回答,並在編碼進行時按問題報告一致性。問卷和調查實驗見調查研究頁面。
Potato 中的文本即資料任務
每一行是 Potato 2.13.1 自帶的一項功能,連結頁面列出了它的選項。
| 任務 | Potato 的做法 | 文件 |
|---|---|---|
| 用編碼手冊做內容分析 | radio 和 multiselect 問題,或從 CSV、JSON 或 YAML 檔案載入的 hierarchical_multiselect 編碼手冊 | 內容分析 |
| 對某個目標的立場 | 通過 instance_display 把目標顯示在文本旁邊,再用一道 radio 問題選擇支援、反對或都不是 | 單選與多選 |
| 框架 | 對框架類別做 multiselect,例如 Media Frames Corpus 的 15 個框架維度 | 單選與多選 |
| 毒性與不文明用語 | 用 likert 評分表示程度,用 span 標籤標出使評論帶有毒性的詞語 | 文本片段標註 |
| 虛假資訊與論斷 | 用 span 標籤標出值得核查的論斷,用 radio 對每條論斷做出判定 | 文本片段標註 |
| 把文本標度到一個連續維度上 | bws 元組,由 python -m potato.bws_scoring 用計數法或 Plackett-Luce 模型為每條文本算出一個值 | 最佳最差標度 |
| 眾包編碼 | 通過 Prolific 招募,配合 attention_checks,以及設有準確率下限的 gold_standards | 眾包 |
| 對照人工檢查的 LLM 輔助編碼 | machine_annotators 把模型宣告為一位編碼者,一致性報告把模型與人分開 | LLM 輔助編碼 |
| 回覆串與對話 | potato convokit 把 ConvoKit 語料庫轉成 Potato 條目,並保留回覆結構 | 串聯對話 |
在一個任務中編碼立場、框架和不文明用語
一個任務可以針對同一條帖子提出多個問題。下面的配置把立場目標顯示在每條帖子上方,詢問作者的立場、帖子使用的框架,以及帖子有多不文明,每個條目有三位編碼者。框架標籤是 Media Frames Corpus 維度的一個子集,真正的編碼手冊會在指南中定義每一個框架。
annotation_task_name: "Stance and framing in news posts"
task_dir: "."
data_files:
- data/posts.jsonl
item_properties:
id_key: id
text_key: text
instance_display:
fields:
- key: target
type: text
label: "Target"
- key: text
type: text
label: "Post"
output_annotation_dir: annotation_output/
user_config:
allow_all_users: true
num_annotators_per_item: 3
agreement_metrics:
enabled: true
min_overlap: 2
annotation_schemes:
- annotation_type: radio
name: stance
description: "What position does the author take toward the target?"
labels: [favor, against, neither]
label_requirement:
required: true
- annotation_type: multiselect
name: frames
description: "Which frames does the post use? Select all that apply."
labels: [economic, morality, fairness and equality, legality, security and defense, public opinion, other]
- annotation_type: likert
name: incivility
description: "How uncivil is the post?"
size: 5
min_label: "Civil"
max_label: "Very uncivil"data/posts.jsonl 中的每個條目帶有 id、target 和 text 欄位。每個條目三位編碼者比兩位成本更高。第三位編碼者能打破大多數平局,並讓不文明用語這類主觀問題上的 alpha 更穩定。需要多少位標註者?分析了其中的取捨。編碼結束後,reliability 匯出會為每個問題寫出 Krippendorff's alpha 及自助法區間,立場按名義水平計算,框架集合有重疊時給予部分得分,不文明用語按有序水平計算。
檢查眾包編碼者和 LLM 編碼者
Benoit 等人(2016)報告說,由許多非專家的眾包工作者編碼的政治文本,得到的結果與專家編碼相當。Potato 通過 Prolific 招募編碼者,並用 attention_checks 篩選每一位編碼者,gold_standards 則在執行期間用已知答案的條目度量每位編碼者的準確率。金標準與注意力檢查介紹了這兩種檢查。
Gilardi、Alizadeh 和 Kubli(2023)發現,在 2,382 條推文的五項標註任務中,ChatGPT 的零樣本準確率在其中四項上超過了眾包工作者,這些任務包括立場和框架檢測。模型在你的編碼手冊和你的語料庫上是否也一樣好,是每項研究都要用實證回答的問題。Potato 以 machine_annotators 中宣告的 ID 記錄模型的標籤,並附上模型名稱和執行日期。/admin/iaa 上的一致性報告隨後把主要數字保持為僅限人工,並把模型單獨報告,csv、tsv 和 parquet 匯出還會新增一個 annotator_origin 列,標明每一行來自人還是來自模型。對於單選和評分類問題,一旦有三位或更多的人各自編碼了 30 個或更多模型也編碼過的條目,管理 API 就會執行 Calderon、Reichart 和 Dror(2025)的替代標註者檢驗。
匯入資料與匯出標籤
資料檔案是 JSON、JSONL、CSV 或 TSV,每行一個條目。在你自己的流程中抽取的帖子或文章樣本可以不經轉換直接載入。ConvoKit 格式的語料庫用一條命令就能匯入。下面這條命令為每段對話寫出一個條目,並根據語料庫後設資料生成一份起始配置:
potato convokit conversations-gone-awry-corpus -o data/awry.jsonl --emit-config config.yaml標籤可以匯出為每位編碼者每個條目一行的 csv、jsonl 或 parquet,也可以匯出為用於訓練分類器的 Hugging Face 資料集。按編碼者逐行的檔案保留了每位編碼者的回答,供一致性分析使用。convokit 匯出會把標籤寫回語料庫的話語和對話上。
與 Prolific、Label Studio 和電子表格的分工
許多內容分析項目在電子表格裡編碼,許多眾包項目在問卷工具裡搭建編碼表單,再通過 Prolific 招募。這兩種做法都把條目到編碼者的分配、重疊樣本和一致性統計,留給為每項研究單獨編寫的指令碼。Label Studio 是一個開源的資料標註與 AI 評估平臺,在一個介面中涵蓋文本、影像、音訊和時間序列。Potato 圍繞編碼研究而構建,每個條目的編碼者人數在配置中設定,帶有注意力檢查和金標準檢查,按問題報告可靠性,並有一份能為方法部分復現任務的配置檔案。Prolific 招募經過驗證的學術研究參與者,參與者到達後,由 Potato 執行編碼。
藉助程式設計智慧體搭建研究
potato-skill 為 Claude Code、Codex 或 Cursor 提供設計和構建 Potato 研究的說明。用平實的語言描述這項工作,就足以開始。一條請求可以短到這樣:
為 3,000 條關於碳稅的推文設定立場編碼,每條推文三位 Prolific 編碼者,用十條金標準推文做篩選,並按問題報告 Krippendorff's alpha。
智慧體會列出過程中做出的每一項假設,構建 Potato 任務,並把任務渲染出來以檢查結果。在邀請標註者之前,先自己開啟任務,標幾個條目。
常見問題
如何標註推文對某個目標的立場?
用 instance_display 把目標顯示在每條推文旁邊,再提出一道 radio 問題,選項為支援、反對和都不是,做法與 SemEval-2016 Task 6 相同。目標存放在每個條目的資料中,一個任務就可以涵蓋多個目標。立場不同於情感,因為語氣負面的推文仍可能支援該目標。指南應當為每種情況各給一個例子。立場檢測設計是一份起始配置。
ChatGPT 能取代眾包工作者做文本標註嗎?
在一項已發表的推文對比中,ChatGPT 在五項文本標註任務裡有四項勝過眾包工作者,而用你自己的條目做一次測試,才能顯示模型在你的資料上表現如何。讓人在看不到模型標籤的情況下編碼一個樣本,在 machine_annotators 中宣告模型,並把模型與人的一致性同人與人之間的一致性相比較。管理 API 會執行替代標註者檢驗,用來檢查模型能否代替其中一位人工編碼者。
延伸閱讀
- 標註者間一致性:該報告哪種係數,以及如何解讀
- 聚合眾包標籤:把多位編碼者的回答合併成一個標籤
- 撰寫標註指南:編碼者所依據的編碼手冊
- LLM 預標註:由編碼者確認或修正的模型建議
- LLM 標註者與人類:模型何時是合格的編碼者
- 內容稽核標註:毒性與政策標籤
- 調查研究、定性研究和 NLP 與文本:本站相鄰的領域
參考文獻
- Grimmer and Stewart (2013). Text as Data: The Promise and Pitfalls of Automatic Content Analysis Methods for Political Texts. Political Analysis 21(3). https://doi.org/10.1093/pan/mps028
- Card, Boydstun, Gross, Resnik, and Smith (2015). The Media Frames Corpus: Annotations of Frames Across Issues. ACL-IJCNLP 2015. https://doi.org/10.3115/v1/P15-2072
- Mohammad, Kiritchenko, Sobhani, Zhu, and Cherry (2016). SemEval-2016 Task 6: Detecting Stance in Tweets. SemEval-2016. https://doi.org/10.18653/v1/S16-1003
- Benoit, Conway, Lauderdale, Laver, and Mikhaylov (2016). Crowd-sourced Text Analysis: Reproducible and Agile Production of Political Data. American Political Science Review 110(2). https://doi.org/10.1017/S0003055416000058
- Gilardi, Alizadeh, and Kubli (2023). ChatGPT Outperforms Crowd Workers for Text-Annotation Tasks. Proceedings of the National Academy of Sciences 120(30). https://doi.org/10.1073/pnas.2305016120
- Calderon, Reichart, and Dror (2025). The Alternative Annotator Test for LLM-as-a-Judge: How to Statistically Justify Replacing Human Annotators with LLMs. ACL 2025. https://doi.org/10.18653/v1/2025.acl-long.782