<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Nlp on Xiangtao's log</title><link>https://www.xiaoxiangtao.cn/zh/tags/nlp/</link><description>Recent content in Nlp on Xiangtao's log</description><generator>Hugo</generator><language>zh-Hans</language><managingEditor>15989119660@163.com (Xiangtao XIAO)</managingEditor><webMaster>15989119660@163.com (Xiangtao XIAO)</webMaster><lastBuildDate>Fri, 22 May 2020 00:00:00 +0000</lastBuildDate><atom:link href="https://www.xiaoxiangtao.cn/zh/tags/nlp/feed.xml" rel="self" type="application/rss+xml"/><item><title>Gensim训练词向量与Embedding相关知识</title><link>https://www.xiaoxiangtao.cn/zh/posts/gensim-training-word-vector-and-embedding-related-knowledge/</link><pubDate>Fri, 22 May 2020 00:00:00 +0000</pubDate><author>15989119660@163.com (Xiangtao XIAO)</author><guid isPermaLink="false">https://www.xiaoxiangtao.cn/zh/posts/gensim-training-word-vector-and-embedding-related-knowledge/</guid><description>&lt;p&gt;在进行文本分类的时候，预处理我们可以自己做一个词向量模型，也可以采用预训练的模型。采用预训练的模型比如谷歌基于goole news训练的Word2vec模型，由于在大量文本数据中训练过，所以词的概率分布会比较准确，当自己的数据集比较小的时候，用预训练数据有利于提升模型的准确度。&lt;/p&gt;
&lt;p&gt;以下内容使用了tensorflow。&lt;/p&gt;
&lt;h2 id="训练文本生成word2vec模型"&gt;训练文本生成word2vec模型&lt;/h2&gt;
&lt;p&gt;自己训练模型一般有以下几步：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;处理数据集，首先gensim的Word2Vec()方法需要的输入是句子顺序的单词，比如 我 爱 你 而不是我爱你，所以要将文本数据分词处理，在这个过程中，我们可以去除停用词，英文全部小写，语法统一等处理，可能对词向量的训练比较有帮助。&lt;/li&gt;
&lt;li&gt;完成文本的处理以后，我们得到一个分词后的文本数据集，比如一个列表[&amp;lsquo;she&amp;rsquo;, &amp;lsquo;is&amp;rsquo;, &amp;lsquo;beautiful&amp;rsquo;]，在gensim模块中可以简单的使用model=gensim.models.word2vec.Word2Vec()得到训练的模型。&lt;br&gt;
该方法有一些参数：&lt;br&gt;
&lt;strong&gt;sentences&lt;/strong&gt;-即数据集；sg-设置训练算法，0代表CBOW，1代表skip-gram算法；&lt;br&gt;
&lt;strong&gt;size&lt;/strong&gt;-指特征向量的维度，默认为100，大的size需要更多数据，效果更好，但是过大则浪费资源，效果提升不明显；&lt;br&gt;
&lt;strong&gt;window&lt;/strong&gt;-当前词与预测词在一个句子中的最大距离，默认是5，比如 我 今天 成功 完成 工作，对于 成功，如果设置窗口为2，可能去预测的词就是我 今天 完成 和 工作，注意是最大值而不是一定选取四个词。最后模型输出的是一个概率分布，即一个词出现在其他词边的概率是多少，我们也就可以据此去发现相似的词。&lt;br&gt;
&lt;strong&gt;min_count&lt;/strong&gt;-去除词频小于min_count的词；&lt;br&gt;
&lt;strong&gt;hs&lt;/strong&gt;-1采用hierarchy softmax，0采用negative sample；&lt;br&gt;
&lt;strong&gt;iter&lt;/strong&gt;-迭代次数&lt;br&gt;
&lt;strong&gt;workers&lt;/strong&gt;-参数控制训练的并行数¨C9C    更多参考： &lt;a href="//www.cnblogs.com/kjkj/p/9825418.html"&gt;//www.cnblogs.com/kjkj/p/9825418.html&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;其他训练词向量有相似的方法和思路，网上有很多资料。&lt;/p&gt;
&lt;h2 id="使用预训练词向量"&gt;使用预训练词向量&lt;/h2&gt;
&lt;p&gt;首先加载获取到准备好的模型，然后我们的目标是得到一个embedding_metrics即词向量矩阵，词向量矩阵的shape为（vocab_size, embedding_dim），它是我们要用于训练的数据的每个词（更具体的说是词表中的词）在训练好的模型中的词向量组成的矩阵。&lt;/p&gt;
&lt;p&gt;接下来处理训练数据，即用tokenizer处理训练后的数据得到词表，然后将每条文本数据转变为用词表索引数字代替各单词表示的列表，这里给词编码的顺序是词频由高到低，再进行padding使句子输入变为定长，最后我们利用word_index和模型生成embedding_metrics，数据的准备就基本完成了。这些步骤使用tensorflow提供的api可以很简单的实现。&lt;/p&gt;
&lt;p&gt;生成代码及相关解释如下：&lt;/p&gt;
&lt;div class="highlight"&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;embedding_matrix&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;zeros&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nb"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;word_index&lt;/span&gt;&lt;span class="p"&gt;)&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;word2vec&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;vector_size&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;#  len(word_index) + 1，加1是因为word_index的标记是从1开始而非0，这样词索引与词向量刚好对应，并且对于padding后为&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;#  0的填充位置可以有对应的映射。&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="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;word&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;index&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;word_index&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;items&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;try&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;embedding_vector&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;word2vec&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;getitem&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;word&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;embedding_matrix&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nb"&gt;int&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;index&lt;/span&gt;&lt;span class="p"&gt;)]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;embedding_vector&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;    &lt;span class="k"&gt;except&lt;/span&gt; &lt;span class="ne"&gt;KeyError&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;vector not found for word - &lt;/span&gt;&lt;span class="si"&gt;%s&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="n"&gt;word&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="embedding层做了什么"&gt;Embedding层做了什么？&lt;/h2&gt;
&lt;p&gt;Embedding层就是以one hot为输入、中间层节点为词向量维数的全连接层！而这个全连接层的参数，就是一个“词向量表”即我们的embedding_metrics，也就是说，其实onehot的作用就是查表，选择onehot表示的词对应的词向量，然后输出到下一层去。如果我们不用预处理的词向量，就是放一个空矩阵在embedding层（或者说是随机初始化参数），然后在训练网络过程中更新参数。&lt;/p&gt;
&lt;div class="highlight"&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;Embedding&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;vocab&lt;/span&gt;&lt;span class="p"&gt;)&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;embedding_dim&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;input_length&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;weights&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;embedding_matrix&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;trainable&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="c1"&gt;# (len(vocab) + 1, embedding_dim)与embedding_matrix的shape是一致的。&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>NLP分类效果衡量指标(F1/p/r)</title><link>https://www.xiaoxiangtao.cn/zh/posts/nlp-classification-effect-measurement-index-f1-p-r/</link><pubDate>Fri, 22 May 2020 00:00:00 +0000</pubDate><author>15989119660@163.com (Xiangtao XIAO)</author><guid isPermaLink="false">https://www.xiaoxiangtao.cn/zh/posts/nlp-classification-effect-measurement-index-f1-p-r/</guid><description>&lt;h2 id="概念"&gt;概念&lt;/h2&gt;
&lt;p&gt;为什么要计算F1：避免样本分布带来的偏差，综合考量分类效果，假如有100个样本，其中1个正样本，99个负样本，如果模型的预测只输出0，那么正确率是99%，这时候用正确率来衡量模型的好坏显然是不对的。&lt;/p&gt;
&lt;p&gt;真实 1真实 0预测 1True Positive(TP)False Positive(FP)预测 0False Negative(FN)True Negative(TN)&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;查准率(precision)，预测正确的样本在所有预测为1的样本中的比例，该值反映有多少其他类被错误的归为该类。&lt;/li&gt;
&lt;li&gt;召回率(recall)，预测正确的样本在所有真实为1的样本中的比例，该值反映有多少该类被预测为其他类了。&lt;/li&gt;
&lt;li&gt;F1(F1-Score)， 精准率和召回率的调和平均数。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Micro-F1与Macro-F1&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;针对多标签分类而言衡量分类效果&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Micro-F1：直接计算所有类别的Precision和Recall，然后计算F1。（类别有权重，分到样本数多的类别有更大的影响力）&lt;/li&gt;
&lt;li&gt;Macro-F1：计算出每一个类的Precision和Recall并分别计算F1，最后将F1平均。（各类别的F1权重相同）&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="代码实现"&gt;&lt;strong&gt;代码实现&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;二分类&lt;/p&gt;
&lt;div class="highlight"&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="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;f1&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;y_hat&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;y_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="s1"&gt;&amp;#39;&amp;#39;&amp;#39;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt;    输入张量y_hat是输出层经过sigmoid激活的张量
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt;    y_true是label{0,1}的集和
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt;    model指的是如果是多任务分类，single会返回每个分类的f1分数，multi会返回所有类的平均f1分数（Marco-F1）
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt;    如果只是单个二分类任务，则可以忽略model
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt;    &amp;#39;&amp;#39;&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;    &lt;span class="n"&gt;epsilon&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mf"&gt;1e-7&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;    &lt;span class="n"&gt;y_hat&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;tf&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;round&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;y_hat&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="c1"&gt;#将经过sigmoid激活的张量四舍五入变为0，1输出&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&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;    &lt;span class="n"&gt;tp&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;tf&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;cast&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;tf&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;matmul&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;y_true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;y_hat&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;float&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="c1"&gt;#tn = tf.sum(tf.cast((1-y_hat)&amp;lt;em&amp;gt;(1-y_true), &amp;#39;float&amp;#39;), axis=0)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;    &lt;span class="n"&gt;fp&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;tf&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;cast&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;tf&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;matmul&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;y_true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;y_hat&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;float&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="n"&gt;fn&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;tf&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;cast&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;tf&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;matmul&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;y_true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;y_hat&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;float&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="s1"&gt;&amp;#39;tp: &amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;tp&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 class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;numpy&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;fp: &amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;  &lt;span class="n"&gt;fp&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 class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;numpy&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;fn: &amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;  &lt;span class="n"&gt;fn&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 class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;numpy&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;p&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;tp&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;tp&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="n"&gt;fp&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="n"&gt;epsilon&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="c1"&gt;#epsilon的意义在于防止分母为0，否则当分母为0时python会报错&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;    &lt;span class="n"&gt;r&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;tp&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;tp&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="n"&gt;fn&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="n"&gt;epsilon&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;f1&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="n"&gt;em&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;em&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="n"&gt;epsilon&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;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;f1&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 class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;numpy&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt; &lt;span class="n"&gt;p&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 class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;numpy&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt; &lt;span class="n"&gt;r&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 class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;numpy&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="n"&gt;result&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;em&gt;多标签&lt;/em&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;import tensorflow as tf
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;def f1(y_hat, y_true, model=&amp;#39;multi&amp;#39;):
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;    &amp;#39;&amp;#39;&amp;#39;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;    输入张量y_hat是输出层经过sigmoid激活的张量
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;    y_true是label{0,1}的集和
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;    model指的是如果是多任务分类，single会返回每个分类的f1分数，multi会返回所有类的平均f1分数（Marco-F1）
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;    如果只是单个二分类任务，则可以忽略model
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;    &amp;#39;&amp;#39;&amp;#39;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;    epsilon = 1e-7
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;    y_hat = tf.round(y_hat)#将经过sigmoid激活的张量四舍五入变为0，1输出
&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.cast()转换张量数据类型
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;    tp = tf.reduce_sum(tf.cast(y_hat&amp;lt;/em&amp;gt;y_true, &amp;#39;float&amp;#39;), axis=0) #取axis维数据求和
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;    #tn = tf.sum(tf.cast((1-y_hat)&amp;lt;em&amp;gt;(1-y_true), &amp;#39;float&amp;#39;), axis=0)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;    fp = tf.reduce_sum(tf.cast((1-y_hat)&amp;lt;/em&amp;gt;y_true, &amp;#39;float&amp;#39;), axis=0)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;    fn = tf.reduce_sum(tf.cast(y_hat&amp;lt;em&amp;gt;(1-y_true), &amp;#39;float&amp;#39;), axis=0)
&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;    p = tp/(tp+fp+epsilon)#epsilon的意义在于防止分母为0，否则当分母为0时python会报错
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;    r = tp/(tp+fn+epsilon)
&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;    f1 = 2&amp;lt;/em&amp;gt;p*r/(p+r+epsilon)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;    f1 = tf.where(tf.is_nan(f1), tf.zeros_like(f1), f1)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;    if model == &amp;#39;single&amp;#39;:
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;        return f1
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;    if model == &amp;#39;multi&amp;#39;:
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;        return tf.reduce_mean(f1)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="参考"&gt;&lt;strong&gt;参考&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;&lt;a href="//blog.csdn.net/zjn295771349/article/details/84961596"&gt;//blog.csdn.net/zjn295771349/article/details/84961596&lt;/a&gt;&lt;/p&gt;</description></item><item><title>Natural Language Processing相关概念理解</title><link>https://www.xiaoxiangtao.cn/zh/posts/understanding-of-related-concepts-of-natural-language/</link><pubDate>Thu, 21 May 2020 00:00:00 +0000</pubDate><author>15989119660@163.com (Xiangtao XIAO)</author><guid isPermaLink="false">https://www.xiaoxiangtao.cn/zh/posts/understanding-of-related-concepts-of-natural-language/</guid><description>&lt;h2 id="nlp一般流程"&gt;NLP一般流程&lt;/h2&gt;
&lt;p&gt;文本预处理-&amp;gt;词向量与文本表示-&amp;gt;特征选择与特征抽取-&amp;gt;分类算法&lt;/p&gt;
&lt;h2 id="词向量与文本表示"&gt;词向量与文本表示&lt;/h2&gt;
&lt;h3 id="词袋模型bow"&gt;词袋模型（BOW）&lt;/h3&gt;
&lt;p&gt;将所有词汇放进一个袋子里，假设有n个词，则每个句子表示为一个长度为n的词频向量，词频即对应词在句子里出现的次数，如果没有出现就是0。这种方法句子里的语义信息被完全遗失了。&lt;/p&gt;
&lt;h3 id="word-based-encodings"&gt;word based encodings&lt;/h3&gt;
&lt;p&gt;另一种思路是表示句子，这样就可以把词在句子中的位置关系考虑进去，例如 “我 喜欢 猫”和 “我 喜欢 狗”分别表示为（0 1 2）和（0 1 3），这里的数字不再是词频，而是对应单词被分配的编码，如果词重复了，显然在数组中对应的数字也会重复。&lt;/p&gt;
&lt;h3 id="padding"&gt;padding&lt;/h3&gt;
&lt;p&gt;句子长度不同时，需要将他们转化为统一长度的向量输入到神经网络中训练，这时就要padding，设置一个长度n，如果句子长度小于n，就在数组左侧或右侧填充0，如果句子长了，就把左侧或右侧多余的部分忽略，具体方位由自己选择。&lt;/p&gt;
&lt;h3 id="词向量模型word-embedding"&gt;词向量模型（word embedding）&lt;/h3&gt;
&lt;p&gt;考虑词与词之间的位置关系。原本用随机分配的数字代表每一个词，词与词之间是完全独立的，而embedding使得每一个词成为了一个n维空间中的向量，如果两个词的含义相近，那么相应的向量距离也就进，这样就考虑到了词的含义。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;word2Vec ：&lt;/strong&gt; 底层采用基于CBOW和Skip-Gram算法的神经网络模型。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;CBOW模型：&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;CBOW模型的训练输入是某一个特征词的上下文相关的词对应的词向量，而输出就是这特定的一个词的词向量。由于CBOW使用的是词袋模型，因此上下文的几个词都是平等的，也就是不考虑他们和我们关注的词之间的距离大小，只要在我们上下文之内即可。&lt;/p&gt;
&lt;p&gt;这样我们这个CBOW的例子里，我们的输入是上下文选定的词向量，输出是所有词的softmax概率（训练的目标是期望训练样本特定词对应的softmax概率最大），对应的CBOW神经网络模型输入层有4个神经元，输出层有词汇表大小个神经元。隐藏层的神经元个数我们可以自己指定。通过DNN的反向传播算法，我们可以求出DNN模型的参数，同时得到所有的词对应的词向量。这样当我们有新的需求，要求出某4个词对应的最可能的输出中心词时，我们可以通过一次DNN前向传播算法并通过softmax激活函数找到概率最大的词对应的神经元即可。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Skip-Gram模型：&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Skip-Gram模型和CBOW的思路是反着来的，即输入是特定的一个词的词向量，而输出是特定词对应的上下文词向量。&lt;/p&gt;
&lt;p&gt;这样我们这个Skip-Gram的例子里，我们的输入是特定词， 输出是softmax概率排前几的词，对应的Skip-Gram神经网络模型输入层有1个神经元，输出层有词汇表大小个神经元。隐藏层的神经元个数我们可以自己指定。通过DNN的反向传播算法，我们可以求出DNN模型的参数，同时得到所有的词对应的词向量。这样当我们有新的需求，要求出某1个词对应的最可能的4个上下文词时，我们可以通过一次DNN前向传播算法得到概率大小排前4的softmax概率对应的神经元所对应的词即可。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;词向量模型突出特点：&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;在词向量模型中，词向量与词向量之间有这非常特殊的特性。例如现在存在国王、男生、女人、皇后四个词向量，那么一个完善的词向量模型，就存在“国王-男人+女人=皇后”这样的关系。&lt;/p&gt;
&lt;p&gt;参考： &lt;a href="//www.cnblogs.com/chenyusheng0803/p/10978883.html"&gt;词袋模型（BOW，bag of words）和词向量模型（Word Embedding）概念介绍&lt;/a&gt;&lt;/p&gt;</description></item><item><title>NLP数据准备相关代码记录</title><link>https://www.xiaoxiangtao.cn/zh/posts/nlp-data-preparation-related-code-record/</link><pubDate>Thu, 21 May 2020 00:00:00 +0000</pubDate><author>15989119660@163.com (Xiangtao XIAO)</author><guid isPermaLink="false">https://www.xiaoxiangtao.cn/zh/posts/nlp-data-preparation-related-code-record/</guid><description>&lt;h2 id="csv文件"&gt;csv文件&lt;/h2&gt;
&lt;h3 id="什么是csv文件"&gt;什么是csv文件&lt;/h3&gt;
&lt;p&gt;csv既逗号分隔符文件，行数据用&amp;rsquo;,&amp;lsquo;分隔，列数据用换行符&amp;rsquo;\n&amp;rsquo;分隔&lt;/p&gt;
&lt;h3 id="读取与写入csv文件"&gt;读取与写入csv文件&lt;/h3&gt;
&lt;div class="highlight"&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="k"&gt;with&lt;/span&gt; &lt;span class="nb"&gt;open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;filename&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;r&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;encoding&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;gbk&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;rf&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;reader&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;csv&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;reader&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;rf&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;dialect&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;csv&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;excel&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;#  按行读取，读取的是存储为excel可读格式的csv文件，这个文件可以用excel打开查看&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="highlight"&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="k"&gt;with&lt;/span&gt; &lt;span class="nb"&gt;open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;r&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;clean_data\clean_data_0.5_no_repeat.csv&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;w&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;encoding&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;gbk&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;newline&lt;/span&gt;&lt;span class="o"&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="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;f&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;writer&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;csv&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;writer&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;dialect&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;csv&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;excel&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;delimiter&lt;/span&gt;&lt;span class="o"&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="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;final_dataset&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;writer&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;writerow&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;data&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;#    按行写入，写入格式也是csv.excel，会把一个二维列表自动存储为表格，行列对应，存储的内容是原封不动的&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="csv文件存储格式与换行问题"&gt;csv文件存储格式与换行问题&lt;/h3&gt;
&lt;p&gt;用以上方法读取的csv文件每一行每一列取出的都是字符串&amp;rsquo;str&amp;rsquo;格式，对于字典要用eval()函数自动转回原本对应的格式，而int等也要用对应函数转换&lt;/p&gt;
&lt;p&gt;newline=&amp;rsquo;&amp;rsquo;&amp;ldquo;设置存储的行与行之间没有空行，否则会隔行存储。&lt;/p&gt;
&lt;h2 id="json格式"&gt;json格式&lt;/h2&gt;
&lt;h3 id="json格式文件特点"&gt;json格式文件特点&lt;/h3&gt;
&lt;p&gt;json格式文本对{对象:值}，例如： {&amp;ldquo;name&amp;rdquo;: &amp;ldquo;John Doe&amp;rdquo;, &amp;ldquo;age&amp;rdquo;: 18, &amp;ldquo;address&amp;rdquo;: {&amp;ldquo;country&amp;rdquo; : &amp;ldquo;china&amp;rdquo;, &amp;ldquo;zip-code&amp;rdquo;: &amp;ldquo;10000&amp;rdquo;}}，和字典有些相似，存储的值可以是字符串，数组，字典等，这个格式好处在于可以存储结构相对复杂的数据并且易于存取。&lt;/p&gt;
&lt;h3 id="json与strjson的读取"&gt;json与str，json的读取&lt;/h3&gt;
&lt;p&gt;在实际操作中似乎直接把json放在列表里就可以和其他数据一样存储到csv文件中，在使用csv.writer方法时，双引号的问题被自动解决了，取出以后和其他数据一样都是str，使用json.loads()方法即可转换为json格式数据，写入的时候可以用同样的方法转换。&lt;/p&gt;
&lt;p&gt;转换后的json格式数据按对象取值的方法与字典相似，即data[&amp;lsquo;对象名&amp;rsquo;]-&amp;gt;值&lt;/p&gt;
&lt;h2 id="python集合列表字典"&gt;python集合、列表、字典&lt;/h2&gt;
&lt;p&gt;在处理重复数据时（这里指字符串或数值的数据），可以采用集合进行存储，因为集合中元素不能重复，可以很简单的使用set()或list()方法将集合和列表相互转换，因此可以利用集合去重后在转换为list存储。&lt;/p&gt;
&lt;p&gt;要注意的是，创建空的集合要使用a = set()方法，如果是a={}则是一个空的字典。&lt;/p&gt;
&lt;p&gt;当存储集合时如果集合为空会存储一个空集，内容为set()。&lt;/p&gt;
&lt;p&gt;集合增加元素要用add()方法，集合没有列表的append()方法。&lt;/p&gt;
&lt;p&gt;在处理数据时，字典一个很大的用处在于给出的key是有语义的，这提高了代码的可读性，list[1]中的数据是什么我们是不知道的，而dict[&amp;lsquo;key&amp;rsquo;]则很好懂。&lt;/p&gt;
&lt;h2 id="tensorflow输入数据格式转化"&gt;tensorflow输入数据格式转化&lt;/h2&gt;
&lt;p&gt;constant方法生成张量，tensorflow搭建的算法输入数据都是相应格式的张量，而不是列表，因此如果采用csv.reader读取csv文件而不是tensorflow自带的方法读取csv文件的话，要用对应的tensorflow或者numpy方法将数据转化为张量，通常为[None,*]None为数据量比如有2000条训练文本，None就是2000，后面的就是处理后的数据格式，比如设置的padding，maxlen=500的embedding size=12后的文本数据，格式就是[None,500,12]，label数据格式也要与之相对应。&lt;/p&gt;
&lt;p&gt;tensorflow自带的读取csv文件的方法可以直接得到tensor格式的数据，但是由于我要处理的csv文件是文本文件并且包含json，这个时候还是先用csv的方法处理完比较好。&lt;/p&gt;</description></item><item><title>卷积神经网络(CNN)理论与实现</title><link>https://www.xiaoxiangtao.cn/zh/posts/theory-and-implementation-of-convolutional-neural-network/</link><pubDate>Thu, 21 May 2020 00:00:00 +0000</pubDate><author>15989119660@163.com (Xiangtao XIAO)</author><guid isPermaLink="false">https://www.xiaoxiangtao.cn/zh/posts/theory-and-implementation-of-convolutional-neural-network/</guid><description>&lt;h2 id="一理论"&gt;一、理论&lt;/h2&gt;
&lt;p&gt;卷积神经网络结构：（卷积层+（可选）池化层）*N+全连接层*M（M&amp;gt;=0），卷积层的输入输出是矩阵，全连接层输入输出是向量，在卷积层的最后一层做一个展平。&lt;/p&gt;
&lt;p&gt;主要用于分类任务&lt;/p&gt;
&lt;p&gt;全卷积神经网络：（卷积层+（可选）池化层）*N+反卷积层*K，可以做物体分割类任务&lt;/p&gt;
&lt;h3 id="卷积操作"&gt;卷积操作&lt;/h3&gt;
&lt;p&gt;解决参数过多导致的计算资源不足，容易过拟合的问题。解决方法：局部连接（基于图像的区域性）、参数共享（基于图像特征与位置无关）&lt;/p&gt;
&lt;p&gt;卷积核是反向传播计算出的参数，卷积：卷积核与输入做点积乘法。步长：卷积核每次在输入上滑动的距离。padding：使输出size不变。&lt;/p&gt;
&lt;h3 id="池化操作"&gt;池化操作&lt;/h3&gt;
&lt;p&gt;类似卷积，计算方式不同，最大值池化：池化核滑动覆盖区域的最大值作为结果输出。&lt;/p&gt;
&lt;p&gt;特点：常使用不重叠（kernal-size=步长）、不补零的操作。参数即为步长和池化核大小。用于减少图像尺寸，从而减少计算量。一定程度平移鲁棒。损失了空间精度。&lt;/p&gt;
&lt;h2 id="二实现"&gt;二、实现&lt;/h2&gt;
&lt;div class="highlight"&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;embedding_dim&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;16&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;batch_size&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;128&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;cnn_model&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;keras&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;Sequential&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;keras&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;layers&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Embedding&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;vocab_size&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;embedding_dim&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;input_length&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;max_length&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;keras&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;layers&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Conv1D&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;filters&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;256&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;kernel_size&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;kernel_initializer&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;he_normal&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="n"&gt;strides&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;padding&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;SAME&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;activation&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;relu&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="n"&gt;keras&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;layers&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;GlobalMaxPooling1D&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;keras&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;layers&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Dropout&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;rate&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;0.5&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;keras&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;layers&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Dense&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;12&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;activation&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;sigmoid&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="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;cnn_model&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;summary&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;cnn_model&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;compile&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;optimizer&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;adam&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;loss&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;binary_crossentropy&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;metrics&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;accuracy&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="conv1d"&gt;Conv1D&lt;/h3&gt;
&lt;p&gt;在文本中，卷积的某一维大小往往为embedding长度，即在宽度上不需要窗口移动，宽度就是整个窗口，所以conv1d默认卷积的宽度就为embedding维度，长度通过kernel_size来指定的，此处为2，即卷积核的大小为2*embedding_size。strides为步长，此处为1，即卷积核每隔一个单词移动一次。filters是卷积核的个数，即输出的维度。padding有valid和same两种选择，valid在长度方向（宽度方向不padding）不进行padding，而same则在长度方向进行padding，保证输入句子长度和卷积后输出的句子长度一致。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;a href="//blog.csdn.net/bobobe/article/details/87923618"&gt;//blog.csdn.net/bobobe/article/details/87923618&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;tensorflow fit()方法：参考&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;a href="//blog.csdn.net/crazyman2010/article/details/103705318"&gt;//blog.csdn.net/crazyman2010/article/details/103705318&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id="textcnn"&gt;TextCNN&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;a href="//blog.csdn.net/u014732537/article/details/79573174"&gt;//blog.csdn.net/u014732537/article/details/79573174&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;</description></item></channel></rss>