<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
	<channel>
		<title>第 6 章 文本特征与模型复用 on 《从零学AI指南手册》</title>
		<link>https://mlwithme.github.io/ml/chapter06/</link>
		<description>Recent content in 第 6 章 文本特征与模型复用 on 《从零学AI指南手册》</description>
		<generator>Hugo</generator>
		<language>zh_CN</language>
		
		
		
		
			<atom:link href="https://mlwithme.github.io/ml/chapter06/index.xml" rel="self" type="application/rss+xml" />
			<item>
				<title>6.1 词袋模型</title>
				<link>https://mlwithme.github.io/ml/chapter06/e05b5928c41d4841/</link>
				<pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
				<guid>https://mlwithme.github.io/ml/chapter06/e05b5928c41d4841/</guid>
				<description>&lt;p&gt;在前面几个章节的示例介绍中，我们所用到的数据集都是已经处理好的数据，换句话说这些数据集的每个特征维度都已经转换成了可用于计算的数值形式，但是在实际的建模任务中，我们获得的数据集可能并不是这样的形式。例如文本形式的这类数据是我们在实际场景中会经常遇到的。同时，对于一个训练完成的模型通常我们都需要将其进行持久化保存以便在实际预测场景中进行使用。在本章内容中，我们首先将会介绍3中常见的文本向量化方法，然后再介绍如何对训练完成的模型进行持久化保存。整个第6章的学习路线如图6-1所示。&lt;/p&gt;&#xA;&lt;div align=center&gt;&lt;img width=&#34;500&#34; src=&#34;https://mlwithme.github.io/images/ml/240427133959.jpg&#34;/&gt; &lt;/div&gt; &lt;center&gt;图 6-1 文本特征提取与模型复用学习路线图&lt;/center&gt;&#xA;&lt;h1 id=&#34;61-词袋模型&#34;&gt;6.1 词袋模型&lt;a class=&#34;anchor&#34; href=&#34;#61-%e8%af%8d%e8%a2%8b%e6%a8%a1%e5%9e%8b&#34;&gt;#&lt;/a&gt;&lt;/h1&gt;&#xA;&lt;p&gt;如何对文本内容进行表示是整个机器学习领域中的一个重要研究方向。例如，对于下面这样一个邮件来说，应该采用什么样的方式对其进行量化呢？同时，我们知道在建模过程中需要保证每个样本的特征维度数都一样，但是这里每一封邮件的长度却并不同，这又该怎么处理呢？接下来，我们开始介绍机器学习中的第1种文本向量化方法——词袋模型（Bag Of Words, BOW）。&lt;/p&gt;&#xA;&lt;blockquote class=&#39;book-hint &#39;&gt;&#xA;&lt;p&gt;“股权分置已经牵动全国股民的心，是机会？还是陷阱？如果是机会，则应该如何把握？如果是陷阱，则应该如何规避？请单击此网址索取和讯专家团针对股权分置的操作指导： &lt;a href=&#34;http://www.spam.com/gwyqxjqxx/&#34;&gt;http://www.spam.com/gwyqxjqxx/&lt;/a&gt; ”。&lt;/p&gt;&#xA;&lt;/blockquote&gt;&lt;h2 id=&#34;611-理解词袋模型&#34;&gt;6.1.1 理解词袋模型&lt;a class=&#34;anchor&#34; href=&#34;#611-%e7%90%86%e8%a7%a3%e8%af%8d%e8%a2%8b%e6%a8%a1%e5%9e%8b&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;什么是词袋模型呢？其实词袋模型这个叫法非常形象，突出了模型的核心思想。所谓词袋模型是指，首先将训练样本中所有不重复的词放到这个袋子中构成一个有序词表（字典）；然后以这个词表为标准来遍历每个样本。如果词表中对应位置的词出现在样本中，则词表对应位置就用1来表示，没有出现就用0来表示；最后，对于每个样本来讲都将其向量化成了一个和词表长度一样的只含有0和1的向量。&lt;/p&gt;&#xA;&lt;p&gt;如图6-2所示，此示意图为一个直观的词袋模型转换示意图。左边为原始数据集（包含两个样本），中间为词表，右边为向量化的结果。&lt;/p&gt;&#xA;&lt;div align=center&gt;&lt;img width=&#34;550&#34; src=&#34;https://mlwithme.github.io/images/ml/p6-1.png&#34;/&gt;&lt;/div&gt;&lt;center&gt;图 6-2 词袋模型原理示意图&lt;/center&gt;&#xA;&lt;p&gt;其中&lt;code&gt;[1 1 0 1]&lt;/code&gt;的含义就是，在样本“机器学习是人工智能的子集”中有3个词出现在词表当中，分别是“机器学习”、“人工智能”和“子集”。&lt;/p&gt;&#xA;&lt;p&gt;因此，词袋模型的处理流程可以总结为以下3步：&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;1. 文本分词&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;首先需要将原始数据的每个样本进行分词处理（英文语料可以跳过这步）。&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;2. 构造词表&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;然后在所有的分词结果中去掉重复部分，保证每个词语只出现一次，并且同时要以任意一种顺序来固定词表中每个词的位置。&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;3. 文本向量化&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;遍历每个数据样本，若词表中的词出现在该样本中，则对应位置为1，否则为0。&lt;/p&gt;&#xA;&lt;p&gt;在图6-2中，对样本“机器学习是人工智能的子集”来讲，其中有3个词出现在词表中，所以词表中每个词的对应位置为1，而“深度学习”这个词并没有出现在样本中，所以对应位置为0。&lt;/p&gt;&#xA;&lt;p&gt;可以看出，向量化后每个样本特征维度的长度都和词表长度相同（图6-2中为4）。虽然这样做的好处是词表包含了样本中所有出现过的词，但是却很容易导致维度灾难。因为通常一个一般大小的中文数据集，可能会出现数万个词语（而这意味着转化后向量的维度也有这么大），所以在实际处理中，在分词结束后通常还会进行词频统计这一步，即统计每个词在数据集中出现的次数，然后只选择其中出现频率最高的前K个词作为最终的词表。最后，通常也会将一些无意义的虚词，即停用词（Stop Words）去掉，例如“的”、“啊”、“了”等。&lt;/p&gt;&#xA;&lt;h2 id=&#34;612-文本分词&#34;&gt;6.1.2 文本分词&lt;a class=&#34;anchor&#34; href=&#34;#612-%e6%96%87%e6%9c%ac%e5%88%86%e8%af%8d&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;通过6.1.1节内容的介绍可以知道，向量化的第1步是需要对文本进行分词处理。下面我们将介绍一款常用的开源分词工具jieba。当然，使用jieba库的前提是先要安装，读者可以先进入对应的虚拟环境中，然后通过命令&lt;code&gt;pip install jieba&lt;/code&gt;进行安装。&lt;/p&gt;&#xA;&lt;p&gt;这里先用下面这段文本进行分词处理并做词频统计。&lt;/p&gt;&#xA;&lt;blockquote class=&#39;book-hint &#39;&gt;&#xA;&lt;p&gt;央视网消息： 当地时间11日，美国国会参议院以88票对11票的结果通过了一项动议，允许国会“在总统以国家安全为由决定征收关税时”发挥一定的限制作用。这项动议主要针对加征钢、铝关税的232调查，目前尚不具有约束力。动议的主要发起者——共和党参议员鲍勃·科克说，11日的投票只是一小步，他会继续推动进行有约束力的投票。&lt;/p&gt;&#xA;&lt;/blockquote&gt;&lt;p&gt;可以看到，这段文本中还包含了很多标点符号和数字，显然暂时不需要这些内容，所以在分词的时候可以通过正则表达式进行过滤。同时，jieba库分别提供了两种分词模式来应对不同场景下的中文分词，下面分别进行介绍。完整代码可参见&lt;code&gt;AllBooKCode/Chapter06/C01_cut_words.py&lt;/code&gt; 文件。&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;1. 普通分词模式&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;普通分词模式指的是按照常规的分词方法，将一个句子分割成多个词语的组成形式，代码如下：&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f0f0f0;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#40a070&#34;&gt;1&lt;/span&gt; &lt;span style=&#34;color:#007020;font-weight:bold&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#0e84b5;font-weight:bold&#34;&gt;jieba&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;,&lt;/span&gt;&lt;span style=&#34;color:#0e84b5;font-weight:bold&#34;&gt;re&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#40a070&#34;&gt;2&lt;/span&gt; &lt;span style=&#34;color:#007020;font-weight:bold&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#06287e&#34;&gt;cutWords&lt;/span&gt;(s, cut_all&lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#007020;font-weight:bold&#34;&gt;False&lt;/span&gt;):&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#40a070&#34;&gt;3&lt;/span&gt;     cut_words &lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt; []&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#40a070&#34;&gt;4&lt;/span&gt;     s &lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt; re&lt;span style=&#34;color:#666&#34;&gt;.&lt;/span&gt;sub(&lt;span style=&#34;color:#4070a0&#34;&gt;&amp;#34;[A-Za-z0-9\：\·\—\，\。\“ \”]&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#4070a0&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;, s)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#40a070&#34;&gt;5&lt;/span&gt;     seg_list &lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt; jieba&lt;span style=&#34;color:#666&#34;&gt;.&lt;/span&gt;cut(s, cut_all&lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt;cut_all)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#40a070&#34;&gt;6&lt;/span&gt;     cut_words&lt;span style=&#34;color:#666&#34;&gt;.&lt;/span&gt;append(&lt;span style=&#34;color:#4070a0&#34;&gt;&amp;#34;/&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;.&lt;/span&gt;join(seg_list))&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;在上述代码中，第4行是将所有字母、数字、冒号、逗号、句号等过滤掉，第5行用来完成分词处理的过程，其中当&lt;code&gt;cut_all = False&lt;/code&gt;时，表示普通分词模式；第6行是将所有分词后的结果以&lt;code&gt;/&lt;/code&gt;进行分割展示。根据上述代码分词结束后便能看到以下所示的结果：&lt;/p&gt;</description>
			</item>
			<item>
				<title>6 .2 基于K近邻算法的垃圾邮件分类</title>
				<link>https://mlwithme.github.io/ml/chapter06/de59bf74d753457e/</link>
				<pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
				<guid>https://mlwithme.github.io/ml/chapter06/de59bf74d753457e/</guid>
				<description>&lt;h1 id=&#34;6-2-基于k近邻算法的垃圾邮件分类&#34;&gt;6 .2 基于K近邻算法的垃圾邮件分类&lt;a class=&#34;anchor&#34; href=&#34;#6-2-%e5%9f%ba%e4%ba%8ek%e8%bf%91%e9%82%bb%e7%ae%97%e6%b3%95%e7%9a%84%e5%9e%83%e5%9c%be%e9%82%ae%e4%bb%b6%e5%88%86%e7%b1%bb&#34;&gt;#&lt;/a&gt;&lt;/h1&gt;&#xA;&lt;p&gt;在6.1节内容中，我们介绍了2种简单的词袋模型，接下来我们以第2种词袋模型表示方法为例，通过K近邻算法来对垃圾邮件进行分类处理。下面用到的是一个中文的邮件分类数据集，包含垃圾邮件和非垃圾邮件两类，即一个二分类任务。其中&lt;code&gt;ham_5000.utf8&lt;/code&gt;和&lt;code&gt;spam_5000.utf8&lt;/code&gt;这两个文件中分别包含5000封正常邮件和垃圾邮件，文件中每行分别表示一封邮件，示例如下:&lt;/p&gt;&#xA;&lt;blockquote class=&#39;book-hint &#39;&gt;&#xA;&lt;p&gt;“我的意中人是一个盖世英雄，有一天他会踩着七色的云彩来娶我，我猜中了前头，可是我猜不着这结局”世间一切美好都有有效期限吧，坦然面对，接受幸福的彩排。&lt;/p&gt;&#xA;&lt;/blockquote&gt;&lt;p&gt;总地来讲，要完成这一文本分类任务，首先需要载入原始文本并对其中的每个样本进行分词处理，接着通过上面介绍的&lt;code&gt;CountVectorizer&lt;/code&gt;类来完成文本的向量化表示，并制作完成每个样本对应的类别以便构成一个完整的数据集，最后根据K近邻算法完成分类任务。不过在正式介绍文本分类任务之前，我们先来介绍如何对训练好的模型进行持久化和复用。&lt;/p&gt;&#xA;&lt;h2 id=&#34;621-复用模型&#34;&gt;6.2.1 复用模型&lt;a class=&#34;anchor&#34; href=&#34;#621-%e5%a4%8d%e7%94%a8%e6%a8%a1%e5%9e%8b&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;在实际应用场景中，我们不可能每次在对新数据进行预测时都从头开始训练一个模型。通常，模型在第1次训练完成后会被持久化保存下来，并且只要后续不需要再对模型做任何改动，在对新数据进行预测时，只需载入已有的模型进行复用[1]。完整代码参见&lt;code&gt;AllBooKCode/Chapter06/C05_bag_of_word_cla.py&lt;/code&gt; 文件。&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;1. 保存模型&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;首先需要定义一个函数来对传入的模型进行保存，代码如下：&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f0f0f0;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#40a070&#34;&gt;1&lt;/span&gt; &lt;span style=&#34;color:#007020;font-weight:bold&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#0e84b5;font-weight:bold&#34;&gt;joblib&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#40a070&#34;&gt;2&lt;/span&gt; &lt;span style=&#34;color:#007020;font-weight:bold&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#06287e&#34;&gt;save_model&lt;/span&gt;(model, &lt;span style=&#34;color:#007020&#34;&gt;dir&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#4070a0&#34;&gt;&amp;#39;MODEL&amp;#39;&lt;/span&gt;, MODEL_NAME&lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#4070a0&#34;&gt;&amp;#39;model.pkl&amp;#39;&lt;/span&gt;):&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#40a070&#34;&gt;3&lt;/span&gt;     &lt;span style=&#34;color:#007020;font-weight:bold&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color:#007020;font-weight:bold&#34;&gt;not&lt;/span&gt; os&lt;span style=&#34;color:#666&#34;&gt;.&lt;/span&gt;path&lt;span style=&#34;color:#666&#34;&gt;.&lt;/span&gt;exists(&lt;span style=&#34;color:#007020&#34;&gt;dir&lt;/span&gt;):&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#40a070&#34;&gt;4&lt;/span&gt;         os&lt;span style=&#34;color:#666&#34;&gt;.&lt;/span&gt;mkdir(&lt;span style=&#34;color:#007020&#34;&gt;dir&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#40a070&#34;&gt;5&lt;/span&gt;     path &lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt; os&lt;span style=&#34;color:#666&#34;&gt;.&lt;/span&gt;path&lt;span style=&#34;color:#666&#34;&gt;.&lt;/span&gt;join(&lt;span style=&#34;color:#007020&#34;&gt;dir&lt;/span&gt;, MODEL_NAME)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#40a070&#34;&gt;6&lt;/span&gt;     joblib&lt;span style=&#34;color:#666&#34;&gt;.&lt;/span&gt;dump(model,path )&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;在上述代码中，第3~4行用来判断当前是否存在&lt;code&gt;MODEL&lt;/code&gt;这个目录。如果不存在则创建。第5行是根据目录名称和模型名称拼接模型的保存路径。第6行用来将传入的模型以&lt;code&gt;MODEL_NAME&lt;/code&gt;的名称保存到&lt;code&gt;MODEL&lt;/code&gt;目录中。&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;2. 复用模型&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;在复用模型之前，需要先定义一个函数来对已有的模型进行载入，代码如下：&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f0f0f0;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#40a070&#34;&gt;1&lt;/span&gt; &lt;span style=&#34;color:#007020;font-weight:bold&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#06287e&#34;&gt;load_model&lt;/span&gt;(&lt;span style=&#34;color:#007020&#34;&gt;dir&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#4070a0&#34;&gt;&amp;#39;MODEL&amp;#39;&lt;/span&gt;, MODEL_NAME&lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#4070a0&#34;&gt;&amp;#39;model.pkl&amp;#39;&lt;/span&gt;):&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#40a070&#34;&gt;2&lt;/span&gt;     path &lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt; os&lt;span style=&#34;color:#666&#34;&gt;.&lt;/span&gt;path&lt;span style=&#34;color:#666&#34;&gt;.&lt;/span&gt;join(&lt;span style=&#34;color:#007020&#34;&gt;dir&lt;/span&gt;, MODEL_NAME)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#40a070&#34;&gt;3&lt;/span&gt;     &lt;span style=&#34;color:#007020;font-weight:bold&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color:#007020;font-weight:bold&#34;&gt;not&lt;/span&gt; os&lt;span style=&#34;color:#666&#34;&gt;.&lt;/span&gt;path&lt;span style=&#34;color:#666&#34;&gt;.&lt;/span&gt;exists(path):&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#40a070&#34;&gt;4&lt;/span&gt;         &lt;span style=&#34;color:#007020;font-weight:bold&#34;&gt;raise&lt;/span&gt; &lt;span style=&#34;color:#007020&#34;&gt;FileNotFoundError&lt;/span&gt;(&lt;span style=&#34;color:#4070a0&#34;&gt;f&lt;/span&gt;&lt;span style=&#34;color:#4070a0&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#70a0d0&#34;&gt;{&lt;/span&gt;path&lt;span style=&#34;color:#70a0d0&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#4070a0&#34;&gt; 模型不存在，请先训练模型！&amp;#34;&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#40a070&#34;&gt;5&lt;/span&gt;     model &lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt; joblib&lt;span style=&#34;color:#666&#34;&gt;.&lt;/span&gt;load(path)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#40a070&#34;&gt;6&lt;/span&gt;     &lt;span style=&#34;color:#007020;font-weight:bold&#34;&gt;return&lt;/span&gt; model&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;在上述代码中，第2~4行用来判断给定的路径中是否存在一个名为&lt;code&gt;MODEL_NAME&lt;/code&gt;的模型文件，如果不存在则进行提示。第5~6行用来返回载入后的模型。&lt;/p&gt;&#xA;&lt;p&gt;下面，我们将开始完整介绍如何在训练集上训练模型以及在测试数据上复用模型。&lt;/p&gt;&#xA;&lt;h2 id=&#34;622-载入原始文本&#34;&gt;6.2.2 载入原始文本&lt;a class=&#34;anchor&#34; href=&#34;#622-%e8%bd%bd%e5%85%a5%e5%8e%9f%e5%a7%8b%e6%96%87%e6%9c%ac&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;首先需要完成一个函数来载入本地文本以及构造每个样本对应的标签。同时，为了方便这部分代码在后续其它地方复用，我们将其放到了&lt;code&gt;utils&lt;/code&gt;下的&lt;code&gt;dataset&lt;/code&gt;模块中，可参见AllBooKCode/utils/dataset.py文件，示例代码如下：&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f0f0f0;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#40a070&#34;&gt;1&lt;/span&gt; DATA_HOME &lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt; os&lt;span style=&#34;color:#666&#34;&gt;.&lt;/span&gt;path&lt;span style=&#34;color:#666&#34;&gt;.&lt;/span&gt;join(os&lt;span style=&#34;color:#666&#34;&gt;.&lt;/span&gt;path&lt;span style=&#34;color:#666&#34;&gt;.&lt;/span&gt;dirname(os&lt;span style=&#34;color:#666&#34;&gt;.&lt;/span&gt;path&lt;span style=&#34;color:#666&#34;&gt;.&lt;/span&gt;dirname(&lt;span style=&#34;color:#bb60d5&#34;&gt;__file__&lt;/span&gt;)), &lt;span style=&#34;color:#4070a0&#34;&gt;&amp;#39;data&amp;#39;&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#40a070&#34;&gt;2&lt;/span&gt; &lt;span style=&#34;color:#007020;font-weight:bold&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#06287e&#34;&gt;load_spam&lt;/span&gt;():&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#40a070&#34;&gt;3&lt;/span&gt;     data_spam_dir &lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt; os&lt;span style=&#34;color:#666&#34;&gt;.&lt;/span&gt;path&lt;span style=&#34;color:#666&#34;&gt;.&lt;/span&gt;join(DATA_HOME, &lt;span style=&#34;color:#4070a0&#34;&gt;&amp;#39;spam&amp;#39;&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#40a070&#34;&gt;4&lt;/span&gt;     &lt;span style=&#34;color:#007020;font-weight:bold&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#06287e&#34;&gt;load_spam_data&lt;/span&gt;(file_path&lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#007020;font-weight:bold&#34;&gt;None&lt;/span&gt;):&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#40a070&#34;&gt;5&lt;/span&gt;         texts &lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt; []&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#40a070&#34;&gt;6&lt;/span&gt;         &lt;span style=&#34;color:#007020;font-weight:bold&#34;&gt;with&lt;/span&gt; &lt;span style=&#34;color:#007020&#34;&gt;open&lt;/span&gt;(file_path, encoding&lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#4070a0&#34;&gt;&amp;#39;utf-8&amp;#39;&lt;/span&gt;) &lt;span style=&#34;color:#007020;font-weight:bold&#34;&gt;as&lt;/span&gt; f:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#40a070&#34;&gt;7&lt;/span&gt;             &lt;span style=&#34;color:#007020;font-weight:bold&#34;&gt;for&lt;/span&gt; line &lt;span style=&#34;color:#007020;font-weight:bold&#34;&gt;in&lt;/span&gt; f:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#40a070&#34;&gt;8&lt;/span&gt;                 line &lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt; line&lt;span style=&#34;color:#666&#34;&gt;.&lt;/span&gt;strip(&lt;span style=&#34;color:#4070a0&#34;&gt;&amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#4070a0;font-weight:bold&#34;&gt;\n&lt;/span&gt;&lt;span style=&#34;color:#4070a0&#34;&gt;&amp;#39;&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#40a070&#34;&gt;9&lt;/span&gt;                 texts&lt;span style=&#34;color:#666&#34;&gt;.&lt;/span&gt;append(clean_str(line))&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#40a070&#34;&gt;10&lt;/span&gt;         &lt;span style=&#34;color:#007020;font-weight:bold&#34;&gt;return&lt;/span&gt; texts&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#40a070&#34;&gt;11&lt;/span&gt;     x_pos &lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt; load_spam_data(file_path&lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt;os&lt;span style=&#34;color:#666&#34;&gt;.&lt;/span&gt;path&lt;span style=&#34;color:#666&#34;&gt;.&lt;/span&gt;join(data_spam_dir, &lt;span style=&#34;color:#4070a0&#34;&gt;&amp;#39;ham_5000.utf8&amp;#39;&lt;/span&gt;))&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#40a070&#34;&gt;12&lt;/span&gt;     x_neg &lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt; load_spam_data(file_path&lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt;os&lt;span style=&#34;color:#666&#34;&gt;.&lt;/span&gt;path&lt;span style=&#34;color:#666&#34;&gt;.&lt;/span&gt;join(data_spam_dir, &lt;span style=&#34;color:#4070a0&#34;&gt;&amp;#39;spam_5000.utf8&amp;#39;&lt;/span&gt;))&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#40a070&#34;&gt;13&lt;/span&gt;     y_pos, y_neg &lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt; [&lt;span style=&#34;color:#40a070&#34;&gt;1&lt;/span&gt;] &lt;span style=&#34;color:#666&#34;&gt;*&lt;/span&gt; &lt;span style=&#34;color:#007020&#34;&gt;len&lt;/span&gt;(x_pos), [&lt;span style=&#34;color:#40a070&#34;&gt;0&lt;/span&gt;] &lt;span style=&#34;color:#666&#34;&gt;*&lt;/span&gt; &lt;span style=&#34;color:#007020&#34;&gt;len&lt;/span&gt;(x_neg)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#40a070&#34;&gt;14&lt;/span&gt;     x, y &lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt; x_pos &lt;span style=&#34;color:#666&#34;&gt;+&lt;/span&gt; x_neg, y_pos &lt;span style=&#34;color:#666&#34;&gt;+&lt;/span&gt; y_neg&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#40a070&#34;&gt;15&lt;/span&gt;     &lt;span style=&#34;color:#007020;font-weight:bold&#34;&gt;return&lt;/span&gt; x, y&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;在上述代码中，第1行用于获取当前工程目录下&lt;code&gt;data&lt;/code&gt;目录所在的绝对路径（今后本书中所使用到的数据集均会放到该目录下），其中&lt;code&gt;__file__&lt;/code&gt;为Python中的环境变量用于得到当前文件所在的绝对路径，而&lt;code&gt;os.path.dirname&lt;/code&gt;则是根据当前路径取对应的目录。例如在这里&lt;code&gt;DATA_HOME&lt;/code&gt;的结果将形如：&lt;/p&gt;</description>
			</item>
			<item>
				<title>6.3 考虑权重的词袋模型</title>
				<link>https://mlwithme.github.io/ml/chapter06/c6fdc78b49d44453/</link>
				<pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
				<guid>https://mlwithme.github.io/ml/chapter06/c6fdc78b49d44453/</guid>
				<description>&lt;h1 id=&#34;63-考虑权重的词袋模型&#34;&gt;6.3 考虑权重的词袋模型&lt;a class=&#34;anchor&#34; href=&#34;#63-%e8%80%83%e8%99%91%e6%9d%83%e9%87%8d%e7%9a%84%e8%af%8d%e8%a2%8b%e6%a8%a1%e5%9e%8b&#34;&gt;#&lt;/a&gt;&lt;/h1&gt;&#xA;&lt;p&gt;在6.1节中，我们介绍了两种基本的用于文本表示的词袋模型表示方法，两者之间的唯一区别就是一个考虑了词频而另外一个没有考虑。下面我们再介绍另外一种应用更为广泛和常见的词袋模型表示方式——TFIDF表示方法。&lt;/p&gt;&#xA;&lt;h2 id=&#34;631-理解tfidf&#34;&gt;6.3.1 理解TFIDF&lt;a class=&#34;anchor&#34; href=&#34;#631-%e7%90%86%e8%a7%a3tfidf&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;之所以陆续地会出现不同的向量化表示形式，其最终目的只有一个，即尽可能准确地对原始文本进行表示。词频逆文档频率（Term FrequenceInverse Document Frequence, TFIDF）实际上是词频与逆文档频率两者的乘积，其出现的原因在于，通常来讲在一个样本中一个词出现的频率越高，其重要性应该相应越高，即考虑到词频对文本向量的影响。但是如果仅仅考虑这一个因素，则同样会带来一个新的弊端，即有的词不只是在某个样本中出现的频率高，其实它在整个数据集中出现的频率都很高，而这样的词往往也是没有意义的，因此，TFIDF的做法是通过词的逆文档频率来加以修正调整。&lt;/p&gt;&#xA;&lt;h2 id=&#34;632-tfidf计算原理&#34;&gt;6.3.2 TFIDF计算原理&lt;a class=&#34;anchor&#34; href=&#34;#632-tfidf%e8%ae%a1%e7%ae%97%e5%8e%9f%e7%90%86&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;TFIDF的计算过程总体上可以分为两步，先统计词频，然后计算逆文档频率，最后将两者相乘得到TFIDF值[1]。&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;1. 统计词频&lt;/strong&gt;&#xA;&lt;/p&gt;&#xA;$$&#xA;\text{TF}=\text{某个词在该样本中出现的次数}\tag{6-1}&#xA;$$&lt;p&gt;&#xA;&lt;strong&gt;2. 计算逆文档频率&lt;/strong&gt;&#xA;&lt;/p&gt;&#xA;$$&#xA;\text{IDF}=\log \left( \frac{\text{总的样本数}}{\text{包含有该词的样本数}+1} \right)\tag{6-2}&#xA;$$&lt;p&gt;&#xA;其中$\log$表示取自然对数。&lt;/p&gt;&#xA;&lt;p&gt;根据式(6-2)可以发现，如果一个词越常见，则对应的分母就越大，逆文档频率就越小。分母之所以要加1，是为了避免分母为0时（当使用自定义词表时）的平滑处理。这就是最原始的IDF计算方式。不过这种做法的一个瑕疵是，当所有样本中都含有某个词的时候，计算出来的IDF为负数，因此，sklearn在实现IDF计算时采用了另外一种平滑处理方式&#xA;&lt;/p&gt;&#xA;$$&#xA;\text{IDF}=\log \left( \frac{\text{总的样本数}+1}{\text{包含有该词的样本数}+1} \right)+1\tag{6-3}&#xA;$$&lt;p&gt;&#xA;这样就同时避免了上面所出现的两种情况。在后面的计算示例中，我们也将采用式(6-3)来计算IDF值。&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;3. 计算TFIDF&lt;/strong&gt;&#xA;&lt;/p&gt;&#xA;$$&#xA;\text{TFIDF}=\text{TF} \times  \text{IDF}\tag{6-4}&#xA;$$&lt;p&gt;&#xA;最后，根据计算得到的TF和IDF值便可以根据式(6-4)计算TFIDF值。同时，对于数据集中的每个词都能计算并得到对应的TFIDF值，再将所有的值组合成一个矩阵便可得到文本的向量化表示。&lt;/p&gt;&#xA;&lt;p&gt;注意： 对于样本中的每个词，如果其没有出现在词表中，则对应的TFIDF值为0。&lt;/p&gt;&#xA;&lt;h2 id=&#34;633-tfidf计算示例&#34;&gt;6.3.3 TFIDF计算示例&lt;a class=&#34;anchor&#34; href=&#34;#633-tfidf%e8%ae%a1%e7%ae%97%e7%a4%ba%e4%be%8b&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;现在假设有以下4个样本（每个样本为列表中的一个元素）：&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f0f0f0;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#40a070&#34;&gt;1&lt;/span&gt; corpus &lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt; [&lt;span style=&#34;color:#4070a0&#34;&gt;&amp;#39;this is the first document&amp;#39;&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#40a070&#34;&gt;2&lt;/span&gt;           &lt;span style=&#34;color:#4070a0&#34;&gt;&amp;#39;this document is the second document&amp;#39;&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#40a070&#34;&gt;3&lt;/span&gt;           &lt;span style=&#34;color:#4070a0&#34;&gt;&amp;#39;and this is the third one&amp;#39;&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#40a070&#34;&gt;4&lt;/span&gt;           &lt;span style=&#34;color:#4070a0&#34;&gt;&amp;#39;is this the first document&amp;#39;&lt;/span&gt;]&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;同时，其对应的词表如下：&lt;/p&gt;</description>
			</item>
			<item>
				<title>6.4 词云图</title>
				<link>https://mlwithme.github.io/ml/chapter06/825fde8589654b16/</link>
				<pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
				<guid>https://mlwithme.github.io/ml/chapter06/825fde8589654b16/</guid>
				<description>&lt;h1 id=&#34;64-词云图&#34;&gt;6.4 词云图&lt;a class=&#34;anchor&#34; href=&#34;#64-%e8%af%8d%e4%ba%91%e5%9b%be&#34;&gt;#&lt;/a&gt;&lt;/h1&gt;&#xA;&lt;p&gt;在介绍完文本的向量化表示方法后，这里再顺便介绍一个实用的对文本按权重（频率）进行可视化的Python包word cloud。根据word cloud，可以将词语以权重大小或者词频高低来生成词云图，如图6-4所示。&lt;/p&gt;&#xA;&lt;div align=center&gt;&lt;img width=&#34;550&#34; src=&#34;https://mlwithme.github.io/images/ml/p6-3.png&#34;/&gt; &lt;/div&gt;&lt;center&gt;图 6-4 词云图示例&lt;/center&gt;&#xA;&lt;p&gt;在图6-4所展示的词云图中，是根据宋词分词统计后所形成的结果，其中字体越大表示其出现的频率越高或者TFIDF权重越大。&lt;/p&gt;&#xA;&lt;h2 id=&#34;641-生成词云图&#34;&gt;6.4.1 生成词云图&lt;a class=&#34;anchor&#34; href=&#34;#641-%e7%94%9f%e6%88%90%e8%af%8d%e4%ba%91%e5%9b%be&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;在生成词云图之前，首先需要统计词频或者TFIDF权重。接下来，以一个宋词数据集为例进行介绍。完整代码可参见&lt;code&gt;AllBooKCode/Chapter06/C07_word_cloud.py&lt;/code&gt; 文件。&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;1. 载入原始文本&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;首先需要载入原始的宋词数据，示例代码如下：&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f0f0f0;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#40a070&#34;&gt;1&lt;/span&gt; &lt;span style=&#34;color:#007020;font-weight:bold&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#06287e&#34;&gt;load_data_and_cut&lt;/span&gt;(file_path&lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#4070a0&#34;&gt;&amp;#39;./data/QuanSongCi.txt&amp;#39;&lt;/span&gt;):&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#40a070&#34;&gt;2&lt;/span&gt;     cut_words &lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#4070a0&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#40a070&#34;&gt;3&lt;/span&gt;     &lt;span style=&#34;color:#007020;font-weight:bold&#34;&gt;with&lt;/span&gt; &lt;span style=&#34;color:#007020&#34;&gt;open&lt;/span&gt;(file_path, encoding&lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#4070a0&#34;&gt;&amp;#39;utf-8&amp;#39;&lt;/span&gt;) &lt;span style=&#34;color:#007020;font-weight:bold&#34;&gt;as&lt;/span&gt; f:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#40a070&#34;&gt;4&lt;/span&gt;         &lt;span style=&#34;color:#007020;font-weight:bold&#34;&gt;for&lt;/span&gt; line &lt;span style=&#34;color:#007020;font-weight:bold&#34;&gt;in&lt;/span&gt; f:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#40a070&#34;&gt;5&lt;/span&gt;             line &lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt; line&lt;span style=&#34;color:#666&#34;&gt;.&lt;/span&gt;strip(&lt;span style=&#34;color:#4070a0&#34;&gt;&amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#4070a0;font-weight:bold&#34;&gt;\n&lt;/span&gt;&lt;span style=&#34;color:#4070a0&#34;&gt;&amp;#39;&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#40a070&#34;&gt;6&lt;/span&gt;             &lt;span style=&#34;color:#007020;font-weight:bold&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color:#007020&#34;&gt;len&lt;/span&gt;(line) &lt;span style=&#34;color:#666&#34;&gt;&amp;lt;&lt;/span&gt; &lt;span style=&#34;color:#40a070&#34;&gt;20&lt;/span&gt;:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#40a070&#34;&gt;7&lt;/span&gt;                 &lt;span style=&#34;color:#007020;font-weight:bold&#34;&gt;continue&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#40a070&#34;&gt;8&lt;/span&gt;             seg_list &lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt; jieba&lt;span style=&#34;color:#666&#34;&gt;.&lt;/span&gt;cut(clean_str(line), cut_all&lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#007020;font-weight:bold&#34;&gt;False&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#40a070&#34;&gt;9&lt;/span&gt;             cut_words &lt;span style=&#34;color:#666&#34;&gt;+=&lt;/span&gt; (&lt;span style=&#34;color:#4070a0&#34;&gt;&amp;#34; &amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#666&#34;&gt;.&lt;/span&gt;join(seg_list))&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#40a070&#34;&gt;10&lt;/span&gt;         all_words &lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt; cut_words&lt;span style=&#34;color:#666&#34;&gt;.&lt;/span&gt;split()&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#40a070&#34;&gt;11&lt;/span&gt;     &lt;span style=&#34;color:#007020;font-weight:bold&#34;&gt;return&lt;/span&gt; all_words&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;可以看到，上述代码和6.1.3节中的代码基本一样，所以在此就不再赘述。&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;2. 统计词频&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;接下来，通过&lt;code&gt;Counter&lt;/code&gt;计数器来完成分词结果中词频的统计，示例代码如下：&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f0f0f0;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#40a070&#34;&gt;1&lt;/span&gt; &lt;span style=&#34;color:#007020;font-weight:bold&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#06287e&#34;&gt;get_words_freq&lt;/span&gt;(all_words, top_k&lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#40a070&#34;&gt;500&lt;/span&gt;):&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#40a070&#34;&gt;2&lt;/span&gt;     c &lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt; Counter()&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#40a070&#34;&gt;3&lt;/span&gt;     &lt;span style=&#34;color:#007020;font-weight:bold&#34;&gt;for&lt;/span&gt; x &lt;span style=&#34;color:#007020;font-weight:bold&#34;&gt;in&lt;/span&gt; all_words:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#40a070&#34;&gt;4&lt;/span&gt;         &lt;span style=&#34;color:#007020;font-weight:bold&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color:#007020&#34;&gt;len&lt;/span&gt;(x) &lt;span style=&#34;color:#666&#34;&gt;&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#40a070&#34;&gt;1&lt;/span&gt; &lt;span style=&#34;color:#007020;font-weight:bold&#34;&gt;and&lt;/span&gt; x &lt;span style=&#34;color:#666&#34;&gt;!=&lt;/span&gt; &lt;span style=&#34;color:#4070a0&#34;&gt;&amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#4070a0;font-weight:bold&#34;&gt;\r\n&lt;/span&gt;&lt;span style=&#34;color:#4070a0&#34;&gt;&amp;#39;&lt;/span&gt;:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#40a070&#34;&gt;5&lt;/span&gt;             c[x] &lt;span style=&#34;color:#666&#34;&gt;+=&lt;/span&gt; &lt;span style=&#34;color:#40a070&#34;&gt;1&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#40a070&#34;&gt;6&lt;/span&gt;     vocab &lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt; {}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#40a070&#34;&gt;7&lt;/span&gt;     &lt;span style=&#34;color:#007020;font-weight:bold&#34;&gt;for&lt;/span&gt; (k, v) &lt;span style=&#34;color:#007020;font-weight:bold&#34;&gt;in&lt;/span&gt; c&lt;span style=&#34;color:#666&#34;&gt;.&lt;/span&gt;most_common(top_k):&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#40a070&#34;&gt;8&lt;/span&gt;         vocab[k] &lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt; v&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#40a070&#34;&gt;9&lt;/span&gt;     &lt;span style=&#34;color:#007020;font-weight:bold&#34;&gt;return&lt;/span&gt; vocab&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;在上述代码中，第2行用来定义一个计数器。第5行用来对每个词进行计数。第6~8行用来查找出现频率最高的前&lt;code&gt;top_k&lt;/code&gt;个词，并将词和出现频率以字典的形式进行存储。&lt;/p&gt;</description>
			</item>
			<item>
				<title>引用</title>
				<link>https://mlwithme.github.io/ml/chapter06/8451cffe49f5477c/</link>
				<pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
				<guid>https://mlwithme.github.io/ml/chapter06/8451cffe49f5477c/</guid>
				<description>&lt;h1 id=&#34;引用&#34;&gt;引用&lt;a class=&#34;anchor&#34; href=&#34;#%e5%bc%95%e7%94%a8&#34;&gt;#&lt;/a&gt;&lt;/h1&gt;&#xA;&lt;p&gt;[1] PEDREGOSA.scikitlearn: Machine Learning in Python［J］.JMLR 12,2011: 28252830.&lt;/p&gt;</description>
			</item>
	</channel>
</rss>
