为文科背景学习者定制 · 无需数学与编程基础

从零基础,到 NLP 应用精通

不需要先成为数学家,也不需要先成为程序员。从你熟悉的文本出发——用一条为你量身定制的路线,学会用机器阅读、统计与分析语言。

已掌握 0 / 0 项 完成 0%

进度保存在你自己的浏览器里,随时回来接着学。

八大模块

这个网站适合谁

🎓

外语、文学、语言学背景,想给研究加上"计算"这一对翅膀。

🤖

天天听说 ChatGPT 很强,但不知道从哪里学起、学多少才够用。

🔬

不打算转行算法工程师,只想把数字方法真正用到自己的课题里。

怎么用本站?
  1. 先看 路线图,选好你的路径(多数人选应用向);
  2. 数学和 Python 交替推进,别陷入"先补完数学"的陷阱;
  3. 每学完一块,点一下旁边的「标记已掌握」记录进度;
  4. 学到第 3 个月左右,去实操项目区换上自己的语料做实验。
模块 01 · 规划

学习路线图

两条路线,两种人生节奏。默认突出语言学科研应用向——它能让绝大多数文科学习者在 3–5 个月内达到"研究够用"的水平。

⭐ 重点推荐

路线 A · 语言学科研应用向

周期 3–5 个月 每天 1–2 小时即可

目标:能用 Python 处理自己的语料、跑通文本分析实验、读懂 NLP 论文的"方法"部分,并把大模型当成靠谱(但需核查)的研究助手。

  1. Python 速成第 1–3 周

    在 Colab 里跑通第一个脚本;掌握变量、列表、字典、循环、函数"五件套",标准是能改别人的代码。

  2. 数学急救包与第 1 步同步

    只学三样:向量、余弦相似度、概率直觉。高等数学暂且放到一边——真的用不到多少。

  3. 数据处理第 2 个月

    文件与 CSV 读写;用 numpy 算相似度,用 pandas 管理语料表格、做分组统计。

  4. 文本工具与 NLP 概念第 3 个月

    spaCy / stanza 分词与标注;搞懂词袋、TF-IDF、词向量、Token、Transformer 是什么、为什么行得通。

  5. 实操项目第 4 个月

    完成本站五个实验:文体计量、相似度、语言模型接龙、标注一致性、语料统计——然后全部换上你自己的语料。

  6. 走向研究第 5 个月

    复现一篇计算人文 / 计量文体学论文的核心实验;学会把大模型用于辅助标注与写作,并知道如何防住它的幻觉。

路线 B · 算法研发向

周期 12–18 个月 需要大块时间投入

目标:能读懂论文公式、复现和改造模型,适合读博、转算法岗,或对模型内部原理有强烈好奇心的人。

  1. 高等数学第 1–2 月

    极限与连续、导数与偏导、链式法则、梯度——后面一切的地基。

  2. 线性代数第 3–4 月

    矩阵运算、秩、特征值与特征向量、SVD——这次要学"为什么",不只是"是什么"。

  3. 概率论与统计第 5–6 月

    概率空间、常见分布、贝叶斯定理、假设检验与参数估计。

  4. Python 与工程基础第 6–7 月

    语法进阶、numpy、数据结构与算法入门、命令行与 Git。

  5. 机器学习第 8–10 月

    线性 / 逻辑回归、决策树、SVM、交叉验证与评估指标,配 Scikit-learn 实战。

  6. 深度学习第 11–13 月

    神经网络、反向传播、CNN/RNN、PyTorch 实战,亲手训练几个小模型。

  7. NLP 专精第 13–18 月

    词向量 → 序列模型 → Transformer → 预训练与微调 → 大语言模型,跟踪领域前沿。

🧰 研发向的弹药库已就位:知识库新增「算法工程师进阶」分类——PyTorch 官方教程与中文入门、Transformer 论文逐行实现、开源大模型微调与部署实战、南瓜书公式推导、算法岗面经,正好对应路线 B 的每一步。

怎么选?一张表看清

路线 A · 应用向 ⭐路线 B · 研发向
核心目标会用:跑通分析、读懂方法会造:复现模型、读懂公式
时间周期3–5 个月12–18 个月
数学要求够用包(约 10 个概念)系统学完三件套
编程要求会跑、会改现成脚本会写、会调、会工程化
适合人群在读研究生、语言学者、计算人文爱好者计划转方向 / 读博 / 算法岗
两条路线不是单选题。最常见且最划算的走法是:先走应用向做出第一个成果,再按需回头补理论——有了正反馈,理论也更容易学进去。
模块 02 · 地基

数学基础

按 线性代数 → 概率论 → 高等数学 的优先级组织:线代决定你能不能看懂词向量和相似度,概率决定你能不能读懂语言模型和统计检验,高数只需要两个概念帮你理解"训练"在干嘛。

必学 推荐 了解即可 可跳过

① 线性代数 优先级 ★★★

在 NLP 的世界里,一切皆向量:文档、词、句子都会变成一串数字,而线性代数就是研究"一串数字怎么算"的学问。

向量是什么

必学

一串按顺序排好的数字,比如 [2, 1, 0, 3]。

NLP 里用在哪
一篇文档的"词频清单"就是一个向量;计算机靠比较向量来比较文本。
学到什么程度
理解"向量 = 数字列表"、会算长度即可。行列式、线性方程组可跳过。

点积与向量夹角

必学

对应位置相乘再求和,一个数字衡量两个向量"方向有多一致"。

NLP 里用在哪
所有相似度计算的第一块积木。
学到什么程度
会按公式手算一个 4 维点积即可。几何证明可跳过。

余弦相似度

必学 · 核心

