社科文本分析与定性编码
社科文本分析的稳妥做法,是把大模型当作按编码本工作的编码员:研究者写好编码本,模型逐段给出编码并引用原话,程序核对每条原话确实出自原文;再抽一部分样本,由人工和第二个模型分别独立编码,计算一致性,分歧由研究者裁定。社交媒体这类大语料用同样的方法标注情感和主题,再用向量模型聚类探索话题。按每月 40 份访谈、8,000 条开放题回答和 10 万条社交媒体帖子估算,用各模型最低价分组的实时价格计算,模型费用每月约 ¥124。
价格更新于 2026年11月13日 17:53
月成本估算
假设:每月处理 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日 17:53。点模型名可查看全部分组价格。
主编码模型
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日 17:53。
只含模型调用费用,不含人工编码和录音转写的费用(转写见语音转写方案)。编码本越长,每条的输入 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。编码本的长度和帖子的数量对费用影响最大。
英文或其他语言的语料也能用吗?
可以,流程不变。编码本最好和语料用同一种语言;需要把原话译成论文的写作语言时,见翻译方案,引用时仍以原文为准。
情感和话题的标注结果能直接写进结论吗?
把它们当作描述性的线索:每个情感标签和话题都抽原文人工阅读,确认含义和你的研究问题一致,再写进结论。
