跳到正文
土土金API

社科文本分析与定性编码

社科文本分析的稳妥做法,是把大模型当作按编码本工作的编码员:研究者写好编码本,模型逐段给出编码并引用原话,程序核对每条原话确实出自原文;再抽一部分样本,由人工和第二个模型分别独立编码,计算一致性,分歧由研究者裁定。社交媒体这类大语料用同样的方法标注情感和主题,再用向量模型聚类探索话题。按每月 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。

¥124.3/ 月

  • 访谈逐段编码¥5.38
  • 开放题回答编码¥24.37
  • 社交媒体情感与话题¥82.88
  • 一致性抽样(第二编码员)¥8.56
  • 帖子向量化与聚类¥3.12
看用量假设

业务问题

访谈逐字稿、问卷开放题、社交媒体帖子,一个项目动辄几十万字。人工逐段编码要花几周,几位编码员之间还要反复校准。

直接让模型「总结一下主题」很快,但结论没法检验:依据什么标准、哪句原话,换一次会不会变,都说不清,写进论文也难以经得起评审。

更可靠的用法是让模型严格按编码本工作:编码本由研究者定,模型只能从中选编码,并给出原话;程序逐条核对原话,再抽样和人工编码比较一致性,分歧和最终解释都由研究者负责。

数据的知情同意、伦理审查、脱敏,以及能不能发送给第三方模型服务,由研究者和所在机构按自己的规定判断,我们不对此作承诺。按平台默认配置,用量日志不记录请求和回复正文;为了生成回复,请求会转发给所选分组对应的模型服务方处理。

推荐模型组合

推荐模型按实时目录自动选取,价格取各模型最低价分组,更新于 2026年11月13日 17:53。点模型名可查看全部分组价格。

参考架构

  1. 1

    整理与脱敏

    访谈录音先转成逐字稿,再按段落切分,每段带上受访者编号和段落号,例如 INT07-P012。发送前去掉姓名、单位、联系方式等能识别个人的信息,原始数据只留在本地。

  2. 2

    写编码本

    每个编码写清定义、适用和不适用的情况,再配一两个原文例子。可以先用向量聚类浏览语料、找候选话题,但编码本由研究者确定,并标上版本号。

  3. 3

    模型逐段编码

    编码本放在系统提示词里,temperature 设为 0,要求按 JSON 返回编码和对应的原话。程序检查编码是否在编码本里、原话是否逐字出现在这一段,不符合的进入人工核对。

  4. 4

    一致性检验

    随机抽取一部分段落,例如 10% 到 20%,由人工和第二个模型分别独立编码,按每个编码计算 Cohen’s kappa 或 Krippendorff’s alpha。分歧大的编码多半是定义不清,修改编码本后重新编码;达标的门槛按你所在学科的惯例确定。

  5. 5

    情感与话题

    社交媒体帖子这类大语料,用固定的情感标签和话题清单逐条标注,做法和数据标注方案相同;再结合向量聚类看话题分布,每一类抽几条原文人工阅读。

  6. 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-plus1,200 次 × 输入 2,500 + 输出 250 tokens¥5.38
开放题回答编码qwen3.5-plus8,000 次 × 输入 2,000 + 输出 120 tokens¥24.37
社交媒体情感与话题qwen3.5-plus100,000 次 × 输入 500 + 输出 40 tokens¥82.88
一致性抽样(第二编码员)gpt-5.4-mini1,840 次 × 输入 2,200 + 输出 150 tokens¥8.56
帖子向量化与聚类text-embedding-3-large100,000 次 × 输入 120 tokens¥3.12
合计(每月)¥124.3

按各模型最低价分组的实时价格计算,价格更新于 2026年11月13日 17:53。

只含模型调用费用,不含人工编码和录音转写的费用(转写见语音转写方案)。编码本越长,每条的输入 tokens 越多;编码本固定不变、模型又支持上下文缓存时,命中缓存的部分按更低的缓存读取价计费,实际费用会更低。语料量翻倍,对应那一项的费用大致翻倍。

示例代码

模型只能从编码本里选编码,并给出原话;程序丢掉不在编码本里的编码和对不上原文的原话,记为待人工核对,再在同一批样本上计算模型与人工、模型与第二个模型的 Cohen’s kappa。

示例代码(Python,按编码本编码、核对原话与一致性)
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.

用一把 Key 试试这个方案

注册后在控制台创建 API Key,把上面代码里的 base_url 和 Key 换成你的就能运行。企业采购、开发票可以加客服微信 JsnonoChat。

土土金客服微信二维码
微信JsnonoChat

扫码或搜索微信号添加客服

常见问题

大模型能代替人工编码吗?

不能代替研究者的判断。模型适合按明确的编码本做大批量的初次编码;编码本怎么定、分歧怎么裁、结论怎么解释,都由研究者负责。论文里如实写明模型的用法、所用的模型和一致性检验的结果。

怎么检验模型编码和人工编码的一致性?

随机抽一部分段落,由人工在看不到模型结果的情况下独立编码,按每个编码计算 Cohen’s kappa(两位编码员)或 Krippendorff’s alpha(多位编码员或有缺失值)。一致性低的编码多半是定义不清,改编码本后再测;门槛按你所在学科的惯例定。

访谈数据涉及隐私,可以发给模型吗?

能不能发,取决于知情同意书、伦理审查批准的范围和所在机构的数据规定,需要研究者自己判断,我们不能替你作合规承诺。技术上建议先去掉姓名、单位、联系方式等识别信息,只发送分析需要的段落;对线路来源有要求的,选标着「官方转发」的分组。

每月大概要花多少钱?

按每月 40 份访谈、8,000 条开放题回答、10 万条社交媒体帖子估算,用最低价分组计算约 ¥124。编码本的长度和帖子的数量对费用影响最大。

英文或其他语言的语料也能用吗?

可以,流程不变。编码本最好和语料用同一种语言;需要把原话译成论文的写作语言时,见翻译方案,引用时仍以原文为准。

情感和话题的标注结果能直接写进结论吗?

把它们当作描述性的线索:每个情感标签和话题都抽原文人工阅读,确认含义和你的研究问题一致,再写进结论。