跳到主要内容

NLP 基础:从词袋到词向量

这一章讲三件事: 计算机处理文字的第一步——把字变成数;两条变数路线(数次数 vs 学上下文); 以及中文为什么需要专门一节。 从本章起进入文字与语音篇:语言处理的思路与影像不同,起点却同样是「变成向量」。

1. 起点:计算机不「懂」字,只能先变数

书里的开场很冷静:人类语言高度模糊,计算机现阶段无法真正理解文字,所以现在的做法与影像一致——先把文字转换成向量,再对向量分析或建模1。这一章就是「文字怎么变成好向量」的历史:先数次数(词袋),再学上下文(词向量)。

背景一笔:图灵 1950 年就提出图灵测试;Siri、小冰这类产品才算真正启动了 NLP 热潮2

2. 词袋与 TF-IDF:数次数的艺术

词袋(Bag of Words):把文章拆成词、统计每个词出现的次数,用高频词猜全文大意。流程四步3:

  1. 分词(把文章切成一个个词);

  2. 前置处理:词形还原、转小写;

  3. 去停用词(Stop Word):be 动词、代名词、介词这类「到处都有」的词不剔除,统计结果就全是它们;

  4. 按次数排序,由高到低。

书里的实测一次就灵:一篇讲韩国便利店文化的新闻,词频前三名 stores 15 次、convenience 14 次、korean 6 次——不用读原文,三个词已经交代了主题,与标题吻合4

词袋的死穴:有些词不是停用词、到处出现、却对主题毫无帮助——only、most 这类词会在词频榜上捣乱。TF-IDF 的药方:哪个词「在所有文档里都出现」,就给它降权——词频(tf)高不算数,还得「只在少数文档出现」(idf 高)才算特征5

TF-IDF 还能做问答配对:把问题和候选答案都变成向量,算相似度,最近的那个就是答案。这条路下一章还会走得更远。

3. 前置处理:慢工出细活的分词与还原

前置处理听着像杂活,实际上每一步都在决定下游的天花板:

  • 分词:英文靠空格,中文要专门算法(见第 5 节);

  • 词形还原两条路:Stemming(按字根硬砍)快而不准——keeps 去掉 s、crashing 去掉 ing 都对,但 his 砍掉 s 就成了 hi;Lemmatization(查字典规则)慢而准,his、daily 都不会错6;

  • 停用词:NLTK 内置英文停用词表(收录的全部词汇),标点也算;

  • 词性(名词/动词这类语法角色)标注(POS):给每个词标上名词/动词/形容词等,书里列了 35 个英文标签。

工具格局:NLTK 老牌但不支持中文;spaCy 支持 64 种以上语言,还能接 BERT 预训练模型7

4. 词向量:用上下文定义词义

词袋数的是「出现几次」,词向量(Word2Vec)换了一个深刻得多的定义:一个词的意思,是它周围的词。Mikolov 等人 2013 年提出,用 1000 亿个字训练;与 TF-IDF 的稀疏(绝大多数位置是 0)向量不同。

词嵌入是稠密(每个位置都是有效的小数)的——每个词是一小串实数,意思相近的词这串数也相近8。第 03 章神经网络里那个 Embedding 层,学的就是这个东西。

两种训练方式,方向相反9:

  • CBOW:拿上下文猜中间的词;
  • Skip-gram:拿中间的词猜上下文——一个词可以对多个上下文,因此能处理一字多义;CBOW 遇到 Apple(水果?公司?)会取平均,导致失准10

负样本抽样(Negative Sub-sampling) 解决一个算力死结:按朴素设计,输出是 1000 亿个词的概率分布,模型扛不住。改造:不再问「下一个词是什么」,改问「这两个词是不是上下文」——P(juice|orange) 变成 P(1|<orange,juice>),1000 亿类的多分类瞬间缩成二分类(真/假)11。这是「把不可能的问题改写成可能的问题」的经典案例。

预训练模型的实测效果,书里挑了最有名的那个:查「woman、king」的相似词,排除「man」——结果正是 king − man + woman = queen:词向量空间(每个词是空间里的一个点)里,「性别」和「王室」是两个可以加减的方向12

类比推理(拿已知关系推未知词)第一次变成了算术。

