跳轉到內容
計算社會科學

用 Potato 做計算社會科學與文本即資料

為新聞和社交媒體帖子編碼立場、框架和不文明用語,按問題報告 Krippendorff's alpha,並對照人工編碼者檢查 LLM 的標籤。

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 維度的一個子集,真正的編碼手冊會在指南中定義每一個框架。

yaml
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 格式的語料庫用一條命令就能匯入。下面這條命令為每段對話寫出一個條目,並根據語料庫後設資料生成一份起始配置:

bash
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 會執行替代標註者檢驗,用來檢查模型能否代替其中一位人工編碼者。

延伸閱讀

參考文獻

  1. 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
  2. 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
  3. 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
  4. 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
  5. 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
  6. 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

示例設計

每個設計都是可以下載並直接執行的 Potato 配置。

從這裡開始

其他領域

全部應用場景