<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Gensim on 酒中仙</title><link>https://hanguangwu.github.io/blog/tags/gensim/</link><description>Recent content in Gensim on 酒中仙</description><generator>Hugo -- gohugo.io</generator><language>zh-cn</language><copyright>hanguangwu</copyright><lastBuildDate>Mon, 02 Feb 2026 20:34:25 -0800</lastBuildDate><atom:link href="https://hanguangwu.github.io/blog/tags/gensim/index.xml" rel="self" type="application/rss+xml"/><item><title>文本表示与词向量</title><link>https://hanguangwu.github.io/blog/p/%E6%96%87%E6%9C%AC%E8%A1%A8%E7%A4%BA%E4%B8%8E%E8%AF%8D%E5%90%91%E9%87%8F/</link><pubDate>Mon, 02 Feb 2026 20:34:25 -0800</pubDate><guid>https://hanguangwu.github.io/blog/p/%E6%96%87%E6%9C%AC%E8%A1%A8%E7%A4%BA%E4%B8%8E%E8%AF%8D%E5%90%91%E9%87%8F/</guid><description>&lt;h1 id="文本表示与词向量"&gt;&lt;strong&gt;文本表示与词向量&lt;/strong&gt;
&lt;/h1&gt;&lt;p&gt;&lt;a class="link" href="https://datawhalechina.github.io/base-llm" target="_blank" rel="noopener"
&gt;本文来源于Datawhale课程&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="第一节-初级分词技术"&gt;第一节 初级分词技术
&lt;/h2&gt;&lt;p&gt;要让计算机开始理解人类语言，首先要做的就是把连续不断的文本“敲碎”，变成一块块有意义的“积木”——这个过程就是&lt;strong&gt;分词（Tokenization）&lt;/strong&gt;。如果说文本是一座宏伟的建筑，那么“词”就是构成这座建筑的砖瓦。分词任务的质量，将决定上层建筑（如信息检索、机器翻译、情感分析等）的稳固程度。&lt;/p&gt;
&lt;h3 id="一分词的定义与重要性"&gt;一、分词的定义与重要性
&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;分词&lt;/strong&gt;的任务，是把连续的文本序列切分成具有独立语义的基本单元（即“词”或“词元”）。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;对于英文等天然有空格作为分隔符的语言，分词相对简单。&lt;/li&gt;
&lt;li&gt;但对于中文、日文、泰文等语言，文本是连续的字符流，词之间没有明确的边界。例如，&lt;code&gt;&amp;quot;给阿姨倒一杯卡布奇诺&amp;quot;&lt;/code&gt;，计算机需要依据算法将其正确地切分为 &lt;code&gt;[&amp;quot;给&amp;quot;, &amp;quot;阿姨&amp;quot;, &amp;quot;倒&amp;quot;, &amp;quot;一杯&amp;quot;, &amp;quot;卡布奇诺&amp;quot;]&lt;/code&gt;。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;在传统的 NLP 处理流程中，分词是后续所有任务的基础。其处理方式通常是将分词作为一个独立且“硬性”的预处理步骤，这就导致一个微小的分词错误就可能造成语义信息的丢失。这种错误会在后续的处理链条中被不断放大，产生“差之毫厘，谬以千里”的级联效应（Cascading Effect）。例如，在传统的搜索引擎里，一旦“南京市长江大桥”被错分为 [&amp;ldquo;南京&amp;rdquo;, &amp;ldquo;市长&amp;rdquo;, &amp;ldquo;江大桥&amp;rdquo;]，系统就很难再从这三个错误的词块中还原出原始的、正确的地理位置含义，导致搜索结果完全跑偏。现代的 NLP 方法则通过更灵活的切分策略，在很大程度上缓解了这个问题。&lt;/p&gt;
&lt;h3 id="二通过-jieba-认识分词"&gt;二、通过 jieba 认识分词
&lt;/h3&gt;&lt;p&gt;诚然，在以 Transformer 为基础的大语言模型兴起后，传统意义上“语言学分词”的应用场景在逐步减少，现代大语言模型更多采用子词（Subword）等切分策略。但 &lt;code&gt;jieba&lt;/code&gt; 作为一个经典、简单、代码开源的中文分词库，仍是&lt;strong&gt;理解传统分词思想、学习 NLP 基础工程实践&lt;/strong&gt;的重要工具 [^1]。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;a class="link" href="https://github.com/FutureUnreal/base-nlp/blob/main/code/C2/01_jieba.py" target="_blank" rel="noopener"
&gt;本节完整代码&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h4 id="21-jieba安装"&gt;2.1 jieba安装
&lt;/h4&gt;&lt;p&gt;&lt;code&gt;jieba&lt;/code&gt; 是目前流行的 Python 中文分词库之一，对初学者较为友好。可以使用如下 &lt;code&gt;pip&lt;/code&gt; 命令安装。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;pip install jieba
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;安装完成后，输入以下命令查看 &lt;code&gt;jieba&lt;/code&gt; 的版本等信息，以确认是否安装成功。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;pip show jieba
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h4 id="22-基于规则与词典"&gt;2.2 基于规则与词典
&lt;/h4&gt;&lt;p&gt;这是最早期也是最符合直觉的分词方法，它的核心是&lt;strong&gt;一部大型词典&lt;/strong&gt;和&lt;strong&gt;一套匹配规则&lt;/strong&gt;。&lt;code&gt;jieba&lt;/code&gt; 的默认模式实现的就是这种方式。它首先基于一个&lt;strong&gt;前缀词典（Trie树）&lt;/strong&gt;，高效地构建出一个包含句子中所有可能词语组合的&lt;strong&gt;有向无环图（DAG）&lt;/strong&gt;。接着，通过动态规划算法寻找一条概率最大的路径，作为最终分词结果。&lt;/p&gt;
&lt;p&gt;这个过程可以被量化为一个概率计算问题。假设一个分词路径由一个词语序列组成，将其表示为 $w_1, w_2, &amp;hellip;, w_n$，其中 $w_i$ 代表序列中的第 i 个词。那么这条路径的概率可以近似为：&lt;/p&gt;
$$ P(w_1, w_2, ..., w_n) \approx P(w_1) \times P(w_2) \times ... \times P(w_n) $$&lt;p&gt;其中，每个词 $w_i$ 的概率 $P(w_i)$ 可以通过其在词典（语料库）中的频率来估算：&lt;/p&gt;
$$ P(w_i) = \frac{\text{词 } w_i \text{ 的词频}}{\text{词典中所有词的总词频}} $$&lt;p&gt;&lt;code&gt;jieba&lt;/code&gt;的目标就是找到一条路径，使得这个累乘的概率值最大。&lt;/p&gt;
&lt;h5 id="221-log概率与动态规划"&gt;2.2.1 Log概率与动态规划
&lt;/h5&gt;&lt;p&gt;在实际工程中，将大量小于1的概率值直接相乘，很容易导致结果趋近于0，造成&lt;strong&gt;浮点数下溢&lt;/strong&gt;，从而无法比较路径优劣。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;jieba&lt;/code&gt; 采用了两种关键技术来解决这个问题：&lt;/p&gt;
&lt;p&gt;（1）&lt;strong&gt;对数概率&lt;/strong&gt;：利用对数函数 &lt;code&gt;log&lt;/code&gt; 的性质，将概率的&lt;strong&gt;累乘&lt;/strong&gt;转换为 &lt;code&gt;log&lt;/code&gt; 概率的&lt;strong&gt;累加&lt;/strong&gt;。寻找概率最大值就等价于寻找 &lt;code&gt;log&lt;/code&gt; 概率之和的最大值，有效避免了下溢问题。&lt;/p&gt;
$$ \underset{w}{\arg\max} \sum_{i=1}^{n} \log P(w_i) $$&lt;p&gt;（2）&lt;strong&gt;动态规划&lt;/strong&gt;：暴力计算所有可能路径概率和的计算量是很大的。&lt;code&gt;jieba&lt;/code&gt; 使用动态规划的思想，从句子的&lt;strong&gt;末尾&lt;/strong&gt;开始，&lt;strong&gt;从后向前&lt;/strong&gt;递推计算到每个位置的最优切分路径及其 &lt;code&gt;log&lt;/code&gt; 概率之和，并记录下来。最终，从句子开头出发，根据记录好的最优路径信息，就能反推出整个句子的最优分词结果。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;怎么又是数学公式🥹？我知道你很急，但你先别急&lt;/p&gt;
&lt;p&gt;下面通过一个实际的例子来理解一下&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;例如，对于句子“给阿姨倒一杯卡布奇诺”，在构建好 DAG 之后，&lt;code&gt;jieba&lt;/code&gt; 在“&lt;code&gt;一/一杯&lt;/code&gt;”这个位置附近，可能会存在两条候选路径：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;路径 A&lt;/strong&gt;：&lt;code&gt;给 阿姨 倒 一杯 卡布奇诺&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;路径 B&lt;/strong&gt;：&lt;code&gt;给 阿姨 倒 一 杯 卡布奇诺&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;如果直接从“概率乘积”的角度看，两条路径的概率近似为：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;$P(A) \approx P(\text{给}) \times P(\text{阿姨}) \times P(\text{倒}) \times P(\text{一杯}) \times P(\text{卡布奇诺})$&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;$P(B) \approx P(\text{给}) \times P(\text{阿姨}) \times P(\text{倒}) \times P(\text{一}) \times P(\text{杯}) \times P(\text{卡布奇诺})$&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;在真实实现中，&lt;code&gt;jieba&lt;/code&gt; 会把上面的乘积全部换成 &lt;strong&gt;log 概率的加和&lt;/strong&gt; 来计算：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;$\log P(A) \approx \log P(\text{给}) + \log P(\text{阿姨}) + \log P(\text{倒}) + \log P(\text{一杯}) + \log P(\text{卡布奇诺})$&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;$\log P(B) \approx \log P(\text{给}) + \log P(\text{阿姨}) + \log P(\text{倒}) + \log P(\text{一}) + \log P(\text{杯}) + \log P(\text{卡布奇诺})$&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;由于对数函数是单调递增的，&lt;strong&gt;谁的 log 概率和更大，谁对应的原始概率也更大&lt;/strong&gt;。假设“一杯”是一个高频词，它单独出现的概率 $P(\text{一杯})$ 会远大于两个单字“一”和“杯”的概率之积 $P(\text{一}) \times P(\text{杯})$，于是就有：&lt;/p&gt;
$$\log P(\text{一杯}) \gg \log P(\text{一}) + \log P(\text{杯})$$&lt;p&gt;因此：&lt;/p&gt;
$$\log P(A) &gt; \log P(B)$$&lt;p&gt;动态规划要做的，就是**在句子的每一个位置上，自动完成这种“在所有可能后续切分中，挑出 log 概率和最大的那条路径”**的比较，而不是像例子里只人工枚举两条路径。最终，它就会把路径 A 选为“全句最优分词结果”。&lt;/p&gt;
&lt;h5 id="222-jieba-实践"&gt;2.2.2 Jieba 实践
&lt;/h5&gt;&lt;p&gt;&lt;code&gt;jieba&lt;/code&gt;的&lt;strong&gt;精确模式&lt;/strong&gt;正是前文所述**“基于词典和动态规划寻找最大概率路径”**这一方法的典型应用，它会力图将句子尽可能精确地切开。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;jieba&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;text&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;我在梦里收到清华大学录取通知书&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;seg_list&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;jieba&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;lcut&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;cut_all&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;False&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;# cut_all=False 表示精确模式&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;seg_list&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;输出：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;我&amp;#39;&lt;/span&gt;, &lt;span class="s1"&gt;&amp;#39;在&amp;#39;&lt;/span&gt;, &lt;span class="s1"&gt;&amp;#39;梦里&amp;#39;&lt;/span&gt;, &lt;span class="s1"&gt;&amp;#39;收到&amp;#39;&lt;/span&gt;, &lt;span class="s1"&gt;&amp;#39;清华大学&amp;#39;&lt;/span&gt;, &lt;span class="s1"&gt;&amp;#39;录取&amp;#39;&lt;/span&gt;, &lt;span class="s1"&gt;&amp;#39;通知书&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;上面的例子之所以能切得比较理想，是因为“清华大学”“通知书”等词在词典中已有较稳定的统计信息。反过来，精确模式的核心仍然是“基于词典找最优路径”。一旦遇到词典里没有收录的新词（例如“奔波儿灞”），就容易被拆成更小的片段，出现不符合预期的切分。这时，&lt;strong&gt;基于词典的分词方法&lt;/strong&gt;的优势就体现出来了。我们可以进行&lt;strong&gt;人工干预&lt;/strong&gt;，通过&lt;strong&gt;自定义词典&lt;/strong&gt;把新词加入词表，“教会”&lt;code&gt;jieba&lt;/code&gt;认识它。&lt;/p&gt;
&lt;p&gt;下面创建一个自定义字典&lt;code&gt;user_dict.txt&lt;/code&gt;：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;九头虫
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;奔波儿灞
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;code&gt;jieba&lt;/code&gt;自定义词典的格式为：&lt;code&gt;词语 [词频] [词性]&lt;/code&gt;。词频和词性是可选的，用空格隔开。这里先不添加这两个选项。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;span class="lnt"&gt;6
&lt;/span&gt;&lt;span class="lnt"&gt;7
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 未加载词典前的错误分词&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;text&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;九头虫让奔波儿灞把唐僧师徒除掉&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;精准模式: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;jieba&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;lcut&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;cut_all&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;False&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 加载自定义词典&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;jieba&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;load_userdict&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;./user_dict.txt&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;加载词典后: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;jieba&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;lcut&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;cut_all&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;False&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;精准模式: &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;九头&amp;#39;&lt;/span&gt;, &lt;span class="s1"&gt;&amp;#39;虫&amp;#39;&lt;/span&gt;, &lt;span class="s1"&gt;&amp;#39;让&amp;#39;&lt;/span&gt;, &lt;span class="s1"&gt;&amp;#39;奔波&amp;#39;&lt;/span&gt;, &lt;span class="s1"&gt;&amp;#39;儿&amp;#39;&lt;/span&gt;, &lt;span class="s1"&gt;&amp;#39;灞&amp;#39;&lt;/span&gt;, &lt;span class="s1"&gt;&amp;#39;把&amp;#39;&lt;/span&gt;, &lt;span class="s1"&gt;&amp;#39;唐僧&amp;#39;&lt;/span&gt;, &lt;span class="s1"&gt;&amp;#39;师徒&amp;#39;&lt;/span&gt;, &lt;span class="s1"&gt;&amp;#39;除掉&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;加载词典后: &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;九头虫&amp;#39;&lt;/span&gt;, &lt;span class="s1"&gt;&amp;#39;让&amp;#39;&lt;/span&gt;, &lt;span class="s1"&gt;&amp;#39;奔波儿灞&amp;#39;&lt;/span&gt;, &lt;span class="s1"&gt;&amp;#39;把&amp;#39;&lt;/span&gt;, &lt;span class="s1"&gt;&amp;#39;唐僧&amp;#39;&lt;/span&gt;, &lt;span class="s1"&gt;&amp;#39;师徒&amp;#39;&lt;/span&gt;, &lt;span class="s1"&gt;&amp;#39;除掉&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;通过自定义词典，能很方便地解决 &lt;strong&gt;OOV&lt;/strong&gt; 的问题，让分词结果符合预期，这在处理特定业务领域文本时尤其有用。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;未登录词（OOV, Out-Of-Vocabulary）是一个“相对概念”——&lt;strong&gt;相对某个词典/词表未被收录的词&lt;/strong&gt;。对词典法来说，就是词典里没有；常见表现是被切成多个字或更小片段，需要通过维护词典（或引入其它模型）来修正。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;当向&lt;code&gt;jieba&lt;/code&gt;中添加自定义词（如“奔波儿灞”）但&lt;strong&gt;不指定词频&lt;/strong&gt;时，&lt;code&gt;jieba&lt;/code&gt;会采取一种自动的方式来估算其词频。它会首先尝试对这个新词进行分词（例如，默认会切成 &lt;code&gt;[&amp;quot;奔&amp;quot;, &amp;quot;波&amp;quot;, &amp;quot;儿&amp;quot;, &amp;quot;灞&amp;quot;]&lt;/code&gt;），然后基于这些组成部分的基础词频计算出一个概率。最后，给“奔波儿灞”这个整体赋予一个&lt;strong&gt;略高于&lt;/strong&gt;其组成部分概率之积的词频。这样，在后续的分词计算中，模型就会更倾向于将“奔波儿灞”视为一个完整的词，从而实现了“强制”分词的效果。&lt;/p&gt;
&lt;h5 id="223-精确模式工作流程"&gt;2.2.3 精确模式工作流程
&lt;/h5&gt;&lt;p align="center"&gt;
&lt;img src="https://cdn.jsdelivr.net/gh/Hanguangwu/MyImageBed01/img/2_1_1.svg" width="80%" alt="精确模式工作流程" /&gt;
&lt;br /&gt;
&lt;em&gt;图 2-1 jieba 精确模式工作流程&lt;/em&gt;
&lt;/p&gt;
&lt;p&gt;分析底层源码可以发现，&lt;code&gt;jieba&lt;/code&gt; 精确模式的分词过程主要是下面四步（简单了解）：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;文本预处理与分块 (&lt;code&gt;cut&lt;/code&gt; 方法)&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;cut&lt;/code&gt; 函数是总调度。它首先通过正则表达式 &lt;code&gt;re_han_default&lt;/code&gt; 将整个句子切分成连续的汉字区块和非汉字部分（如英文、数字、标点）。非汉字部分被直接输出，而每个汉字区块则被送入核心分词流程。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;构建有向无环图（DAG） (&lt;code&gt;get_DAG&lt;/code&gt; 方法)&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;这一步为每个汉字区块生成一个记录所有可能分词路径的图。&lt;code&gt;get_DAG&lt;/code&gt; 的逻辑是：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;从句子的第 &lt;code&gt;k&lt;/code&gt; 个字开始，向后扫描，形成词语 &lt;code&gt;frag&lt;/code&gt;（fragment）。&lt;/li&gt;
&lt;li&gt;只要 &lt;code&gt;frag&lt;/code&gt; 存在于 &lt;code&gt;self.FREQ&lt;/code&gt; 这个前缀词典（由主词典与用户词典加载后生成）中，就继续向后扫描。&lt;/li&gt;
&lt;li&gt;在扫描过程中，如果 &lt;code&gt;self.FREQ[frag]&lt;/code&gt; 的值&lt;strong&gt;不为0&lt;/strong&gt;，说明 &lt;code&gt;frag&lt;/code&gt; 是一个能独立成词的词语，就将它的结束位置 &lt;code&gt;i&lt;/code&gt; 记录下来。词频为 &lt;code&gt;0&lt;/code&gt; 的词条仅被当作前缀，不会被记录为成词路径。&lt;/li&gt;
&lt;li&gt;最终，&lt;code&gt;get_DAG&lt;/code&gt; 返回一个字典 &lt;code&gt;DAG&lt;/code&gt;。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;计算最优路径 (&lt;code&gt;calc&lt;/code&gt; 方法)&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;这是动态规划算法的核心实现，用于从DAG中寻找最优路径。&lt;code&gt;calc&lt;/code&gt; 的计算方向很重要：它是&lt;strong&gt;从句子的末尾向前反向计算的&lt;/strong&gt; (&lt;code&gt;for idx in xrange(N - 1, -1, -1)&lt;/code&gt;)。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;对于句中的每个位置 &lt;code&gt;idx&lt;/code&gt;，它会考察所有从 &lt;code&gt;idx&lt;/code&gt; 出发的可能词语（由 &lt;code&gt;DAG[idx]&lt;/code&gt; 提供）。&lt;/li&gt;
&lt;li&gt;对于每个可能的词 &lt;code&gt;sentence[idx:x + 1]&lt;/code&gt;，它会计算一个路径“分数”，这个分数由两部分相加而成：
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;当前词的log概率&lt;/strong&gt;：源码中为 &lt;code&gt;log(self.FREQ.get(...) or 1) - logtotal&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;该词之后剩余句子的最优log概率&lt;/strong&gt;：这部分已经在之前的迭代中计算好并储存在 &lt;code&gt;route[x + 1][0]&lt;/code&gt; 中。&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;&lt;code&gt;calc&lt;/code&gt; 会选择使这个总分数最高的那个词语作为从 &lt;code&gt;idx&lt;/code&gt; 出发的“最佳下一步”，并将这个最高分和“下一步”的起始位置 &lt;code&gt;x&lt;/code&gt; 记录在 &lt;code&gt;route[idx]&lt;/code&gt; 中。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;从路由表中重建结果 (&lt;code&gt;__cut_DAG_NO_HMM&lt;/code&gt; 方法)&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;当 &lt;code&gt;calc&lt;/code&gt; 计算完成后，&lt;code&gt;route&lt;/code&gt; 字典中已经储存了从每个位置出发的最优选择。&lt;code&gt;__cut_DAG_NO_HMM&lt;/code&gt; 的工作就相对简单：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;它从句子的第 &lt;code&gt;0&lt;/code&gt; 位开始 (&lt;code&gt;x=0&lt;/code&gt;)。&lt;/li&gt;
&lt;li&gt;通过 &lt;code&gt;route[x][1]&lt;/code&gt; 查找下一步应该跳到哪里，从而得到第一个最优的词。&lt;/li&gt;
&lt;li&gt;然后将 &lt;code&gt;x&lt;/code&gt; 更新为这个词的结束位置，继续循环查找，直到句子末尾。&lt;/li&gt;
&lt;li&gt;最终，通过 &lt;code&gt;yield&lt;/code&gt; 逐个返回最优路径上的所有词语。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="23-统计学习时代的方法"&gt;2.3 统计学习时代的方法
&lt;/h4&gt;&lt;p&gt;为了解决对人工词典的过度依赖，研究者们转向了统计学习。其核心思想是把分词看作一个&lt;strong&gt;序列标注&lt;/strong&gt;问题。它会为每个字标注其在词中的位置（&lt;code&gt;B-Begin&lt;/code&gt;, &lt;code&gt;M-Middle&lt;/code&gt;, &lt;code&gt;E-End&lt;/code&gt;, &lt;code&gt;S-Single&lt;/code&gt;），然后利用&lt;strong&gt;隐马尔可夫模型（HMM）&lt;/strong&gt; 等模型来预测每个字最可能的位置标签序列。也就是为句子中的每个字打上一个位置标签，例如：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;B&lt;/code&gt;（Begin）：词的开始&lt;/li&gt;
&lt;li&gt;&lt;code&gt;M&lt;/code&gt;（Middle）：词的中间&lt;/li&gt;
&lt;li&gt;&lt;code&gt;E&lt;/code&gt;（End）：词的结束&lt;/li&gt;
&lt;li&gt;&lt;code&gt;S&lt;/code&gt;（Single）：单字成词&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;这样，“我爱北京”就会被标注为 &lt;code&gt;S S B E&lt;/code&gt;。分词任务就变成了为字序列寻找最合理的标签序列。&lt;/p&gt;
&lt;p&gt;隐马尔可夫模型是解决这类问题的经典生成式模型。它能学习到字与标签之间的对应关系（发射概率）以及标签与标签之间的转移关系（转移概率）。&lt;code&gt;jieba&lt;/code&gt; 就利用了HMM来识别词典中不存在的 &lt;strong&gt;OOV&lt;/strong&gt; [^2]。当基于词典的图算法在句子中遇到一个无法切分的、连续的未登录字串时，就会调用HMM模块对这个局部子句进行分词。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;优点&lt;/strong&gt;：能够发现词典外的新词，一定程度上解决了 OOV 问题。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;缺点&lt;/strong&gt;：HMM的两个核心假设（观测独立和齐次马尔可夫）过于严格，限制了其利用更丰富的上下文特征的能力，因此在处理复杂的歧义场景时效果不如后续的CRF等模型。&lt;/li&gt;
&lt;/ul&gt;
&lt;h5 id="231-jieba-实践hmm对未登录词的识别"&gt;2.3.1 Jieba 实践：HMM对未登录词的识别
&lt;/h5&gt;&lt;p&gt;前面分析了 &lt;code&gt;__cut_DAG_NO_HMM&lt;/code&gt; 的源码，它直接使用动态规划（&lt;code&gt;calc&lt;/code&gt; 方法）计算出的最优路径。如果最优路径将“直聘”切分为两个单字，它就会直接输出两个单字。&lt;/p&gt;
&lt;p&gt;而当 &lt;code&gt;HMM=True&lt;/code&gt;（默认情况）时，&lt;code&gt;jieba&lt;/code&gt; 调用的是 &lt;code&gt;__cut_DAG&lt;/code&gt; 方法，它的源码展现了混合策略：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;设立缓冲区&lt;/strong&gt;：函数内有一个缓冲区 &lt;code&gt;buf&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;收集单字&lt;/strong&gt;：当 &lt;code&gt;calc&lt;/code&gt; 计算出的最优路径是一个&lt;strong&gt;单字&lt;/strong&gt;时，该函数并&lt;strong&gt;不立即输出&lt;/strong&gt;，而是将这个单字存入 &lt;code&gt;buf&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;HMM介入&lt;/strong&gt;：当遇到一个&lt;strong&gt;多字词&lt;/strong&gt;，或者整个句子遍历结束时，函数会检查 &lt;code&gt;buf&lt;/code&gt;。如果 &lt;code&gt;buf&lt;/code&gt; 中积累了连续的单字（如 &lt;code&gt;&amp;quot;直聘&amp;quot;&lt;/code&gt;），它并不会直接输出这些单字，而是调用 &lt;code&gt;finalseg.cut(buf)&lt;/code&gt; 来处理。&lt;code&gt;finalseg&lt;/code&gt; 正是 &lt;code&gt;jieba&lt;/code&gt; 内置的&lt;strong&gt;HMM模型&lt;/strong&gt;。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;二次分词&lt;/strong&gt;：HMM模型会对 &lt;code&gt;buf&lt;/code&gt; 中的字符串进行一次基于统计模型的“二次分词”，尝试从中识别出完整的未登录词。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;下面的例子直观地展示了 &lt;code&gt;__cut_DAG&lt;/code&gt; 中HMM模块的作用：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;span class="lnt"&gt;6
&lt;/span&gt;&lt;span class="lnt"&gt;7
&lt;/span&gt;&lt;span class="lnt"&gt;8
&lt;/span&gt;&lt;span class="lnt"&gt;9
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;text&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;我在Boss直聘找工作&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 开启HMM（默认）&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;seg_list_hmm&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;jieba&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;lcut&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;HMM&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;True&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;HMM开启: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;seg_list_hmm&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 关闭HMM&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;seg_list_no_hmm&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;jieba&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;lcut&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;HMM&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;False&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;HMM关闭: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;seg_list_no_hmm&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;HMM开启: &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;我&amp;#39;&lt;/span&gt;, &lt;span class="s1"&gt;&amp;#39;在&amp;#39;&lt;/span&gt;, &lt;span class="s1"&gt;&amp;#39;Boss&amp;#39;&lt;/span&gt;, &lt;span class="s1"&gt;&amp;#39;直聘&amp;#39;&lt;/span&gt;, &lt;span class="s1"&gt;&amp;#39;找&amp;#39;&lt;/span&gt;, &lt;span class="s1"&gt;&amp;#39;工作&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;HMM关闭: &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;我&amp;#39;&lt;/span&gt;, &lt;span class="s1"&gt;&amp;#39;在&amp;#39;&lt;/span&gt;, &lt;span class="s1"&gt;&amp;#39;Boss&amp;#39;&lt;/span&gt;, &lt;span class="s1"&gt;&amp;#39;直&amp;#39;&lt;/span&gt;, &lt;span class="s1"&gt;&amp;#39;聘&amp;#39;&lt;/span&gt;, &lt;span class="s1"&gt;&amp;#39;找&amp;#39;&lt;/span&gt;, &lt;span class="s1"&gt;&amp;#39;工作&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;在这个例子中，当HMM开启时，&lt;code&gt;__cut_DAG&lt;/code&gt; 方法将动态规划产生的 &lt;code&gt;['直', '聘']&lt;/code&gt; 序列在缓冲区内拼接成 &lt;code&gt;&amp;quot;直聘&amp;quot;&lt;/code&gt;，然后交由HMM模型（&lt;code&gt;finalseg.cut&lt;/code&gt;）处理，最终HMM通过其学到的统计规律，“猜”出这两个字是一个完整的词语，从而弥补了词典法的不足。&lt;/p&gt;
&lt;h5 id="232-词性标注"&gt;2.3.2 词性标注
&lt;/h5&gt;&lt;p&gt;除了分词，&lt;code&gt;jieba&lt;/code&gt; 还提供了词性标注功能。采用了&lt;strong&gt;词典查询与隐马尔可夫模型相结合&lt;/strong&gt;的混合策略，来识别出每个词语的语法属性（名词、动词、形容词等）。这需要使用&lt;code&gt;jieba.posseg&lt;/code&gt;模块。&lt;/p&gt;
&lt;p&gt;由于在前面已经通过 &lt;code&gt;jieba.load_userdict()&lt;/code&gt; 加载了包含“奔波儿灞”的词典，因此 &lt;code&gt;jieba&lt;/code&gt; 已经能够正确地将其切分出来。但是，因为初始词典未提供词性，&lt;code&gt;jieba&lt;/code&gt; 会给它一个默认的、不一定准确的词性（如下面的&lt;code&gt;x&lt;/code&gt;）。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;span class="lnt"&gt;6
&lt;/span&gt;&lt;span class="lnt"&gt;7
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;jieba.posseg&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="nn"&gt;pseg&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;text&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;九头虫让奔波儿灞把唐僧师徒除掉&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# HMM=False 强制只使用词典和动态规划&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;words&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;pseg&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;lcut&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;HMM&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;False&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;默认词性输出: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;words&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;此时的输出，分词是正确的，但“九头虫”和“奔波儿灞”的词性是&lt;code&gt;x&lt;/code&gt;（非语素字）：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;默认词性输出: &lt;span class="o"&gt;[&lt;/span&gt;pair&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;九头虫&amp;#39;&lt;/span&gt;, &lt;span class="s1"&gt;&amp;#39;x&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;, pair&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;让&amp;#39;&lt;/span&gt;, &lt;span class="s1"&gt;&amp;#39;v&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;, pair&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;奔波儿灞&amp;#39;&lt;/span&gt;, &lt;span class="s1"&gt;&amp;#39;x&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;, pair&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;把&amp;#39;&lt;/span&gt;, &lt;span class="s1"&gt;&amp;#39;p&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;, pair&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;唐僧&amp;#39;&lt;/span&gt;, &lt;span class="s1"&gt;&amp;#39;nr&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;, pair&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;师徒&amp;#39;&lt;/span&gt;, &lt;span class="s1"&gt;&amp;#39;n&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;, pair&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;除掉&amp;#39;&lt;/span&gt;, &lt;span class="s1"&gt;&amp;#39;v&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;)]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;接下来，尝试通过调整词频来“干预”分词路径。如果希望将‘九头虫’完全切分为‘九’、‘头’、‘虫’三个单字，可以修改词典如下。为单个字“九”和“头”赋予了很高的词频，这会使&lt;code&gt;jieba&lt;/code&gt;在进行动态规划计算时，认为 &lt;code&gt;九&lt;/code&gt;+&lt;code&gt;头&lt;/code&gt; 这条路径的概率远大于 &lt;code&gt;九头&lt;/code&gt; 这条路径，从而优先选择前者。&lt;/p&gt;
&lt;p&gt;将&lt;code&gt;user_pos_dict.txt&lt;/code&gt;修改为：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;九 10000000 n
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;头 1000000 n
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;奔波儿灞 nr
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;为了让修改生效，需要重新加载词典：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 重新加载修改后的词典&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;jieba&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;load_userdict&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;./user_pos_dict.txt&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;dic_words&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;pseg&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;lcut&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;HMM&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;False&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;加载词性词典后: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;dic_words&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;可以看到，&lt;code&gt;jieba&lt;/code&gt;根据词典的“指示”，成功地将“九头”拆分：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;加载词性词典后: &lt;span class="o"&gt;[&lt;/span&gt;pair&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;九&amp;#39;&lt;/span&gt;, &lt;span class="s1"&gt;&amp;#39;n&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;, pair&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;头&amp;#39;&lt;/span&gt;, &lt;span class="s1"&gt;&amp;#39;n&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;, pair&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;虫&amp;#39;&lt;/span&gt;, &lt;span class="s1"&gt;&amp;#39;n&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;, pair&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;让&amp;#39;&lt;/span&gt;, &lt;span class="s1"&gt;&amp;#39;v&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;, pair&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;奔波儿灞&amp;#39;&lt;/span&gt;, &lt;span class="s1"&gt;&amp;#39;nr&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;, pair&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;把&amp;#39;&lt;/span&gt;, &lt;span class="s1"&gt;&amp;#39;p&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;, pair&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;唐僧&amp;#39;&lt;/span&gt;, &lt;span class="s1"&gt;&amp;#39;nr&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;, pair&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;师徒&amp;#39;&lt;/span&gt;, &lt;span class="s1"&gt;&amp;#39;n&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;, pair&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;除掉&amp;#39;&lt;/span&gt;, &lt;span class="s1"&gt;&amp;#39;v&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;)]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;code&gt;jieba&lt;/code&gt; 使用的是兼容ICTCLAS的词性标记集，常见的标签如下：&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style="text-align: left"&gt;标签&lt;/th&gt;
&lt;th style="text-align: left"&gt;含义&lt;/th&gt;
&lt;th style="text-align: left"&gt;标签&lt;/th&gt;
&lt;th style="text-align: left"&gt;含义&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style="text-align: left"&gt;n&lt;/td&gt;
&lt;td style="text-align: left"&gt;名词&lt;/td&gt;
&lt;td style="text-align: left"&gt;nr&lt;/td&gt;
&lt;td style="text-align: left"&gt;人名&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: left"&gt;ns&lt;/td&gt;
&lt;td style="text-align: left"&gt;地名&lt;/td&gt;
&lt;td style="text-align: left"&gt;nt&lt;/td&gt;
&lt;td style="text-align: left"&gt;机构团体&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: left"&gt;nz&lt;/td&gt;
&lt;td style="text-align: left"&gt;其他专名&lt;/td&gt;
&lt;td style="text-align: left"&gt;v&lt;/td&gt;
&lt;td style="text-align: left"&gt;动词&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: left"&gt;a&lt;/td&gt;
&lt;td style="text-align: left"&gt;形容词&lt;/td&gt;
&lt;td style="text-align: left"&gt;d&lt;/td&gt;
&lt;td style="text-align: left"&gt;副词&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: left"&gt;m&lt;/td&gt;
&lt;td style="text-align: left"&gt;数词&lt;/td&gt;
&lt;td style="text-align: left"&gt;q&lt;/td&gt;
&lt;td style="text-align: left"&gt;量词&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: left"&gt;r&lt;/td&gt;
&lt;td style="text-align: left"&gt;代词&lt;/td&gt;
&lt;td style="text-align: left"&gt;p&lt;/td&gt;
&lt;td style="text-align: left"&gt;介词&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: left"&gt;c&lt;/td&gt;
&lt;td style="text-align: left"&gt;连词&lt;/td&gt;
&lt;td style="text-align: left"&gt;u&lt;/td&gt;
&lt;td style="text-align: left"&gt;助词&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: left"&gt;t&lt;/td&gt;
&lt;td style="text-align: left"&gt;时间词&lt;/td&gt;
&lt;td style="text-align: left"&gt;x&lt;/td&gt;
&lt;td style="text-align: left"&gt;非语素字&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: left"&gt;w&lt;/td&gt;
&lt;td style="text-align: left"&gt;标点符号&lt;/td&gt;
&lt;td style="text-align: left"&gt;un&lt;/td&gt;
&lt;td style="text-align: left"&gt;未知词&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h4 id="24-从分词到分块"&gt;2.4 从“分词”到“分块”
&lt;/h4&gt;&lt;p&gt;随着深度学习，特别是&lt;code&gt;BERT&lt;/code&gt;和&lt;code&gt;GPT&lt;/code&gt;等大规模预训练模型的兴起，传统意义上“将句子切分成标准词语”的分词范式有了重大改变。现代 NLP 模型更倾向于采用 &lt;strong&gt;“无分词”或“弱分词”&lt;/strong&gt; 的策略，将文本处理成更基础的、数据驱动的单元，主要分为以下两种流派：&lt;/p&gt;
&lt;h5 id="241-字粒度分词character-level"&gt;2.4.1 字粒度分词（Character-level）
&lt;/h5&gt;&lt;p&gt;以 &lt;code&gt;BERT&lt;/code&gt; 模型为代表，在处理中文时，其最基础的分词策略就是&lt;strong&gt;字粒度&lt;/strong&gt;，即直接将每个汉字视为一个独立的Token。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;优点&lt;/strong&gt; ：
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;有效解决了 OOV 问题&lt;/strong&gt;：常用汉字的数量是有限的（几千个），模型可以构建一个全覆盖的“字表”。任何由标准汉字组成的词语都不会“未登录”，因为构成它的每个字都在字表里。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;无需维护庞大词典&lt;/strong&gt;：摆脱了对词典的依赖。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;缺点&lt;/strong&gt; ：
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;丢失词汇语义&lt;/strong&gt;：像“博物馆”这样的词，其整体语义在输入层面被人为地拆散为三个独立的字，模型需要消耗更多的计算资源在内部重新学习这些字的组合关系。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;输入序列更长&lt;/strong&gt;：相较于词，字的序列长度会显著增加，加大了模型的处理负担。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h5 id="242-子词分词subword"&gt;2.4.2 子词分词（Subword）
&lt;/h5&gt;&lt;p&gt;以 &lt;code&gt;GPT&lt;/code&gt; 系列为代表的大语言模型，则采用了更灵活的&lt;strong&gt;子词（Subword）&lt;/strong&gt; 切分方案，其中最主流的算法是 &lt;strong&gt;BPE（BytePair Encoding）&lt;/strong&gt; [^3]。&lt;/p&gt;
&lt;p&gt;BPE的核心思想是：在原始的字符语料库上，迭代地将高频的相邻字节对（或字符对）合并成一个新的、更大的单元，并将其加入词表。&lt;/p&gt;
&lt;p&gt;例如，对于语料中频繁出现的 &amp;ldquo;deeper&amp;rdquo;，BPE可能会先学习到 &amp;ldquo;er&amp;rdquo;，然后是 &amp;ldquo;deep&amp;rdquo;，最终可能将 &amp;ldquo;deeper&amp;rdquo; 作为一个整体或&amp;quot;deep&amp;quot;+&amp;ldquo;er&amp;rdquo; 的组合加入词表。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;优点&lt;/strong&gt; ：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;有效平衡&lt;/strong&gt; ：它在“词”和“字”之间取得了较好的平衡。高频词（如“机器学习”）可以被完整保留，低频词（如“擘画”）可以被拆分为更小的有意义的子词或单字（&lt;code&gt;擘&lt;/code&gt;+&lt;code&gt;画&lt;/code&gt;），而OOV（如一个新造的网络词）则可以被拆解成字符或字节组合，从而&lt;strong&gt;在保持信息完整性的前提下有效解决了OOV问题&lt;/strong&gt;。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;词表大小可控&lt;/strong&gt;：可以通过控制合并次数，将词表大小有效控制在预设范围内。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;缺点&lt;/strong&gt; :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;语言学可解释性不强&lt;/strong&gt;：BPE等算法产生的子词通常是基于统计频率，而非语言学上的词根、词缀等有意义的语素。这使得分词结果的可解释性变差。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;对训练语料的强依赖性&lt;/strong&gt;：子词词表是根据特定语料训练的，对于领域外的文本，其分词效果可能会退化，将很多词切成单字，导致处理效率降低。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;子词分词是当前大语言模型处理文本的标准方案，既保留了词的语义信息，又具备了字的灵活性。&lt;/p&gt;
&lt;h3 id="练习"&gt;练习
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;尝试修改 user_pos_dict.txt 中九和头的词频看看结果有什么不同&lt;/li&gt;
&lt;li&gt;自行更换代码中使用的 text 短句看看会得到什么输出&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h3 id="参考文献1"&gt;参考文献1
&lt;/h3&gt;&lt;p&gt;[1]: &lt;a class="link" href="https://github.com/fxsjy/jieba" target="_blank" rel="noopener"
&gt;Sun, F. (2012). &lt;em&gt;jieba Chinese segmentation&lt;/em&gt;. GitHub&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;[2]: &lt;a class="link" href="https://aclanthology.org/O03-4002/" target="_blank" rel="noopener"
&gt;Xue, N. (2003). &lt;em&gt;Chinese Word Segmentation as Character Tagging&lt;/em&gt;. International Journal of Computational Linguistics &amp;amp; Chinese Language Processing, 8(1), 29-48&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;[3]: &lt;a class="link" href="https://arxiv.org/abs/1508.07909" target="_blank" rel="noopener"
&gt;Sennrich, R., Haddow, B., &amp;amp; Birch, A. (2016). &lt;em&gt;Neural Machine Translation of Rare Words with Subword Units&lt;/em&gt;. arXiv:1508.07909&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="第二节-词向量表示"&gt;第二节 词向量表示
&lt;/h2&gt;&lt;p&gt;在上一章中，简单学习了如何将连续的文本切分成一个个独立的词元（Token）。然而，无论是&lt;code&gt;jieba&lt;/code&gt;分出的词语，还是BERT模型中的单个汉字，它们本质上仍然是计算机无法直接理解的&amp;quot;字符串&amp;quot;。&lt;/p&gt;
&lt;p&gt;机器学习和深度学习模型，无论结构多么复杂，其处理的输入都必须是&lt;strong&gt;数值形式&lt;/strong&gt;——具体来说，是由数字组成的&lt;strong&gt;特征向量或矩阵&lt;/strong&gt;。因此，在分词之后，必须将这些词元转换为模型可以&amp;quot;消化&amp;quot;的数字形式。这个过程称为&lt;strong&gt;词向量表示 (Word Representation)&lt;/strong&gt; 。**词嵌入 (Word Embedding)**通常特指通过神经网络学习得到的稠密向量表示，是词向量表示的一个重要子集。&lt;/p&gt;
&lt;h3 id="一为什么需要词向量"&gt;一、为什么需要词向量？
&lt;/h3&gt;&lt;p&gt;模型无法直接处理文本，它需要数字化的特征。以最基础的 NLP 任务——&lt;strong&gt;文本分类&lt;/strong&gt;为例，需要判断一段文本“国足爱吃海参”属于“负面”类别。模型无法直接理解这串汉字，它只能处理数字。&lt;/p&gt;
&lt;p&gt;词向量的核心任务就是&lt;strong&gt;弥合自然语言（符号世界）与数学模型（向量空间）之间的鸿沟&lt;/strong&gt;。需要一种系统性的方法，将分词后得到的&lt;code&gt;[&amp;quot;国足&amp;quot;, &amp;quot;爱&amp;quot;, &amp;quot;吃&amp;quot;, &amp;quot;海参&amp;quot;]&lt;/code&gt;这个词元序列，整体转换成一个或一组有意义的数字（即向量），然后才能将其输入给分类模型进行训练和预测。一个好的词向量表示，不仅要能唯一地标识一个词，更理想的情况是，向量本身能够&lt;strong&gt;蕴含词语的语义信息&lt;/strong&gt;。例如，我们希望“国王”和“女王”的向量在空间中的距离，会比“国王”和“香蕉”的向量距离更近。实现这一目标，也是 NLP 领域的重要发展方向之一。&lt;/p&gt;
&lt;h3 id="二离散表示"&gt;二、离散表示
&lt;/h3&gt;&lt;p&gt;在深度学习普及之前，研究者们提出了多种将词语表示为固定向量的方法。这些方法通常将每个词视为一个独立的、不可再分的单元，生成的向量因此也被称为&lt;strong&gt;离散向量（Discrete Vector）&lt;/strong&gt;。其特点是维度高且稀疏，在机器学习领域应用广泛。&lt;/p&gt;
&lt;h4 id="21-独热编码one-hot-encoding"&gt;2.1 独热编码（One-Hot Encoding）
&lt;/h4&gt;&lt;p&gt;这是最直观、最基础的&lt;strong&gt;词元级别&lt;/strong&gt;表示方法。它将每个词元都看作一个独立的类别，其思想与机器学习中的类别特征处理一致。&lt;/p&gt;
&lt;h5 id="211-编码原理"&gt;2.1.1 编码原理
&lt;/h5&gt;&lt;p&gt;&lt;strong&gt;独热编码&lt;/strong&gt;，也称&amp;quot;哑编码&amp;quot;，其核心步骤如下：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;构建词典&lt;/strong&gt;：首先，从整个语料库中收集所有出现过的&lt;strong&gt;唯一&lt;/strong&gt;词语，构成一个词典。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;分配索引&lt;/strong&gt;：为词典中的每个词语分配一个从 0 开始的唯一整数索引。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;创建向量&lt;/strong&gt;：用一个长度等于词典大小的向量来表示每个词。向量中，该词对应索引的位置为 &lt;code&gt;1&lt;/code&gt;，其余所有位置均为 &lt;code&gt;0&lt;/code&gt;。&lt;/li&gt;
&lt;/ol&gt;
&lt;h5 id="212-编码示例"&gt;2.1.2 编码示例
&lt;/h5&gt;&lt;p&gt;假设词典是从句子&amp;quot;我先挣它一个亿&amp;quot;构建的，分词后为&lt;code&gt;[&amp;quot;我&amp;quot;, &amp;quot;先&amp;quot;, &amp;quot;挣&amp;quot;, &amp;quot;它&amp;quot;, &amp;quot;一个&amp;quot;, &amp;quot;亿&amp;quot;]&lt;/code&gt;。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;我&lt;/code&gt; -&amp;gt; &lt;code&gt;[1, 0, 0, 0, 0, 0]&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;先&lt;/code&gt; -&amp;gt; &lt;code&gt;[0, 1, 0, 0, 0, 0]&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;挣&lt;/code&gt; -&amp;gt; &lt;code&gt;[0, 0, 1, 0, 0, 0]&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;它&lt;/code&gt; -&amp;gt; &lt;code&gt;[0, 0, 0, 1, 0, 0]&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;一个&lt;/code&gt; -&amp;gt; &lt;code&gt;[0, 0, 0, 0, 1, 0]&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;亿&lt;/code&gt; -&amp;gt; &lt;code&gt;[0, 0, 0, 0, 0, 1]&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h5 id="213-优点与缺陷"&gt;2.1.3 优点与缺陷
&lt;/h5&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;优点&lt;/strong&gt;：实现简单，能够清晰地将词语区分开。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;缺点&lt;/strong&gt;：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;维度灾难&lt;/strong&gt;：如果词典中有数万个词，那么每个词的向量维度就高达数万，造成数据极其稀疏，浪费计算和存储资源。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;语义鸿沟&lt;/strong&gt;：任意两个不同词的独热向量都是&lt;strong&gt;正交&lt;/strong&gt;的（它们的点积为 0）。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;为什么点积为0？&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;点积&lt;/strong&gt;是通过将两个向量的对应元素相乘再求和来计算的。在独热编码中，每个向量只有一个位置是 &lt;code&gt;1&lt;/code&gt;，其余都是 &lt;code&gt;0&lt;/code&gt;。对于任意两个&lt;strong&gt;不同&lt;/strong&gt;的词，它们值为 &lt;code&gt;1&lt;/code&gt; 的位置必然是错开的。&lt;/p&gt;
&lt;p&gt;因此，在计算点积时，&lt;code&gt;1&lt;/code&gt;总是与 &lt;code&gt;0&lt;/code&gt; 相乘，导致所有乘积项都为0，最终的和（点积）也为 0。在几何上，点积为 0 意味着向量&lt;strong&gt;正交&lt;/strong&gt;（互相垂直），这在语义上表示所有词都被视为同等的不相似。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;意味着模型无法从向量层面得知词与词之间的任何相似关系。在模型看来，&amp;ldquo;国王&amp;quot;与&amp;quot;女王&amp;quot;的距离，和&amp;quot;国王&amp;quot;与&amp;quot;香蕉&amp;quot;的距离是完全一样的，这严重丢失了语义信息。&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="22-词袋模型bag-of-words-bow"&gt;2.2 词袋模型（Bag-of-Words, BoW）
&lt;/h4&gt;&lt;p&gt;哑编码表示的是单个词，但实际通常需要表示整个句子或文档。&lt;strong&gt;词袋模型&lt;/strong&gt;正是为此而生，它是表示&lt;strong&gt;文档级别&lt;/strong&gt;特征最常用的方法之一。这种方法的理论基础可以追溯到向量空间模型 [^1]的提出。&lt;/p&gt;
&lt;h5 id="221-基本思想"&gt;2.2.1 基本思想
&lt;/h5&gt;&lt;p&gt;&lt;strong&gt;词袋模型&lt;/strong&gt;的基本思想是&lt;strong&gt;忽略文本中的词序和语法，将其仅仅视作一个装满词的&amp;quot;袋子&amp;rdquo;&lt;/strong&gt;，用袋子中每个词出现的&lt;strong&gt;统计量&lt;/strong&gt;来表示整个文档。&lt;/p&gt;
&lt;p&gt;它的实现过程可以理解为：将文档中所有词的&lt;strong&gt;独热向量相加&lt;/strong&gt;，得到一个最终的向量。这个向量的维度等于词典大小，每一维的值代表了对应词语在文档中的出现频次。实际实现时，通常直接统计每个词的出现次数，而不需要真正构造和相加 One-Hot 向量。&lt;/p&gt;
&lt;h5 id="222-实现示例"&gt;2.2.2 实现示例
&lt;/h5&gt;&lt;p&gt;假设词典与上文相同（基于&amp;quot;我先挣它一个亿&amp;quot;），有两个文档：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;文档1: &lt;code&gt;我 先 挣 一个 亿&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;文档2: &lt;code&gt;我 挣 它 一个 亿&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;它们的词袋表示为：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;vec(文档1)&lt;/code&gt; = &lt;code&gt;vec(我)&lt;/code&gt; + &lt;code&gt;vec(先)&lt;/code&gt; + &lt;code&gt;vec(挣)&lt;/code&gt; + &lt;code&gt;vec(一个)&lt;/code&gt; + &lt;code&gt;vec(亿)&lt;/code&gt; = &lt;code&gt;[1, 1, 1, 0, 1, 1]&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;vec(文档2)&lt;/code&gt; = &lt;code&gt;vec(我)&lt;/code&gt; + &lt;code&gt;vec(挣)&lt;/code&gt; + &lt;code&gt;vec(它)&lt;/code&gt; + &lt;code&gt;vec(一个)&lt;/code&gt; + &lt;code&gt;vec(亿)&lt;/code&gt; = &lt;code&gt;[1, 0, 1, 1, 1, 1]&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;这个结果向量的每一维，代表了对应词典中的词在该文档中出现的次数。通过计算两个向量的距离（如余弦相似度），可以发现这两个文档是比较相似的，因为它们共享了&amp;quot;我&amp;quot;、&amp;ldquo;挣&amp;rdquo;、&amp;ldquo;一个&amp;rdquo;、&amp;ldquo;亿&amp;quot;这几个词。&lt;/p&gt;
&lt;h5 id="223-余弦相似度计算"&gt;2.2.3 余弦相似度计算
&lt;/h5&gt;&lt;p&gt;**余弦相似度（Cosine Similarity）**通过计算两个向量夹角的余弦值来衡量它们的相似性。对于非负向量（如词袋模型产生的向量），其值范围在 &lt;code&gt;[0, 1]&lt;/code&gt; 之间，值越接近&lt;code&gt;1&lt;/code&gt;，表示两个向量越相似。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;公式:&lt;/strong&gt;&lt;/p&gt;
$$\text{similarity} = \cos(\theta) = \frac{\mathbf{A} \cdot \mathbf{B}}{||\mathbf{A}|| \cdot ||\mathbf{B}||} = \frac{\sum_{i=1}^{n} A_i B_i}{\sqrt{\sum_{i=1}^{n} A_i^2} \cdot \sqrt{\sum_{i=1}^{n} B_i^2}}$$&lt;p&gt;令 &lt;strong&gt;A&lt;/strong&gt; = &lt;code&gt;vec(文档1)&lt;/code&gt; = &lt;code&gt;[1, 1, 1, 0, 1, 1]&lt;/code&gt;，&lt;strong&gt;B&lt;/strong&gt; = &lt;code&gt;vec(文档2)&lt;/code&gt; = &lt;code&gt;[1, 0, 1, 1, 1, 1]&lt;/code&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;计算点积 A · B&lt;/strong&gt;: $(1 \times 1) + (1 \times 0) + (1 \times 1) + (0 \times 1) + (1 \times 1) + (1 \times 1) = 1 + 0 + 1 + 0 + 1 + 1 = 4$&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;计算模长 ||A|| 和 ||B||&lt;/strong&gt;:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;||A||&lt;/code&gt; = $\sqrt{1^2+1^2+1^2+0^2+1^2+1^2} = \sqrt{5}$&lt;/p&gt;
&lt;p&gt;&lt;code&gt;||B||&lt;/code&gt; = $\sqrt{1^2+0^2+1^2+1^2+1^2+1^2} = \sqrt{5}$&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;计算相似度&lt;/strong&gt;:&lt;/p&gt;
$$\cos(\theta) = \frac{4}{\sqrt{5} \cdot \sqrt{5}} = \frac{4}{5} = 0.8$$&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;结果为&lt;code&gt;0.8&lt;/code&gt;，这是一个非常接近&lt;code&gt;1&lt;/code&gt;的值，这从数学上证明了这两个文档是高度相似的。&lt;/p&gt;
&lt;h5 id="224-不同统计方式"&gt;2.2.4 不同统计方式
&lt;/h5&gt;&lt;p&gt;词袋模型向量中每一维的值，可以根据不同策略来确定：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;频数&lt;/strong&gt;: 直接使用单词在文档中出现的次数。这是最简单直接的方式，但会受到文章长度影响，长文章的计数值会普遍偏高。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;频率&lt;/strong&gt;: 使用单词在文档中出现的次数除以文档的总词数，即词频（TF）。这在一定程度上缓解了文档长度不同带来的问题。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;二进制&lt;/strong&gt;: 只关心单词是否出现，出现即为&lt;code&gt;1&lt;/code&gt;，不出现为&lt;code&gt;0&lt;/code&gt;，不关心出现的次数。&lt;/li&gt;
&lt;/ul&gt;
&lt;h5 id="225-优点与局限"&gt;2.2.5 优点与局限
&lt;/h5&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;优点&lt;/strong&gt;：实现简单，并且在&lt;strong&gt;文本分类&lt;/strong&gt;等任务上，因为这类任务的核心在于判断&amp;quot;文档里有什么词&amp;rdquo;，而非&amp;quot;词与词之间如何关联&amp;quot;，所以即使丢失了词序，也常常能取得不错的效果。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;缺点&lt;/strong&gt;：
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;丢失词序&lt;/strong&gt;：&lt;code&gt;&amp;quot;我 爱 你&amp;quot;&lt;/code&gt; 和 &lt;code&gt;&amp;quot;你 爱 我&amp;quot;&lt;/code&gt; 的词袋表示完全相同，无法区分语义差异。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;未考虑词的重要性&lt;/strong&gt;：像&amp;quot;的&amp;quot;、&amp;ldquo;是&amp;quot;这类在所有文档中都频繁出现的&lt;strong&gt;停用词&lt;/strong&gt;，会获得很高的频次，但它们对区分文档主题几乎没有贡献，反而会形成干扰。&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="23-n-gram-模型"&gt;2.3 N-gram 模型
&lt;/h4&gt;&lt;p&gt;词袋模型最大的局限在于丢失了词序信息，而 &lt;strong&gt;N-gram（N元语法）&lt;/strong&gt; 通过统计连续词组的方式弥补了这一短板。它不仅仅是对传统方法的改进，更是现代大语言模型（LLM）的&lt;strong&gt;鼻祖&lt;/strong&gt;，因为它最早引入了&lt;strong&gt;预测下一个词&lt;/strong&gt;的思想 [^2]。&lt;/p&gt;
&lt;h5 id="231-预测下一个词"&gt;2.3.1 预测下一个词
&lt;/h5&gt;&lt;p&gt;与词袋模型只关心“有什么词”不同，N-gram（1-gram 是特例）关心的是“词的顺序”。其核心基于&lt;strong&gt;马尔可夫假设&lt;/strong&gt;，也就是认为&lt;strong&gt;一个词出现的概率只取决于它前面 N-1 个词&lt;/strong&gt;。虽然这是一种简化，但它极大地降低了建模的复杂度。&lt;/p&gt;
&lt;p&gt;这正是&lt;strong&gt;生成式 AI&lt;/strong&gt; 的雏形。根据依赖的前文长度不同，常见的 N-gram 模型包括：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Unigram (1-gram)&lt;/strong&gt;: 即词袋模型。假设每个词都是独立的，完全不看前面。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Bigram (2-gram)&lt;/strong&gt;: 只看前 &lt;strong&gt;1&lt;/strong&gt; 个词。例如看到“喜欢”，预测下一个词是“玩”的概率。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Trigram (3-gram)&lt;/strong&gt;: 看前 &lt;strong&gt;2&lt;/strong&gt; 个词。例如看到“喜欢 玩”，预测下一个词是“GTA6”的概率。&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;现在的 GPT 等大模型，本质上可以被视为一个 &lt;strong&gt;N 非常非常大&lt;/strong&gt;（比如 N=128000）的超级 N-gram 模型。它们都在执行根据上文预测下一个词这一核心任务。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h5 id="232-示例"&gt;2.3.2 示例
&lt;/h5&gt;&lt;p&gt;对于句子 &lt;code&gt;&amp;quot;我 喜欢 玩 GTA6&amp;quot;&lt;/code&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Bigram 特征&lt;/strong&gt;：&lt;code&gt;{&amp;quot;我 喜欢&amp;quot;, &amp;quot;喜欢 玩&amp;quot;, &amp;quot;玩 GTA6&amp;quot;}&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Trigram 特征&lt;/strong&gt;：&lt;code&gt;{&amp;quot;我 喜欢 玩&amp;quot;, &amp;quot;喜欢 玩 GTA6&amp;quot;}&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;通过这种方式，模型就能区分 &lt;code&gt;&amp;quot;我 喜欢&amp;quot;&lt;/code&gt; 和 &lt;code&gt;&amp;quot;喜欢 我&amp;quot;&lt;/code&gt; 了，因为它捕捉到了局部的&lt;strong&gt;序列信息&lt;/strong&gt;。&lt;/p&gt;
&lt;h5 id="233-维度灾难"&gt;2.3.3 维度灾难
&lt;/h5&gt;&lt;p&gt;虽然 N-gram 找回了词序，但它付出了巨大的代价，这也是它被神经网络取代的原因：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;指数级爆炸&lt;/strong&gt;：如果词典有 10,000 个词，Bigram 就有 $10^8$ 种组合，Trigram 有 $10^{12}$ 种&amp;hellip; 这种&lt;strong&gt;维度灾难&lt;/strong&gt;是传统计算机无法承受的。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;数据稀疏&lt;/strong&gt;：绝大多数词的组合（如“大象 驾驶 飞机”）在语料中永远不会出现，导致概率为 0。为了解决这个问题，传统 NLP 发展出了复杂的&lt;strong&gt;平滑技术&lt;/strong&gt;，以及通过将词聚类来减少参数的&lt;strong&gt;基于类的 N-gram 模型&lt;/strong&gt; [^3]。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;正是为了从根本上解决这些问题，后续诞生了&lt;strong&gt;词向量&lt;/strong&gt;和&lt;strong&gt;神经网络语言模型&lt;/strong&gt;。&lt;/p&gt;
&lt;h4 id="24-tf-idf"&gt;2.4 TF-IDF
&lt;/h4&gt;&lt;p&gt;为了提升文档在向量空间中的区分度，解决&amp;quot;常见词权重过高&amp;quot;导致文档混淆的问题，&lt;strong&gt;TF-IDF（Term Frequency-Inverse Document Frequency）&lt;/strong&gt; 被提出。正如 Salton 等人所指出的，优秀的索引项应该能降低文档空间的密度，使语义不同的文档在空间中距离更远 [^1]。TF-IDF 就是实现这一目标的经典加权技术。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;TF-IDF 指出：一个词的重要性，与其在&lt;strong&gt;当前文档中出现的次数&lt;/strong&gt;成正比，与其在&lt;strong&gt;整个语料库中出现的频率&lt;/strong&gt;成反比。一个词在当前文档里越常见，但在其他文档里越罕见，其权重就越高。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h5 id="241-计算公式"&gt;2.4.1 计算公式
&lt;/h5&gt;&lt;p&gt;它由两部分组成：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;词频（Term Frequency, TF）&lt;/strong&gt;：衡量一个词在当前文档中出现的频繁程度。常见的计算方式有：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;原始频数： $TF(t, d) = f_{t,d}$&lt;/li&gt;
&lt;li&gt;归一化频率： $TF(t, d) = \frac{f_{t,d}}{\sum_{t&amp;rsquo; \in d} f_{t&amp;rsquo;,d}}$&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;其中 $f_{t,d}$ 表示词 $t$ 在文档 $d$ 中出现的次数。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;逆文档频率（Inverse Document Frequency, IDF）&lt;/strong&gt;：衡量一个词的&amp;quot;稀有&amp;quot;程度或&amp;quot;信息量&amp;rdquo;。这一概念由 Karen Sparck Jones 在 1972 年提出 [^4]。&lt;/p&gt;
$$ IDF(t, D) = \log \frac{|D|}{|\{d \in D : t \in d\}|} $$&lt;p&gt;其中 $|D|$ 是语料库中的总文档数， $|{d \in D : t \in d}|$ 是包含词 $t$ 的文档数。&lt;/p&gt;
&lt;p&gt;为避免除零错误，实际应用中常使用平滑版本：&lt;/p&gt;
$$ IDF(t, D) = \log \frac{|D|}{1 + |\{d \in D : t \in d\}|} $$&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;最终, 一个词的 TF-IDF 权重就是这两者的乘积：&lt;/p&gt;
$$ TF-IDF(t, d, D) = TF(t, d) \times IDF(t, D) $$&lt;p&gt;一个文档的 TF-IDF 向量, 就是由该文档中每个词的 TF-IDF 值构成的向量。&lt;/p&gt;
&lt;h5 id="242-实际应用"&gt;2.4.2 实际应用
&lt;/h5&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;关键词提取&lt;/strong&gt;：计算一篇文章中每个词的 TF-IDF 值，并按降序排列，排在最前面的通常就是这篇文章的关键词。&lt;code&gt;jieba&lt;/code&gt; 的关键词提取也内置了这种算法。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;文本相似度计算&lt;/strong&gt;：计算两篇文档的 TF-IDF 向量，再通过余弦相似度等方法判断它们的相似性。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;传统搜索引擎&lt;/strong&gt;：在早期的搜索引擎中，TF-IDF 是衡量查询词与网页相关性的核心指标之一。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="三序号化表示"&gt;三、序号化表示
&lt;/h3&gt;&lt;p&gt;虽然上述方法在传统机器学习时代扮演了重要角色，但在深度学习时代，它们已不再是主流。现代深度学习模型，尤其是大语言模型，采用的是一种更简洁、更灵活的输入方式——&lt;strong&gt;序号化（Sequentialization）&lt;/strong&gt;。&lt;/p&gt;
&lt;h4 id="31-核心思想转变"&gt;3.1 核心思想转变
&lt;/h4&gt;&lt;p&gt;在深度学习中，通常&lt;strong&gt;只进行最少的预处理&lt;/strong&gt;。不再像传统方法那样，费尽心思地设计复杂的特征工程（如计算 TF-IDF）来告诉模型哪些词重要。相反，只把文本转换成最基础的&lt;strong&gt;整数 ID 序列&lt;/strong&gt;，然后把&amp;quot;学习词语的含义和重要性&amp;quot;这个更复杂的任务，&lt;strong&gt;交给模型自己去完成&lt;/strong&gt;。&lt;/p&gt;
&lt;h4 id="32-序号化过程"&gt;3.2 序号化过程
&lt;/h4&gt;&lt;p&gt;&lt;strong&gt;序号化&lt;/strong&gt;，也称&amp;quot;整数编码&amp;quot;，是将&lt;strong&gt;分词后的词元序列&lt;/strong&gt;转换为深度学习模型能够处理的&lt;strong&gt;整数序列&lt;/strong&gt;的&lt;strong&gt;核心步骤&lt;/strong&gt;。其过程如下：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;构建词典&lt;/strong&gt;：与 One-Hot 类似，首先从训练语料中构建一个词典。但在深度学习中，这个词典通常是&lt;strong&gt;字级别&lt;/strong&gt;的（如BERT），或是&lt;strong&gt;子词级别&lt;/strong&gt;的（如GPT），而不是词级别的。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;增加特殊词元&lt;/strong&gt;：在词典中加入一些有特殊功能的 Token，至少包括：
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;[PAD]&lt;/code&gt; (Padding)：用于&lt;strong&gt;填充&lt;/strong&gt;。因为模型通常需要批处理（Batch Processing），一个批次内的所有句子必须长度相同。短句子会用&lt;code&gt;[PAD]&lt;/code&gt;填充到与最长句子一致的长度。其对应的 ID 通常是&lt;code&gt;0&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;[UNK]&lt;/code&gt; (Unknown)：用于表示所有在词典中&lt;strong&gt;未出现过&lt;/strong&gt;的词。其对应的 ID 通常是&lt;code&gt;1&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;此外，还可能有 &lt;code&gt;[CLS]&lt;/code&gt; (Classification), &lt;code&gt;[SEP]&lt;/code&gt; (Separator) 等用于特定任务的特殊词元。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;ID 映射&lt;/strong&gt;：将文本序列中的每个词元（字/子词）直接映射为其在词典中的&lt;strong&gt;整数 ID&lt;/strong&gt;。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;预训练模型的词典：&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;在实践中，很少从零开始为自己的小数据集构建词典。更常见的做法是，直接使用像 &lt;code&gt;BERT&lt;/code&gt;、&lt;code&gt;GPT&lt;/code&gt; 这类预训练模型官方提供的 &lt;strong&gt;词典文件（vocab.txt）&lt;/strong&gt; 。这些词典通常包含了数万个字、子词、符号等，是在海量通用语料上构建的，覆盖面非常广。&lt;/p&gt;
&lt;p&gt;例如，Google 的中文 BERT 模型词典 &lt;code&gt;vocab.txt&lt;/code&gt; 中就包含了约 21128 个词元，其中不仅有常用汉字，还包括了英文字母、数字、标点及 &lt;code&gt;[PAD]&lt;/code&gt;, &lt;code&gt;[UNK]&lt;/code&gt; 等特殊符号。&lt;/p&gt;
&lt;h4 id="33-序号化实例"&gt;3.3 序号化实例
&lt;/h4&gt;&lt;p&gt;假设有一个精简词典：&lt;/p&gt;
&lt;p&gt;&lt;code&gt;{'[PAD]': 0, '[UNK]': 1, '比': 2, '方': 3, '说': 4, '我': 5, '先': 6, '挣': 7, '它': 8, '一': 9, '个': 10, '亿': 11}&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;现在有三个句子需要处理：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;code&gt;我挣一个亿&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;比方说我&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;我先挣钱&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;第一步：分词 &amp;amp; 查找ID&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;句子1 (&lt;code&gt;我挣一个亿&lt;/code&gt;): &lt;code&gt;我&lt;/code&gt; (5), &lt;code&gt;挣&lt;/code&gt; (7), &lt;code&gt;一&lt;/code&gt; (9), &lt;code&gt;个&lt;/code&gt; (10), &lt;code&gt;亿&lt;/code&gt; (11) -&amp;gt; &lt;code&gt;[5, 7, 9, 10, 11]&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;句子2 (&lt;code&gt;比方说我&lt;/code&gt;): &lt;code&gt;比&lt;/code&gt; (2), &lt;code&gt;方&lt;/code&gt; (3), &lt;code&gt;说&lt;/code&gt; (4), &lt;code&gt;我&lt;/code&gt; (5) -&amp;gt; &lt;code&gt;[2, 3, 4, 5]&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;句子3 (&lt;code&gt;我先挣钱&lt;/code&gt;): &lt;code&gt;我&lt;/code&gt; (5), &lt;code&gt;先&lt;/code&gt; (6), &lt;code&gt;挣&lt;/code&gt; (7), &lt;code&gt;钱&lt;/code&gt; (不在词典中) -&amp;gt; &lt;code&gt;[5, 6, 7, 1]&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;第二步：填充 (Padding)&lt;/strong&gt;
为了将这三个长短不一的序列组成一个矩阵，需要以最长的序列（句子1，长度为5）为基准，对其他短序列用&lt;code&gt;[PAD]&lt;/code&gt;的ID &lt;code&gt;0&lt;/code&gt;进行填充。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;序列1 (长度5): &lt;code&gt;[5, 7, 9, 10, 11]&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;序列2 (长度4→5): &lt;code&gt;[2, 3, 4, 5, 0]&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;序列3 (长度4→5): &lt;code&gt;[5, 6, 7, 1, 0]&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;最终，我们得到一个 &lt;code&gt;3x5&lt;/code&gt; 的&lt;strong&gt;整数矩阵&lt;/strong&gt;。这个矩阵，就是喂给深度学习模型的最终输入。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 最终输入模型的张量（Tensor）&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;[[&lt;/span&gt;5, 7, 9, 10, 11&lt;span class="o"&gt;]&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;[&lt;/span&gt;2, 3, 4, 5, 0&lt;span class="o"&gt;]&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;[&lt;/span&gt;5, 6, 7, 1, 0&lt;span class="o"&gt;]]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;blockquote&gt;
&lt;p&gt;序号化本身并未解决语义鸿沟，其整数ID（如 &lt;code&gt;2&lt;/code&gt; 和 &lt;code&gt;3&lt;/code&gt;）不具备数学意义。它的真正价值是作为后续&lt;strong&gt;嵌入层&lt;/strong&gt;的输入。嵌入层会将这些ID查询并映射为低维、稠密的浮点数向量（即&lt;strong&gt;词向量&lt;/strong&gt;），而这个映射关系本身是在模型训练中&lt;strong&gt;学习&lt;/strong&gt;出来的 [^5]。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;h3 id="参考文献2"&gt;参考文献2
&lt;/h3&gt;&lt;p&gt;[1]: &lt;a class="link" href="https://doi.org/10.1145/361219.361220" target="_blank" rel="noopener"
&gt;Salton, G., Wong, A., &amp;amp; Yang, C. S. (1975). &lt;em&gt;A vector space model for automatic indexing&lt;/em&gt;. Communications of the ACM, 18(11), 613-620&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;[2]: &lt;a class="link" href="https://doi.org/10.1002/j.1538-7305.1951.tb01366.x" target="_blank" rel="noopener"
&gt;Shannon, C. E. (1951). &lt;em&gt;Prediction and entropy of printed English&lt;/em&gt;. Bell System Technical Journal, 30(1), 50-64&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;[3]: &lt;a class="link" href="https://aclanthology.org/J92-4003/" target="_blank" rel="noopener"
&gt;Brown, P. F., Desouza, P. V., Mercer, R. L., Pietra, V. J. D., &amp;amp; Lai, J. C. (1992). &lt;em&gt;Class-based n-gram models of natural language&lt;/em&gt;. Computational Linguistics, 18(4), 467-479&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;[4]: &lt;a class="link" href="https://doi.org/10.1108/eb026526" target="_blank" rel="noopener"
&gt;Jones, K. S. (1972). &lt;em&gt;A statistical interpretation of term specificity and its application in retrieval&lt;/em&gt;. Journal of Documentation, 28(1), 11-21&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;[5]: &lt;a class="link" href="https://www.jmlr.org/papers/v3/bengio03a.html" target="_blank" rel="noopener"
&gt;Bengio, Y., Ducharme, R., Vincent, P., &amp;amp; Jauvin, C. (2003). &lt;em&gt;A neural probabilistic language model&lt;/em&gt;. Journal of Machine Learning Research, 3(Feb), 1137-1155&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="第三节-从主题模型到-word2vec"&gt;第三节 从主题模型到 Word2Vec
&lt;/h2&gt;&lt;p&gt;无论是哑编码还是序号化，它们本身都存在一个根本性的缺陷：无法表达词与词之间的&lt;strong&gt;语义关系&lt;/strong&gt;。在这些表示方法中，不同词的向量通常是正交的（如One-Hot编码中点积为0），或者其ID大小关系是随机的，这导致模型无法从输入层面理解“国王”与“女王”的语义比“国王”与“苹果”更近。&lt;/p&gt;
&lt;p&gt;为了解决这个问题，&lt;strong&gt;分布式表示（Distributed Representation）&lt;/strong&gt; 被提出，目的是将词语映射到一个&lt;strong&gt;低维、稠密、且蕴含丰富语义信息&lt;/strong&gt;的连续向量空间中。本节将首先介绍一种基于传统机器学习思想的分布式表示方法——&lt;strong&gt;主题模型&lt;/strong&gt;，并在此基础上，引出真正开启了 NLP 新时代的经典算法——&lt;strong&gt;Word2Vec&lt;/strong&gt;。&lt;/p&gt;
&lt;h3 id="一寻找理想的词向量"&gt;一、寻找理想的词向量
&lt;/h3&gt;&lt;p&gt;理想中的词向量需要同时满足两个主要目标：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;语义蕴含&lt;/strong&gt;：向量之间的距离（如余弦相似度或欧氏距离）能够度量词语之间的语义相似度。这背后的原理是 &lt;strong&gt;分布式假设&lt;/strong&gt; 的朴素应用：&lt;strong&gt;如果两个词经常在相似的上下文中共同出现（Co-occurrence），那么它们的向量在空间上应该是彼此靠近的&lt;/strong&gt;。例如，&amp;ldquo;被子&amp;quot;和&amp;quot;床铺&amp;quot;经常一起出现，它们的向量就应该接近；而&amp;quot;椰子&amp;quot;和&amp;quot;企鹅&amp;quot;则应该相互远离。语义的相似性，正是这种&amp;quot;上下文共现&amp;quot;关系在向量空间中的自然体现。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;低维稠密&lt;/strong&gt;：摆脱“维度灾难”。词向量的维度应该是一个较小的、可控的超参数，而不是动辄数万的词典大小。并且，向量中的每一维都应是有意义的浮点数，而非绝大部分为0的稀疏表示。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;为实现这一目标，研究者们探索了不同的技术路径。其中，一条是基于&lt;strong&gt;全局文档统计&lt;/strong&gt;的&lt;strong&gt;主题模型&lt;/strong&gt;；另一条则是后来居上、并成为主流的、基于&lt;strong&gt;局部上下文预测&lt;/strong&gt;的&lt;strong&gt;神经网络模型&lt;/strong&gt;。&lt;/p&gt;
&lt;h3 id="二主题模型"&gt;二、主题模型
&lt;/h3&gt;&lt;p&gt;主题模型是基于机器学习和传统数学思想的经典方法。它尝试从宏观的视角，通过分析大量文档的词语共现统计，来发现词语间的潜在语义关联。其关键假设是：&lt;strong&gt;一篇文档由多个&amp;quot;主题&amp;quot;按一定比例混合而成，而一个主题又由多个&amp;quot;词语&amp;quot;按一定概率组成&lt;/strong&gt;。词语之所以会一同出现在某篇文档中，是因为它们都在共同描述这篇文章所包含的某个或某些潜在主题。&lt;/p&gt;
&lt;p&gt;例如，一篇关于&amp;quot;人工智能&amp;quot;的文档，会高频出现&amp;quot;深度学习&amp;rdquo;、&amp;ldquo;Transformer&amp;rdquo;、&amp;ldquo;注意力机制&amp;quot;等词。正是因为这些词都强关联于&amp;quot;AI技术&amp;quot;这个主题，它们才频繁地共现在一起。所以，&lt;strong&gt;一个词的向量，就可以用它与各个主题的关联强度来表示&lt;/strong&gt;。这其中最核心的技术，就是 &lt;strong&gt;矩阵分解（Matrix Factorization）&lt;/strong&gt;。&lt;/p&gt;
&lt;h4 id="21-svd-矩阵分解"&gt;2.1 SVD 矩阵分解
&lt;/h4&gt;&lt;p&gt;该方法将获取词向量的过程，巧妙地转化成了一个矩阵分解问题。&lt;/p&gt;
&lt;p align="center"&gt;
&lt;img src="https://cdn.jsdelivr.net/gh/Hanguangwu/MyImageBed01/img/2_3_1.gif" width="80%" alt="矩阵分解图示" /&gt;
&lt;br /&gt;
&lt;em&gt;图 2-2 矩阵分解图示&lt;/em&gt;
&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;构建“词-文档”矩阵&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;首先，以整个语料库为基础，构建一个巨大的&lt;strong&gt;词-文档矩阵 $X$&lt;/strong&gt;。这个矩阵的每一行代表一个词，每一列代表一篇文档，矩阵中 $X(i, j)$ 的值是词 $i$ 在文档 $j$ 中的重要性权重，可以使用 &lt;strong&gt;TF-IDF&lt;/strong&gt; 值来填充。这个矩阵通常是&lt;strong&gt;巨大且高度稀疏&lt;/strong&gt;的。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;矩阵分解&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;从线性代数的角度看，这个巨大的稀疏矩阵 $X$ 可以被近似分解为两个更小的、更稠密的矩阵的乘积。最常用的分解技术之一是 &lt;strong&gt;奇异值分解（SVD）&lt;/strong&gt;。&lt;/p&gt;
$$X_{m \times n} \approx W_{topic\, m \times k} \times H_{topic\, k \times n}$$&lt;ul&gt;
&lt;li&gt;$X_{m \times n}$ 是原始的词-文档矩阵， $m$ 是词典大小， $n$ 是文档数量。&lt;/li&gt;
&lt;li&gt;$k$ 是一个远小于 $m$ 和 $n$ 的超参数，代表期望发现的&lt;strong&gt;潜在主题数量&lt;/strong&gt;。&lt;/li&gt;
&lt;li&gt;$W_{topic}$ 表示 &lt;strong&gt;“词-主题矩阵”&lt;/strong&gt;。它的每一行，都是一个 $k$ 维的稠密向量，表示一个词与 $k$ 个主题的关联度。&lt;/li&gt;
&lt;li&gt;$H_{topic}$ 表示 &lt;strong&gt;“文档-主题矩阵”&lt;/strong&gt;。它的每一列，都是一个 $k$ 维的稠密向量，表示一篇文档在 $k$ 个主题上的分布。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;获取词向量&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;分解完成后，我们真正关心的是 &lt;strong&gt;“词-主题”矩阵 $W_{topic}$&lt;/strong&gt;。这个矩阵的&lt;strong&gt;每一行&lt;/strong&gt;，正是我们需要的&lt;strong&gt;词向量&lt;/strong&gt;。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;它将原来 $m$ 维的One-Hot编码，降维到了 $k$ 维。&lt;/li&gt;
&lt;li&gt;它是一个稠密向量，每个维度都代表了与某个主题的关联强度。&lt;/li&gt;
&lt;li&gt;它蕴含了语义信息。如果两个词（如&amp;quot;CPU&amp;quot;和&amp;quot;GPU&amp;rdquo;）经常在描述&amp;quot;硬件&amp;quot;这个主题的文档中共同出现，那么SVD分解的结果会使它们在对应&amp;quot;硬件&amp;quot;主题的那个维度上都有很高的值，从而使它们的最终词向量在空间上非常接近。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h4 id="22-聚类视角理解主题模型"&gt;2.2 聚类视角理解主题模型
&lt;/h4&gt;&lt;p&gt;从机器学习的角度看，主题模型本质上是一个&lt;strong&gt;聚类算法&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;文档聚类&lt;/strong&gt;：文档主题矩阵 $H_{topic}$ 将 $n$ 篇文档聚成 $k$ 个主题类别。每篇文档都有一个 $k$ 维向量，表示其属于各个主题的 &lt;strong&gt;置信度&lt;/strong&gt; 或 &lt;strong&gt;软分配&lt;/strong&gt;。例如，一篇文档可能70%属于&amp;quot;AI技术&amp;quot;主题，30%属于&amp;quot;数学理论&amp;quot;主题。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;词语倾向性&lt;/strong&gt;：单词主题矩阵 $W_{topic}$ 揭示了词语的主题倾向。有些词语（如&amp;quot;深度学习&amp;quot;、&amp;ldquo;Transformer&amp;rdquo;）更倾向于描述&amp;quot;AI技术&amp;quot;主题，而另一些词语（如&amp;quot;坦克&amp;quot;、&amp;ldquo;导弹&amp;rdquo;）则更倾向于描述&amp;quot;军事&amp;quot;主题。这在一定程度上减弱了“同义词”问题。虽然“番茄”和“西红柿”写法完全不同，但因为它们都高频出现在“烹饪”或“蔬菜”相关的主题中，它们在 $W_{topic}$ 矩阵中的向量表示就会非常相似。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;语义相关性的来源&lt;/strong&gt;：正因为描述同一主题的词语会在相同的主题维度上有较高的权重，它们的词向量才会在空间中彼此靠近，从而实现了语义信息的捕捉。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="23-总结与局限"&gt;2.3 总结与局限
&lt;/h4&gt;&lt;p&gt;主题模型（如其更广为人知的名字 &lt;strong&gt;LSA, Latent Semantic Analysis&lt;/strong&gt; [^1]）通过对全局的&amp;quot;词-文档&amp;quot;共现矩阵进行分解，成功地将词语映射到了一个低维的&amp;quot;主题空间&amp;quot;，从而得到了能够表达语义的稠密词向量。相关的技术还包括 &lt;strong&gt;PCA&lt;/strong&gt; 和 &lt;strong&gt;NMF（非负矩阵分解）&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;不过，这种方法也存在明显的局限性：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;计算代价高昂&lt;/strong&gt;：对一个大型语料库进行SVD分解，计算量和内存开销都极大。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;依赖全局统计&lt;/strong&gt;：它依赖的是全局的、粗粒度的文档级别共现信息，忽略了词语在句子中的局部上下文和词序信息，这使得它难以捕捉更精细的语义关系。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;难以集成&lt;/strong&gt;：这种&amp;quot;先统计，再分解&amp;quot;的流程，很难与现代的深度学习模型进行端到端的联合训练。&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="三word2vec"&gt;三、Word2Vec
&lt;/h3&gt;&lt;p&gt;与主题模型从全局文档统计中挖掘主题不同，由 Google 在 2013 年提出的 Word2Vec 算法 [^2]，将视角聚焦于词语的&lt;strong&gt;局部上下文&lt;/strong&gt;。它的思想来源于语言学中的&lt;strong&gt;分布式假设，即一个词的含义，由其上下文中的词语所决定&lt;/strong&gt; [^3]。&lt;/p&gt;
&lt;p&gt;换言之，如果两个词的上下文经常是相似的，那么这两个词的语义就是相近的。Word2Vec正是这一思想的数学实现。&lt;/p&gt;
&lt;h4 id="31-word2vec概述"&gt;3.1 Word2Vec概述
&lt;/h4&gt;&lt;p&gt;Word2Vec 通常被认为是一种&lt;strong&gt;浅层神经网络模型（Shallow Neural Network）&lt;/strong&gt;。其&amp;quot;浅层&amp;quot;体现在网络结构的简单性上，它&lt;strong&gt;移除了&lt;/strong&gt;传统神经概率语言模型（NNLM）中计算昂贵的&lt;strong&gt;非线性隐藏层&lt;/strong&gt;，直接将投影层与输出层相连。这种简洁的设计使得 Word2Vec 的计算非常高效，从而能够在大规模语料库上进行训练。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;目标与手段的分离：&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;理解Word2Vec的关键在于区分其&lt;strong&gt;最终目标&lt;/strong&gt;与&lt;strong&gt;实现手段&lt;/strong&gt;。神经网络结构本身只是获取词向量的一种方式，&lt;strong&gt;并非模型的最终目的&lt;/strong&gt;。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;最终目标&lt;/strong&gt;：获取一个高质量的 &lt;strong&gt;词向量查询表&lt;/strong&gt;。这本质上是一个巨大的矩阵 $W_{in}$ ， 矩阵的每一行就是对应单词的稠密向量。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;实现手段&lt;/strong&gt;：为了学习到这个查询表，Word2Vec设计了一个巧妙的&amp;quot;伪任务&amp;quot;——&lt;strong&gt;根据上下文预测中心词&lt;/strong&gt;（或反之），并在这个过程中，将词向量查询表作为&lt;strong&gt;模型参数&lt;/strong&gt;进行训练和优化。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;训练结束后，用于执行预测任务的神经网络本身会被&lt;strong&gt;丢弃&lt;/strong&gt;。不会使用它的输出，真正需要和保留的，只有作为其内部参数的那个 &lt;strong&gt;词向量查询表&lt;/strong&gt;。&lt;/p&gt;
&lt;h4 id="32-可学习的词向量矩阵"&gt;3.2 可学习的词向量矩阵
&lt;/h4&gt;&lt;p&gt;从数学上看，将一个单词的ID转换为其稠密向量的过程，在概念上可以分解为两步：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;输入&lt;/strong&gt;：一个代表单词的ID，例如 $3$ 。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;哑编码&lt;/strong&gt;：将ID $3$ 转换为一个维度等于词典大小 $|V|$ 的高维稀疏向量，例如 $[0, 0, 0, 1, 0, \ldots]$ ， 其中只有第 3 个位置为 1。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;矩阵乘法&lt;/strong&gt;：用这个One-Hot向量去乘以一个巨大的、可学习的&lt;strong&gt;参数矩阵 $W_{in}$&lt;/strong&gt;（尺寸为 $|V|\times D$）。这个矩阵 $W_{in}$ 就是最终想要得到的词向量查询表。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;由于One-Hot向量只有一个位置是1，这个矩阵乘法的结果，等效于直接从矩阵 $W_{in}$ 中 &lt;strong&gt;“抽取”出索引为 3 的那一行&lt;/strong&gt;。&lt;/p&gt;
&lt;h1 id="endbmatrix"&gt;$$
\begin{bmatrix} 0 &amp;amp; 0 &amp;amp; 0 &amp;amp; \color{#42b983}{1} &amp;amp; 0 &amp;amp; 0 \end{bmatrix}
\times
\begin{bmatrix}
2 &amp;amp; 8 &amp;amp; 5 &amp;amp; 3 &amp;amp; 1 \
9 &amp;amp; 4 &amp;amp; 7 &amp;amp; 2 &amp;amp; 6 \
3 &amp;amp; 1 &amp;amp; 8 &amp;amp; 5 &amp;amp; 0 \
5 &amp;amp; 6 &amp;amp; 2 &amp;amp; 9 &amp;amp; 4 \
8 &amp;amp; 0 &amp;amp; 3 &amp;amp; 7 &amp;amp; 2 \
4 &amp;amp; 2 &amp;amp; 9 &amp;amp; 6 &amp;amp; 1
\end{bmatrix}
&lt;/h1&gt;&lt;p&gt;\begin{bmatrix} \color{#42b983}{5} &amp;amp; \color{#42b983}{6} &amp;amp; \color{#42b983}{2} &amp;amp; \color{#42b983}{9} &amp;amp; \color{#42b983}{4} \end{bmatrix}
$$&lt;/p&gt;
&lt;p&gt;在实践中，为了极大地提升效率，程序并不会真的执行稀疏的矩阵乘法，而是直接实现一个 &lt;strong&gt;查询&lt;/strong&gt; 操作：根据输入的单词ID，直接从 $W_{in}$ 矩阵中获取对应的行向量。理解这里的关键在于，这个参数矩阵 $W_{in}$ &lt;strong&gt;本身就是学习的目标&lt;/strong&gt;。它被随机初始化，并在后续的训练过程中，通过CBOW或Skip-gram这样的 &lt;strong&gt;预测任务&lt;/strong&gt; 不断地被优化和调整。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;在 PyTorch 等深度学习框架中，&lt;code&gt;nn.Embedding&lt;/code&gt; 层本质上就是维护了这个 $W_{in}$ 矩阵（Lookup Table）。当我们在后续章节中搭建模型时，第一层通常都是 Embedding 层。它接收输入序列的整数 ID，直接通过查表将其映射为稠密的词向量，而这个矩阵的参数会随着整个模型的训练（反向传播）而被自动更新和学习。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h4 id="33-两种经典模型"&gt;3.3 两种经典模型
&lt;/h4&gt;&lt;p&gt;Word2Vec 包含 CBOW 和 Skip-gram 两种具体的实现模型。两者在任务设计上恰好相反，但最终都实现了相同的目标，即通过&lt;strong&gt;训练过程&lt;/strong&gt;得到一个高质量的词向量查询表。&lt;/p&gt;
&lt;h5 id="331-cbow-模型详解"&gt;3.3.1 CBOW 模型详解
&lt;/h5&gt;&lt;p&gt;如图 2-3，CBOW（Continuous Bag-of-Words）的任务是 &lt;strong&gt;“根据上下文预测中心词”&lt;/strong&gt;。&lt;/p&gt;
&lt;p align="center"&gt;
&lt;img src="https://cdn.jsdelivr.net/gh/Hanguangwu/MyImageBed01/img/2_3_2.svg" width="60%" alt="CBOW" /&gt;
&lt;br /&gt;
&lt;em&gt;图 2-3 CBOW&lt;/em&gt;
&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;数据流与维度变化：&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;假设 $B$ 是批大小， $S$ 是上下文单词数量， $|V|$ 是词典大小， $D$ 是词向量维度。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;输入层&lt;/strong&gt;：上下文窗口内的所有词对应的ID。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;数据形状&lt;/strong&gt;： $(B, S)$ ， 例如输入为 $[[1, 8, 10, 13, 14, 16], [8, 5, 14, 16, 18, 10]]$ 。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;词向量转换&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;操作&lt;/strong&gt;：将每个单词ID转换为对应的 $D$ 维词向量。这通过输入矩阵 $W_{in}$ （大小为 $|V|\times D$ ）实现，相当于公式中的 $v_{c-k} = W_{in}w_{c-k}$ 。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;数据形状变化&lt;/strong&gt;： $(B, S)$ -&amp;gt; $(B, S, D)$ 。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;上下文向量聚合&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;操作&lt;/strong&gt;：将一个样本中 $S$ 个上下文单词的 $D$ 维向量进行聚合（通常是&lt;strong&gt;求和&lt;/strong&gt;或&lt;strong&gt;平均&lt;/strong&gt;），得到上下文向量 $h$ 。原论文中使用的是平均，但在部分实现中也会采用求和。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;数据形状变化&lt;/strong&gt;： $(B, S, D)$ -&amp;gt; $(B, D)$ 。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;输出得分计算&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;操作&lt;/strong&gt;：将 $D$ 维的上下文向量与输出矩阵 $W_{out}$ （大小为 $D\times |V|$ ）相乘，得到 $|V|$ 维的得分向量，对应公式中的 $z_c = W_{out}^T, h$ （或按实现以右乘形式表示）。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;数据形状变化&lt;/strong&gt;： $(B, D)$ -&amp;gt; $(B, |V|)$ 。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;损失计算&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;操作&lt;/strong&gt;：使用 Softmax 将得分转换为概率分布，然后计算与真实中心词之间的交叉熵损失。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;优化&lt;/strong&gt;：通过反向传播更新输入矩阵 $W_{in}$ 和输出矩阵 $W_{out}$ 。最终需要的是训练好的输入矩阵 $W_{in}$ 。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;公式：&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;词向量转换&lt;/strong&gt;：对于上下文中的每个词 $w_{c-k}$ ，从输入矩阵 $W_{in}$ 中获取对应的词向量： $v_{c-k} = W_{in}w_{c-k}$&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;上下文向量&lt;/strong&gt;：将上下文窗口中所有词的词向量聚合（求和或平均），得到 $h = \frac{1}{S} \sum (v_{c-m} + \cdots + v_{c+m})$ （此处以平均为例）&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;输出得分&lt;/strong&gt;：将上下文向量与输出矩阵 $W_{out}$ 相乘： $z_c = W_{out}^T h$&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;损失函数&lt;/strong&gt;：模型的优化目标是最小化负对数似然：&lt;/p&gt;
$$
\begin{aligned}
\text{minimize } J &amp;= -\log P(w_c | w_{c-m}, \ldots, w_{c-1}, w_{c+1}, \ldots, w_{c+m}) \\
&amp;= -\log P(u_c | h) \\
&amp;= -\log \frac{\exp(u_c^T h)}{\sum_{j=1}^{|V|} \exp(u_j^T h)} \\
&amp;= -u_c^T h + \log \sum_{j=1}^{|V|} \exp(u_j^T h)
\end{aligned}
$$&lt;p&gt;其中 $u_c$ 是目标中心词的输出向量， $h$ 是上下文向量。&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h5 id="332-skip-gram-模型详解"&gt;3.3.2 Skip-gram 模型详解
&lt;/h5&gt;&lt;p&gt;与 CBOW 恰好相反，Skip-gram 的任务是 &lt;strong&gt;“根据中心词预测上下文”&lt;/strong&gt;。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Skip-gram 与 N-gram 的关系：&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;名字渊源&lt;/strong&gt;：Skip-gram 这个名字确实源于传统的 &lt;strong&gt;k-skip-n-gram&lt;/strong&gt; 模型（即允许跳过中间词的 N-gram）。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;核心区别&lt;/strong&gt;：虽然借用了“跳跃”的思想，但 Word2Vec 的 Skip-gram 是一种&lt;strong&gt;预测模型&lt;/strong&gt;，而非统计模型。它并不是为了“修复”N-gram，而是为了&lt;strong&gt;更高效地学习稠密词向量&lt;/strong&gt;。它通过“用中心词预测上下文”这一任务，强迫模型学习到词语的语义特征，从而彻底解决了传统 N-gram 面临的&lt;strong&gt;稀疏性&lt;/strong&gt;和&lt;strong&gt;维度灾难&lt;/strong&gt;问题。&lt;/li&gt;
&lt;/ol&gt;
&lt;/blockquote&gt;
&lt;p&gt;在具体实现上，它将一个预测任务，分解成了多个独立的子任务。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;数据流与维度变化：&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;输入层&lt;/strong&gt;：中心词的 ID 。
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;数据形状&lt;/strong&gt;： $(B, 1)$ 。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;词向量转换&lt;/strong&gt;：
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;操作&lt;/strong&gt;：将中心词 ID 通过查表（输入矩阵 $W_{in}$ ）转换为其 $D$ 维词向量 $v_{w_c}$ 。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;数据形状变化&lt;/strong&gt;： $(B, 1)$ -&amp;gt; $(B, 1, D)$ 。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;输出得分计算&lt;/strong&gt;：
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;操作&lt;/strong&gt;：将 $D$ 维的中心词向量 $v_{w_c}$ ， 与输出矩阵 $W_{out}$ 相乘，得到一个 $|V|$ 维的得分向量。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;数据形状变化&lt;/strong&gt;： $(B, 1, D)$ -&amp;gt; $(B, |V|)$ 。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;损失计算（多标签问题）&lt;/strong&gt;：
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;操作&lt;/strong&gt;：与 CBOW 不同，这里的目标是预测多个上下文单词（例如， $S$ 个）。因此，这一个 $|V|$ 维的得分向量将被 &lt;strong&gt;复用 $S$ 次&lt;/strong&gt;，分别与 $S$ 个真实的上下文单词计算损失。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;优化&lt;/strong&gt;：将 $S$ 个位置的损失&lt;strong&gt;全部相加&lt;/strong&gt;，然后进行反向传播，同时更新 $W_{in}$ 和 $W_{out}$ 。因为一个输入对应多个输出标签，这本质上是一个&lt;strong&gt;多标签分类问题&lt;/strong&gt;。在实际运用中，通常将其分解为多个独立的单标签分类任务：对每个上下文词位置，都使用 Softmax 进行一次独立的预测，然后将所有位置的损失相加。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;公式：&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;词向量转换&lt;/strong&gt;：对于中心词 $w_c$，从输入矩阵 $W_{in}$ 中获取对应的词向量： $v_c = W_{in}w_c$&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;输出得分计算&lt;/strong&gt;：将中心词向量与输出矩阵 $W_{out}$ 相乘： $z = W_{out}^T v_c$&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;损失函数&lt;/strong&gt;：模型的优化目标是最小化负对数似然。完整的数学推导过程如下：&lt;/p&gt;
$$
\begin{aligned}
\text{minimize } J &amp;= -\log P(w_{c-m}, \ldots, w_{c-1}, w_{c+1}, \ldots, w_{c+m} | w_c) \\
&amp;= -\log \prod_{j=0, j \neq m}^{2m} P(w_{c-m+j} | w_c) \\
&amp;= -\log \prod_{j=0, j \neq m}^{2m} P(u_{c-m+j} | v_c) \\
&amp;= -\log \prod_{j=0, j \neq m}^{2m} \frac{\exp(u_{c-m+j}^T v_c)}{\sum_{k=1}^{|V|} \exp(u_k^T v_c)} \\
&amp;= -\sum_{j=0, j \neq m}^{2m} u_{c-m+j}^T v_c + 2m \log \sum_{k=1}^{|V|} \exp(u_k^T v_c)
\end{aligned}
$$&lt;p&gt;其中 $v_c$ 是中心词的输入向量， $u_{c-m+j}$ 是上下文词的输出向量。&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;blockquote&gt;
&lt;p&gt;Skip-gram为每个&amp;quot;中心词-上下文词&amp;quot;对都创建了一个独立的学习任务，这使得它能够更好地学习到词与词之间更精细的关系。在处理&lt;strong&gt;低频词&lt;/strong&gt;和&lt;strong&gt;大数据集&lt;/strong&gt;时，通常能得到质量更高的词向量，但由于其任务量是CBOW的 $S$ 倍，训练速度相对较慢。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h5 id="333-滑动窗口的直观理解"&gt;3.3.3 滑动窗口的直观理解
&lt;/h5&gt;&lt;p&gt;在了解了模型的基本构造后，可以深入探讨Word2Vec是如何真正捕捉到语义的。以CBOW模型为例，其关键在于&lt;strong&gt;滑动窗口&lt;/strong&gt;机制如何生成大量高度重叠的训练样本。&lt;/p&gt;
&lt;p&gt;假设有一个很长的句子，并设窗口大小为 $k=7$（中心词左右各 7 个词）。通过在文本上滑动该窗口可以生成大量训练样本：对于 CBOW 任务，当窗口中心位于第 8 个单词时，模型使用上下文 $[w_1, \ldots, w_7]$ 与 $[w_9, \ldots, w_{15}]$ 预测 $w_8$；随后窗口右移一格，中心变为第 9 个单词，模型使用新的上下文 $[w_2, \ldots, w_8]$ 与 $[w_{10}, \ldots, w_{16}]$ 预测 $w_9$。比较这两次样本可见，它们有 12 个上下文词&lt;strong&gt;完全相同&lt;/strong&gt;（ $w_2 \sim w_7$ 与 $w_{10} \sim w_{15}$），因此两者的 &lt;strong&gt;上下文向量&lt;/strong&gt;（所有上下文词向量之和）在初始时就非常相似。&lt;/p&gt;
&lt;p&gt;模型的目标是：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;对于第一个样本，它需要调整参数，使得相似的上下文向量能够成功预测出 $w_8$。&lt;/li&gt;
&lt;li&gt;对于第二个样本，它需要让这个极其相似的上下文向量，又能成功预测出 $w_9$。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;为了同时满足这两个看似矛盾的目标，优化算法（如梯度下降）会找到一个“捷径”：&lt;strong&gt;如果 $w_8$ 和 $w_9$ 的词向量本身就足够接近，那么模型就能用一个相似的上下文向量同时很好地预测出它们俩&lt;/strong&gt;。这一现象在整个语料库中不断重复：当两个不同的词（如“笔记本”和“电脑”）因语言习惯而频繁出现在相似的上下文（如与“键盘”“屏幕”“CPU”等共现）时，为了降低总体损失，模型会将它们的词向量在空间中推向彼此靠近的位置，从而形成语义相似性。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;训练目标与余弦相似度：&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;从数学角度看，模型的最终目标是让 $|V|$ 维得分向量中，对应真实目标词的那个维度的值最大化。这个得分值，是由上下文向量 $x$（CBOW）或中心词向量 $v_c$（Skip-gram）与输出矩阵 $W_{out}$ 中对应目标词的行向量 $u_{target}$ 进行 &lt;strong&gt;点积&lt;/strong&gt; 得到的。&lt;/p&gt;
$$
\text{score} = x \cdot u_{target}
$$&lt;p&gt;两个向量的点积是余弦相似度公式的分子部分。因此，最大化这个点积得分，在几何上就是在&lt;strong&gt;促使上下文向量 $x$ 和目标词向量 $u_{target}$ 的夹角尽可能小，即让它们在空间上更接近&lt;/strong&gt;。这为前述的滑动窗口机制，提供了数学解释。实际训练中，为避免对整个词表进行 Softmax 归一化带来的高开销，可以用 Hierarchical Softmax 与负采样等近似方法加速训练 [^4]。&lt;/p&gt;
&lt;h3 id="4-word2vec的局限性"&gt;4. Word2Vec的局限性
&lt;/h3&gt;&lt;p&gt;尽管Word2Vec是里程碑式的算法，但存在一个根本性的局限性——它产生的是&lt;strong&gt;静态词向量&lt;/strong&gt;。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;上下文无关&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;对于词典中的任意一个词，Word2Vec 只会生成一个 &lt;strong&gt;固定&lt;/strong&gt; 的向量表示。这个向量是在整个语料库上训练得到的“平均”语义，与该词出现的具体上下文无关。&lt;/li&gt;
&lt;li&gt;这直接导致了 Word2Vec &lt;strong&gt;无法解决一词多义&lt;/strong&gt;的问题。例如，“小米”这个词，无论是在“农民伯伯正在收割小米”的语境中，还是在“小米公司发布了新手机”的语境中，Word2Vec 赋予它的词向量都是&lt;strong&gt;完全相同&lt;/strong&gt;的。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;静态的本质&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Word2Vec 的输出是一个巨大的查询表。训练完成后，这个表就固定下来了。在使用时，只是根据单词 ID 去查找对应的行向量，整个过程不涉及对上下文的动态分析。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="练习-1"&gt;练习
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;根据已经学过的内容使用 &lt;code&gt;20newsgroups&lt;/code&gt; 数据（from sklearn.datasets import fetch_20newsgroups）实现基于全连接的文本分类模型训练和推理代码（若自行实现困难，可以参考&lt;a class="link" href="https://github.com/datawhalechina/base-nlp/blob/main/docs/chapter7/02_lstm_text_classification.md" target="_blank" rel="noopener"
&gt;基于 LSTM 的文本分类&lt;/a&gt;）&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h3 id="参考文献3"&gt;参考文献3
&lt;/h3&gt;&lt;p&gt;[1]: &lt;a class="link" href="https://doi.org/10.1002/%28SICI%291097-4571%28199009%2941:6%3c391::AID-ASI1%3e3.0.CO;2-9" target="_blank" rel="noopener"
&gt;Deerwester, S., Dumais, S. T., Furnas, G. W., Landauer, T. K., &amp;amp; Harshman, R. (1990). &lt;em&gt;Indexing by latent semantic analysis&lt;/em&gt;. Journal of the American Society for Information Science, 41(6), 391-407&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;[2]: &lt;a class="link" href="https://arxiv.org/abs/1301.3781" target="_blank" rel="noopener"
&gt;Mikolov, T., Chen, K., Corrado, G., &amp;amp; Dean, J. (2013). &lt;em&gt;Efficient Estimation of Word Representations in Vector Space&lt;/em&gt;. arXiv:1301.3781&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;[3]: &lt;a class="link" href="https://doi.org/10.1080/00437956.1954.11659520" target="_blank" rel="noopener"
&gt;Harris, Z. S. (1954). &lt;em&gt;Distributional structure&lt;/em&gt;. Word, 10(2-3), 146-162&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;[4]: &lt;a class="link" href="https://arxiv.org/abs/1310.4546" target="_blank" rel="noopener"
&gt;Mikolov, T., Sutskever, I., Chen, K., Corrado, G., &amp;amp; Dean, J. (2013). &lt;em&gt;Distributed Representations of Words and Phrases and their Compositionality&lt;/em&gt;. arXiv:1310.4546&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="第四节-基于gensim的词向量实战"&gt;第四节 基于Gensim的词向量实战
&lt;/h2&gt;&lt;p&gt;前面已经学习了多种词向量表示，接下来尝试将这些理论转化为可运行的代码。本节将使用&lt;strong&gt;Gensim&lt;/strong&gt;进行实践，通过简洁的代码示例来应用前几章介绍的算法，来加深对模型工作原理的理解，并掌握其基本使用方法。&lt;/p&gt;
&lt;h3 id="一gensim-简介"&gt;一、Gensim 简介
&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;Gensim (Generate Similar)&lt;/strong&gt; 是一个功能强大且高效的Python库，专门用于处理原始的、非结构化的纯文本文档。它内置了多种主流的词向量和主题模型算法，如 Word2Vec、TF-IDF、LSA、LDA 等。&lt;/p&gt;
&lt;h4 id="11-核心概念"&gt;1.1 核心概念
&lt;/h4&gt;&lt;p&gt;使用 Gensim 时，会遇到几个概念：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;语料库&lt;/strong&gt;：这是 Gensim 处理的主要对象，可以简单理解为&lt;strong&gt;训练数据集&lt;/strong&gt;。分词后的文档通常表示为 &lt;code&gt;list[list[str]]&lt;/code&gt;；用于 TF-IDF、LDA 等模型的标准 BoW 语料库是包含稀疏向量的可迭代对象，每篇文档表示为 &lt;code&gt;[(token_id, frequency), ...]&lt;/code&gt;。例如 &lt;code&gt;[[&amp;quot;我&amp;quot;, &amp;quot;爱&amp;quot;, &amp;quot;吃&amp;quot;, &amp;quot;海参&amp;quot;], [&amp;quot;国足&amp;quot;, &amp;quot;惨败&amp;quot;, &amp;quot;泰国&amp;quot;]]&lt;/code&gt; 中每个子列表代表一篇独立的文档。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;词典&lt;/strong&gt;：这是一个将词语（token）映射到唯一整数ID的&lt;strong&gt;词汇表&lt;/strong&gt;。在使用词袋模型之前，必须先根据整个语料库构建一个词典。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;向量&lt;/strong&gt;：在Gensim中，一篇文档最终会被转换成一个数学向量。例如，使用词袋模型时，一篇文档 &lt;code&gt;[&amp;quot;我&amp;quot;, &amp;quot;爱&amp;quot;, &amp;quot;我&amp;quot;]&lt;/code&gt; 可能会被表示为 &lt;code&gt;[(0, 2), (1, 1)]&lt;/code&gt;。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;稀疏向量&lt;/strong&gt;：这是 Gensim 为了节省内存而采用的一种高效表示法。对于像 One-Hot 或词袋模型这样维度巨大且绝大多数值为0的向量，Gensim 不会存储所有0。例如，一个词袋向量 &lt;code&gt;[2, 1, 0, 0, ... , 0]&lt;/code&gt; 会被表示成 &lt;code&gt;[(0, 2), (1, 1)]&lt;/code&gt;，仅记录&lt;strong&gt;非零项的索引和值&lt;/strong&gt;，极大地减少了存储开销。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;模型&lt;/strong&gt;：在 Gensim 中，模型是一个用于实现&lt;strong&gt;向量转换&lt;/strong&gt;的算法。例如，&lt;code&gt;TfidfModel&lt;/code&gt; 可以将一个由词频构成的词袋向量，转换为一个由TF-IDF权重构成的向量。&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h4 id="12-内置模型"&gt;1.2 内置模型
&lt;/h4&gt;&lt;p&gt;Gensim 几乎涵盖了前面章节中讨论过的所有经典算法：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;TF-IDF&lt;/strong&gt;: &lt;code&gt;models.TfidfModel&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;主题模型 / 矩阵分解&lt;/strong&gt;:
&lt;ul&gt;
&lt;li&gt;LSA (Latent Semantic Analysis): &lt;code&gt;models.LsiModel&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;LDA (Latent Dirichlet Allocation): &lt;code&gt;models.LdaModel&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;NMF (Non-negative Matrix Factorization): &lt;code&gt;models.Nmf&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;神经网络词向量&lt;/strong&gt;:
&lt;ul&gt;
&lt;li&gt;Word2Vec: &lt;code&gt;models.Word2Vec&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;FastText: &lt;code&gt;models.FastText&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Doc2Vec: &lt;code&gt;models.Doc2Vec&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="13-安装gensim"&gt;1.3 安装gensim
&lt;/h4&gt;&lt;p&gt;直接使用pip即可：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;pip install gensim
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id="二gensim-工作流"&gt;二、Gensim 工作流
&lt;/h3&gt;&lt;blockquote&gt;
&lt;p&gt;&lt;a class="link" href="https://github.com/FutureUnreal/base-nlp/blob/main/code/C2/04_gensim.ipynb" target="_blank" rel="noopener"
&gt;本节完整代码&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;在 Gensim 中，将原始文本转换为TF-IDF或主题模型向量，通常遵循一个标准的三步流程。这个流程是后续应用的基础。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;准备语料&lt;/strong&gt;：将原始的文本文档进行分词，并整理成Gensim要求的格式——一个由列表构成的列表 &lt;code&gt;list[list[str]]&lt;/code&gt;，其中每个子列表代表一篇独立的文档。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;创建词典&lt;/strong&gt;：遍历所有分词后的文档，创建一个词典，将每个唯一的词元（Token）映射到一个从 0 开始的整数 ID。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;词袋化&lt;/strong&gt;：使用创建好的词典，将每一篇文档转换为其稀疏的词袋（BoW）向量。这个向量只记录文档中出现的词的 ID 及其频次，格式为 &lt;code&gt;[(token_id, frequency), ...]&lt;/code&gt;。&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;这个最终生成的 &lt;strong&gt;BoW语料库&lt;/strong&gt;，就是训练 TF-IDF、LDA 等模型的标准输入。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;以上三步适用于 TF-IDF、LSA、LDA、NMF 等基于 BoW 的模型；不适用于 Word2Vec/FastText/Doc2Vec 等神经网络词向量模型。后者直接以分词后的句子序列（&lt;code&gt;list[list[str]]&lt;/code&gt;）为输入，无需词袋化。详见下文“Word2Vec模型实战”。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;span class="lnt"&gt;16
&lt;/span&gt;&lt;span class="lnt"&gt;17
&lt;/span&gt;&lt;span class="lnt"&gt;18
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;jieba&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;gensim&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;corpora&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Step 1: 准备分词后的语料 (新闻标题)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;raw_headlines&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;央行降息，刺激股市反弹&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;球队赢得总决赛冠军，球员表现出色&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;tokenized_headlines&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;jieba&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;lcut&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;doc&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;doc&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;raw_headlines&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;分词后语料: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;tokenized_headlines&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Step 2: 创建词典&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;dictionary&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;corpora&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Dictionary&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;tokenized_headlines&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;词典: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;dictionary&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;token2id&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Step 3: 转换为BoW向量语料库&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;corpus_bow&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;dictionary&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;doc2bow&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;doc&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;doc&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;tokenized_headlines&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;BoW语料库: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;corpus_bow&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;示例输出：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;分词后语料: [[&amp;#39;央行&amp;#39;, &amp;#39;降息&amp;#39;, &amp;#39;，&amp;#39;, &amp;#39;刺激&amp;#39;, &amp;#39;股市&amp;#39;, &amp;#39;反弹&amp;#39;], [&amp;#39;球队&amp;#39;, &amp;#39;赢得&amp;#39;, &amp;#39;总决赛&amp;#39;, &amp;#39;冠军&amp;#39;, &amp;#39;，&amp;#39;, &amp;#39;球员&amp;#39;, &amp;#39;表现出色&amp;#39;]]
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;词典: {&amp;#39;刺激&amp;#39;: 0, &amp;#39;反弹&amp;#39;: 1, &amp;#39;央行&amp;#39;: 2, &amp;#39;股市&amp;#39;: 3, &amp;#39;降息&amp;#39;: 4, &amp;#39;，&amp;#39;: 5, &amp;#39;冠军&amp;#39;: 6, &amp;#39;总决赛&amp;#39;: 7, &amp;#39;球员&amp;#39;: 8, &amp;#39;球队&amp;#39;: 9, &amp;#39;表现出色&amp;#39;: 10, &amp;#39;赢得&amp;#39;: 11}
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;BoW语料库: [[(0, 1), (1, 1), (2, 1), (3, 1), (4, 1), (5, 1)], [(5, 1), (6, 1), (7, 1), (8, 1), (9, 1), (10, 1), (11, 1)]]
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id="三tf-idf与关键词权重"&gt;三、TF-IDF与关键词权重
&lt;/h3&gt;&lt;p&gt;TF-IDF 是衡量一个词在文档中重要性的经典加权方法。下面将继续使用新闻标题的例子，演示如何计算其 TF-IDF 向量。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;span class="lnt"&gt;16
&lt;/span&gt;&lt;span class="lnt"&gt;17
&lt;/span&gt;&lt;span class="lnt"&gt;18
&lt;/span&gt;&lt;span class="lnt"&gt;19
&lt;/span&gt;&lt;span class="lnt"&gt;20
&lt;/span&gt;&lt;span class="lnt"&gt;21
&lt;/span&gt;&lt;span class="lnt"&gt;22
&lt;/span&gt;&lt;span class="lnt"&gt;23
&lt;/span&gt;&lt;span class="lnt"&gt;24
&lt;/span&gt;&lt;span class="lnt"&gt;25
&lt;/span&gt;&lt;span class="lnt"&gt;26
&lt;/span&gt;&lt;span class="lnt"&gt;27
&lt;/span&gt;&lt;span class="lnt"&gt;28
&lt;/span&gt;&lt;span class="lnt"&gt;29
&lt;/span&gt;&lt;span class="lnt"&gt;30
&lt;/span&gt;&lt;span class="lnt"&gt;31
&lt;/span&gt;&lt;span class="lnt"&gt;32
&lt;/span&gt;&lt;span class="lnt"&gt;33
&lt;/span&gt;&lt;span class="lnt"&gt;34
&lt;/span&gt;&lt;span class="lnt"&gt;35
&lt;/span&gt;&lt;span class="lnt"&gt;36
&lt;/span&gt;&lt;span class="lnt"&gt;37
&lt;/span&gt;&lt;span class="lnt"&gt;38
&lt;/span&gt;&lt;span class="lnt"&gt;39
&lt;/span&gt;&lt;span class="lnt"&gt;40
&lt;/span&gt;&lt;span class="lnt"&gt;41
&lt;/span&gt;&lt;span class="lnt"&gt;42
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;jieba&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;gensim&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;corpora&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;models&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 1. 准备语料 (新闻标题，包含财经和体育两个明显主题)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;headlines&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;央行降息，刺激股市反弹&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;球队赢得总决赛冠军，球员表现出色&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;国家队公布最新一期足球集训名单&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;A股市场持续震荡，投资者需谨慎&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;篮球巨星刷新历史得分记录&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;理财产品收益率创下新高&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;tokenized_headlines&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;jieba&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;lcut&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;title&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;title&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;headlines&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 2. 创建词典和BoW语料库&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;dictionary&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;corpora&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Dictionary&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;tokenized_headlines&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;corpus_bow&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;dictionary&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;doc2bow&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;doc&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;doc&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;tokenized_headlines&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 3. 训练TF-IDF模型&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;tfidf_model&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;models&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;TfidfModel&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;corpus_bow&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 4. 将BoW语料库转换为TF-IDF向量表示&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;corpus_tfidf&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;tfidf_model&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;corpus_bow&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 辅助函数：把 (token_id, weight) 转成 (token, weight)，并按权重降序展示&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;tfidf_with_words&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;tfidf_vec&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;id2word&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;pairs&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[(&lt;/span&gt;&lt;span class="n"&gt;id2word&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;token_id&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;weight&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;token_id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;weight&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;tfidf_vec&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nb"&gt;sorted&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pairs&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="k"&gt;lambda&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;reverse&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;True&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 打印第一篇标题的TF-IDF向量&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;first_tfidf&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;list&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;corpus_tfidf&lt;/span&gt;&lt;span class="p"&gt;)[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;第一篇标题的TF-IDF向量:&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;first_tfidf&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;第一篇标题的TF-IDF向量(带词语):&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;tfidf_with_words&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;first_tfidf&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;dictionary&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 5. 对新标题应用模型&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;new_headline&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;股市大涨，牛市来了&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;new_headline_bow&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;dictionary&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;doc2bow&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;list&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;jieba&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;cut&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;new_headline&lt;/span&gt;&lt;span class="p"&gt;)))&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;new_headline_tfidf&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;tfidf_model&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;new_headline_bow&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s2"&gt;新标题的TF-IDF向量:&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;new_headline_tfidf&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;输出：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;span class="lnt"&gt;6
&lt;/span&gt;&lt;span class="lnt"&gt;7
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;第一篇标题的TF-IDF向量:
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;[(0, 0.44066740566370055), (1, 0.44066740566370055), (2, 0.44066740566370055), (3, 0.44066740566370055), (4, 0.44066740566370055), (5, 0.1704734229377651)]
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;第一篇标题的TF-IDF向量(带词语):
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;[(&amp;#34;刺激&amp;#34;, 0.44066740566370055), (&amp;#34;反弹&amp;#34;, 0.44066740566370055), (&amp;#34;央行&amp;#34;, 0.44066740566370055), (&amp;#34;股市&amp;#34;, 0.44066740566370055), (&amp;#34;降息&amp;#34;, 0.44066740566370055), (&amp;#34;，&amp;#34;, 0.1704734229377651)]
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;新标题的TF-IDF向量:
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;[(3, 0.9326446771245245), (5, 0.360796211497975)]
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h4 id="结果分析"&gt;结果分析
&lt;/h4&gt;&lt;ul&gt;
&lt;li&gt;原始的BoW向量只包含词频（整数），而 TF-IDF 向量则包含浮点数权重。&lt;/li&gt;
&lt;li&gt;像“，”这样在多篇文档中都出现的词，其 TF-IDF 权重会较低；而在特定财经新闻中出现的“股市”、“降息”等词，权重会相对较高。&lt;/li&gt;
&lt;li&gt;这个 TF-IDF 向量后续可用于计算文档相似度或作为机器学习模型的输入特征。&lt;/li&gt;
&lt;li&gt;词典外的新词会被忽略，新文本的向量仅由词典中已有词构成。&lt;/li&gt;
&lt;li&gt;本示例中标点“，”进入了词典并具有非零权重；如不希望其影响权重或相似度，建议在构建词典前移除标点/停用词。&lt;/li&gt;
&lt;li&gt;你会看到新标题的TF-IDF仅包含“股市”和“，”两项，这是因为其他词为OOV被忽略。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="四lda-与文档主题挖掘"&gt;四、LDA 与文档主题挖掘
&lt;/h3&gt;&lt;p&gt;主题模型（如 LDA）能从大量文档中自动发现隐藏的、无监督的主题。它的输入同样是词典和 BoW 语料库。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;span class="lnt"&gt;16
&lt;/span&gt;&lt;span class="lnt"&gt;17
&lt;/span&gt;&lt;span class="lnt"&gt;18
&lt;/span&gt;&lt;span class="lnt"&gt;19
&lt;/span&gt;&lt;span class="lnt"&gt;20
&lt;/span&gt;&lt;span class="lnt"&gt;21
&lt;/span&gt;&lt;span class="lnt"&gt;22
&lt;/span&gt;&lt;span class="lnt"&gt;23
&lt;/span&gt;&lt;span class="lnt"&gt;24
&lt;/span&gt;&lt;span class="lnt"&gt;25
&lt;/span&gt;&lt;span class="lnt"&gt;26
&lt;/span&gt;&lt;span class="lnt"&gt;27
&lt;/span&gt;&lt;span class="lnt"&gt;28
&lt;/span&gt;&lt;span class="lnt"&gt;29
&lt;/span&gt;&lt;span class="lnt"&gt;30
&lt;/span&gt;&lt;span class="lnt"&gt;31
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;gensim&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;corpora&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;models&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 1. 准备语料&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;headlines&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;央行降息，刺激股市反弹&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;球队赢得总决赛冠军，球员表现出色&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;国家队公布最新一期足球集训名单&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;A股市场持续震荡，投资者需谨慎&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;篮球巨星刷新历史得分记录&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;理财产品收益率创下新高&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;tokenized_headlines&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;jieba&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;lcut&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;title&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;title&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;headlines&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 2. 创建词典和BoW语料库&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;dictionary&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;corpora&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Dictionary&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;tokenized_headlines&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;corpus_bow&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;dictionary&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;doc2bow&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;doc&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;doc&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;tokenized_headlines&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 3. 训练LDA模型 (假设需要发现2个主题)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;lda_model&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;models&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;LdaModel&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;corpus&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;corpus_bow&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;id2word&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;dictionary&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;num_topics&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;random_state&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 4. 查看模型发现的主题&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;模型发现的2个主题及其关键词:&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;topic&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;lda_model&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;print_topics&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;topic&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 5. 推断新文档的主题分布&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;new_headline&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;詹姆斯获得常规赛MVP&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;new_headline_bow&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;dictionary&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;doc2bow&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;jieba&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;lcut&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;new_headline&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;topic_distribution&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;lda_model&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;new_headline_bow&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s2"&gt;新标题 &amp;#39;&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;new_headline&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;#39; 的主题分布:&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;topic_distribution&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;输出：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;span class="lnt"&gt;6
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;模型发现的2个主题及其关键词:
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;(0, &amp;#39;0.045*&amp;#34;，&amp;#34; + 0.040*&amp;#34;公布&amp;#34; + 0.039*&amp;#34;一期&amp;#34; + 0.039*&amp;#34;名单&amp;#34; + 0.039*&amp;#34;足球&amp;#34; + 0.039*&amp;#34;最新&amp;#34; + 0.038*&amp;#34;集训&amp;#34; + 0.038*&amp;#34;国家队&amp;#34; + 0.037*&amp;#34;A股&amp;#34; + 0.037*&amp;#34;市场&amp;#34;&amp;#39;)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;(1, &amp;#39;0.066*&amp;#34;，&amp;#34; + 0.039*&amp;#34;篮球&amp;#34; + 0.039*&amp;#34;刷新&amp;#34; + 0.039*&amp;#34;历史&amp;#34; + 0.039*&amp;#34;记录&amp;#34; + 0.038*&amp;#34;得分&amp;#34; + 0.038*&amp;#34;巨星&amp;#34; + 0.037*&amp;#34;刺激&amp;#34; + 0.036*&amp;#34;降息&amp;#34; + 0.036*&amp;#34;反弹&amp;#34;&amp;#39;)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;新标题 &amp;#39;巨星詹姆斯获得常规赛MVP&amp;#39; 的主题分布:
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;[(0, 0.27247813), (1, 0.7275219)]
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;通过 LDA，不仅可以将一篇文档表示为一个主题概率分布（Gensim 默认以稀疏列表返回；例如 90% 体育、10% 财经），还能清晰地看到每个主题由哪些核心词构成。若新文本在词典中几乎无重叠词（&lt;code&gt;doc2bow&lt;/code&gt; 为空），推断出的主题分布可能接近均匀（例如 2 个主题时约为 0.5/0.5）。&lt;/p&gt;
&lt;h3 id="五word2vec-模型实战"&gt;五、Word2Vec 模型实战
&lt;/h3&gt;&lt;p&gt;与前两者不同，Word2Vec 的输入直接是 &lt;strong&gt;分词后的句子列表&lt;/strong&gt; 。它的目标不是加权或寻找主题，而是根据上下文学习每个词语本身内在的、稠密的语义向量。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;目标与手段
需要强调的核心观点是：Word2Vec训练结束后，神经网络本身通常会被丢弃。其 &lt;strong&gt;最终目标&lt;/strong&gt; 是获得那个高质量的 &lt;strong&gt;词向量查询表&lt;/strong&gt; ，它存储在 &lt;code&gt;model.wv&lt;/code&gt; 属性中。后续所有的应用，都是围绕这个查询表展开的。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h4 id="51-模型训练与核心参数"&gt;5.1 模型训练与核心参数
&lt;/h4&gt;&lt;p&gt;训练 Word2Vec 模型非常直接，关键在于理解其核心参数的设置。继续使用新闻标题的例子。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;span class="lnt"&gt;16
&lt;/span&gt;&lt;span class="lnt"&gt;17
&lt;/span&gt;&lt;span class="lnt"&gt;18
&lt;/span&gt;&lt;span class="lnt"&gt;19
&lt;/span&gt;&lt;span class="lnt"&gt;20
&lt;/span&gt;&lt;span class="lnt"&gt;21
&lt;/span&gt;&lt;span class="lnt"&gt;22
&lt;/span&gt;&lt;span class="lnt"&gt;23
&lt;/span&gt;&lt;span class="lnt"&gt;24
&lt;/span&gt;&lt;span class="lnt"&gt;25
&lt;/span&gt;&lt;span class="lnt"&gt;26
&lt;/span&gt;&lt;span class="lnt"&gt;27
&lt;/span&gt;&lt;span class="lnt"&gt;28
&lt;/span&gt;&lt;span class="lnt"&gt;29
&lt;/span&gt;&lt;span class="lnt"&gt;30
&lt;/span&gt;&lt;span class="lnt"&gt;31
&lt;/span&gt;&lt;span class="lnt"&gt;32
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;gensim.models&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Word2Vec&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 1. 准备语料&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;headlines&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;# 财经&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;央行降息，刺激股市反弹&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;A股市场持续震荡，投资者需谨慎&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;理财产品收益率创下新高&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;证监会发布新规，规范市场交易&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;创业板指数上涨，科技股领涨大盘&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;房价调控政策出台，房地产市场降温&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;全球股市动荡，影响资本市场信心&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;分析师认为，当前股市风险与机遇并存，市场情绪复杂&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;# 体育&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;球队赢得总决赛冠军，球员表现出色&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;国家队公布最新一期足球集训名单&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;篮球巨星刷新历史得分记录&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;奥运会开幕，中国代表团旗手确定&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;马拉松比赛圆满结束，选手创造佳绩&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;电子竞技联赛吸引大量年轻观众&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;这支球队的每位球员都表现出色&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;球员转会市场活跃，多支球队积极引援&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;tokenized_headlines&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;jieba&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;lcut&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;title&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;title&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;headlines&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 2. 训练Word2Vec模型&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;model&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Word2Vec&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;tokenized_headlines&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;vector_size&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;50&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;window&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;min_count&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;sg&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 训练完成后，所有词向量都存储在 model.wv 对象中&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# model.wv 是一个 KeyedVectors 实例&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;strong&gt;参数解析：&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;sentences&lt;/code&gt;: 输入的语料库，必须是 &lt;code&gt;list[list[str]]&lt;/code&gt; 格式。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;vector_size&lt;/code&gt;: 词向量的维度。维度越高，能表达的语义信息越丰富，但计算量也越大。通常在50-300之间选择。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;window&lt;/code&gt;: 上下文窗口大小。表示在预测一个词时，需要考虑其前后多少个词。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;min_count&lt;/code&gt;: &lt;strong&gt;最小词频过滤&lt;/strong&gt;。任何在整个语料库中出现次数低于此值的词将被直接忽略。这是非常关键的一步，可以过滤掉大量噪音（如错别字、罕见词），并显著减小模型体积。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;sg&lt;/code&gt;: 选择训练算法。&lt;code&gt;0&lt;/code&gt; 表示 &lt;strong&gt;CBOW&lt;/strong&gt; (根据上下文预测中心词)；&lt;code&gt;1&lt;/code&gt; 表示 &lt;strong&gt;Skip-gram&lt;/strong&gt; (根据中心词预测上下文)。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;hs&lt;/code&gt;: 选择优化策略。&lt;code&gt;0&lt;/code&gt; 表示使用 &lt;strong&gt;Negative Sampling&lt;/strong&gt; (负采样)；&lt;code&gt;1&lt;/code&gt; 表示使用 &lt;strong&gt;Hierarchical Softmax&lt;/strong&gt;。当 &lt;code&gt;hs=0&lt;/code&gt; 时，下面的 &lt;code&gt;negative&lt;/code&gt; 参数才会生效。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;negative&lt;/code&gt;: 当使用负采样时，为每个正样本随机选择多少个负样本。通常在5-20之间。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;sample&lt;/code&gt;: &lt;strong&gt;高频词二次重采样阈值&lt;/strong&gt;。这是一个控制高频词（如“的”、“是”）被随机跳过的机制，目的是减少它们对模型训练的过多影响，并加快训练速度。值越小，高频词被跳过的概率越大。&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="52-使用词向量"&gt;5.2 使用词向量
&lt;/h4&gt;&lt;p&gt;模型训练完成后，所有的操作都围绕 &lt;code&gt;model.wv&lt;/code&gt; 展开，用于探索词语间的语义关系。小语料示例下，相似度数值通常较低且不稳定，仅作演示参考。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 1. 寻找最相似的词&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 在小语料上，结果可能不完美，但能体现出模型学习到了主题内的关联&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;similar_to_market&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;wv&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;most_similar&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;股市&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;与 &amp;#39;股市&amp;#39; 最相似的词: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;similar_to_market&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 2. 计算两个词的余弦相似度&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;similarity&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;wv&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;similarity&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;球队&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;球员&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s2"&gt;&amp;#39;球队&amp;#39; 和 &amp;#39;球员&amp;#39; 的相似度: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;similarity&lt;/span&gt;&lt;span class="si"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;.4f&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 3. 获取一个词的向量&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;market_vector&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;wv&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;市场&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s2"&gt;&amp;#39;市场&amp;#39; 的向量维度: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;market_vector&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;shape&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;输出：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;与 &amp;#39;股市&amp;#39; 最相似的词: [(&amp;#39;名单&amp;#39;, 0.3699544370174408), (&amp;#39;央行&amp;#39;, 0.3554984927177429), (&amp;#39;年轻&amp;#39;, 0.24192844331264496), (&amp;#39;联赛&amp;#39;, 0.23673078417778015), (&amp;#39;马拉松&amp;#39;, 0.20006775856018066), (&amp;#39;证监会&amp;#39;, 0.19390541315078735), (&amp;#39;每位&amp;#39;, 0.17580750584602356), (&amp;#39;积极&amp;#39;, 0.16841839253902435), (&amp;#39;球队&amp;#39;, 0.16585905849933624), (&amp;#39;理财产品&amp;#39;, 0.16510605812072754)]
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&amp;#39;球队&amp;#39; 和 &amp;#39;球员&amp;#39; 的相似度: -0.1552
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&amp;#39;市场&amp;#39; 的向量维度: (50,)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h4 id="53-模型的持久化"&gt;5.3 模型的持久化
&lt;/h4&gt;&lt;p&gt;在实际项目中，通常会把训练好的词向量保存下来，避免重复训练。推荐只保存 &lt;code&gt;KeyedVectors&lt;/code&gt; 对象，它更轻量、高效。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;gensim.models&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;KeyedVectors&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 保存词向量到文件&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;wv&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;save&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;news_vectors.kv&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 从文件加载词向量&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;loaded_wv&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;KeyedVectors&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;load&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;news_vectors.kv&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 加载后可以执行同样的操作&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s2"&gt;加载后，&amp;#39;球队&amp;#39; 和 &amp;#39;球员&amp;#39; 的相似度: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;loaded_wv&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;similarity&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;球队&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;球员&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="si"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;.4f&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;示例输出：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;加载后，&amp;#39;球队&amp;#39; 和 &amp;#39;球员&amp;#39; 的相似度: -0.1552
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;通过 Gensim，可以非常方便地训练自己的 Word2Vec 模型，并利用其强大的语义捕捉能力进行相似度计算、语义类比等 NLP 任务。&lt;/p&gt;</description></item></channel></rss>