边界同样重要:通用模型在特殊领域会打折。辛普森动画的对话数据集里,Bart 和 Nelson 的相似度只有 0.5——通用模型觉得「都是小孩名字该很像」,但剧迷知道他们是「朋友但不亲近」13。另外单字比对之外还有句子比对(Doc2Vec):书里用星巴克 FAQ 实测「mobile pay」能找到对的问题,但其他语句效果一般——作者预告:换 BERT 会好很多(第 12 章兑现)14。想肉眼看词向量空间,TensorFlow 的 Embedding Projector 提供 3D 投影——第 05 章 TensorBoard 里那个「词嵌入展示」的独立版15

5. GloVe:全局数一数,还是局部看一窗

GloVe 与 Word2Vec 的分歧只有一个:看多大范围。 Word2Vec 只看移动窗口内的共现,GloVe(斯坦福,2014)认为这丢掉了全文信息,于是先建词汇共现矩阵——统计全语料(用于训练的全文集合)里每对词「一起出现」的概率,再从矩阵学出向量16。书里给的模型规模可以感受一下:最大的一版 8400 亿词、300 维、文件 2.03GB;文件格式极简,每行一个词、后面跟 300 个数,读进来转字典就能查17。实测:找 king 的近邻,出来 queen、monarch、prince、kingdom——两大门派殊途同归18

6. 中文:分词是一道独立的坎

中文没有空格,「深度学习」是一个词还是「深度+学习」两个?jieba 库给三种分法:全模式(所有可能的词组都切出来)、精确模式(默认,只切最可能的)、搜索引擎模式(用隐马尔可夫链)19。最实用的一个功能是加词:「三天三夜」默认被切成「三天三」+「夜」,add_word 加入词典后就对了——各行各业的术语都能这样灌进去20。spaCy 也支持中文(还能选 jieba/pkuseg 引擎),但繁体分词会把「大学」切成两个词,书里的建议很朴素:先转简体分词,再转回繁体21

7. 可带走的

  1. 计算机不「懂」文字,只是先变数;词袋数次数就能猜文意(stores/convenience/korean 三个词撑起一篇新闻的主题);
  2. TF-IDF=词频×稀有效应:「在所有文档都出现」的词降权,only/most 不再捣乱;
  3. 前置处理决定下游天花板:Stemming 快而糙(his→hi),Lemmatization 慢而准;停用词不剔,词频榜全是虚词;
  4. 词向量的定义:一个词的意思=它的上下文;稠密向量让「意思」变成「距离」;
  5. Skip-gram 优于 CBOW 的一点:一字多义(Apple 水果/公司);
  6. 负样本抽样:把 1000 亿类的「猜下一词」改写成「这两词是不是上下文」的二分类——问题改写比算力堆砌更值钱;
  7. king−man+woman=queen:语义关系变成向量运算;但通用模型在特殊领域打折(辛普森 0.5);
  8. GloVe 与 Word2Vec 只差窗口大小:共现矩阵全局统计 vs 移动窗口局部学习;
  9. 中文先过分词关:jieba 三种模式;术语用 add_word 灌词典;繁体先转简体再分。

8. 原文地图