cos θ = A · B|A| × |B|

两个向量夹角的余弦:1 表示方向完全相同,0 表示无关。

NLP 里用在哪
文本相似度、语义检索、文档聚类的标配。你必须能向导师讲清楚它。
学到什么程度
会用 + 能解释"为什么用余弦而不是直接比距离"(只看方向不看长短,长短文章可公平比较)。推导过程可跳过。

矩阵与矩阵乘法

必学

把向量排成表格就是矩阵;乘法规则是"行点列"。

NLP 里用在哪
词袋矩阵、词向量表、Transformer 的注意力,本质上全是矩阵乘法。
学到什么程度
知道维度规则(m×n 乘 n×k)、见过一次 2×2 手算即可。逆矩阵、秩可暂缓。

转置与单位矩阵

了解即可

转置 = 沿对角线翻面;单位矩阵 = 乘法里的"1"。

NLP 里用在哪
代码里到处是 A.T 和 I,认识符号、读到不慌即可。
学到什么程度
五分钟看完就走。

SVD 奇异值分解

推荐 · 推导可跳

把任何大矩阵拆成三个矩阵,保留最重要的几个"方向",其余丢掉。

NLP 里用在哪
潜在语义分析(LSA)用它把"词-文档"矩阵压缩成主题;是一切降维方法的思想源头。
学到什么程度
知道它是"压缩矩阵、提取主题"的工具即可。如何求解完全可跳过。

特征值与对角化

可跳过

找到矩阵变换中"方向不变"的那些特殊向量。

学到什么程度
应用向暂时完全用不到;走研发向时再回来学,毫无心理负担。

② 概率论与统计 优先级 ★★

语言天生是随机的——下一个词是什么,永远带点运气。概率论就是描述这种不确定性的语言。

概率与条件概率

必学

P(下一个词是"猫" | 前文是"我养了一只…")——语言模型的全部秘密就写在条件概率里。

NLP 里用在哪
从老式的 n-gram 到 GPT,都在做同一件事:估计条件概率。
学到什么程度
理解 P(A|B) 的含义和乘法公式。测度论可跳过(请放心跳过)。

朴素贝叶斯

推荐

"朴素"地假设词与词互不影响,然后反推文本属于哪个类别。

NLP 里用在哪
垃圾邮件过滤、情感分类的经典基线,几行代码就能跑。
学到什么程度
能用自己的话讲清思路即可,公式推导可跳过。

假设检验与 p 值

推荐 · 科研刚需

p 值 = 假如两组真的没差别,出现现在这么极端数据的概率;p < 0.05 就拒绝"没差别"的假设。

NLP / 语言学里用在哪
比较两位作家、两个时代的用词差异是否显著——语料库论文的审稿人一定会问。
学到什么程度
理解逻辑链(原假设 → 统计量 → p 值 → 结论),不背公式表。各检验的推导可跳过。

卡方检验

推荐

数一数"预期 vs 实际"差多少,判断两组频数差异是否显著。

NLP / 语言学里用在哪
语料库语言学最常用的显著性检验,搭配 2×2 列联表使用。
学到什么程度
会用软件算出结果并正确解读即可。手工计算过程可跳过。

常见分布:二项、正态、Zipf

了解即可

词频分布有个著名规律:Zipf 定律——少数词出现极多,大量词只出现一两次。

学到什么程度
知道 Zipf 定律这个趣闻,能解释"为什么高频词都是功能词",足够了。

大数定律与中心极限定理

可跳过

样本够大,平均数会稳定下来,且近似服从正态分布。

学到什么程度
知道名字和上面这句话就够了,证明请直接跳过。

③ 高等数学 优先级 ★

好消息:对应用向来说,高数只需要两个词——导数和梯度。它们帮你理解"训练模型"到底在干嘛,而不是用来做题。

导数 = 变化率

必学概念

函数在某一点"变化有多快",图像上就是斜率。

NLP 里用在哪
"训练"就是不断问:把参数挪一点点,错误是变多还是变少?——这就是在用导数。
学到什么程度
建立直觉即可,不求会算。求导法则可跳过。

梯度 = 最陡上坡方向

必学概念

把很多参数的导数打包成一个向量,它指向"变差最快的方向";反着走,就叫"梯度下降"。

NLP 里用在哪
你听说过的所有"训练大模型",核心循环就是这一句话。
学到什么程度
能解释"为什么梯度下降要反方向走"即可。偏导数计算可跳过。

链式法则

了解即可

复合函数逐层求导;"反向传播"就是它在大网络里的机械化应用。

学到什么程度
记住"逐层求导"四个字,读科普文章就够用了。

积分

可跳过
学到什么程度
应用向完全不需要。

泰勒展开、极限证明、多元微积分

可跳过
学到什么程度
应用向不需要;研发向第 1–2 个月回头系统补。
✂️ 现在就可以放心跳过的清单:行列式与线性方程组、逆矩阵、特征值对角化、测度论、各种分布的推导、积分、泰勒展开、多元微积分、极限的 ε-δ 定义。等真的用到再回来查,一点都不晚——先动手做出来,再回头补原理,是文科生学技术最快的路。
模块 03 · 工具

Python 编程

目标不是"会写程序",而是会跑程序、会改程序。每一节都配了能直接粘贴运行的代码。达标线只有三条:能运行 ✓ 能改参数 ✓ 能看懂报错的前三行 ✓

第 0 步 · 环境搭建

必学
方案一 · Google Colab(推荐)

打开浏览器就能写 Python,免费、免安装、自带 AI 补全。适合不想折腾环境的人。
colab.research.google.com ↗

方案二 · 本地安装

