01
NLP 是什么:把人话变成机器能算的东西
自然语言处理(NLP)研究怎么让机器处理人类语言——听懂、读懂、生成。它从规则时代一路走到统计时代再到深度学习时代,而今天所有大模型(ChatGPT、Kimi 这些对话产品)本质上就是一个超大规模的语言模型。所以理解 NLP 的基本概念,等于理解了大模型的每一块积木从哪来。
按技术手段看,这门学科走过三个时代:规则时代(词表 + 正则 + 语法树,人力堆出来的精确但脆弱)、统计时代(n-gram、HMM、CRF,从数据里学概率)、神经网络时代(词向量、RNN、Transformer,直到今天的大模型)。每个时代的工具都还在服役:正则依然在清洗文本,jieba 依然在分词,大模型则把后面的所有环节一肩挑。
不管任务怎么变,数据流万变不离其宗:原始文本 → 切成单元(token)→ 变成数字(表示)→ 模型处理 → 输出标签或新文本。差别只在于每一环用什么技术。下面的任务地图是这门学科的「目录页」:
- 分词 / 分句
- 把字符串切成词或子词(token),一切的第一步
- 词性标注
- 标出名词 / 动词 / 形容词,后续规则的抓手
- 命名实体识别 NER
- 找出人名、地名、机构名、时间
- 情感分析
- 判断好评还是差评、正面还是负面
- 文本分类
- 垃圾邮件识别、新闻归类、意图识别
- 机器翻译
- 跨语言生成,seq2seq 架构的诞生地
- 自动摘要
- 长文变短文:抽取式摘句 / 生成式重写
- 问答与对话
- 阅读理解、检索问答、客服机器人
本页代码环境:Python 3.12、jieba 0.42.1、scikit-learn 1.9;文中代码输出均为实际运行结果。
这一页的用法建议:
- 按顺序读:第 04 节「表示方法的四级台阶」是全页主轴,前面都是它的铺垫。
- 边读边跑:所有代码在 jieba + scikit-learn 环境即可复现,逐行对照输出。
- 速查表当词典:忘了指标、库名、术语,回这里搜。
- 第 06 节两条路都要跑:跑完你就知道「手搓流水线」与「预训练模型」各自意味着什么。
02
环境准备:三步装齐经典 NLP 工具箱
推荐用虚拟环境。经典路线(jieba + scikit-learn)轻到几十 MB,深度学习路线(transformers)需要 torch 作底座、首次运行还要下载模型。
python3 -m venv .venv source .venv/bin/activate # Windows 是 .venv\Scripts\activate # 分词 + 传统机器学习,本页第 03、06 节只需要这两个 pip install jieba scikit-learn python -c "import jieba, sklearn; print('ok')"
# torch 是运行底座,CPU 版即可起步 pip install torch transformers # 第一次调用 pipeline 时会自动下载所选模型(数百 MB)
pip install spacy
# 中文小模型单独下载:分词、词性、NER 一条龙
python -m spacy download zh_core_web_sm
验证装好的标志:终端里 python -c "import jieba, sklearn; print('ok')" 能打印 ok;transformers 路线则是 python -c "import transformers; print(transformers.__version__)" 能出版本号。
03
快速上手:五分钟用 jieba 切好第一段中文
import jieba import jieba.posseg as pseg # 精确模式:默认,最常用 print(jieba.lcut("自然语言处理让机器读懂人话")) # ['自然语言', '处理', '让', '机器', '读懂', '人', '话'] # 搜索引擎模式:长词再切细,提高召回 print(jieba.lcut_for_search("小明硕士毕业于中国科学院计算所")) # ['小明', '硕士', '毕业', '于', '中国', '科学', '学院', # '科学院', '中国科学院', '计算', '计算所'] # 领域词保护:先 add_word,再切 jieba.add_word("计算所") print(jieba.lcut("他在中国科学院计算所实习")) # ['他', '在', '中国科学院', '计算所', '实习'] # 词性标注:n 名词 / v 动词 / a 形容词 / r 代词 print([(w.word, w.flag) for w in pseg.lcut("这个手机性能不错")][:4]) # [('这个', 'r'), ('手机', 'n'), ('性能', 'n'), ('不错', 'a')]
s = "小明硕士毕业于中国科学院计算所" jieba.lcut(s) # 精确模式:默认,句子级分析用这个 jieba.lcut(s, cut_all=True) # 全模式:穷举所有成词可能,宁可错切不漏切 jieba.lcut_for_search(s) # 搜索模式:长词再切细,检索召回用
-
01
精确模式起步
jieba.lcut返回列表(jieba.cut返回生成器),一次切完,句子级别够用。 -
02
长文本换搜索引擎模式
搜索引擎模式把「中国科学院」这种长词再切出「科学院」「计算所」,检索场景召回率更高。
-
03
专有名词先喂词典
单次用
jieba.add_word,成批用jieba.load_userdict("user_dict.txt")(一行一个词)。领域文本这一步几乎必做。 -
04
词性标注做过滤
pseg给每个词带词性标签——只保留名词和动词当关键词、找形容词判断情感,都靠它。
顺手做个词频统计
分词最常见的下游用途——数词。配合 Python 自带的 collections.Counter,三行就是一个词频工具:
from collections import Counter words = jieba.lcut("自然语言处理让机器读懂人话,自然语言处理很难") print(Counter(words).most_common(3)) # [('自然语言', 2), ('处理', 2), ('让', 1)]
再抽一下关键词
jieba 自带基于 TF-IDF 思想的关键词抽取,从一段话里挑最有信息量的几个词——第 04 节讲完原理,这里先看看它能多省事:
import jieba.analyse tags = jieba.analyse.extract_tags( "自然语言处理是人工智能的核心问题,机器学习与深度学习推动了它", topK=5, ) print(tags) # ['学习', '自然语言', '人工智能', '深度', '机器']
04
从字符串到语义:表示方法的四级台阶
预处理:分词、停用词与词干化
中英文第一处分水岭就在分词:英文天然有空格,按空格切就有七八成正确率,剩下的是 don't、New York 这类边界情况;中文没有任何分隔符,同一串字可以有多种切法,必须靠词典 + 统计模型。第二处分水岭是词干化 / 词形还原:英文有形态变化(running → run、better → good),切完要归一;中文没有形态变化,这步通常省掉。停用词(的、了、a、the)几乎不带信息量,做文本分类前通常过滤掉。
英文侧用 NLTK 时注意:首次使用要先 nltk.download("punkt") 下载数据,新版本可能提示还需要 punkt_tab,照提示补装即可。
stops = {"的", "了", ",", "、"}
words = jieba.lcut("这个手机性能不错的,体验很流畅了")
print([w for w in words if w not in stops])
# ['这个', '手机', '性能', '不错', '体验', '很', '流畅']
from nltk.stem import PorterStemmer # 英文侧:词干化
print(PorterStemmer().stem("running")) # run
spaCy 是另一条预处理路线:zh_core_web_sm 模型把分词、词性、命名实体识别装进同一条流水线,nlp(text) 一次返回全部结果,适合做成服务长期跑。jieba 胜在轻量好嵌入,spaCy 胜在工程化,两者不冲突——很多项目的组合是正则粗洗 + jieba 细切 + 重活交给模型。
表示:one-hot → TF-IDF → 词向量 → 上下文相关
one-hot:每个词一根「独热」向量,维度等于词表大小,任意两个词都互相垂直——「猫」和「狗」的相似度是 0,语义完全丢失。TF-IDF 给出文档级表示:TF(这个词在本文档出现得多不多)× IDF(这个词在全体文档里稀不稀罕),越「本文专属、全局稀有」的词权重越高。它常配朴素贝叶斯、逻辑回归做分类,几十年不过时。词向量(word2vec,Mikolov 等,2013)把词映射成稠密低维向量,语义相近的词距离就近,经典类比 king − man + woman ≈ queen;用 gensim 可以训练或加载现成词向量。但它一词一向量——「苹果手机」和「吃苹果」里的「苹果」没法区分。
上下文相关表示由预训练模型给出:同一个词在不同句子里向量不同,多义词的歧义就此解决。今天任何大模型的第一层,都是把 token 查表映射成这样的稠密向量——这四级台阶不是进化史上的化石,而是层层叠加着用。
from sklearn.feature_extraction.text import TfidfVectorizer vec = TfidfVectorizer() X = vec.fit_transform(["I love NLP", "NLP is fun and love is great"]) print(sorted(vec.vocabulary_)) # 6 个词各占一列 print(X.shape) # (2, 6):2 篇文档 × 6 维
one-hot 的缺陷一行代码就能看到:任意两个词的内积都是 0,「猫」和「狗」跟「猫」和「汽车」一样不像——语义完全丢失,这就是要学向量表示的理由:
import numpy as np cat, dog, car = np.eye(3)[0], np.eye(3)[1], np.eye(3)[2] # 三根独热向量 print(cat @ dog, cat @ car) # 0.0 0.0:猫和狗、猫和汽车,一样「不像」
词向量用 gensim 就能训一个玩具版(真实词向量要大语料,通常直接加载现成的):
from gensim.models import Word2Vec sents = [["我", "爱", "自然语言", "处理"], ["词", "向量", "很", "有用"], ["自然语言", "处理", "很", "有趣"]] model = Word2Vec(sents, vector_size=16, min_count=1, epochs=10, seed=1) print(len(model.wv)) # 9:词表共 9 个词 print(model.wv["自然语言"].shape) # (16,):每个词变成 16 维向量
语言模型演化:n-gram → RNN → Transformer → 预训练 + 大模型
语言模型回答一个的问题:「给定前文,下一个词的概率分布是什么」。n-gram(上世纪八九十年代)用马尔可夫假设只看前 n−1 个词,简单高效,但词组合爆炸、见过的才认识,泛化差。RNN / LSTM(2010 年代前期)按顺序逐词读入、用一个隐状态记住上文,LSTM 的门控机制缓解了长距离依赖,但依然是串行计算,难以并行、难以上规模。
n-gram 的意思很直白:bigram 只看前 1 个词,trigram 看前 2 个——「今天 天气」之后接「不错」的概率,直接从语料里数出来。数不出来的组合概率为零,这就是它泛化差的原因,也是「让神经网络学语言」要解决的第一件事。
把 RNN 的困境说透:第 100 个词想「看到」第 1 个词,信息要在隐状态里传递 99 步,一路上被不断改写——距离一长就忘。n-gram 是「看不远」,RNN 是「看得远但记不住还跑不快」,三个毛病各占其半。
2017 年《Attention Is All You Need》提出 Transformer,换了打法:自注意力让序列中任意两个 token 直接互相打分、按分数加权取信息(打分用的就是 AI 数学页讲的点积),位置编码补回「谁在谁前面」的顺序信息,多头机制让模型同时关注几种不同关系——而且整个计算天然并行,这才打开了「把模型做大」的大门。随后 BERT(2018,双向掩码预训练,擅长理解)与 GPT 系列(逐词预测预训练,擅长生成)把自注意力推成绝对主流。
- 自注意力
- 每个 token 对所有 token 打点积打分、按分加权取信息——任意距离一步直达
- 多头
- 多组注意力并行,各自关注不同关系(语法、指代、语义……)
- 位置编码
- 注意力本身不感知顺序,必须显式注入 token 的位置信息
- 前馈层 + 残差
- 注意力之后逐位置做非线性变换;残差连接让上百层的网络训得动
2018–2020 年的主流范式是预训练 + 微调:先在无标注的海量文本上学会「语言本身」,再用少量标注数据微调到具体任务。2020 年后模型规模继续上台阶,出现了提示(prompt)与上下文学习:不再微调参数,把任务写进提示词就能用。今天的大模型,就是这条演化线的最新一环——但它读文本的每个环节,依然能对应到本节的四级台阶。
「提示」之所以可行,是因为预训练把任务逼成了「续写」:把「评论:…… 情感:」拼给模型,它自然往「好评 / 差评」上续。few-shot、思维链这些技巧,本质都是「怎么把任务写成一道好的续写题」——底层数据流,仍是本节开头那条「切 token → 查向量 → 模型处理」。
中文特有问题:歧义切分与未登录词
中文分词有两大经典难题。歧义切分:同一串字存在多种「合法」切法,例子已经写进教科书——「南京市长江大桥」,正确读法是 南京市 / 长江大桥,但也能读成 南京 / 市长 / 江大桥。jieba 的全模式会把各种切法都列出来给你看。未登录词(OOV):新词、人名、产品名不在词典里,比如「计算所」常被切碎。对策组合拳:自定义词典兜底、统计模型(HMM)猜新词;大模型则用子词切分(BPE)把词拆成更小的稳定单元,从机制上大幅缓解了 OOV。
print(jieba.lcut("南京市长江大桥")) # ['南京市', '长江大桥'] print(jieba.lcut("南京市长江大桥", cut_all=True)) # 全模式:歧义全列出 # ['南京', '南京市', '京市', '市长', '长江', '长江大桥', '大桥']
自定义词典的文件格式一行一个词,词频和词性可省略:
# 词 词频(可省) 词性(可省)
计算所 3 nz
哔哩哔哩 2 nz
词典之外,jieba 还有最后一道保险:基于 HMM(隐马尔可夫模型)猜新词——对没见过的组合按字的出现规律「估」一个切法。经典演示是人名、机构名这类组合:
print(jieba.lcut("他来到了网易杭研大厦")) # ['他', '来到', '了', '网易', '杭研', '大厦']:杭研这类新词也认出来了
还有一条工程经验:分词粒度会一路影响下游。切太细丢语义(「计算」「所」),切太粗泛化差(新组合认不出);文本分类常取「词」粒度,检索场景偏爱「字 / 子词」粒度。没有绝对正确的粒度,只有匹配下游任务的粒度。
05
速查表:任务、模型、库与术语
这一节当词典用。忘了某任务用什么指标、某个库怎么装、Transformer 术语什么意思,直接搜——中英文关键词都支持。四张表分别覆盖:做什么(任务)、用什么(模型与库)、什么意思(术语)。
| 任务 | 常用指标 |
|---|---|
| 分词 | 词级 Precision / Recall / F1(SIGHAN 评测) |
| 词性标注 | 词级准确率 |
| 命名实体识别 | 实体级 F1:边界和类型都对才算对 |
| 文本分类 / 情感分析 | Accuracy;类别不均衡时看 Macro-F1 |
| 机器翻译 | BLEU:与参考译文的 n-gram 重合度 |
| 自动摘要 | ROUGE:n-gram / 最长公共子序列重合 |
| 抽取式问答 | EM(完全匹配)+ F1 |
| 语言模型 | 困惑度 PPL:越低说明模型对文本越「不意外」 |
| 词向量 | 词类比 / 相似度评测集 |
| 开放对话生成 | 人工评测为主,自动指标只作参考 |
| 信息检索 / 排序 | MRR、NDCG:正确的文档排得越靠前分越高 |
| 文本蕴含 | 准确率:前提能否推出假设(三分类) |
| 模型 / 方法 | 一句话定位 |
|---|---|
| n-gram 语言模型 | 马尔可夫假设只看前 n−1 个词,简单但泛化差 |
| HMM 隐马尔可夫 | 分词 / 词性的经典统计模型(jieba 猜新词用它) |
| CRF 条件随机场 | 序列标注利器,常接在特征或表示之上 |
| word2vec(2013) | CBOW / Skip-gram 两种训练方式,词向量开山之作 |
| GloVe(2014) | 全局共现统计 + 词向量,与 word2vec 互补 |
| LSTM / GRU | 门控 RNN,缓解长距离依赖,串行计算 |
| seq2seq + attention | 编码器-解码器,机器翻译的经典架构 |
| Transformer(2017) | 《Attention Is All You Need》:自注意力 + 并行 |
| BERT(2018) | 双向掩码预训练,理解类任务王者 |
| GPT 系列 | 逐词预测预训练,生成式,大模型路线 |
| ELMo(2018) | 上下文相关词向量的先驱:一词多向量 |
| T5 / BART | 把任务统一成「文本进、文本出」的编码-解码模型 |
| 库(pip 安装名) | 定位 |
|---|---|
| jieba | pip install jieba;中文分词事实标准,轻量无依赖 |
| nltk | pip install nltk;英文教学与研究的经典工具箱 |
| spacy | pip install spacy;工业级流水线,中文模型另装(zh_core_web_sm) |
| scikit-learn | pip install scikit-learn;TF-IDF、朴素贝叶斯、逻辑回归 |
| gensim | pip install gensim;训练 / 加载 word2vec 词向量 |
| transformers | pip install transformers;预训练模型统一接口(pipeline 一行调用) |
| torch | transformers 的运行底座,CPU 版即可入门 |
| datasets | pip install datasets;Hugging Face 数据集加载与预处理 |
| hanlp | pip install hanlp;中文 NLP 工业级套件(复旦邱锡鹏团队) |
| pkuseg | pip install pkuseg;北大中文分词,支持领域模型 |
| snownlp | pip install snownlp;简易中文情感分析,适合原型验证 |
| sentencepiece | pip install sentencepiece;BPE/子词切分,大模型 tokenizer 的常用底座 |
| fasttext | pip install fasttext;快速文本分类 + 词向量,CPU 上极快 |
| 术语 | 含义 |
|---|---|
| token | 文本切分后的最小单元:词、子词或字 |
| embedding | token → 向量的映射表,模型的第一层 |
| self-attention | 自注意力:每个 token 对所有 token 打分、按分加权取信息 |
| multi-head | 多头:多组注意力并行,各自关注不同的关系 |
| 位置编码 | 给注意力补上「谁在谁前面」的顺序信息 |
| encoder / decoder | 理解侧与生成侧两半;GPT 类只用 decoder |
| mask 掩码 | 解码时遮住「未来」token;padding 位置也要遮蔽 |
| [CLS] | BERT 里代表整句的特殊 token,句向量从它取 |
| 预训练 | 海量无标注文本上学语言规律,与具体任务无关 |
| 微调 fine-tune | 用标注数据把预训练模型调到具体任务 |
| BPE 子词切分 | 高频词整存、低频词拆开,缓解未登录词 |
| PPL 困惑度 | 语言模型好坏的经典指标,越低越好 |
| MLM / CLM | 两类预训练目标:掩码语言模型(BERT)与因果语言模型(GPT) |
| few-shot | 把少量示例写进提示词,靠上下文学习完成任务 |
| KV cache | 推理时缓存注意力的键值,生成逐词加速的关键手段 |
没有匹配的条目。换个词试试,比如「分词」「F1」「注意力」。
06
实战:中文情感分类,经典与预训练两条路
同一个任务走两条路:先用 jieba + TF-IDF + 朴素贝叶斯亲手搭一条经典流水线,再用 transformers 一行调用预训练模型对照——两条路的差距,就是「机器学习」与「预训练」的差距。全部代码真实可跑,输出为实际运行结果。
第 1 步:8 条语料,把问题定死
标签 1 = 好评、0 = 差评。真实任务需要成百上千条标注,这里 8 条只为跑通流程——别拿它评估真实效果。
import jieba from sklearn.feature_extraction.text import TfidfVectorizer from sklearn.naive_bayes import MultinomialNB from sklearn.pipeline import make_pipeline # 8 条带标签语料:1=好评,0=差评 texts = [ "界面漂亮,操作流畅,体验很好", "性能强悍,电池耐用,值得购买", "拍照清晰,系统稳定,非常满意", "性价比高,推荐给朋友了", "用了一周就卡顿,质量太差", "电池不耐用,售后态度也差", "屏幕发黄,做工粗糙,后悔了", "价格贵还不好用,非常失望", ] labels = [1, 1, 1, 1, 0, 0, 0, 0] # 一条流水线:jieba 分词 → TF-IDF 加权 → 朴素贝叶斯 model = make_pipeline( TfidfVectorizer(tokenizer=jieba.lcut, token_pattern=None), MultinomialNB(), ) model.fit(texts, labels) # 试几条没见过的句子 tests = ["手感不错,系统流畅", "用了两天就坏了,太差劲", "包装很好,很喜欢", "卡成幻灯片,后悔"] for t, p in zip(tests, model.predict(tests)): print(t, "=>", "好评" if p == 1 else "差评")
手感不错,系统流畅 => 好评 用了两天就坏了,太差劲 => 差评 包装很好,很喜欢 => 好评 卡成幻灯片,后悔 => 差评
注意:两条测试句里的「手感」「坏」「差劲」大多没在训练语料里出现过——分类靠的是「流畅」「太」「差」这些共享词的统计信号。样本这么少还能对,是因为任务太简单;语料扩到几千条、任务贴近真实,经典流水线的上限立刻显现。
第 2 步:切分训练 / 测试集,正经评估一次
刚才只看了预测结果,评估要按规矩来:留出一部分数据当测试集,指标才算数。
from sklearn.model_selection import train_test_split from sklearn.metrics import accuracy_score Xtr, Xte, ytr, yte = train_test_split( texts, labels, test_size=0.25, stratify=labels, random_state=0) model.fit(Xtr, ytr) # 只用 6 条训练 print([t for t in Xte]) # 留出的两条测试句 print(accuracy_score(yte, model.predict(Xte))) # 0.5:两条件对一条
0.5 不是 bug——8 条语料只留 2 条做测试,单条对错就让指标跳 50%。它的真实含义是:样本太少时,评估本身就是噪音。真实任务几千条起步,这个坑自然消失。
第 3 步:看看模型学到了哪些词
朴素贝叶斯给每个词存了好评 / 差评两套对数概率,作差就知道哪些词最「偏袒」好评:
import numpy as np tfidf = model.named_steps["tfidfvectorizer"] nb = model.named_steps["multinomialnb"] names = tfidf.get_feature_names_out() diff = nb.feature_log_prob_[1] - nb.feature_log_prob_[0] # 好评 − 差评 top = np.argsort(diff)[::-1][:5] print([(names[i], round(float(diff[i]), 2)) for i in top]) # [('性能', 0.34), ('值得', 0.34), ('购买', 0.34), ('强悍', 0.34), ('系统', 0.33)]
tokenizer 参数接受任何可调用对象——想顺带过滤停用词,直接传 lambda s: [w for w in jieba.lcut(s) if w not in stops],把预处理挂进流水线。
模型自己「说」出了判断依据:性能、值得、购买这些词把天平拨向好评。传统机器学习的好处就在这——每个决策都能打开看。
第 4 步:对照——预训练模型一行调用
同一个任务,用 transformers 加载一个在大众点评语料上微调过的中文 RoBERTa。它读过几十万条真实评论,「语言知识」是预训练带来的,不靠这 8 条。
from transformers import pipeline pipe = pipeline( "sentiment-analysis", model="uer/roberta-base-finetuned-dianping-chinese", ) print(pipe("手感不错,系统流畅")) # [{'label': 'LABEL_1', 'score': 0.99…}] # LABEL_1 = 好评,LABEL_0 = 差评;score 以实际运行为准
- 要可控、可解释、部署轻
- 经典路线:TF-IDF + 线性模型,每一步能打开看,模型文件只有几 MB
- 要泛化、语义复杂、标注少
- 预训练路线:pipeline 或微调,模型自带「读过的书」
- 真实项目的常见搭配
- 预处理用经典工具,理解 / 生成用预训练模型——两条线各干各的活
预训练中文分类模型不止一个:上面用的是 UER-py 模型库的大众点评版,同一系列还有在电商、微博等不同语料上微调的版本,按业务场景选。
07
避坑:中文文本最常见的四个坑
坑一:TfidfVectorizer 直接喂中文
sklearn 的向量化器默认按空格切词,中文没空格,整句会被当成一个「词」——特征只剩一列,模型等于瞎的。
from sklearn.feature_extraction.text import TfidfVectorizer vec = TfidfVectorizer() # 默认按空格切 X = vec.fit_transform(["界面漂亮操作流畅"]) print(X.shape) # (1, 1):整句一个词! vec = TfidfVectorizer(tokenizer=jieba.lcut, token_pattern=None)
坑二:专有名词被切碎
「计算所」「团建」这类领域词、新词不在默认词典里。上线前务必用真实业务语料抽查分词结果。
jieba.add_word("计算所") # 运行时加一个词 # 成批加载:先造词典文件(UTF-8),再一行加载 with open("user_dict.txt", "w", encoding="utf-8") as f: f.write("计算所 3 nz\n哔哩哔哩 2 nz\n") jieba.load_userdict("user_dict.txt")
词典文件务必存成 UTF-8 编码——Windows 记事本默认的 GBK 会让 load_userdict 静默加载失败,一词不报错但全部不生效。
坑三:数据没分层就切分
类别不均衡(差评远多于好评)时直接随机切,测试集可能清一色一类,指标虚高或虚低。用 stratify 按类别分层:
from sklearn.model_selection import train_test_split Xtr, Xte, ytr, yte = train_test_split( texts, labels, test_size=0.25, stratify=labels, # 两边的好坏评比例一致 random_state=0, )
random_state 也建议固定:测试集一变,前后指标就不可比。团队协作时,把切分方式和随机种子写进代码评审清单。
坑四:transformers 第一次跑「卡住」
pipeline("sentiment-analysis") 不指定 model 时加载的是英文模型——中文任务必须显式指定中文模型,否则输出无意义。du -sh ~/.cache/huggingface # 缓存目录的体积;在涨就说明还在下载
08
进阶:把 NLP 的地图接回大模型
按「先动手、后体系」排序,前三个是动手文档,后三个是体系教材:
读的顺序建议:先用 jieba / sklearn 的文档把本页跑通的部分吃透,再上 Hugging Face 课程学预训练模型的操作,Jurafsky 教材当词典查理论——三条线并行,别单线硬啃教材。
- jieba GitHub 仓库:README 里有全部功能(关键词提取、自定义词典格式)。
- scikit-learn 文本处理教程:官方教程,本页第 06 节的完整版背景。
- Hugging Face 官方课程:从 pipeline 到微调,配可运行 notebook。
- spaCy 使用文档:工业级流水线的标准用法,中文模型支持分词 / 词性 / NER。
- NLTK Book:《用 Python 进行自然语言处理》免费在线版,体系化入门经典。
- Jurafsky & Martin《Speech and Language Processing》:斯坦福教材(第 3 版草稿免费),从 n-gram 讲到大模型,查细节的权威书。
09
收尾:合上页面前,勾一遍
全勾上,你就具备了读大模型相关文章的词汇量——token、embedding、预训练这些词不再是黑话,而是你亲手用过、跑过的东西。
0 / 5