主题原书章原文位置
先变数再分析、图灵测试第11章 自然语言处理的介绍text/90-ch11.txt:7(搜「图灵测试」) · text/91-ch11-11-1-tf-idf.txt:5(搜「高度模糊性」)
词袋四步、去停用词11-1 词袋与TF-IDFtext/91-ch11-11-1-tf-idf.txt:7(搜「词袋(Bag of Words」) · text/91-ch11-11-1-tf-idf.txt:17(搜「去除停用词」)
词频实测 stores 1511-1 词袋与TF-IDFtext/91-ch11-11-1-tf-idf.txt:37(搜「stores:15次」)
TF-IDF 降权11-1 词袋与TF-IDFtext/91-ch11-11-1-tf-idf.txt:45(搜「TF-IDF对它的评分就相对较低」)
Stemming 的 his 反例11-2 词汇前置处理text/92-ch11-11-2.txt:39(搜「his直接删去s」)
Word2Vec 定义、稠密11-3 词向量text/93-ch11-11-3.txt:7(搜「稠密」)
CBOW/Skip-gram、负样本抽样11-3 词向量text/93-ch11-11-3.txt:41(搜「Negative Sub-sampling」) · text/93-ch11-11-3.txt:41(搜「1000亿个单字的概率」)
CBOW 一字多义缺陷11-3 词向量text/93-ch11-11-3.txt:51(搜「无法处理一字多义」)
king−man+woman=queen11-3 词向量text/93-ch11-11-3.txt:193(搜「king - man + woman = queen」)
辛普森 0.5、Doc2Vec11-3 词向量text/93-ch11-11-3.txt:203(搜「辛普生」) · text/93-ch11-11-3.txt:215(搜「mobile pay」) · text/93-ch11-11-3.txt:207(搜「Doc2Vec」)
Embedding Projector11-3 词向量text/93-ch11-11-3.txt:217(搜「Embedding Projector」)
GloVe 共现矩阵11-4 GloVe模型text/94-ch11-11-4-glove.txt:7(搜「移动窗口」)
jieba 三模式、加词11-5 中文处理text/95-ch11-11-5.txt:31(搜「隐马尔夫链」) · text/95-ch11-11-5.txt:47(搜「三天三夜」)
spaCy 繁体坑11-6 spaCy库text/96-ch11-11-6-spacy.txt:75(搜「大学被切割成两个词」)

Footnotes

  1. 出处:「11-1 词袋与TF-IDF」第 5 段(text/91-ch11-11-1-tf-idf.txt:5,搜「高度模糊性」)。

  2. 出处:「第11章 自然语言处理的介绍」第 7 段(text/90-ch11.txt:7,搜「图灵测试」)。

  3. 出处:「11-1 词袋与TF-IDF」第 7 段(text/91-ch11-11-1-tf-idf.txt:7,搜「词袋(Bag of Words」)与第 17 段(text/91-ch11-11-1-tf-idf.txt:17,搜「去除停用词」)。

  4. 出处:「11-1 词袋与TF-IDF」第 37 段(text/91-ch11-11-1-tf-idf.txt:37,搜「stores:15次」)。convenience 14 次、korean 6 次在同段前后;与标题契合的结论在第 41 段(搜「与标题契合」)。

  5. 出处:「11-1 词袋与TF-IDF」第 45 段(text/91-ch11-11-1-tf-idf.txt:45,搜「TF-IDF对它的评分就相对较低」)。

  6. 出处:「11-2 词汇前置处理」第 35 段(text/92-ch11-11-2.txt:35,搜「速度快,但不一定正确」)与第 39 段(text/92-ch11-11-2.txt:39,搜「his直接删去s」)。

  7. 出处:「11-2 词汇前置处理」第 5 段(text/92-ch11-11-2.txt:5,搜「不支持中文处理」)与「11-6 spaCy库」第 5 段(text/96-ch11-11-6-spacy.txt:5,搜「64种语言」)。

  8. 出处:「11-3 词向量」第 7 段(text/93-ch11-11-3.txt:7,搜「稠密」)。

  9. 出处:「11-3 词向量」第 11 段(text/93-ch11-11-3.txt:11,搜「连续CBOW」)。

  10. 出处:「11-3 词向量」第 51 段(text/93-ch11-11-3.txt:51,搜「无法处理一字多义」)。

  11. 出处:「11-3 词向量」第 41 段(text/93-ch11-11-3.txt:41,搜「Negative Sub-sampling」)。

  12. 出处:「11-3 词向量」第 193 段(text/93-ch11-11-3.txt:193,搜「king - man + woman = queen」)。

  13. 出处:「11-3 词向量」第 203 段(text/93-ch11-11-3.txt:203,搜「辛普生」)。

  14. 出处:「11-3 词向量」第 207 段(text/93-ch11-11-3.txt:207,搜「Doc2Vec」)与第 215 段(text/93-ch11-11-3.txt:215,搜「mobile pay」)。

  15. 出处:「11-3 词向量」第 217 段(text/93-ch11-11-3.txt:217,搜「Embedding Projector」)。

  16. 出处:「11-4 GloVe模型」第 7 段(text/94-ch11-11-4-glove.txt:7,搜「移动窗口」)。

  17. 出处:「11-4 GloVe模型」第 13 段(text/94-ch11-11-4-glove.txt:13,搜「840B.300d」)与第 19 段(text/94-ch11-11-4-glove.txt:19,搜「转为字典」)。

  18. 出处:「11-4 GloVe模型」第 35 段(text/94-ch11-11-4-glove.txt:35,搜「queen」)。

  19. 出处:「11-5 中文处理」第 27 段(text/95-ch11-11-5.txt:27,搜「全模式」)与第 31 段(text/95-ch11-11-5.txt:31,搜「隐马尔夫链」)。

  20. 出处:「11-5 中文处理」第 47 段(text/95-ch11-11-5.txt:47,搜「三天三夜」)。

  21. 出处:「11-6 spaCy库」第 75 段(text/96-ch11-11-6-spacy.txt:75,搜「大学被切割成两个词」)。