安装 Anaconda(一路下一步),打开自带的 Jupyter Notebook。适合想离线工作、处理本地文件的人。

你的第一行代码
print("你好,NLP!")

基础语法 · 够用五件套

必学

变量、列表、字典、循环、函数——90% 的文本处理脚本只用到这五样。

basics.py
name = "杜甫"                    # 字符串
years = [712, 770]               # 列表:一串东西
poet = {"name": "李白", "朝代": "唐"}  # 字典:标签 → 内容

for y in years:                  # 循环:逐个处理
    print(y)

def greet(who):                  # 函数:打包复用
    return f"你好,{who}!"

print(greet(name))

练法:先原样跑通 → 改成一个数字看变化 → 换成你自己的名字和书目。

字符串处理 · NLP 最常用

必学

文本分析的"刀工":切、拼、去空格、替换、切片。

strings.py
line = "  春眠不觉晓,处处闻啼鸟。  "
line = line.strip()            # 去掉首尾空格
print(len(line))               # 字符数
print(line.split(","))        # 按逗号切成列表
print(line.replace("春", "秋"))  # 替换
print(line[0:5])               # 切片:取前 5 个字符

文件与 CSV 读写

必学

你的语料就是文件。学会读进来、写出去,研究才能开始。

read_csv.py
import csv

# 读取语料表格(假设有 "作者" "篇名" 两列)
with open("corpus.csv", encoding="utf-8") as f:
    for row in csv.DictReader(f):
        print(row["作者"], row["篇名"])

# 把结果写出去
with open("result.csv", "w", encoding="utf-8", newline="") as f:
    writer = csv.writer(f)
    writer.writerow(["篇名", "字数"])
    writer.writerow(["静夜思", 20])

切记:读中文文件永远带上 encoding="utf-8",否则 Windows 上必乱码。

numpy · 向量运算

推荐

把"一串数字"交给 numpy,相似度十行搞定——这就是数学板块里余弦相似度的落地。

cosine.py
import numpy as np

def cosine(a, b):
    return a @ b / (np.linalg.norm(a) * np.linalg.norm(b))

doc1 = np.array([2, 1, 0, 3])   # 文档 1 的词频向量
doc2 = np.array([1, 1, 1, 2])   # 文档 2 的词频向量
print(cosine(doc1, doc2))       # 0.909 —— 相当相似

pandas · 语料表格管理

推荐

把语料元数据(作者、年代、体裁……)当成 Excel 来筛、来数。

pandas_demo.py
import pandas as pd

df = pd.read_csv("corpus.csv")        # 读入表格
print(df.head())                       # 看前 5 行
print(df["年代"].value_counts())       # 按年代统计篇数
tang = df[df["年代"] == "唐"]          # 筛选:只要唐代的
tang.to_csv("tang.csv", index=False)   # 存出子集

spaCy 与 stanza · 文本工具入门

推荐

现成的工业级工具:分词、词性标注、词形还原、命名实体识别,一行加载。

spacy_demo.py · 英文
# 终端执行: pip install spacy
# 终端执行: python -m spacy download en_core_web_sm
import spacy

nlp = spacy.load("en_core_web_sm")
doc = nlp("Chomsky argued that language is innate.")

for token in doc:
    print(token.text, token.pos_, token.lemma_)   # 词 / 词性 / 原形

for ent in doc.ents:
    print(ent.text, ent.label_)   # 实体识别: Chomsky PERSON
stanza_demo.py · 中文
# 终端执行: pip install stanza
import stanza
stanza.download("zh")   # 首次运行会下载中文模型,耐心等

nlp = stanza.Pipeline("zh", processors="tokenize,pos,lemma")
doc = nlp("语言是人类独有的能力。")
for sentence in doc.sentences:
    for word in sentence.words:
        print(word.text, word.pos, word.lemma)
🐍 程序员的"够用"哲学: ① 复制示例跑通;② 改一个数字,观察变化;③ 改一句话,换成自己的数据;④ 报错了就把信息丢给搜索引擎或 AI。 做到这四步,你就已经超过大多数同行了。另外,请把 ChatGPT / Claude 当成 24 小时助教:把报错和代码贴给它,加一句"请解释给文科生听"。
模块 04 · 观念

NLP 概念

不推导、不实现,只求你真的明白每个概念在说什么。读完这一页,你可以自信地听懂一场 NLP 讲座,也听得懂工程师同事在说什么。

词袋 Bag of Words

约 5 分钟

打个比方:把一篇文章拆成一堆词,全部倒进一个袋子,只数每个词出现了几次,完全不管顺序。

例子
「我喜欢语言学」→ {我: 1, 喜欢: 1, 语言学: 1}
为什么重要
这是把文字变成数字的第一步——计算机不识字,只认数字。
局限
「我爱你」和「你爱我」在词袋里一模一样,语序信息全丢了。

TF-IDF

约 10 分钟

打个比方:一个词重要不重要,看两点——它在这篇文章里出现得多不多(TF),以及它是不是"烂大街"的词(IDF)。「的」到处都有,不值钱;「语料库」只在少数文章出现,很值钱。

用途
关键词提取、文本相似度、搜索引擎的祖师爷。
一句话总结
TF-IDF = 出现得多 × 别处少见的词,才是这篇文章的真面目。

词向量 Word Embedding

约 15 分钟

打个比方:给每个词一个"语义坐标",意思相近的词在地图上住得近。「国王」和「女王」是邻居,「国王」和「午饭」相距十万八千里。

著名的魔法
king − man + woman ≈ queen:语义关系变成了坐标运算。
代表方法
Word2Vec、GloVe;今天大模型的底层仍保留着这个思想。

Token

约 10 分钟

