一篇三万字的文献综述初稿,写了半年,章节改过好几轮。作者想知道它实际讲了几条主线,哪几段写着写着偏了题,两个自以为不同的小节是不是在说同一件事。更麻烦的是,引用的文献各有各的用词,有人写城镇化,有人写城市化,按关键词去数,两个说法会被当成两件事。
潜在语义分析(Latent Semantic Analysis,LSA)专门处理这种情况。它把一段一段的文本和其中的词排成一张大表,用矩阵分解找出藏在用词背后的少数几个语义方向,每个方向叫一个潜在主题。经常和同一批词一起出现的两个词,即使从来没在同一段里碰面,也会在这些方向上落到相近的位置。
在 TATOOLS 的【LSA 潜在语义分析】里【上传文档】,TATOOLS 把材料切成段,用 TF-IDF 建表,再做截断奇异值分解。报告给每个主题列出主题词并拟好名字,标出每段的主导主题,找出主题归属不清的跑偏段落,还检查哪些主题的关键词重叠太多。
这篇教程先讲 LSA 要解决什么问题,再讲文本怎样变成一张片段与词语的矩阵,接着用一个四个词的例子手算一遍奇异值分解,讲清主题词、解释方差和片段坐标各是什么。最后讲跑偏段落和主题重叠的诊断,以及报告的读法和论文里的写法。
01
LSA 要解决什么问题
按关键词检索和计数,有两个老问题。一个是同义,城镇化和城市化说的是同一件事,字面不同就数不到一起;一个是多义,同一个词在不同领域意思不同。Deerwester 等人 1990 年提出 LSA,最初就是为了让文献检索绕开这两个问题。他们的想法是,词义体现在它和哪些词一起出现,这种一起出现的规律藏在整张词语与文档的矩阵里,把矩阵压缩到少数几个维度,规律就显出来了。
Landauer 和 Dumais 1997 年用 LSA 做了一个著名的检验。他们用大量百科文本训练 LSA,再让它做托福考试里的 80 道同义词选择题,LSA 答对 64.4%,和来自非英语国家的考生平均水平 64.5% 几乎一样。LSA 从来没被告诉过哪些词是同义词,它只看了词和词在文本里怎样一起出现。
社会科学里,LSA 常用来看一批文本由哪几个主题构成,比较文本之间语义上的远近,也用来检查一篇长文的结构。TATOOLS 的【LSA 潜在语义分析】侧重后两件事,报告不光给出主题,还逐段标出每段属于哪个主题、归属是否清楚。
02
文本怎样变成一张矩阵
分词和切段
TATOOLS 先去掉标点,再按工具页的分词设置切词。【自定义词典】保证领域术语不被切碎;停用词去掉的、了这类没有实际内容的词;打开词性过滤可以只留选定的词性;【词形合并】把几种写法并成一种再计数,比如把 AI 和人工智慧都并到人工智能。
材料按【文档分段大小】设定的字数一段一段切开,段与段首尾相接、不重叠。分析单位(Unit of Analysis,一次统计针对的对象)是段。段小,能看到一章里前后几段的主题变化;段大,看的是更宏观的主线。上传多个文件时,TATOOLS 对每个文件单独分析,报告按文件依次排列。
TF-IDF 加权
每一段用 TF-IDF(词频–逆文档频率,一个词在这段常见、在别处少见的程度)表示成一行权重,每个词是一列。
tfidf(t, d) = tf(t, d) × idf(t)
idf(t) = ln((1 + n) / (1 + df(t))) + 1
n:段落总数;df(t):含有词 t 的段落数
每一行再缩放到长度为 1
n = 60 时,只出现在 5 段里的词,idf = ln(61 / 6) + 1 ≈ 3.32;出现在 50 段里的词,idf = ln(61 / 51) + 1 ≈ 1.18。【最小文档频率】要求一个词至少出现在这么多段里,【最大文档频率】去掉几乎每段都有的词,【最大特征数】给保留的词数设上限。段落太少、门槛显得太严时,TATOOLS 会自动放宽这几个门槛再算。
03
奇异值分解:把矩阵拆成几个方向
定义
把 n 段、m 个词的 TF-IDF 矩阵记作 X。奇异值分解(Singular Value Decomposition,SVD)把它写成三个矩阵的乘积。
X = U × Σ × Vᵀ
Σ:对角线上是奇异值 σ₁ ≥ σ₂ ≥ …,每个对应一个方向
V 的第 k 列:第 k 个方向上每个词的权重
U × Σ 的第 k 列:每一段在第 k 个方向上的坐标
只保留前 k 个最大的奇异值和对应的列,就是截断奇异值分解。Eckart 和 Young 1936 年证明,这样得到的秩为 k 的矩阵,是所有秩为 k 的矩阵里离原矩阵最近的一个,丢掉的误差平方和正好等于被丢掉的奇异值的平方和。LSA 就是对词语矩阵做截断奇异值分解,保留下来的 k 个方向就是 k 个潜在主题。
手算一个例子
为了能手算,这里用词频代替 TF-IDF。三段文字,四个词。
城镇化 城市化 户籍 课堂
段 1 1 0 1 0
段 2 0 1 1 0
段 3 0 0 0 2
段 1 和段 2 讲的是同一件事,只是一个写城镇化、一个写城市化。原始的余弦相似度是 1 / (√2 × √2) = 0.5,两个词本身从没在同一段出现,按列算余弦相似度是 0。
奇异值来自 XᵀX 的特征值。前三个词组成的那一块可以直接验证。
XᵀX 前三行三列 = | 1 0 1 |
| 0 1 1 |
| 1 1 2 |
乘以 (1, 1, 2) 得 (3, 3, 6) = 3 × (1, 1, 2)
特征值 3,奇异值 √3 ≈ 1.73
这一块另外两个特征值是 1 和 0
课堂那一列自成一块,特征值 4,奇异值 2
保留两个主题。主题 1 是课堂,奇异值 2;主题 2 的词权重是 (1, 1, 2) 缩放到长度为 1,城镇化 0.408、城市化 0.408、户籍 0.816。
段 1 在主题 2 上的坐标 = 1×0.408 + 1×0.816 ≈ 1.22
段 2 在主题 2 上的坐标 = 1×0.408 + 1×0.816 ≈ 1.22
段 3 在主题 1 上的坐标 = 2
用两个主题重建段 1 = 1.22 × (0.408, 0.408, 0.816, 0) ≈ (0.5, 0.5, 1, 0)
重建出来的段 1,城市化一栏从 0 变成了 0.5。段 1 从没写过城市化,LSA 从段 2 学到城市化和户籍总是一起出现,推断段 1 也和城市化有关。两段在主题空间里的坐标完全相同,余弦相似度从 0.5 升到 1;城镇化和城市化在两个主题上的权重都是 (0, 0.41),方向一模一样。丢掉的误差是段 1 和段 2 各 0.5² + 0.5² = 0.5,合计 1,正好等于被丢掉的奇异值 1 和 0 的平方和。
TATOOLS 按【保留的主成分数量】做这一步,最多保留 10 个主题。
04
主题词、解释方差和片段坐标
主题词和主题名
V 的每一列是一个主题上所有词的权重,权重可正可负。TATOOLS 按权重从大到小取出每个主题的前 20 个词,【主题详情】和【词语重要性】把它们画出来。再去掉太短的词和主题、分析这类泛泛的词,取前三个拼成主题名,比如【户籍、城镇化、城市化相关主题】。
对没有减去均值的词语矩阵,第一个方向上所有词的权重同号,它常常由整份材料里最常见的一批词撑起,描述的是材料的总体用词。从第二个方向开始,权重有正有负,才开始区分不同的话题。读主题时,第一个主题的名字常常最宽泛,这是方法本身的性质。
解释方差
每个主题说明了多少差异,用解释方差比来看。
解释方差比_k = 各段在主题 k 上坐标的方差 ÷ 原矩阵各列方差之和
接着上面的例子。四列的方差分别是 2/9、2/9、2/9 和 8/9,合计 14/9。三段在主题 1 上的坐标是 (0, 0, 2),方差 8/9;在主题 2 上是 (1.22, 1.22, 0),方差 3/9。
主题 1:(8/9) ÷ (14/9) = 8/14 ≈ 57%
主题 2:(3/9) ÷ (14/9) = 3/14 ≈ 21%
累计 11/14 ≈ 79%
TATOOLS 报告的【累计方差解释率】把各主题的解释方差按编号依次累加成折线,【各主题方差贡献】把每个主题单独画成柱子。累计值偏低,说明材料的用词很分散,几个主题只说明了其中一部分,可以试着多保留几个主题。
片段坐标和主导主题
U × Σ 的每一行是一段在各主题上的坐标。TATOOLS 把每一段的坐标缩放到长度为 1,坐标最大的那个主题就是这一段的主导主题,最大的坐标就是主导权重。
某段在三个主题上:(0.95, 0.20, 0.24)
长度 ≈ 1,主导主题 1,主导权重 0.95
第二高 0.24,两者相差 0.71,归属清楚
【主题分布】和【主题占比】统计每个主题分到了几段,【主题内容分析】按主题分页列出归到这个主题的代表段落和它们的主导权重。【主题相关性摘要】按主题汇总各段坐标的平均水平,【相关性极值】找出在某个主题上坐标最高和最低的段落。
05
跑偏段落和主题重叠
跑偏段落
一段的主导权重偏低,或者和第二高的主题相差很小,它的归属就不清楚。
某段在三个主题上:(0.62, 0.58, 0.53)
主导权重 0.62,第二高 0.58,只差 0.04
这一段同时挨着三个主题,可能在做过渡,可能一段里讲了几件事,也可能离题了。TATOOLS 的【跑偏段落提示】把这类段落列出来,写明原因。主导权重低、差距又小,提示回看它是不是过渡或背景;只是权重偏低,提示检查信息是不是太少;只是差距小,提示它可能同时讨论了几个问题,可以考虑拆成两段。改一篇长文时,从这张表下手最快。
主题重叠诊断
两个主题的关键词重合太多,它们可能是一件事被分成了两半,也可能共用了一批泛泛的词。TATOOLS 用 Jaccard 系数(交集大小除以并集大小)衡量两个主题关键词的重合。
主题 A 关键词:{户籍, 城镇化, 落户, 人口, 流动, 市民化}
主题 B 关键词:{户籍, 城镇化, 人口, 土地, 财政, 融资}
交集 3 个,并集 9 个,Jaccard = 3 / 9 ≈ 0.33
【主题重叠诊断】列出重合较多的主题对和它们共享的关键词。重合很高时,建议减少主题数或把两个主题合并解读;重合中等时,先看共享词是不是泛泛的词,是的话补进停用词重跑。【主题相似度热力图】给出所有主题两两之间的重合度,【主题关系网络图】把相近的主题连起来。
06
散点图和词汇网络
【文档降维散点】把每段在主题空间里的坐标再压到平面上,颜色是主导主题;【词汇降维散点】对词做同样的事,并按词在各主题上的权重把词分组,看词的分组和主题是否对得上。【主题核心词汇】为每个主题取权重最高的一批词,两个词在各主题上的权重方向接近,就连一条线,画成网络,并算出每个词的中心性,处在网络中间的词就是这个主题的核心。【词汇在不同主题中的权重分布】给出每个词在每个主题上的完整权重,方便查任何一个词。
TATOOLS 把这些图放在主题结构的诊断之后,作为查细节的工具。先用主题名、代表段落和跑偏段落把结构看清楚,有疑问再来这里找具体的词。
07
两种算法
截断奇异值分解有两种常用的算法,TATOOLS 的【算法】两种都提供。
| 算法 | 做法 | 适合 | 相关设置 |
|---|---|---|---|
| randomized | 先用随机投影把矩阵压小,再精确分解(Halko 等,2011) | 段落多、词多的大材料 | 迭代次数,越多越准 |
| arpack | 用 Lanczos 迭代直接求最大的几个奇异值 | 中小材料,结果每次一致 | 容忍度,越小越准 |
一般用默认的 randomized 就够了。需要多次运行结果完全一致、材料又不大时,可以换成 arpack。
08
LSA 和相近方法的区别
| 方法 | 怎样分解 | 结果里的数 |
|---|---|---|
| LSA | 对 TF-IDF 矩阵直接做截断奇异值分解 | 可正可负的坐标和权重 |
| 主成分分析 | 先减去均值、标准化,再分解相关矩阵 | 可正可负的得分和载荷 |
| LDA 主题模型 | 概率模型,每段是几个主题按比例混合 | 0 到 1 之间、加起来为 1 的比例 |
LSA 是一次矩阵分解,算得快,擅长把近义词拉到一起。LDA 的主题比例更容易直接解释成每段有百分之几在讲某个主题。两者可以对照着用。
09
分析场景模板和设置
工具页顶部的【分析场景模板】按材料预设了三组参数,选一个就自动填好,下面的设置仍可以微调。
| 模板 | 适合的材料 | 预设的做法 |
|---|---|---|
| 论文综述 | 文献笔记、论文草稿和综述 | 4 个主题,每段 250 字 |
| 访谈材料 | 访谈逐字稿、开放题回答 | 6 个主题,每段 180 字,保留更多词 |
| 政策长文 | 政策、公文、报告 | 5 个主题,每段 300 字,arpack 算法 |
| 设置 | 范围 | 影响什么 |
|---|---|---|
| 分词设置、词形合并 | 自己填写 | 哪些词参与分析 |
| 保留的主成分数量 | 最多 10 | 提取几个潜在主题 |
| 最大特征数 | 1 到 5000 | 保留的词数上限 |
| 最小文档频率 | 2 到 10 | 一个词至少出现在几段里 |
| 最大文档频率 | 0.01 到 0.99 | 出现在过多段落里的词被去掉 |
| 文档分段大小 | 100 到 500 | 每段多少字 |
| 算法 | randomized 或 arpack | 用哪种算法分解 |
| 迭代次数 | 5 到 100 | randomized 的精度 |
| 容忍度 | 0.001 到 0.1 | arpack 的精度 |
主题名里泛泛的词多,或者重叠诊断里共享词大多是通用词,就把它们补进停用词重跑;专有名词被切碎,就补进自定义词典;跑偏段落多、累计解释方差低,可以试着多保留一两个主题,或者调整分段大小。
10
报告怎么读
TATOOLS 的报告先给出整体的模型效果,再按文件依次展开。
| 区块 | 先看什么 |
|---|---|
| 总解释方差、当前模型参数、参数优化建议 | 几个主题一共说明了多少差异 |
| 主题结构摘要 | 结构判断和结论草稿 |
| 主题命名与代表段落 | 主题名对不对,代表段落是否说的是一回事 |
| 跑偏段落提示 | 哪些段落归属不清 |
| 主题重叠诊断 | 哪些主题可能该合并 |
| 主题详情、词语重要性 | 每个主题的前 20 个词 |
| 模型解读、主题相关性摘要、主题内容分析 | 每段归到哪个主题 |
| 累计方差解释率、各主题方差贡献 | 每个主题说明了多少 |
| 主题相似度热力图、主题关系网络图 | 主题之间有多近 |
| 散点图、主题核心词汇、完整权重表 | 查具体的段和词 |
【主题结构摘要】按最大主题覆盖了多少段落,判断材料是主题集中还是多议题并列,并给出一段结论草稿。【主题命名与代表段落】为每个主题列出权重最高的三段原文,主题名可以直接在输入框里改,改好的名字会同步到跑偏段落和重叠诊断里。点【导出摘要】,主题名、关键词、代表段落、跑偏段落和重叠诊断会一起导出成一份主题结构摘要。
读的顺序是先看主题命名与代表段落,改定每个主题的名字,再看跑偏段落和重叠诊断决定改哪里,最后回到解释方差确认主题数是否合适。结果可以下载,包括每段在各主题上的坐标和主导主题、每个主题的词语权重和各主题的解释方差。
11
把结果写进论文
LSA 适合在论文里用来描述一批文本的语义结构,或者作为检查长文结构的依据。下面是一段方法部分的写法示例,方括号里换成自己的数字。
本研究使用 TATOOLS 的 LSA 潜在语义分析处理 [文件数] 份文本。分词并去除停用词后,按每段约 [字数] 字切分为 [段落数] 段,以 TF-IDF 加权构建段落—词语矩阵,保留至少出现在 [最小文档频率] 段中的词,对矩阵做截断奇异值分解(Deerwester 等,1990),保留 [K] 个潜在主题,累计解释 [比例] 的方差。各主题依据权重最高的关键词与代表段落人工命名,每段以坐标最大的主题作为主导主题。
报告主题时,列出每个主题的名称、解释方差比、段落占比和前五个关键词,再各引一段代表段落,读者就能看出每个主题讲的是什么。
12
小结
LSA 对段落与词语的 TF-IDF 矩阵做截断奇异值分解,保留的 k 个方向就是 k 个潜在主题。
截断奇异值分解给出最接近原矩阵的低秩近似,经常和同一批词一起出现的近义词会落到相近的位置。
主题词是每个方向上权重最高的词,解释方差比说明每个主题说明了多少差异,段落坐标缩放到长度为 1 后,最大的一项是主导主题。
TATOOLS 为每个主题拟好名字、列出代表段落,标出主导权重偏低或和第二主题相差很小的跑偏段落,并用 Jaccard 系数诊断主题重叠。
主题名可以在报告里直接改,连同代表段落、跑偏段落和重叠诊断一起导出成主题结构摘要。
想看片段之间沿着哪几个方向拉开差异,可以用 TATOOLS 的【PCA 主成分分析】;想让每段的主题表示成加起来为 1 的比例,用【高级LDA主题模型】;想把段落直接按相似度分成几组,用【高级文本聚类】。
13
资料来源
Lehoucq、Sorensen 与 Yang:ARPACK Users’ Guide,SIAM,1998
Blei、Ng 与 Jordan:Latent Dirichlet Allocation,Journal of Machine Learning Research,第 3 卷,2003
Jaccard:The Distribution of the Flora in the Alpine Zone,New Phytologist,第 11 卷第 2 期,1912
END
