社科文本分析與定性編碼
社科文本分析的穩妥做法,是把大模型當作按編碼本工作的編碼員:研究者寫好編碼本,模型逐段給出編碼並引用原話,程式核對每條原話確實出自原文;再抽一部分樣本,由人工和第二個模型分別獨立編碼,計算一致性,分歧由研究者裁定。社交媒體這類大語料用同樣的方法標註情感和主題,再用向量模型聚類探索話題。按每月 40 份訪談、8,000 條開放題回答和 10 萬條社交媒體帖子估算,用各模型最低價分組的即時價格計算,模型費用每月約 ¥124。
價格更新於 2026年11月13日 下午5:58
月成本估算
假設:每月處理 40 份訪談,切成 1,200 段,每段輸入約 2,500 tokens(編碼本約 1,800、正文約 700)、輸出約 250 tokens;8,000 條問卷開放題回答,每條輸入約 2,000 tokens、輸出約 120 tokens;10 萬條社交媒體帖子標註情感和話題,每條輸入約 500 tokens、輸出約 40 tokens;從訪談段落和開放題中抽 20%(1,840 條)由第二個模型獨立編碼;10 萬條帖子向量化,每條約 120 tokens。
業務問題
訪談逐字稿、問卷開放題、社交媒體帖子,一個專案動輒幾十萬字。人工逐段編碼要花幾週,幾位編碼員之間還要反覆校準。
直接讓模型「總結一下主題」很快,但結論沒法檢驗:依據什麼標準、哪句原話,換一次會不會變,都說不清,寫進論文也難以經得起評審。
更可靠的用法是讓模型嚴格按編碼本工作:編碼本由研究者定,模型只能從中選編碼,並給出原話;程式逐條核對原話,再抽樣和人工編碼比較一致性,分歧和最終解釋都由研究者負責。
資料的知情同意、倫理審查、脫敏,以及能不能傳送給第三方模型服務,由研究者和所在機構按自己的規定判斷,我們不對此作承諾。按平臺預設配置,用量日誌不記錄請求和回覆正文;為了生成回覆,請求會轉發給所選分組對應的模型服務方處理。
推薦模型組合
推薦模型按即時目錄自動選取,價格取各模型最低價分組,更新於 2026年11月13日 下午5:58。點模型名可檢視全部分組價格。
主編碼模型
qwen3.5-plus通義千問
輸入 ¥1.12 / 輸出 ¥6.72 每百萬 tokens國產模型分組
處理全部文本:按編碼本逐段編碼,也給社交媒體帖子標註情感和主題。編碼本寫在系統提示詞裡,每次請求都要帶上,輸入遠多於輸出,所以輸入單價最要緊。最終用哪個模型,以抽樣一致性檢驗的結果為準。
第二編碼員(另一家廠商的模型)
gpt-5.4-miniOpenAI
輸入 ¥1.5 / 輸出 ¥9 每百萬 tokens標準分組
只處理抽出來做一致性檢驗的樣本,在看不到主編碼結果的情況下獨立編碼。換一家廠商的模型,更容易看出哪些分歧來自編碼定義不清,而不只是某個模型自己的偏差;它的結果和人工編碼一起交給研究者裁定。
話題探索(Embeddings)
text-embedding-3-largeOpenAI
輸入 ¥0.26 / 輸出 ¥0.26 每百萬 tokens標準分組
把開放題回答和帖子轉成向量,用來聚類、找相似表述和去重,幫研究者在寫編碼本之前瞭解語料裡有哪些話題。聚類結果只是線索,話題的命名和取捨由研究者決定。
參考架構
- 1
整理與脫敏
訪談錄音先轉成逐字稿,再按段落切分,每段帶上受訪者編號和段落號,例如 INT07-P012。傳送前去掉姓名、單位、聯絡方式等能識別個人的資訊,原始資料只留在本地。
- 2
寫編碼本
每個編碼寫清定義、適用和不適用的情況,再配一兩個原文例子。可以先用向量聚類瀏覽語料、找候選話題,但編碼本由研究者確定,並標上版本號。
- 3
模型逐段編碼
編碼本放在系統提示詞裡,temperature 設為 0,要求按 JSON 返回編碼和對應的原話。程式檢查編碼是否在編碼本里、原話是否逐字出現在這一段,不符合的進入人工核對。
- 4
一致性檢驗
隨機抽取一部分段落,例如 10% 到 20%,由人工和第二個模型分別獨立編碼,按每個編碼計算 Cohen’s kappa 或 Krippendorff’s alpha。分歧大的編碼多半是定義不清,修改編碼本後重新編碼;達標的門檻按你所在學科的慣例確定。
- 5
情感與話題
社交媒體帖子這類大語料,用固定的情感標籤和話題清單逐條標註,做法和資料標註方案相同;再結合向量聚類看話題分佈,每一類抽幾條原文人工閱讀。
- 6
回到原文
分析結果裡的每條編碼都保留段落編號和原話,引用時直接用原話,不用模型的轉述。編碼本版本、提示詞、模型 ID、呼叫日期和一致性結果寫進分析日誌,便於在論文的方法部分如實報告。
成本估算
假設:每月處理 40 份訪談,切成 1,200 段,每段輸入約 2,500 tokens(編碼本約 1,800、正文約 700)、輸出約 250 tokens;8,000 條問卷開放題回答,每條輸入約 2,000 tokens、輸出約 120 tokens;10 萬條社交媒體帖子標註情感和話題,每條輸入約 500 tokens、輸出約 40 tokens;從訪談段落和開放題中抽 20%(1,840 條)由第二個模型獨立編碼;10 萬條帖子向量化,每條約 120 tokens。
| 專案 | 模型 | 用量假設 | 費用 |
|---|---|---|---|
| 訪談逐段編碼 | qwen3.5-plus | 1,200 次 × 輸入 2,500 + 輸出 250 tokens | ¥5.38 |
| 開放題回答編碼 | qwen3.5-plus | 8,000 次 × 輸入 2,000 + 輸出 120 tokens | ¥24.37 |
| 社交媒體情感與話題 | qwen3.5-plus | 100,000 次 × 輸入 500 + 輸出 40 tokens | ¥82.88 |
| 一致性抽樣(第二編碼員) | gpt-5.4-mini | 1,840 次 × 輸入 2,200 + 輸出 150 tokens | ¥8.56 |
| 帖子向量化與聚類 | text-embedding-3-large | 100,000 次 × 輸入 120 tokens | ¥3.12 |
| 合計(每月) | ¥124.3 | ||
按各模型最低價分組的即時價格計算,價格更新於 2026年11月13日 下午5:58。
只含模型呼叫費用,不含人工編碼和錄音轉寫的費用(轉寫見語音轉寫方案)。編碼本越長,每條的輸入 tokens 越多;編碼本固定不變、模型又支援上下文快取時,命中快取的部分按更低的快取讀取價計費,實際費用會更低。語料量翻倍,對應那一項的費用大致翻倍。
示例程式碼
模型只能從編碼本里選編碼,並給出原話;程式丟掉不在編碼本里的編碼和對不上原文的原話,記為待人工核對,再在同一批樣本上計算模型與人工、模型與第二個模型的 Cohen’s kappa。
import json
import os
from openai import OpenAI
client = OpenAI(base_url="https://www.tutujin.com/v1", api_key=os.environ["TUTUJIN_API_KEY"], max_retries=3)
CODEBOOK = { # written and versioned by the research team
"COST": "Money, prices or affordability given as a reason for a decision.",
"TRUST": "Trust or distrust in an institution, a platform or a person.",
"FAMILY": "Family members influence or take part in the decision.",
}
SYSTEM = (
"You are a qualitative coder. Apply only these codes, as defined:\n"
+ "\n".join(f"{code}: {definition}" for code, definition in CODEBOOK.items())
+ "\nFor every code that applies, copy the exact words of the segment that justify it. "
'Reply with JSON only: {"codes": [{"code": "COST", "quote": "exact words"}]}, or {"codes": []} if none apply.'
)
def code_segment(segment, model="qwen3.5-plus"):
resp = client.chat.completions.create(
model=model,
messages=[{"role": "system", "content": SYSTEM}, {"role": "user", "content": segment["text"]}],
temperature=0,
)
raw = resp.choices[0].message.content
found = json.loads(raw[raw.find("{"): raw.rfind("}") + 1]).get("codes", [])
# keep a code only if it is in the codebook and its quote appears word for word in the segment
kept = [c for c in found if c.get("code") in CODEBOOK and c.get("quote") and c["quote"] in segment["text"]]
return {"id": segment["id"], "model": resp.model, "codes": sorted({c["code"] for c in kept}),
"quotes": kept, "to_check": len(found) - len(kept)}
def cohen_kappa(a, b):
"""Agreement of two coders on one code; a and b are 0/1 lists over the same segments."""
n = len(a)
observed = sum(x == y for x, y in zip(a, b)) / n
pa, pb = sum(a) / n, sum(b) / n
expected = pa * pb + (1 - pa) * (1 - pb)
return float("nan") if expected == 1 else (observed - expected) / (1 - expected)
# the agreement sample: a few hundred segments in practice, de-identified before sending
sample = [
{"id": "INT07-P012", "text": "My mother said the rent there was too high, so we stayed where we were."},
{"id": "INT11-P003", "text": "I never believed what the agency told us about the subsidy."},
]
human = {"INT07-P012": {"COST", "FAMILY"}, "INT11-P003": {"TRUST"}} # coded without seeing the model output
first = [code_segment(s) for s in sample]
second = [code_segment(s, model="gpt-5.4-mini") for s in sample]
for code in CODEBOOK:
m1 = [int(code in r["codes"]) for r in first]
m2 = [int(code in r["codes"]) for r in second]
h = [int(code in human[r["id"]]) for r in first]
print(code, "model vs human:", round(cohen_kappa(m1, h), 2), "| model vs second model:", round(cohen_kappa(m1, m2), 2))
# Exploring themes first: embed answers or posts with text-embedding-3-large and cluster the vectors.常見問題
大模型能代替人工編碼嗎?
不能代替研究者的判斷。模型適合按明確的編碼本做大批次的初次編碼;編碼本怎麼定、分歧怎麼裁、結論怎麼解釋,都由研究者負責。論文裡如實寫明模型的用法、所用的模型和一致性檢驗的結果。
怎麼檢驗模型編碼和人工編碼的一致性?
隨機抽一部分段落,由人工在看不到模型結果的情況下獨立編碼,按每個編碼計算 Cohen’s kappa(兩位編碼員)或 Krippendorff’s alpha(多位編碼員或有缺失值)。一致性低的編碼多半是定義不清,改編碼本後再測;門檻按你所在學科的慣例定。
訪談資料涉及隱私,可以發給模型嗎?
能不能發,取決於知情同意書、倫理審查批准的範圍和所在機構的資料規定,需要研究者自己判斷,我們不能替你作合規承諾。技術上建議先去掉姓名、單位、聯絡方式等識別資訊,只發送分析需要的段落;對線路來源有要求的,選標著「官方轉發」的分組。
每月大概要花多少錢?
按每月 40 份訪談、8,000 條開放題回答、10 萬條社交媒體帖子估算,用最低價分組計算約 ¥124。編碼本的長度和帖子的數量對費用影響最大。
英文或其他語言的語料也能用嗎?
可以,流程不變。編碼本最好和語料用同一種語言;需要把原話譯成論文的寫作語言時,見翻譯方案,引用時仍以原文為準。
情感和話題的標註結果能直接寫進結論嗎?
把它們當作描述性的線索:每個情感標籤和話題都抽原文人工閱讀,確認含義和你的研究問題一致,再寫進結論。