打个比方:大模型读书时不是按"词"也不是按"字",而是按 token——一种介于字和词之间的碎片。「人工智能」可能被切成「人工」+「智能」两块。

冷知识
为什么早期大模型数不对 "strawberry" 里有几个 r?因为它看到的不是字母,而是 token。(新一代模型已基本修复,但原理仍值得知道。)
实用
API 按 token 计费;"上下文长度"说的也是 token 数。1 个汉字约对应 0.6–2 个 token,不同分词器差异不小。

Transformer 与注意力

约 20 分钟

打个比方:读到「它」这个字时,注意力机制让模型回头看全句,自己判断「它」指的是前面的哪个词,并给相关的词分配更高的"关注度"。

划时代之处
老方法(RNN)一个字一个字顺着读;Transformer 让所有词同时互相看(并行计算),又快又能抓住长距离关系。GPT、BERT 里的 T 都指它。
需要数学吗
不需要。你只需记住一个词:注意力(Attention)。

上下文窗口 Context Window

约 5 分钟

打个比方:模型的"工作记忆"。它一次只能看见窗口里的内容——从几万到上百万 token 不等,2026 年的旗舰模型已能一次读进一整部长篇。

后果一
文章太长,开头的部分会被"挤出去",模型就忘了。
后果二
于是有了 RAG(下文有专卡):先检索出最相关的几段,再塞进窗口让模型读。别被术语吓到——本质是"先划重点,再答题"。

预训练与微调

约 10 分钟

打个比方:预训练 = 让模型读完整个图书馆,学会"接话";微调 = 给这个博学的人做岗前培训,适应你的具体任务。

与你相关
你平时写提示词(prompt)调教 ChatGPT,是一种零成本的"轻量调教",很多时候不必真的微调。

⚠️ 幻觉 Hallucination

科研必读

大模型会一本正经地编造不存在的文献、页码和数据——因为它的本职是"接最像的话",不是"查证事实"。

科研守则
AI 给的每一条参考文献,都必须亲手核实原文;关键论证,不让 AI 代劳。审稿人迟早会找上门。

LLM 时代的新概念 2023 年之后发生了什么

这批词你在新闻和论文里天天见到。它们不替换上面的基础,而是把基础"放大"——理解了它们,ChatGPT 们的宣传语就不再是黑话。

RAG 检索增强生成

约 5 分钟

打个比方:开卷考试。模型不再硬靠记忆答题,而是先去资料库里翻出最相关的几段,抄在草稿纸上,再照着草稿作答。

为什么需要
模型知识有截止日期,长资料又塞不进上下文窗口——"先检索、再生成",两步都省。
哪里见到
企业知识库问答、文献综述助手,本质都是 RAG。评价它要看两处:检索得准不准(找对段落了吗)+生成得忠实吗(有没有脱离草稿自由发挥)。

提示工程 Prompt Engineering

约 10 分钟

打个比方:给一个聪明但不了解你课题的实习生布置任务——说清背景、给一两个范例、明确输出格式,产出立刻不一样。

常用招式
角色设定、少样本示例(先给范例)、思维链("一步一步想")、结构化输出("只输出 JSON 表格")。
与你相关
让大模型帮你标注语料时,提示词就是你写的"标注规范"——规范写得越清楚,标注越稳定。

后训练与 RLHF

约 10 分钟

打个比方:预训练出来的模型像读遍图书馆但不会聊天的书呆子;后训练教它"好好说话"——先看人类示范(SFT),再按人类偏好奖惩(RLHF)。

为什么重要
ChatGPT 与早期 GPT 的差距主要不在"知道更多",而在后训练。论文里的"对齐(Alignment)"说的就是这件事。
两个缩写
SFT = 监督微调(学人类示范);RLHF = 基于人类反馈的强化学习(按偏好打分调整)。

推理模型与测试时计算

约 5 分钟

打个比方:普通模型读完题抢答;推理模型(o 系列、DeepSeek-R1 这类)先在草稿纸上写满推理过程再交卷——"多想几步"是用算力换正确率。

术语对照
论文里的 test-time compute、thinking budget、CoT,说的都是这件事。
适用边界
数学、代码、多步逻辑提升明显;日常问答、翻译未必更好,还更贵更慢——选模型时别迷信"会思考"。

Agent 与工具调用

约 10 分钟

打个比方:普通对话是"你问我答";Agent 是你给一个目标,它自己拆步骤、调工具(搜索、代码、计算器)、看结果、再修正——像一个会自己用电脑的助理。

关键词
Function calling(模型输出"我要调哪个工具")、MCP(2025 年起工具接入的通用协议)、多步规划。
研究者用法
让 Agent 跑"批量标注 → 汇总 → 抽查"的流水线,你只验收结果——但每一步都要留人工抽查点。

多模态 Multimodal

约 5 分钟

打个比方:以前的模型是"文字进、文字出";多模态模型看得懂图、听得懂声音——把文字、图像、音频都翻译成同一种"通用语"(向量)再一起理解。

与你相关
扫描古籍的文字识别(OCR)、图表转数据、手稿转写,都已有可用的多模态模型。
提醒
图像里的文字识别常出错(小语种尤甚),关键数据必须人工复核——幻觉守则同样适用。

评测素养 · 科研刚需 你的新主场

会用 AI 之后,更重要的问题是:它做得到底好不好?这一组概念决定你能不能科学地回答——也是文科背景在 AI 时代最有竞争力的技能。

Benchmark 与榜单

评测 · 必学

打个比方:给模型办统考——一套固定题目(MMLU 考知识、GSM8K 考数学……),答完算分、排成榜单。LMArena 则换了种考法:让真人盲测两个模型的回答,投票选出更好的。

为什么重要
选模型、写论文都要引用分数;但同一模型换个考法,排名可能大变。
批判性一句
榜单分数是"在那套题上的分数",不是"对你的任务也好"的保证——这正是后面几张卡片要解决的问题。

LLM-as-a-Judge

评测 · 必学

打个比方:开放性任务(翻译得好不好?摘要全不全?)没有标准答案,人工评分又贵又慢——于是让一个强模型当"阅卷老师",替人给其他模型的输出打分。

好处
便宜、快、可重复,已是论文里的标配做法。
坑
会偏爱自己的输出、偏爱更长的答案、偏爱排在后面的选项。正式使用前,先抽查"阅卷老师"和人工打分是否一致——方法见项目五。

数据污染与基准饱和

评测 · 推荐

打个比方:考卷泄露。基准题可能就混在训练数据里,模型"背过答案"——分数再高也说不清是真会还是背会。另一个问题是"考崩了":模型太强,老卷子接近满分,失去区分度。

怎么识别
分数好得反常、模型能一字不差背出题目,都要怀疑污染。
新趋势
私有测试集、动态换题、人工盲测竞技场,都是为了反污染、反刷题。

人工评测与标注一致性

评测 · 科研刚需

让两个人独立给同一批输出打分,结果却大相径庭?学界用 Cohen's κ 系数回答"你们的打分是一致的,还是纯属巧合":κ =(实际一致率 − 碰巧一致率)÷(1 − 碰巧一致率)。

科研守则
论文里的人工标注都要报告标注者人数与一致性系数;这是审稿人检查标注质量的通行证。
动手
去项目五亲手算一次 κ——你会永远记住它。

机器翻译质量评估

评测 · 翻译方向

怎么给译文打分?经典做法是和人工参考译文"对答案":BLEU 算词组重叠率、chrF 按字符算——重叠越高分越高;新一代 COMET 用神经网络学"人类怎么打分",和译员直觉更接近。

术语
自动指标(BLEU/chrF/COMET)便宜但不完美——改个同义词分数就掉;MQM 是人工标注规范:按准确度、流畅度逐条扣分。
为什么值得学
MT 评测是"评测方法论"最成熟的入口。学会它,评测任何 LLM 输出都是同一套思路。
模块 05 · 实战

实操项目

五个实验都可以直接在浏览器里运行:改掉文本框里的语料,点按钮,看结果。每个项目都附了对应的 Python 脚本,等你装好环境就能在本地跑同样的东西。

项目一 · 文本相似度计算

难度 ★☆☆约 30 分钟

用到的概念:词袋 · TF-IDF、余弦相似度

原理白话版:把每篇文档变成"词袋向量"(中文按单字切分,不用分词也能用),再用 TF-IDF 给字加权,最后算两两之间的余弦相似度。数值越接近 1,两篇文本"话题"越像。

🧪 在线实验室 · 改掉下面的文本再点按钮
similarity.py · Python 版(sklearn)
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.metrics.pairwise import cosine_similarity

docs = [
    "春天的西湖游人如织,苏堤春晓桃红柳绿,断桥边杨柳依依。",
    "夜晚的西湖别有韵味,湖面倒映着灯火,断桥与雷峰塔遥遥相望。",
    "梯度下降是训练神经网络最常用的优化算法,沿着损失下降的方向更新参数。",
    "反向传播利用链式法则逐层计算梯度,神经网络通过不断更新参数来降低损失。",
    "杭帮菜讲究清淡鲜嫩,西湖醋鱼与龙井虾仁是最有名的两道菜。",
]

# 中文没有空格分词,改用"字符级"分析器(按单字切分,短文本效果最好)
vec = TfidfVectorizer(analyzer="char")
matrix = vec.fit_transform(docs)
sim = cosine_similarity(matrix)

for i in range(len(docs)):
    for j in range(i + 1, len(docs)):
        print(f"文档{i+1} vs 文档{j+1}: {sim[i][j]:.3f}")
# pip install scikit-learn 后即可运行
延伸挑战:① 把默认文档换成你论文的三段摘要,看它们像不像;② 增加第 6 篇文档;③ 想一想:为什么"杭帮菜"那篇和西湖那两篇也有一点像?(提示:共享了「西湖」二字)

项目二 · Burrows-Delta 文体计量

难度 ★★☆约 45 分钟

用到的概念:向量 · z 分数、词频分布、计算文体学

原理白话版:每位作者都有自己的"高频字指纹"——有人爱用「之乎者也」,有人离不开「真的超特别」。把各文本最常用字的出现比例转成 z 分数,再算待判定文本与每位作者平均风格的平均差距(Delta)。Delta 越小,文风越像。这就是计量文体学判定《伟大的小说 X》作者归属的经典方法。

🧪 在线实验室 · 三位虚构作者 + 一段待判定文本
burrows_delta.py · Python 版(纯标准库)
import statistics
from collections import Counter

def chars(text):                      # 只留汉字,丢掉标点
    return [c for c in text if "\u4e00" <= c <= "\u9fff"]

corpus = {                            # 每位作者至少 2 段样本
    "作者A": ["……样本1……", "……样本2……"],
    "作者B": ["……样本1……", "……样本2……"],
}
unknown = "……待判定文本……"
top_n = 30                            # 取最高频的前 30 个字

# 1. 每个文本统计"字频比例"
freqs = {}
for samples in corpus.values():
    for t in samples:
        cs = chars(t); n = len(cs) or 1
        freqs[t] = Counter({c: v / n for c, v in Counter(cs).items()})
cs = chars(unknown); n = len(cs) or 1
freqs["待判定"] = Counter({c: v / n for c, v in Counter(cs).items()})

# 2. 取全语料最高频的 top_n 个字
total = Counter()
for c in freqs.values():
    total.update(c)
top = [w for w, _ in total.most_common(top_n)]

# 3. 对每个字做 z 分数(跨文本标准化)
z = {}
for t, f in freqs.items():
    vals = [f[w] for w in top]
    mean = statistics.mean(vals)
    sd = statistics.pstdev(vals) or 1e-9
    z[t] = {w: (v - mean) / sd for w, v in zip(top, vals)}

# 4. 每位作者取样本平均 z 分数,算 Delta 距离
for author, samples in corpus.items():
    profile = {w: statistics.mean(z[t][w] for t in samples) for w in top}
    delta = statistics.mean(abs(z["待判定"][w] - profile[w]) for w in top)
    print(f"{author}: Delta = {delta:.3f}")

# Delta 越小,待判定文本与该作者的文风越接近。
延伸挑战:① 把你研究对象的文本分两组粘进来,判定一段待测文字;② 把高频字数从 30 改成 60(改脚本里的 top_n),结果更稳还是更噪?③ 注意:每个作者至少要 2–3 段各 300 字以上的文本,样本太短结果不可信——示例语料只是为了演示机制。

项目三 · 语料处理实验台

难度 ★☆☆约 30 分钟

用到的概念:Token、类符 / 形符比(TTR)、Zipf 定律

原理白话版:这是语料库语言学最基础的一套操作——把文本切成 token,然后统计:总共多少字、多少类符(不同的词)、类符/形符比(词汇丰富度)、平均句长、最高频的词是哪些。把它们粘进论文的"语料描述"部分,就是最标准的做法。

🧪 在线实验室 · 粘贴你自己的语料
corpus_stats.py · Python 版(jieba 真分词)
import re
import jieba
from collections import Counter

with open("corpus.txt", encoding="utf-8") as f:
    text = f.read()

# jieba 是最常用的中文分词库: pip install jieba
words = [w for w in jieba.lcut(text) if re.search(r"[\u4e00-\u9fff]", w)]
counter = Counter(words)

print("总字数(含标点):", len(text))
print("总词数:", len(words))
print("类符数:", len(counter))
print("TTR 类符/形符比:", round(len(counter) / len(words), 3))
print("\n前 20 个高频词:")
for w, n in counter.most_common(20):
    print(f"{w}\t{n}")
延伸挑战:① 粘贴你自己最长的一篇语料(几千字),看看高频词表;② 切换"字符 / 二元组"两种模式,对比 TTR 变化;③ 高频词从第 2 名往后逐名递减得很快吗?——恭喜,你亲眼见到了 Zipf 定律;④ 长文本请用下方 Python 脚本,网速和浏览器内存都更友好。

项目四 · 下一词预测器(bigram 语言模型)

难度 ★★☆约 30 分钟

用到的概念:条件概率、Token、语言模型

原理白话版:语言模型的全部秘密就一句话:数一数语料里每个字后面最常跟哪些字,把"上文"变成"下一个字的概率榜"。这就是最古老的语言模型 bigram(二元模型)——GPT 的原理与它一脉相承,只是把"看前 1 个字"换成了"看前几千个字"。

🧪 在线实验室 · 改掉训练语料,看模型学会什么
lm_bigram.py · Python 版(纯标准库)
# 字符级 bigram 语言模型:语言模型的一切,从"数一数"开始
# 纯标准库,pip install 什么都不需要
from collections import Counter, defaultdict
import random

with open("corpus.txt", encoding="utf-8") as f:
    text = f.read()
chars = [c for c in text if "\u4e00" <= c <= "\u9fff" or c == "。"]

# 1. 训练:数"上一个字 → 下一个字"的出现次数
model = defaultdict(Counter)
for a, b in zip(chars, chars[1:]):
    model[a][b] += 1

# 2. 预测:给定一个字,输出它后面最常跟的字(P(下字|上字))
prev = "语"
counts = model[prev]
total = sum(counts.values())
print(f"「{prev}」后面最可能跟:")
for ch, n in counts.most_common(5):
    print(f"  {ch}   P = {n / total:.2f}")

# 3. 续写:按概率随机采样,一路走 20 个字
out = [prev]
for _ in range(20):
    chs, ns = zip(*model[out[-1]].items()) if model[out[-1]] else (["。"], [1])
    out.append(random.choices(chs, ns)[0])
print("模型续写:", "".join(out))
延伸挑战:① 把开头从「语」换成「机」「思」,预测结果变了吗?② 续写几次——模型是不是在原地打转?这就是只有一步记忆的局限:GPT 靠"看前几千个 token"和随机采样打破死循环;③ 把语料换成你自己的(几百字起),看"模型"会不会染上你的用词习惯。

项目五 · 标注一致性实验台(Cohen's κ)

难度 ★★☆约 30 分钟

用到的概念:人工评测与标注一致性、LLM-as-a-Judge、假设检验

原理白话版:找两位评分者(你和同学,或你和一个大模型)独立给同一批机器翻译打分。两人打分当然不会完全一样——问题是:这点重合是"英雄所见略同",还是"瞎蒙也能蒙出来的巧合"?Cohen's κ 把"碰巧一致"从总分里扣掉:κ =(实际一致率 − 碰巧一致率)÷(1 − 碰巧一致率)。κ 越接近 1,标注越可信。

🧪 在线实验室 · 两位评分者给 10 条译文打分(差 / 中 / 良 / 优)
cohens_kappa.py · Python 版(纯标准库)
# Cohen's kappa:两位评分者的一致程度(校正"碰巧一致")
# 打分制随意,这里用 0差 / 1中 / 2良 / 3优;纯标准库
from collections import Counter

rater_a = [3, 2, 3, 1, 0, 2, 3, 1, 2, 3]   # 评分者A(比如你)
rater_b = [3, 1, 2, 1, 0, 2, 3, 0, 2, 2]   # 评分者B(比如同学或 LLM)

n = len(rater_a)
po = sum(a == b for a, b in zip(rater_a, rater_b)) / n          # 实际一致率
ca, cb = Counter(rater_a), Counter(rater_b)
cats = set(rater_a) | set(rater_b)
pe = sum(ca[c] * cb[c] for c in cats) / n ** 2                  # 碰巧一致率
kappa = (po - pe) / (1 - pe) if pe < 1 else 1.0

print(f"实际一致率 po = {po:.2f}")
print(f"碰巧一致率 pe = {pe:.2f}")
print(f"Cohen's kappa = {kappa:.2f}   (0.41–0.60 中等,0.61–0.80 强)")
延伸挑战:① 把评分者 B 改成故意唱反调,κ 会变成多少?② 两人都只打「优」,κ 会直接显示「不可计算」——碰巧一致率 pe = 1,公式变成 0/0,此时只能报告原始一致率;③ 把评分者 B 换成一个 LLM 的打分:这正是校验 LLM-as-a-Judge 是否可信的标准做法;④ 正式研究请再看一眼 MQM 标注规范。
模块 06 · 素材库

资源知识库

系统梳理 GitHub 上的优质开源学习资源:43 个精选项目按技术方向分为九类,每条都含简介、推荐理由与实时可查的仓库链接。全部条目均经 GitHub API 逐一核验(星标 / 最近推送),优先收录持续维护、面向国际社区的项目。

点击卡片右上角链接直达仓库 ↗
🧭 怎么用这个知识库? 应用向读者按 路线图 顺序看「Python 与数据处理」和「中文 NLP 专项」即可起步;想进阶再去「大模型与前沿应用」;「LLM 评测」对应概念页的评测素养专题,配项目五食用;「算法工程师进阶」是走研发向时的完整弹药库(PyTorch → Transformer → 微调部署 → 面试);「计算人文 · 文体计量」是你写论文时的武器库。星标数为 2026-09-26 核验值,仅供判断体量与热度,入选标准始终是「对你的研究有用」。
模块 07 · 雷达

前沿动态

这个模块帮你回答两个问题:「最近有什么值得学的新东西?」和「整个领域正在往哪走?」——近期动态经 GitHub API 核验,活跃度看板实时刷新,趋势观察按季度复核。

🔧 维护者更新指南(本模块已高度自动化)
  1. 全自动(每日):GitHub Actions 每天北京时间 10:17 运行 scripts/update-data.mjs——核验全部仓库的星标与最近推送、重新生成「近期动态」、自动提交并触发本站重新部署;
  2. 实时看板:页面加载时经 GitHub API 实时刷新(12 小时缓存),与每日核验互为双保险;
  3. 趋势观察(每季度):唯一的人工项——复核 trends 条目表述是否过时;
  4. 补充新资源:在 assets/data/knowledge.js 对应分类添加条目(附仓库全名),下一次自动核验会把它一并纳入动态与看板,星标从此自动保鲜。
模块 08 · 补给

书单与资源清单

为语言学研究者定制的极简清单。原则:每一项都问一句"真的用得上吗?"——用不上的,再经典也不推荐。跟完应用向路线,你只需要下面这些。

📐 数学(视频优先,看完就跑)

3Blue1Brown《线性代数的本质》视频免费

用动画讲透"矩阵是空间的变换",看完你对向量和矩阵的直觉超过很多工科生。B 站搜索 ↗

3Blue1Brown《微积分的本质》视频免费

只为看懂"导数 = 变化率"一集也值得;配合本站数学板块的高数部分食用。

可汗学院 · 统计与概率课程免费

假设检验、p 值、卡方检验讲得最耐心,有中文版,配练习题。前往 ↗

《女士品茶》 David Salsburg科普书

统计学是怎么改变科学的——当故事读,读完你对 p 值不再恐惧。适合睡前。

Seeing Theory · 看见统计交互可视化免费

布朗大学把概率、分布、贝叶斯、假设检验做成可拖动的动画。应用向当零食,研发向当预习。前往 ↗

《Mathematics for Machine Learning》 Deisenroth 等教材免费官方 PDF

机器学习需要的数学一本讲齐(线代、解析几何、概率、优化),官网提供免费全文。决定走研发向、要系统补数学时,从这里开始。前往 ↗

🐍 Python(一本主书 + 两个环境)

《Python 编程:从入门到实践》 Eric Matthes入门书

对零基础最友好的入门书,前半本就够用;不必做完所有习题,够用即走。

廖雪峰 Python 教程免费在线

当字典查:忘了语法就来搜一下,五分钟解决。前往 ↗

Google Colab工具免费

免安装的练手环境,本站 Python 板块所有代码都能直接粘贴运行。前往 ↗

💬 NLP(一门圣经课 + 一个图解站)

《Speech and Language Processing》 Jurafsky & Martin教材免费在线

NLP 领域圣经,第 3 版草稿官网免费、持续更新(2026 年 8 月版已把第一卷整体重组为"大模型"体系:导论、Token、n-gram、Transformer 与预训练、后训练)。先读 Volume I,读得懂"方法部分"就算胜利。前往 ↗

Stanford CS224N公开课免费

NLP 最著名的公开课,走研发向必刷;应用向可以只看前几讲建立全局观。前往 ↗

The Illustrated Transformer · Jay Alammar图解免费

全世界最好懂的 Transformer 图解,配合本站概念板块第 5 节。前往 ↗

Hugging Face LLM Course课程免费

跟上大模型时代的免费课程,讲怎么"用"预训练模型,应用向友好。前往 ↗

NLTK Book免费在线

最经典的"给语言学家的 NLP 书",每一章都从语言问题出发。前往 ↗

🔬 计算人文与语言学(你的主场)

The Programming Historian教程集免费

人文学者写给人文同行的编程课,每篇都是一个小型研究项目,英文但平易近人。前往 ↗

《Macroanalysis》 Matthew Jockers专著

"宏观分析"的奠基之作:把几百部小说当数据集来研究文学史。Burrows-Delta 的思想源头之一。

spaCy 官方课程 / stanza 文档工具免费

英文文本用 spaCy,中文文本用 stanza,两份官方教程就是你最好的老师。spaCy ↗ · stanza ↗

🤖 压轴资源 · AI 助教 遇到看不懂的报错、读不下去的论文段落,直接问 ChatGPT / Claude,并附一句"请解释给文科背景的读者听"。这是当代自学者最大的外挂——但记得按 NLP 概念板块的"幻觉守则"核查它说的话,评测它的输出质量,正是你在评测素养专题学到的第一课。
实验笔记 · 案例拆解

拆解 REA:agent 是怎么获得「逆向」能力的

一篇来自评测视角的实验笔记。对象是 morluto/rea——一个 44 万星、2026 年最热的 agent 项目。它回答了一个比「MCP 是什么」重要得多的问题:模型不会的事情,是怎么被接出来的?

笔记日期 2026-11-08 阅读约 6 分钟 关联:评测素养 · MCP · Agent

先说结论

REA(Reverse Engineer Anything)让 Claude Code、Codex、Cursor 这类 agent 能够「逆向任何东西」——从 App 的某项功能,一路拆到原生二进制。但它的 441k 星没有一行是在训练模型:agent 的「逆向能力」不是练出来的,是接出来的。拆完它的仓库,能力来自三层叠加,每一层都值得单独看。

第一层:一个精心设计的「工具目录」

REA 的本体是一个 MCP 服务器,注册了 40+ 个以 inspect_ 开头的工具——从 PE 导入表、ELF 笔记、二进制加固标记(PIE/NX/RELRO),到 WASM 反汇编、EVM 字节码、GGUF 模型文件头、Unity IL2CPP 元数据、SQLite 快照、HAR 网络抓包……覆盖「你能想逆向的一切」。

工具设计的两个细节很值得抄:① 命名极其规整(inspect_apk_signature、inspect_wasm_artifact),agent 不需要额外解释就能对号入座;② 输入 schema 默认「紧凑档」——只保留最小字段,需要完整校验说明时再切 full。原因写在它们的 contracts 文档里:省 context。一个 40 工具的目录如果每个都挂全套 JSON Schema,还没干活就把上下文吃光了。

第二层:REA 自己不「会」逆向——它调度专业引擎

反编译怎么做?REA 的答案是:不自己做。原生二进制交给 Hopper / Ghidra / IDA / Kuna(用户已装的引擎,REA 通过桥接驱动它们,必要时可代装 Hopper);安卓交给 JADX / JEB / Apktool;固件交给 Binwalk / Unblob;网络包交给 tshark;甚至离线分析还可以调用你自备的 objdump、Rizin、pwntools。很多格式检查则内置实现(模型文件头、PE 证书、ELF 笔记这类「读结构」的活不需要外部引擎)。

这一层揭示的分工是:专业引擎负责「深」,agent 负责「广 + 编排」。引擎把二进制变成结构化事实(伪代码、符号、调用图),REA 把事实连同出处打包成 agent 能用的结果,agent 再决定下一步问什么。工具链的每一个环节都只做一件事。

第三层:写进 agent 脑子里的「工作流指令」

npx rea-agents setup 做两件事:注册 MCP 服务器,并把配套的工作流指令(skill)写进 agent——仓库的 .agents/skills/ 里就放着 reverse-engineer-anything 等五个技能文件,还有 Claude Code / Codex 插件清单。这一步才是「能力涌现」的点睛之笔:同一个工具集,配上「先看哪、怎么取证、何时换引擎、怎么汇报」的指令,效果完全不同。

评测视角最值得学的一点:每个结论都自带证据链

README 里反复强调:分析结果附带证据与局限(evidence and limitations),且全部本地运行。对照我们在评测素养专题学过的框架——这就是把「可验证性」做进了产品:agent 说「这个功能是 X 实现的」,你可以追问证据、自己去复核,甚至知道哪些结论是引擎能力边界之外的猜测。让模型的结论可被检验,比让结论更流畅重要得多。

给你的三个 takeaway

  1. 判断一个 agent 产品的真实能力,先看它的工具目录和工作流指令——而不是看模型叫什么名字。目录设计(命名、schema 档位、context 预算)直接决定上限。
  2. 「编排专业工具」胜过「自己重造」。REA 44 万星的核心不是代码量,而是把五十年逆向工程生态接成了 agent 可用的形态——你的研究流程里也一定有类似的「专业工具」值得这样接。
  3. 证据链是评测的接口。想评测一个 agent 系统?先看它是否强制输出 evidence / limitations——REA 在这点上是行业样板。
🔗 动手环节 ① 浏览 morluto/rea 的 README「What you can analyze」表格,数一数有多少个 inspect_ 工具、多少个「内置 / caller-supplied 引擎」;② 读 mcp-contracts.md 的 compact schema 一节,想想 context 预算怎么省;③ 对照本站资源库里的「MCP Servers 合集」,写出 REA 与通用 MCP 的三点不同——发到你的研究笔记里。