<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet href="/rss.xsl" type="text/xsl"?>
<rss version="2.0">
  <channel>
    <title>IT瘾语言推荐</title>
    <link>https://itindex.net/categories/语言</link>
    <description>IT社区推荐资讯 - ITIndex.net</description>
    <language>zh</language>
    <copyright>https://itindex.net/</copyright>
    <generator>https://itindex.net/</generator>
    <docs>http://backend.userland.com/rss</docs>
    <image>
      <url>https://itindex.net/images/logo.gif</url>
      <title>IT社区推荐资讯 - ITIndex.net</title>
      <link>https://itindex.net/categories/语言</link>
    </image>
    <item>
      <title>OpenAI科学家解密：为什么大语言模型会有幻觉？</title>
      <link>https://itindex.net/detail/63094-openai-%E7%A7%91%E5%AD%A6%E5%AE%B6-%E8%A7%A3%E5%AF%86</link>
      <description>OpenAI科学家解密：为什么大语言模型会有幻觉？ &lt;br /&gt; &lt;br /&gt;发一个技术文，OpenAI研究科学家Adam Kalai近期在普林斯顿高等研究院发表的讲座。原讲座有大量公式，在油管Institute for Advanced Study频道。 &lt;br /&gt; &lt;br /&gt;我读完，最大一个体会是：模型被鼓励不能说不知道。 &lt;br /&gt; &lt;br /&gt;一、什么是幻觉，为什么它比你想象的更严重 &lt;br /&gt; &lt;br /&gt;讲座一开始，Kalai就抛出了一个简单的问题：&amp;quot;PGGB代表什么？&amp;quot; &lt;br /&gt; &lt;br /&gt;现场没有人回答——这正是Kalai想要的效果。 &lt;br /&gt; &lt;br /&gt;&amp;quot;我刚刚向你们证明了人类不会像语言模型那样幻觉。有人说&amp;apos;人类也会像语言模型一样幻觉，模型是从我们这里学的&amp;apos;——我们不会。我们房间里没有人开始胡说八道。&amp;quot; &lt;br /&gt; &lt;br /&gt;而语言模型则会&amp;quot;自信&amp;quot;地编造答案： &lt;br /&gt;• GPT给出了三个不同的答案：&amp;quot;Pulled Growth and Greenband&amp;quot;（互联网上搜不到）、&amp;quot;Public Gaming Group of Belgium&amp;quot;（比利时人喜欢玩游戏，肯定有这个组织吧？并没有）、&amp;quot;Personal Growth and Golding&amp;quot;（听起来很常见的术语，但根本不存在） &lt;br /&gt;• DeepSeek给出了&amp;quot;Permutation of Go Given Barriers&amp;quot;——围棋策略相关的胡编 &lt;br /&gt;• Claude给出了&amp;quot;Pacific Gas and Electric Company&amp;quot;——这家公司的缩写是PG&amp;amp;E，连B都没有。更荒谬的是，Claude还补充说&amp;quot;在某些语境下有时缩写为PGGP&amp;quot;——问的是PGGB，它给的解释是PGGP &lt;br /&gt; &lt;br /&gt;二、关于幻觉的四个常见误解 &lt;br /&gt; &lt;br /&gt;误解1：用准确率衡量幻觉 &lt;br /&gt; &lt;br /&gt;很多人看幻觉问题只看准确率，这是错误的思路。因为模型面对问题有三种选择：回答正确、回答错误、或者说&amp;quot;我不知道&amp;quot;。80%的准确率可能意味着20%的错误率（这是幻觉），也可能意味着20%的&amp;quot;我不知道&amp;quot;（这不是幻觉）。真正衡量幻觉的指标是错误率，不是准确率。 &lt;br /&gt; &lt;br /&gt;误解2：避免幻觉需要巨大的模型 &lt;br /&gt; &lt;br /&gt;Kalai半开玩笑地说： &lt;br /&gt; &lt;br /&gt;&amp;quot;我认识的一些不那么聪明的人，反而相当有自知之明。对我来说说&amp;apos;我不知道&amp;apos;很容易——你用俄语问我问题，我会直接告诉你我听不懂。&amp;quot; &lt;br /&gt; &lt;br /&gt;这其实是一个很好的学术挑战方向：用小模型证明概念，做一个不幻觉的小语言模型，展示它有多实用，然后再把方法移植到大模型上。 &lt;br /&gt; &lt;br /&gt;误解3：等准确率到100%就好了 &lt;br /&gt; &lt;br /&gt;问题在于，永远会有无法回答的问题——涉及隐私的问题、信息相互矛盾的问题、超出模型能力的数学问题。这时候模型需要说&amp;quot;我不知道&amp;quot;，而不是硬猜。 &lt;br /&gt; &lt;br /&gt;误解4：幻觉要么已解决，要么永远无法解决 &lt;br /&gt; &lt;br /&gt;两种极端都不对。语言模型的幻觉率确实在下降，但还没到人类的低水平。最终目标是让模型以极低的概率幻觉，就像人类一样。 &lt;br /&gt; &lt;br /&gt;三、核心理论：为什么预训练必然导致幻觉 &lt;br /&gt; &lt;br /&gt;这是讲座最硬核的部分。Kalai提出了一个简洁的理论框架来解释幻觉的根源。 &lt;br /&gt; &lt;br /&gt;1、语言预测比分类更难 &lt;br /&gt; &lt;br /&gt;设想有两个集合：有效陈述（valid） 和错误陈述（error）。在传统的二分类任务中，你同时看到正例和负例，学习区分它们。但在语言预训练中，你只看到正例——训练数据理论上都是&amp;quot;正确&amp;quot;的文本，模型从来没见过&amp;quot;错误示范&amp;quot;。 &lt;br /&gt; &lt;br /&gt;&amp;quot;只从正例学习，应该比同时从正例和负例学习更难。&amp;quot; &lt;br /&gt; &lt;br /&gt;这个直觉被形式化为一个定理：幻觉概率 ≥ 2倍分类错误概率 - 小项。 &lt;br /&gt; &lt;br /&gt;2、定理的核心洞察 &lt;br /&gt; &lt;br /&gt;如果存在一类事实，你根本无法学会区分正确和错误，那么在这类问题上你必然会大量幻觉。 &lt;br /&gt; &lt;br /&gt;什么样的事实无法学会区分？比如人的生日——生日之间没有规律可循，我告诉你房间左半边人的生日，你不可能推断出右半边人的生日。在这类问题上，分类错误率接近50%（跟瞎猜差不多），对应的幻觉率就接近100%。 &lt;br /&gt; &lt;br /&gt;有人问：&amp;quot;为什么模型不能永远说&amp;apos;我不知道&amp;apos;，或者只重复训练数据里见过的内容？&amp;quot; &lt;br /&gt; &lt;br /&gt;这是两个理论上不幻觉的极端策略，但问题在于它们没有&amp;quot;校准&amp;quot;（calibration）。什么是校准？简单说，就是模型对自己预测的置信度要准确——如果模型说某件事有70%的概率，那这件事真的应该在70%的情况下发生。 &lt;br /&gt; &lt;br /&gt;语言模型的训练目标（最小化交叉熵损失，可以理解为让模型预测的概率分布尽可能接近真实分布）天然会产生校准良好的模型。而&amp;quot;永远说我不知道&amp;quot;或&amp;quot;只重复训练数据&amp;quot;这两种策略，它们的概率预测是严重失真的，所以不会被训练过程选中。 &lt;br /&gt; &lt;br /&gt;3、古德-图灵估计器：量化幻觉率的下界 &lt;br /&gt; &lt;br /&gt;这个估计器来自图灵的合作者Irving Good。图灵当年研究的问题可以用钓鱼来类比：你钓了100条鱼，50条三文鱼，20条金枪鱼，还有一些其他品种……如果再钓一条，是你从没见过的新品种的概率有多大？ &lt;br /&gt; &lt;br /&gt;答案是：看有多少种鱼只出现过一次。直觉上，每种只出现一次的鱼，就像是一个&amp;quot;差一点就没见过&amp;quot;的样本——如果你少钓一次，这种鱼你就没见过了。所以它们代表了&amp;quot;再钓一次可能遇到新品种&amp;quot;的概率。 &lt;br /&gt; &lt;br /&gt;应用到幻觉问题：幻觉率的下界 ≈ 训练数据中只出现一次的事实占比。 &lt;br /&gt; &lt;br /&gt;Kalai问现场观众不同类型事实的出现频率：国家首都在训练数据中反复出现很多次，幻觉率低；名人生日是混合情况，有些人的生日出现很多次，有些可能从未出现；论文标题虽然每篇独特，但作者会在简历、个人网站、arXiv到处贴，所以大多数其实出现多次。 &lt;br /&gt; &lt;br /&gt;但这只是下界——实际幻觉率往往更高。比如论文标题，虽然在训练数据中出现多次，但神经网络不是存储和精确检索标题的好方式。更好的方法是用数据库直接存储标题列表，需要时直接查询。当表示方式不匹配任务需求时，实际幻觉率会远高于理论下界。 &lt;br /&gt; &lt;br /&gt;类似的例子是数字母：问&amp;quot;ladder这个词有几个d&amp;quot;，语言模型的内部表示方式是把词拆成token（词元），每个token是一串字母的编号。模型必须学会&amp;quot;deer这个token（编号可能是19975之类的数字）包含一个d&amp;quot;——这是一个很别扭的学习任务，因为表示方式根本不是为数字母设计的。 &lt;br /&gt; &lt;br /&gt;四、为什么对齐阶段没能解决幻觉 &lt;br /&gt; &lt;br /&gt;语言模型训练分两个阶段：预训练（学习语言的统计规律）和对齐/后训练（让模型按照人类期望的方式回答）。预训练产生幻觉可以理解，但对齐阶段理论上应该消除幻觉。为什么没有？ &lt;br /&gt; &lt;br /&gt;1、评估标准的激励扭曲 &lt;br /&gt; &lt;br /&gt;想想你自己考试的时候。有多少人遇到不会的题会写&amp;quot;我不知道&amp;quot;或者空着？几乎没有。因为说&amp;quot;我不知道&amp;quot;和答错得分一样——都是零分。既然如此，猜一个至少还有蒙对的可能，所以猜测永远比承认无知更划算。 &lt;br /&gt; &lt;br /&gt;语言模型面临同样的困境。MMLU、GPQA Diamond、各种数学竞赛测试——这些主流评测（benchmark）都有一个共同特点：说&amp;quot;我不知道&amp;quot;等于答错，得零分。 &lt;br /&gt; &lt;br /&gt;&amp;quot;如果有人做出了一个不幻觉的更好模型，它在这些测试上的分数反而会更低。因为它会对不确定的问题诚实地说&amp;apos;我不知道&amp;apos;，而在现有规则下，这等于白白丢分。&amp;quot; &lt;br /&gt; &lt;br /&gt;2、人类评估同样有偏差 &lt;br /&gt; &lt;br /&gt;另一种评估方式是让人类对比两个模型的输出，选择更好的那个。问题是：人们往往更喜欢幻觉的答案。 &lt;br /&gt; &lt;br /&gt;你问&amp;quot;PGGB代表什么&amp;quot;，一个模型说&amp;quot;我不知道&amp;quot;，另一个模型给出带要点列表的详细解释。人们倾向于选择后者——因为他们自己也不知道PGGB是什么，没法判断那个详细解释是编的。 &lt;br /&gt; &lt;br /&gt;&amp;quot;人们喜欢那些有条有理的要点列表。所以很多评估方式实际上在奖励幻觉。&amp;quot; &lt;br /&gt; &lt;br /&gt;3、真正的解决方案：改变评分规则 &lt;br /&gt; &lt;br /&gt;有人建议增加一个专门检测幻觉的评估。Kalai认为这远远不够： &lt;br /&gt; &lt;br /&gt;&amp;quot;不要只加一个幻觉评估。语言模型现在有几百个评估指标，如果这几百个都在鼓励幻觉，我们只加一个反幻觉的评估，那是杯水车薪。应该改变所有现有评估的评分方式。&amp;quot; &lt;br /&gt; &lt;br /&gt;具体方案：在题目中明确告诉模型惩罚规则。比如&amp;quot;答对得1分，答错扣3分，说&amp;apos;我不知道&amp;apos;得0分&amp;quot;。这样模型可以算出来：只有在超过75%确信时才应该作答，否则说&amp;quot;我不知道&amp;quot;期望收益更高。不同的惩罚系数对应不同的置信阈值，这提供了一个公平、可比较的评估框架。 &lt;br /&gt; &lt;br /&gt;之前有人提出过惩罚错误答案的想法，但关键的一步没做：没人把惩罚规则告诉模型。Kalai说这就像给你考试，告诉你&amp;quot;答错会扣分，但我不告诉你扣多少&amp;quot;——你没法做理性决策，而且不同模型也没法公平比较，因为它们心里假设的惩罚不一样。 &lt;br /&gt; &lt;br /&gt;Kalai在普林斯顿高等研究院做了实验验证：随着惩罚系数增加，模型说&amp;quot;我不知道&amp;quot;的频率确实相应增加，符合预期。但有趣的是，如果你看模型的实际得分（正确数 - 惩罚×错误数），在某个阈值之后，模型的得分会低于&amp;quot;全部说我不知道&amp;quot;的策略。这说明模型仍然过度自信——它以为自己知道的比实际知道的多。 &lt;br /&gt; &lt;br /&gt;五、行为校准：一个衡量&amp;quot;诚实度&amp;quot;的新维度 &lt;br /&gt; &lt;br /&gt;传统的校准（calibration）是关于预测准确性的：如果天气预报说降雨概率是70%，那在所有预报说70%的日子里，真的应该有70%下雨。如果实际只有50%下雨，就是校准不准。 &lt;br /&gt; &lt;br /&gt;Kalai提出了一个新概念：行为校准（behavioral calibration）。 &lt;br /&gt; &lt;br /&gt;&amp;quot;有些人会把手表调快10分钟。为什么要欺骗自己？因为这样对他们有好处——他们会更准时，表现更好。&amp;quot; &lt;br /&gt; &lt;br /&gt;语言模型也有这个特点：如果你&amp;quot;骗&amp;quot;它说惩罚比实际更高，它的表现反而会提高。Kalai在实验中发现，给模型一个&amp;quot;最优谎言&amp;quot;（让它以为答错的惩罚更重），得分会上升。 &lt;br /&gt; &lt;br /&gt;理想情况下，我们希望模型不需要被&amp;quot;骗&amp;quot;——你告诉它真实的风险程度，它就能相应地调整自己的回答策略。一个行为校准良好的模型，应该能根据你说明的重要性，合理地决定何时作答、何时承认不知道。 &lt;br /&gt; &lt;br /&gt;--- &lt;br /&gt; &lt;br /&gt;六、人类为什么不幻觉：大脑双系统的启示 &lt;br /&gt; &lt;br /&gt;讲座快结束时，Kalai在黑板上画了一张大脑示意图。 &lt;br /&gt; &lt;br /&gt;人类大脑有两个主要的语言区域，功能截然不同： &lt;br /&gt;• 韦尼克区（Wernicke&amp;apos;s area）：靠近耳朵，负责理解语言。它需要能听懂各种内容，包括谎言、脏话、你明知不是真的东西——你的耳朵需要能理解那些你绝不会说出口的内容 &lt;br /&gt;• 布罗卡区（Broca&amp;apos;s area）：靠近嘴巴，负责产生语言。这部分只输出你真正想说的、经过筛选的内容 &lt;br /&gt; &lt;br /&gt;有一种神经疾病叫韦尼克失语症（Wernicke&amp;apos;s aphasia），患者会语无伦次地胡言乱语——这跟语言模型的幻觉惊人地相似。 &lt;br /&gt; &lt;br /&gt;&amp;quot;人类学会了不幻觉，因为如果我们胡说八道，我们看起来像傻瓜。我们不需要在考试里学这一课——在日常生活中瞎编被戳穿几次，自然就学乖了。&amp;quot; &lt;br /&gt; &lt;br /&gt;这给AI设计带来一个启示：也许需要把&amp;quot;理解一切&amp;quot;和&amp;quot;只说有把握的&amp;quot;分成两个不同的模块。 &lt;br /&gt; &lt;br /&gt;对齐研究的核心问题是：我们到底希望语言模型说什么？ 这是一个对所有人开放的大问题，你不需要了解语言模型的技术细节就能思考它——因为我们自己也还没有一个清晰的答案。 &lt;br /&gt; &lt;br /&gt;七、展望未来：当AI比我们更聪明时 &lt;br /&gt; &lt;br /&gt;Kalai在讲座最后分享了一些更长远的思考。 &lt;br /&gt; &lt;br /&gt;当AI变得比人类更聪明时，很多现有框架都会失效。幻觉仍然重要，公平性仍然重要，但会出现很多我们今天连定义都给不出的新问题。 &lt;br /&gt; &lt;br /&gt;他提出了一个发人深省的类比：把AI安全想象成密码学，而不是生物学。 &lt;br /&gt; &lt;br /&gt;很多人把AI当作一种自然现象来研究——观察它、记录它的行为、像研究某种正在失控进化的有机体。但密码学的视角完全不同：RSA加密和区块链是人类工程设计的产物，我们可以在数学上证明它们的安全性，甚至面对比我们拥有更多算力和更高智能的对手，它们仍然安全。 &lt;br /&gt; &lt;br /&gt;&amp;quot;密码学的核心就是：对抗一个比你有更多计算资源、可能比你更聪明的对手，同时保持安全。&amp;quot; &lt;br /&gt; &lt;br /&gt;Kalai分享了一个与妻子Yael Tauman Kalai合作的理论结果：如果你有K个语言模型，其中大多数是&amp;quot;安全&amp;quot;的（不会产生有害输出），你可以构造一个中位数分布（median distribution）——它能放大安全模型的特性。具体来说，如果每个安全模型产生有害输出的概率都是极小的，那么中位数分布会保持甚至强化这个特性。 &lt;br /&gt; &lt;br /&gt;但目前有个实际障碍：不同语言模型之间的&amp;quot;重叠&amp;quot;可能极小。如果你拿Gemini和GPT来做这个实验，它们的输出分布可能几乎不重叠——比如同一道编程题，两个模型给出的代码风格完全不同。这会让上述算法难以应用。一个可能的解决方向是规范化输出——比如定义一个标准的&amp;quot;正确程序分布&amp;quot;，让所有模型都朝这个标准靠拢，这样不同模型的重叠会变大，安全性放大的效果才能实现。 &lt;br /&gt; &lt;br /&gt;有人问：&amp;quot;能不能在预训练阶段就改变损失函数来解决幻觉？&amp;quot; &lt;br /&gt; &lt;br /&gt;Kalai认为预训练可能不是解决这个问题的正确时机： &lt;br /&gt; &lt;br /&gt;&amp;quot;因为有时候你其实想要幻觉。你让它写短篇小说、编菜谱——随便发挥。我告诉你我厨房里有什么食材，你尽管创造一个新菜谱。但问生日的时候，我不希望你瞎编。所以这是一个微妙的平衡——这类问题可以猜，那类问题不能猜，另一类问题要特别谨慎。我觉得这更像是一个需要明确指导的过程，不是单纯从数据里能学会的。&amp;quot; &lt;br /&gt; &lt;br /&gt;有人追问：&amp;quot;但人类能自动学会什么时候该说&amp;apos;我不知道&amp;apos;，为什么模型不能从数据中学会？&amp;quot; &lt;br /&gt; &lt;br /&gt;Kalai承认这是个好问题，目前没有完美答案。也许通过提示词（prompting）就能部分解决——比如在提示中说&amp;quot;这是问题，现在请以那个非常谨慎的助手的身份回答&amp;quot;，或者&amp;quot;如果你答错会很尴尬&amp;quot;，甚至&amp;quot;如果你答错会被开除&amp;quot;。他提到一个有趣的实验发现：如果你在提示中告诉语言模型&amp;quot;答对给你20美元奖励&amp;quot;，它的表现真的会变好。
     
    &lt;div&gt; &lt;a href="https://itindex.net/"  title="IT 资讯"&gt;&lt;img src="https://itindex.net/images/iconWarning.gif" title="IT 资讯" border="0"/&gt; &lt;/a&gt;</description>
      <category />
      <guid isPermaLink="true">https://itindex.net/detail/63094-openai-%E7%A7%91%E5%AD%A6%E5%AE%B6-%E8%A7%A3%E5%AF%86</guid>
      <pubDate>Fri, 28 Nov 2025 09:02:00 CST</pubDate>
    </item>
    <item>
      <title>机器思考的本质 / Gemini 的核心缔造者揭秘大语言模型推理的魔法与真相</title>
      <link>https://itindex.net/detail/63057-%E6%9C%BA%E5%99%A8-%E6%80%9D%E8%80%83-%E6%9C%AC%E8%B4%A8</link>
      <description>&lt;p&gt;2025 年初的一个下午，斯坦福大学 CS25 课程迎来了一位特殊的演讲者 —— Google DeepMind 推理团队创始人 Denny Zhou（周登勇）。面对座无虚席的教室，他抛出了一个看似简单却又深刻的问题：“大型语言模型（LLM）真的会推理吗？”&lt;/p&gt;  &lt;img&gt;&lt;/img&gt;  &lt;p&gt;台下的学生们大多举手表示相信，但 Denny 的回答却出人意料：“说实话，我不知道。这完全取决于你如何定义    &lt;strong&gt;推理&lt;/strong&gt;。“&lt;/p&gt;  &lt;p&gt;这个诚实的开场白，为接下来一个多小时的精彩演讲定下了基调 —— 不谈玄学，不搞神秘主义，而是用工程师的严谨和科学家的好奇心，剖析 LLM 推理能力的本质。本文根据 Denny Zhou 的分享和演示文稿整理创作而成。&lt;/p&gt;  &lt;h1&gt;01&lt;/h1&gt;  &lt;h6&gt;重新定义推理 —— 从哲学回归工程&lt;/h6&gt;  &lt;h5&gt;什么是 LLM 的“推理”？&lt;/h5&gt;  &lt;p&gt;Denny 首先做了一件至关重要的事：为整场演讲建立一个清晰、可操作的&amp;quot;推理&amp;quot;定义。他强调，在没有明确定义的情况下参与“LLM是否会推理”的辩论毫无意义。&lt;/p&gt;  &lt;img title="null"&gt;&lt;/img&gt;PPT 第 2 页  &lt;p&gt;在 LLM 的语境下，推理被定义为：    &lt;strong&gt;在输入和输出之间生成的中间步骤（intermediate tokens）&lt;/strong&gt;。这个定义简单的避开了意识、思维等哲学层面的纠缠，直接聚焦于可观察、可度量的现象。&lt;/p&gt;  &lt;p&gt;其实这个想法其实并不新鲜。早在 2017 年，DeepMind 就发表了一篇开创性的论文，探讨如何使用自然语言的中间步骤来解决数学问题。在那个 AlphaGo 称霸围棋界、符号推理和搜索算法主导 AI 研究的年代，这篇论文就像一颗投入平静湖面的石子，激起了层层涟漪。&lt;/p&gt;  &lt;h5&gt;末字母串联：一个看似简单的测试&lt;/h5&gt;  &lt;p&gt;为了让抽象的定义变得具体，Denny 分享了他在创建 Google Brain 推理团队时设计的一个经典任务 —— “末字母串联”（last letter concatenation）。&lt;/p&gt;  &lt;img title="null"&gt;&lt;/img&gt;PPT 第 3 页  &lt;p&gt;问题很简单：将“artificial intelligence”这两个单词的最后一个字母连接起来，答案是什么？如果模型直接输出“le”，这只是一个简单的模式匹配。但如果模型生成这样的回答：&amp;quot;‘artificial’ 的最后一个字母是 &amp;apos;l&amp;apos;；&amp;apos;intelligence&amp;apos; 的最后一个字母是&amp;apos;e&amp;apos;。将 &amp;apos;l&amp;apos; 和 &amp;apos;e&amp;apos; 连接起来得到 &amp;apos;le&amp;apos;。&amp;quot;&lt;/p&gt;  &lt;p&gt;这些详细的步骤就是 Denny 所说的“推理” —— 那些为了得出最终答案而生成的、描述过程的中间文本。&lt;/p&gt;  &lt;p&gt;有趣的是，Denny 透露他最初尝试的是&amp;quot;首字母串联&amp;quot;，但发现几乎所有模型都能轻松完成，因为网络上充斥着大量的缩写词（如USA、CEO）。只有当换成模型不熟悉的“末字母”任务时，才真正考验并体现出了推理过程的必要性。&lt;/p&gt;  &lt;p&gt;“我们必须时刻牢记，” Denny 强调道，“    &lt;strong&gt;LLMs 只是概率模型，它们不是人类。&lt;/strong&gt;” 这种清醒的认知贯穿了整场演讲，也是理解后续所有技术演进的关键。&lt;/p&gt;  &lt;h1&gt;02&lt;/h1&gt;  &lt;h6&gt;理论的力量 —— 为什么中间步骤如此重要&lt;/h6&gt;  &lt;h5&gt;从理论看推理的必要性&lt;/h5&gt;  &lt;p&gt;接下来，Denny 从理论层面阐述了推理（即生成中间步骤）的深刻价值。他引用了与斯坦福大学合作的一项重要理论研究成果：&lt;/p&gt;  &lt;img title="null"&gt;&lt;/img&gt;PPT 第 4 页  &lt;p&gt;    &lt;strong&gt;对于任何可以由大小为 T 的布尔电路解决的问题，一个规模恒定的 Transformer 模型可以通过生成 O(T) 数量的中间令牌来解决它。&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;这个结论听起来有些学术，让我用更通俗的方式解释：&lt;/p&gt;  &lt;p&gt;想象你要解一道复杂的数学题。你有两个选择：&lt;/p&gt;  &lt;ol&gt;    &lt;li&gt;1. 建造一个超级复杂的大脑（深度巨大的模型），一步就算出答案&lt;/li&gt;    &lt;li&gt;2. 用一个正常大小的大脑，但允许在草稿纸上写下推导过程&lt;/li&gt;&lt;/ol&gt;  &lt;p&gt;理论告诉我们，第二种方法不仅可行，而且更高效。这就像一个普通人通过在纸上一步步演算，可以解决复杂的微积分问题，而不需要拥有一个能瞬间得出答案的“超级大脑”。&lt;/p&gt;  &lt;p&gt;如果我们强迫模型直接输出最终答案，就等于剥夺了它“思考”的过程。此时，要么需要一个极其庞大和深邃的内部结构来“硬算”出结果，要么就根本无解。这从根本上解释了为什么像“思维链”这样的技术能够奇迹般地提升 LLM 的能力 —— 它解放了模型进行逐步计算的潜力。&lt;/p&gt;  &lt;h1&gt;03&lt;/h1&gt;  &lt;h6&gt;惊人的发现 —— 推理能力早已存在，只需&amp;quot;唤醒&amp;quot;&lt;/h6&gt;  &lt;h5&gt;贪婪解码的局限&lt;/h5&gt;  &lt;p&gt;一个普遍的误解是，预训练的 LLM 本身无法推理，必须通过提示工程或微调来“教会”它。但 Denny 的研究揭示了一个大家普遍忽略的事实：    &lt;strong&gt;推理能力早已蕴藏在预训练模型中，我们缺少的不是能力本身，而是发现它的正确解码策略。&lt;/strong&gt;&lt;/p&gt;  &lt;img title="null"&gt;&lt;/img&gt;PPT 第 6 页  &lt;p&gt;让我们看一个具体的例子：&lt;/p&gt;  &lt;p&gt;“我有3个苹果。我爸爸比我多2个苹果。我们总共有多少个苹果？”&lt;/p&gt;  &lt;p&gt;当你将这个问题输入一个未经任何推理优化的预训练模型（如早期的 LLaMA），使用标准的贪婪解码（Greedy Decoding）—— 即总是选择在每一步概率最高的词 —— 模型很可能会直接输出一个错误的答案：“五个苹果”。&lt;/p&gt;  &lt;p&gt;这似乎印证了&amp;quot;模型不会推理&amp;quot;的观点。&lt;/p&gt;  &lt;h5&gt;隐藏在概率空间中的推理路径&lt;/h5&gt;  &lt;p&gt;然而，魔法发生在当我们超越贪婪解码时。Denny 的团队发现，推理过程其实隐藏在那些概率稍低一些的“备选答案”中。&lt;/p&gt;  &lt;img title="null"&gt;&lt;/img&gt;PPT 第 7 页  &lt;p&gt;当我们查看模型的多个候选输出时，会发现：&lt;/p&gt;  &lt;ol&gt;    &lt;li&gt;1.       &lt;strong&gt;&amp;quot;5 apples.&amp;quot;&lt;/strong&gt; - 这是贪婪解码的结果，但错了&lt;/li&gt;    &lt;li&gt;2.       &lt;strong&gt;&amp;quot;I have 3 apples, my dad has 2 more apples than me, so he has 5 apples. 3+5=8.&amp;quot;&lt;/strong&gt; - 虽然以&amp;quot;I&amp;quot;开头的概率不是最高的，但它引出了完整正确的推理链&lt;/li&gt;    &lt;li&gt;3.       &lt;strong&gt;&amp;quot;We have 8 apples in total.&amp;quot;&lt;/strong&gt; - 直接给出正确答案&lt;/li&gt;    &lt;li&gt;4.       &lt;strong&gt;&amp;quot;You have 3 apples, your dad has 2 more apples than you, so he has 5 apples. 3+5=8.&amp;quot;&lt;/strong&gt; - 另一个展示完美推理过程的回答&lt;/li&gt;&lt;/ol&gt;  &lt;p&gt;关键洞察是：正确的推理链    &lt;strong&gt;存在于模型的输出空间中&lt;/strong&gt;，只是它们没有在贪婪解码中胜出。问题从“模型会不会”转变成了“我们如何找到它”。&lt;/p&gt;  &lt;h5&gt;思维链解码：让推理浮出水面&lt;/h5&gt;  &lt;p&gt;基于这个发现，Denny 团队提出了一种全新的解码策略 —— 思维链解码（Chain-of-Thought Decoding）：&lt;/p&gt;  &lt;img title="null"&gt;&lt;/img&gt;PPT 第 10 页  &lt;ol&gt;    &lt;li&gt;1.       &lt;strong&gt;超越贪婪，探索更多可能&lt;/strong&gt;：不再只看概率最高的路径，而是生成多个不同的候选回答序列&lt;/li&gt;    &lt;li&gt;2.       &lt;strong&gt;信任答案的置信度&lt;/strong&gt;：在所有候选回答中，选择那个对最终答案具有最高置信度的回答&lt;/li&gt;&lt;/ol&gt;  &lt;p&gt;这里的“置信度”指的是模型在生成那个特定答案词（比如数字&amp;quot;8&amp;quot;）时给出的概率。Denny 揭示了一个非常有趣的现象：    &lt;strong&gt;当模型通过一步步推理得出答案时，它对这个答案的信心会异常地高&lt;/strong&gt;。在苹果的例子中，当模型生成了完整的推理链后，预测出最终答案&amp;quot;8&amp;quot;的概率可能高达 98%，这在一个拥有数万词汇表的模型中是极为罕见的。&lt;/p&gt;  &lt;h1&gt;04&lt;/h1&gt;  &lt;h6&gt;从解码到提示 —— 重塑输出空间&lt;/h6&gt;  &lt;h5&gt;思维链提示的本质&lt;/h5&gt;  &lt;p&gt;虽然思维链解码效果显著，但它需要编程实现，不够“自然”。这就引出了大家更熟悉的技术：思维链提示（Chain-of-Thought Prompting）和“让我们一步步思考”（Let&amp;apos;s think step by step）。&lt;/p&gt;  &lt;img title="null"&gt;&lt;/img&gt;PPT 第 12 页  &lt;p&gt;这些技术的本质作用是    &lt;strong&gt;重塑模型的输出概率分布&lt;/strong&gt;，让包含推理过程的“好答案”能够自然地排在首位，被简单的贪婪解码直接找到。&lt;/p&gt;  &lt;p&gt;当模型看到范例中的解题步骤，或者读到“让我们一步步思考”时，它会大幅提高生成类似推理步骤的概率。原本隐藏在低概率区域的正确推理路径，现在被&amp;quot;抬&amp;quot;到了最高概率的位置。&lt;/p&gt;  &lt;h5&gt;“让我们一步步思考”的魔力&lt;/h5&gt;  &lt;p&gt;Denny 分享了一段特别有趣的个人经历。当“Let&amp;apos;s think step by step”这篇论文刚发表时，他的第一反应是：“这一定是个玩笑。” 他当时在 Google Brain 团队，非常清楚他们内部的大模型 PaLM 是如何构建的，其训练数据里绝对没有针对这句“咒语”做任何优化。&lt;/p&gt;  &lt;p&gt;然而，当他抱着怀疑的态度在 PaLM 上尝试时，发现它竟然真的有效！“我当时震惊了，” Denny 回忆道，“这篇论文真正激发了我对LLM推理研究的深入探索。”&lt;/p&gt;  &lt;p&gt;这个经历极大地启发了他，让他意识到 LLM 推理的研究中蕴藏着远超他们想象的深刻奥秘。这也从侧面证明了，推理能力是一种从大规模数据中    &lt;strong&gt;涌现&lt;/strong&gt;出来的通用能力，而非特定指令训练的结果。&lt;/p&gt;  &lt;h1&gt;05&lt;/h1&gt;  &lt;h6&gt;监督微调的困境 —— 为什么人类数据不是最优解&lt;/h6&gt;  &lt;h5&gt;SFT 的基本思路&lt;/h5&gt;  &lt;p&gt;接下来，Denny 转向了一个看似更“主动”的方法 —— 监督微调（Supervised Fine-Tuning, SFT）。这是提升模型能力的常用方法，其思路直观而简单：&lt;/p&gt;  &lt;img title="null"&gt;&lt;/img&gt;PPT 第 15 页  &lt;ol&gt;    &lt;li&gt;1. 收集大量问题和人类专家编写的高质量&amp;quot;标准答案&amp;quot;（包含详细推理步骤）&lt;/li&gt;    &lt;li&gt;2. 用这些&amp;quot;问题-标准答案&amp;quot;对，对预训练好的大模型进行进一步训练&lt;/li&gt;    &lt;li&gt;3. 目标是让模型输出尽可能接近人类写的标准答案&lt;/li&gt;&lt;/ol&gt;  &lt;p&gt;这个方法非常直观。OpenAI 的 GSM8K（小学数学题）数据集的早期工作就是遵循这一思路。理论上，只要我们给模型&amp;quot;喂&amp;quot;足够多高质量的人类解题范例，它就应该能学会如何推理。&lt;/p&gt;  &lt;h5&gt;现实的残酷&lt;/h5&gt;  &lt;p&gt;然而，现实是残酷的。&lt;/p&gt;  &lt;p&gt;Denny 指出，他的团队早在 2021 年夏天就发现，SFT 在推理任务上的效果并不理想。模型或许能在与训练数据相似的任务上表现不错，但一旦遇到新的、未见过的问题类型，其性能就会急剧下降，表现出很差的泛化能力。&lt;/p&gt;  &lt;p&gt;更令人沮丧的是，单纯地增加数据量（Scaling）也于事无补。&lt;/p&gt;  &lt;p&gt;“不要盲目地扩大规模，” Denny 警告道，“一旦范式是错误的，无论你如何扩大规模，它都不会起作用。”&lt;/p&gt;  &lt;h5&gt;问题的根源：&amp;quot;from human&amp;quot;&lt;/h5&gt;  &lt;p&gt;那么，SFT 的根本问题出在哪里？&lt;/p&gt;  &lt;img title="null"&gt;&lt;/img&gt;PPT 第 18 页  &lt;p&gt;Denny 用红色圈出了问题的核心：    &lt;strong&gt;&amp;quot;from human&amp;quot;&lt;/strong&gt;。&lt;/p&gt;  &lt;p&gt;我们试图强迫模型去模仿人类的思考和表达方式。但 LLM 毕竟是一个概率模型，它的内部“世界观”和最优的“思考”路径，与人类大脑的运作方式截然不同。人类标注员给出的“完美答案”，在模型看来可能是一条非常“奇怪”、不符合其概率分布的路径，学习起来非常困难且低效。&lt;/p&gt;  &lt;p&gt;这就像教一只鸟像鱼一样游泳 —— 即使它勉强学会了，也永远无法与真正的鱼相媲美，更无法举一反三。&lt;/p&gt;  &lt;p&gt;这个洞察对于整个 AI 训练领域都有着深远的意义。它挑战了“人类数据永远是黄金标准”的传统观念。在某些任务上，尤其是需要模型进行内在生成和推理的任务上，让模型从&amp;quot;自己&amp;quot;的成功经验中学习，可能比模仿人类更有效。&lt;/p&gt;  &lt;h1&gt;06&lt;/h1&gt;  &lt;h6&gt;自我进化之路 —— RL 微调的革命性突破&lt;/h6&gt;  &lt;h5&gt;从人类数据到模型数据&lt;/h5&gt;  &lt;p&gt;既然从人类身上学习的SFT范式存在根本缺陷，那么出路在何方？&lt;/p&gt;  &lt;p&gt;这个想法最初由一篇名为&amp;quot;Star&amp;quot;的论文提出，其核心改变非常简单，却至关重要：&lt;/p&gt;  &lt;img title="null"&gt;&lt;/img&gt;PPT 第 19 页  &lt;ul&gt;    &lt;li&gt;• 不再收集人类标注的答案&lt;/li&gt;    &lt;li&gt;• 而是让      &lt;strong&gt;模型自己&lt;/strong&gt;针对问题，生成大量的、包含推理步骤的候选答案&lt;/li&gt;    &lt;li&gt;• 然后，利用一个外部的、可靠的方式（比如对于数学题，我们知道标准答案）来筛选出那些最终结果正确的生成&lt;/li&gt;    &lt;li&gt;• 最后，用这些被验证为&amp;quot;好&amp;quot;的、      &lt;strong&gt;由模型自己生成的&lt;/strong&gt;数据，去微调模型&lt;/li&gt;&lt;/ul&gt;  &lt;p&gt;Denny 回忆说，当他的团队成员第一次提出“机器生成的回复可能比人类数据更适合训练”时，他本人也感到非常惊讶。这个方法最初可能是为了节省昂贵的人力标注成本，但后来大家发现，它的意义远不止于此。&lt;/p&gt;  &lt;h5&gt;形成自我进化的闭环&lt;/h5&gt;  &lt;p&gt;将上述过程迭代化，就构成了 RL Fine-tuning 的核心循环：&lt;/p&gt;  &lt;img title="null"&gt;&lt;/img&gt;PPT 第 20-21 页  &lt;ol&gt;    &lt;li&gt;1.       &lt;strong&gt;生成（Generate）&lt;/strong&gt;：用当前的模型，针对一批问题生成多种解决方案&lt;/li&gt;    &lt;li&gt;2.       &lt;strong&gt;验证（Verify）&lt;/strong&gt;：用一个可靠的验证器给这些方案打上&amp;quot;正确&amp;quot;或&amp;quot;错误&amp;quot;的标签&lt;/li&gt;    &lt;li&gt;3.       &lt;strong&gt;学习（Learn）&lt;/strong&gt;：强化（增加概率）那些通往正确答案的推理路径，同时抑制（降低概率）那些导致错误答案的路径&lt;/li&gt;    &lt;li&gt;4.       &lt;strong&gt;重复（Repeat）&lt;/strong&gt;：用变得更强的新模型，回到第一步，开始新一轮的循环&lt;/li&gt;&lt;/ol&gt;  &lt;h5&gt;回归机器学习第一性原理&lt;/h5&gt;  &lt;p&gt;Denny 强调，要理解 RL Fine-tuning 的威力，我们必须回归到机器学习最根本的第一性原理：&lt;/p&gt;  &lt;img title="null"&gt;&lt;/img&gt;PPT 第 23 页  &lt;p&gt;    &lt;strong&gt;&amp;quot;直接优化你想要的东西！（Directly optimize what we want!）&amp;quot;&lt;/strong&gt;&lt;/p&gt;  &lt;ul&gt;    &lt;li&gt;• 在 SFT 中，我们优化的目标是“模仿人类的文本”，但这并不是我们最终想要的&lt;/li&gt;    &lt;li&gt;• 在 RL Fine-tuning 中，我们真正优化的目标是“解决问题的最终正确率”这个指标本身&lt;/li&gt;&lt;/ul&gt;  &lt;p&gt;整个训练过程变成了一个清晰的数学优化问题：最大化奖励函数的期望值，其中奖励就是衡量生成质量的指标（比如答案是否正确）。所有的RL算法（如PPO）和复杂的梯度计算，都服务于这个最直接、最纯粹的目标。&lt;/p&gt;  &lt;p&gt;模型不再需要去猜测“人类会怎么说”，而是可以自由探索最适合它自己的、能够稳定得出正确答案的推理方式。&lt;/p&gt;  &lt;h5&gt;验证器：进化的关键&lt;/h5&gt;  &lt;p&gt;在这个自我进化的闭环中，一个可靠的验证器（Verifier）变得至关重要。它就像是进化过程中的&amp;quot;自然选择&amp;quot;，指引着模型朝着正确的方向演进。正如传奇 AI 学者 Rich Sutton 所言：“验证，是通往 AI 的钥匙（Verification, the key to AI）”。&lt;/p&gt;  &lt;h1&gt;07&lt;/h1&gt;  &lt;h6&gt;推理之美 —— 超越搜索的智能&lt;/h6&gt;  &lt;h5&gt;与传统 AI 的本质区别&lt;/h5&gt;  &lt;p&gt;在解释了如何通过 RL Fine-tuning 培养出强大的推理能力后，Denny 展示了一个令人叹为观止的案例，生动地诠释了这种新范式下的“推理之美”。&lt;/p&gt;  &lt;p&gt;他引用了国际象棋大师卡斯帕罗夫在 1997 年输给&amp;quot;深蓝&amp;quot;后的一句名言：&lt;/p&gt;  &lt;p&gt;“深蓝的智能，和你那个可编程的闹钟没什么两样。”&lt;/p&gt;  &lt;p&gt;Denny 表示他同意这个评价，因为&amp;quot;深蓝&amp;quot;的胜利本质上是基于海量的计算和暴力搜索。但他强调，    &lt;strong&gt;LLM的推理则完全不同，搜索在其中并非核心。&lt;/strong&gt;&lt;/p&gt;  &lt;h5&gt;震撼案例：Gemini 挑战数学难题&lt;/h5&gt;  &lt;p&gt;为了证明这一点，Denny 展示了他在 2024 年 12 月用 Gemini 模型解决的一个自创数学题（为确保该问题不在任何训练数据中）：&lt;/p&gt;  &lt;img title="null"&gt;&lt;/img&gt;PPT 第 28 页  &lt;p&gt;    &lt;strong&gt;问题：使用1到10这十个数字，每个数字只用一次，通过加法和乘法运算，得到结果2025。&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;传统解法是编写一个程序进行穷举搜索，尝试所有可能的数字和运算符组合。&lt;/p&gt;  &lt;p&gt;但让我们看看 Gemini 的“思考过程”（中间步骤）：&lt;/p&gt;  &lt;ol&gt;    &lt;li&gt;1.       &lt;strong&gt;初步洞察&lt;/strong&gt;：模型首先注意到“2025 是一个相对较大的数”，因此“乘法会是主要部分”，这是一种基于直觉的判断。&lt;/li&gt;    &lt;li&gt;2.       &lt;strong&gt;关键发现&lt;/strong&gt;：接下来，模型给出了一个惊人的发现：“值得注意的是，2025 是 45 的平方（45 × 45）”。Denny 坦言，就连他自己出题时都未曾注意到这个巨大的提示！&lt;/li&gt;    &lt;li&gt;3.       &lt;strong&gt;策略制定&lt;/strong&gt;：基于这个发现，模型没有去盲目组合数字，而是将宏大目标分解为两个子目标——      &lt;strong&gt;分别用一部分数字凑出 45&lt;/strong&gt;。&lt;/li&gt;    &lt;li&gt;4.       &lt;strong&gt;求解与组合&lt;/strong&gt;：模型最终找到了一种解法：      &lt;code&gt;(10×4+5) × (9×3+8+7+2+1)&lt;/code&gt;，其中两个括号内的部分都等于 45。&lt;/li&gt;&lt;/ol&gt;  &lt;p&gt;这个过程没有丝毫的暴力搜索痕迹，完全是基于对数字规律的深刻理解、目标分解和策略规划。    &lt;strong&gt;这正是人类专家解决问题的方式&lt;/strong&gt;。&lt;/p&gt;  &lt;p&gt;Denny 特别提到，这个问题比经典的“24 点”游戏要难得多，而之前解决“24 点”通常需要结合搜索算法，但现在，一个经过良好训练的 LLM 仅凭自然语言的逐步生成，就能以如此优雅的方式解决更复杂的问题。&lt;/p&gt;  &lt;h5&gt;学习战胜硬编码&lt;/h5&gt;  &lt;p&gt;这个案例有力地回应了 Rich Sutton 在《苦涩的教训（The Bitter Lesson）》中的思想：&amp;quot;我们想要的是能像我们一样去发现的 AI，而不是一个塞满了我们已有发现的容器。&amp;quot;&lt;/p&gt;  &lt;p&gt;LLM 推理的涌现，正是“学习”这一可扩展范式战胜“硬编码知识与搜索”的最好证明。模型通过学习海量数据中的模式，内化了解决问题的通用策略，而不仅仅是记忆具体问题的解法。&lt;/p&gt;  &lt;h1&gt;08&lt;/h1&gt;  &lt;h6&gt;进阶技术 —— 聚合与检索的力量&lt;/h6&gt;  &lt;h5&gt;聚合的数学原理：自洽性&lt;/h5&gt;  &lt;p&gt;在 RL Fine-tuning 奠定的坚实基础上，还有两大技术可以进一步显著提升LLM的推理能力。首先是通过聚合（Aggregation）多个推理路径来增强结果的鲁棒性，即自洽性（Self-Consistency）。&lt;/p&gt;  &lt;img title="null"&gt;&lt;/img&gt;PPT 第 33 页  &lt;p&gt;Denny 首先指出了标准解码过程中的一个根本性数学缺陷：&lt;/p&gt;  &lt;ul&gt;    &lt;li&gt;•       &lt;strong&gt;模型所做的&lt;/strong&gt;：寻找一个概率最高的      &lt;strong&gt;完整序列&lt;/strong&gt;，即       &lt;code&gt;argmax P(reasoning, final answer | problem)&lt;/code&gt;&lt;/li&gt;    &lt;li&gt;•       &lt;strong&gt;我们想要的&lt;/strong&gt;：找到一个能以最高概率导向正确答案的路径，即       &lt;code&gt;argmax P(final answer | problem)&lt;/code&gt;&lt;/li&gt;&lt;/ul&gt;  &lt;p&gt;这两个目标    &lt;strong&gt;并不等价&lt;/strong&gt;！一条推理过程听起来最&amp;quot;顺&amp;quot;的路径，其最终答案不一定是正确的。&lt;/p&gt;  &lt;h5&gt;自洽性的实践&lt;/h5&gt;  &lt;p&gt;如何弥合这一差距？答案是概率论中的一个基本操作：    &lt;strong&gt;边际化（Marginalization）&lt;/strong&gt;。&lt;/p&gt;  &lt;img title="null"&gt;&lt;/img&gt;  &lt;img title="null"&gt;&lt;/img&gt;PPT 第 35-36 页  &lt;p&gt;自洽性方法巧妙地近似了这一过程：&lt;/p&gt;  &lt;ol&gt;    &lt;li&gt;1.       &lt;strong&gt;随机采样&lt;/strong&gt;：让模型通过随机采样生成多个（例如 40 个或 100 个）不同的推理路径和答案&lt;/li&gt;    &lt;li&gt;2.       &lt;strong&gt;投票表决&lt;/strong&gt;：忽略所有的中间推理过程，只看每个路径最终得出的答案，选择出现次数最多的那个答案作为最终结果&lt;/li&gt;&lt;/ol&gt;  &lt;p&gt;这就像民主投票一样简单，却能带来巨大的性能提升：&lt;/p&gt;  &lt;img title="null"&gt;&lt;/img&gt;PPT 第 37 页  &lt;ul&gt;    &lt;li&gt;• PaLM 模型结合思维链提示，准确率约为 58%&lt;/li&gt;    &lt;li&gt;• 加入自洽性后，准确率      &lt;strong&gt;飙升至 75%&lt;/strong&gt;&lt;/li&gt;    &lt;li&gt;• 新一代的 PaLM-2 模型，结合这些技术，准确率更是达到了惊人的       &lt;strong&gt;92%&lt;/strong&gt;&lt;/li&gt;&lt;/ul&gt;  &lt;p&gt;此外，自洽性还提供了一个天然的    &lt;strong&gt;置信度校准&lt;/strong&gt;机制。一个答案的“一致性”（即在多次采样中出现的频率）越高，其正确的概率也越高。当一致性超过 80% 时，准确率几乎接近 100%。&lt;/p&gt;  &lt;h5&gt;检索的价值：当推理遇见知识&lt;/h5&gt;  &lt;p&gt;Denny 接着谈到了另一个重要的增强方向：检索（Retrieval）。他务实地指出，与其陷入“模型究竟是在推理还是在检索记忆”的无谓辩论，不如务实地将两者结合，实现“检索 + 推理”。    &lt;br /&gt;&lt;/p&gt;  &lt;img title="null"&gt;&lt;/img&gt;  &lt;img title="null"&gt;&lt;/img&gt;PPT 第 44-45 页  &lt;p&gt;他通过两个生动的例子展示了检索的威力：&lt;/p&gt;  &lt;ol&gt;    &lt;li&gt;1.       &lt;strong&gt;类比推理&lt;/strong&gt;：&lt;/li&gt;    &lt;ul&gt;      &lt;li&gt;• 问题：计算一个由四个顶点坐标定义的正方形的面积&lt;/li&gt;      &lt;li&gt;• 解决方案：在提问前，加入提示&amp;quot;回忆一个相关问题，然后再解决这个问题&amp;quot;&lt;/li&gt;      &lt;li&gt;• 效果：模型被激活后，首先自行检索到了相关的基础知识（两点间距离公式），然后成功地运用这个知识计算出面积&lt;/li&gt;&lt;/ul&gt;    &lt;li&gt;2.       &lt;strong&gt;退一步思考&lt;/strong&gt;：&lt;/li&gt;    &lt;ul&gt;      &lt;li&gt;• 问题：一个关于理想气体定律的物理问题&lt;/li&gt;      &lt;li&gt;• 解决方案：引导模型&amp;quot;退一步&amp;quot;，先思考问题背后的核心物理原理（PV = nRT）&lt;/li&gt;      &lt;li&gt;• 效果：模型首先抽象出核心原理，然后基于这个清晰的原理进行逐步推导，最终得出正确答案&lt;/li&gt;&lt;/ul&gt;&lt;/ol&gt;  &lt;p&gt;目前最前沿的应用，如 Gemini 和 OpenAI 的“深度研究”（Deep Research）功能，正是这种&amp;quot;    &lt;strong&gt;检索 + 推理&lt;/strong&gt;&amp;quot;范式的完美体现。&lt;/p&gt;  &lt;h1&gt;09&lt;/h1&gt;  &lt;h6&gt;核心洞察与未来展望&lt;/h6&gt;  &lt;p&gt;在演讲的最后，Denny 为我们提炼了关于 LLM 推理最核心、最值得带走的几点洞察：&lt;/p&gt;  &lt;img title="null"&gt;&lt;/img&gt;PPT 第 47 页  &lt;ol&gt;    &lt;li&gt;1.       &lt;strong&gt;推理 &amp;gt; 无推理&lt;/strong&gt;：无论任务简单与否，让模型生成中间步骤，总是比让它直接给出答案效果更好、更可靠。&lt;/li&gt;    &lt;li&gt;2.       &lt;strong&gt;RL Fine-tuning &amp;gt; SFT&lt;/strong&gt;：让模型从自身的成功经验中学习，远胜于强迫它去模仿人类的解决方案。&lt;/li&gt;    &lt;li&gt;3.       &lt;strong&gt;聚合 &amp;gt; 单一答案&lt;/strong&gt;：通过自洽性等聚合方法，利用多次采样的“集体智慧”来做最终决策，可以显著提升准确性和鲁棒性。&lt;/li&gt;    &lt;li&gt;4.       &lt;strong&gt;检索 + 推理 &amp;gt; 单纯推理&lt;/strong&gt;：将模型的内在生成能力与外部知识检索相结合，是打破其知识局限、解决更复杂现实问题的必由之路。&lt;/li&gt;&lt;/ol&gt;  &lt;h5&gt;未来的突破口在哪里？&lt;/h5&gt;  &lt;p&gt;Denny 也坦诚地指出了当前领域面临的巨大挑战和未来的机遇：&lt;/p&gt;  &lt;ol&gt;    &lt;li&gt;1.       &lt;strong&gt;超越&amp;quot;唯一可验证答案&amp;quot;的任务&lt;/strong&gt;：目前的 RL Fine-tuning 严重依赖于有一个能自动判断对错的验证器。但对于像“写一首诗”、“设计一个软件架构”或“进行一次有创意的头脑风暴”这类没有唯一正确答案的      &lt;strong&gt;非可验证任务&lt;/strong&gt;，我们该如何训练和评估模型？这可能是下一代 AI 研究需要攻克的最大难关。&lt;/li&gt;    &lt;li&gt;2.       &lt;strong&gt;构建真正的应用，而非刷榜&lt;/strong&gt;：学术界的基准测试（benchmarks）很快会达到饱和。真正的价值在于将这些强大的推理能力转化为能解决现实世界问题的      &lt;strong&gt;真实应用&lt;/strong&gt;，无论是辅助科研、编程，还是创造全新的交互体验。&lt;/li&gt;&lt;/ol&gt;  &lt;h5&gt;最后的哲学&lt;/h5&gt;  &lt;p&gt;演讲的最后，Denny 引用了物理学巨匠理查德·费曼的一句话作为结尾：&lt;/p&gt;  &lt;p&gt;    &lt;strong&gt;&amp;quot;真相，往往比你想象的要简单。&amp;quot;&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;从看似魔法的提示，到背后简单的概率分布重塑；从复杂的神经网络，到回归&amp;quot;直接优化目标&amp;quot;这一机器学习第一性原理。Denny 的整场演讲，都在为我们揭示 LLM 推理背后那些简单而深刻的“真相”。&lt;/p&gt;  &lt;p&gt;这，或许就是 AI 时代最迷人的悖论：最像人类智能的表现，恰恰来自于最不像人类的过程。而理解这个悖论，正是我们真正理解和发展 AI 的开始。&lt;/p&gt;  &lt;hr&gt;&lt;/hr&gt;  &lt;h4&gt;参考&lt;/h4&gt;  &lt;p&gt;Stanford CS25: V5 I Large Language Model Reasoning, Denny Zhou of Google Deepmind    &lt;sup&gt;[1]&lt;/sup&gt;&lt;/p&gt;  &lt;p&gt;dennyzhou.github.io    &lt;sup&gt;[2]&lt;/sup&gt;&lt;/p&gt;  &lt;h4&gt;引用链接&lt;/h4&gt;  &lt;p&gt;    &lt;code&gt;[1]&lt;/code&gt; Stanford CS25: V5 I Large Language Model Reasoning, Denny Zhou of Google Deepmind:     &lt;em&gt;https://youtu.be/ebnX5Ur1hBk?si=a23sXMSBOqmh-phG&lt;/em&gt;    &lt;br /&gt;    &lt;code&gt;[2]&lt;/code&gt; dennyzhou.github.io:     &lt;em&gt;https://dennyzhou.github.io/LLM-Reasoning-Stanford-CS-25.pdf&lt;/em&gt;    &lt;br /&gt;&lt;/p&gt;
    &lt;div&gt; &lt;a href="https://itindex.net/"  title="IT 资讯"&gt;&lt;img src="https://itindex.net/images/iconWarning.gif" title="IT 资讯" border="0"/&gt; &lt;/a&gt;</description>
      <category />
      <guid isPermaLink="true">https://itindex.net/detail/63057-%E6%9C%BA%E5%99%A8-%E6%80%9D%E8%80%83-%E6%9C%AC%E8%B4%A8</guid>
      <pubDate>Thu, 25 Sep 2025 07:35:22 CST</pubDate>
    </item>
    <item>
      <title>编程语言是如何实现并发的之操作系统篇 · BMPI</title>
      <link>https://itindex.net/detail/62933-%E7%BC%96%E7%A8%8B%E8%AF%AD%E8%A8%80-%E5%B9%B6%E5%8F%91-%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F</link>
      <description>&lt;div&gt;    &lt;ul&gt;      &lt;li&gt;        &lt;a href="https://www.bmpi.dev/dev/deep-in-program-language/how-to-implement-concurrency/os-scheduling/?continueFlag=9c9ca4836bf40544b491dee6be45203d#%E4%BB%8E%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F%E8%BF%90%E8%A1%8C%E7%A8%8B%E5%BA%8F%E8%AF%B4%E8%B5%B7"&gt;从操作系统运行程序说起&lt;/a&gt;&lt;/li&gt;      &lt;li&gt;        &lt;a href="https://www.bmpi.dev/dev/deep-in-program-language/how-to-implement-concurrency/os-scheduling/?continueFlag=9c9ca4836bf40544b491dee6be45203d#%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F%E7%9A%84%E6%94%AF%E6%8C%81"&gt;操作系统的支持&lt;/a&gt;        &lt;ul&gt;          &lt;li&gt;            &lt;a href="https://www.bmpi.dev/dev/deep-in-program-language/how-to-implement-concurrency/os-scheduling/?continueFlag=9c9ca4836bf40544b491dee6be45203d#%E8%B0%83%E5%BA%A6scheduling"&gt;调度(Scheduling)&lt;/a&gt;&lt;/li&gt;          &lt;li&gt;            &lt;a href="https://www.bmpi.dev/dev/deep-in-program-language/how-to-implement-concurrency/os-scheduling/?continueFlag=9c9ca4836bf40544b491dee6be45203d#%E7%BA%BF%E7%A8%8Bthread"&gt;线程(Thread)&lt;/a&gt;&lt;/li&gt;          &lt;li&gt;            &lt;a href="https://www.bmpi.dev/dev/deep-in-program-language/how-to-implement-concurrency/os-scheduling/?continueFlag=9c9ca4836bf40544b491dee6be45203d#%E7%94%A8%E6%88%B7%E7%BA%BF%E7%A8%8Buser-level-thread"&gt;用户线程(User-level Thread)&lt;/a&gt;&lt;/li&gt;          &lt;li&gt;            &lt;a href="https://www.bmpi.dev/dev/deep-in-program-language/how-to-implement-concurrency/os-scheduling/?continueFlag=9c9ca4836bf40544b491dee6be45203d#%E7%BA%BF%E7%A8%8B%E6%A8%A1%E5%9E%8Bthread-model"&gt;线程模型(Thread Model)&lt;/a&gt;&lt;/li&gt;          &lt;li&gt;            &lt;a href="https://www.bmpi.dev/dev/deep-in-program-language/how-to-implement-concurrency/os-scheduling/?continueFlag=9c9ca4836bf40544b491dee6be45203d#%E4%B8%8A%E4%B8%8B%E6%96%87%E5%88%87%E6%8D%A2context-switching"&gt;上下文切换(Context switching)&lt;/a&gt;&lt;/li&gt;          &lt;li&gt;            &lt;a href="https://www.bmpi.dev/dev/deep-in-program-language/how-to-implement-concurrency/os-scheduling/?continueFlag=9c9ca4836bf40544b491dee6be45203d#io%E6%A8%A1%E5%9E%8Bio-model"&gt;I/O模型(I/O Model)&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;      &lt;li&gt;        &lt;a href="https://www.bmpi.dev/dev/deep-in-program-language/how-to-implement-concurrency/os-scheduling/?continueFlag=9c9ca4836bf40544b491dee6be45203d#%E5%B9%B6%E5%8F%91%E8%BF%98%E6%98%AF%E5%B9%B6%E8%A1%8C"&gt;并发还是并行&lt;/a&gt;&lt;/li&gt;      &lt;li&gt;        &lt;a href="https://www.bmpi.dev/dev/deep-in-program-language/how-to-implement-concurrency/os-scheduling/?continueFlag=9c9ca4836bf40544b491dee6be45203d#%E6%80%BB%E7%BB%93"&gt;总结&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;    &lt;h2&gt;从操作系统运行程序说起&lt;/h2&gt;    &lt;p&gt;      &lt;img alt=""&gt;&lt;/img&gt;&lt;/p&gt;    &lt;p&gt;这是一台拥有2个虚拟CPU核心的      &lt;u&gt;Linux&lt;/u&gt;服务器的      &lt;u&gt;系统监控界面&lt;/u&gt;。其中红框①中      &lt;code&gt;PPID&lt;/code&gt;代表父进程ID，      &lt;code&gt;PID&lt;/code&gt;代表进程或线程ID。红框②中      &lt;code&gt;CPU&lt;/code&gt;代表当前线程运行的CPU核心编号。红框③中是程序的运行命令，其中绿色代表的是      &lt;u&gt;线程，白色为进程&lt;/u&gt;。&lt;/p&gt;    &lt;p&gt;以PID为1375的进程为例，它的父进程为1086，可以通过PPID不断追溯至PID为1的      &lt;u&gt;        &lt;code&gt;init&lt;/code&gt;&lt;/u&gt;进程。从这可以看出Linux通过      &lt;u&gt;        &lt;code&gt;fork()&lt;/code&gt;&lt;/u&gt;的系统调用不断的复制出大量的需要被执行的程序进程。&lt;/p&gt;    &lt;p&gt;进程是操作系统进行      &lt;u&gt;资源分配&lt;/u&gt;的一个独立单位，而实际在CPU运行调度的是线程。以进程1375为例，它又创建了7个线程，如下：&lt;/p&gt;    &lt;pre&gt;      &lt;code&gt;$ ls /proc/1375/task/
1375  1429  1430  1431  1432  1433  1488
$ ls /proc/1375/task/1429
arch_status  cgroup      cmdline             cpuset   exe     gid_map  loginuid  mountinfo  ns         oom_score      patch_state  root       sessionid  smaps_rollup  statm    uid_map
attr         children    comm                cwd      fd      io       maps      mounts     numa_maps  oom_score_adj  personality  sched      setgroups  stack         status   wchan
auxv         clear_refs  cpu_resctrl_groups  environ  fdinfo  limits   mem       net        oom_adj    pagemap        projid_map   schedstat  smaps      stat          syscall&lt;/code&gt;&lt;/pre&gt;    &lt;p&gt;其中线程1430与1432是调度运行在2号CPU核心上的，如果持续观察这个监控界面，会发现同一个线程会不定时在两个CPU核心之间来回切换，这实际正是操作系统对这些线程在多核CPU上进行抢占式调度。&lt;/p&gt;    &lt;p&gt;操作系统之所以能用有限的CPU核心去运行非常多的程序，并且用户感觉这些程序是在同时运行。一方面操作系统（内核）可以通过一些方法实现并发处理任务（程序），另外一方面得益于多个CPU核心，操作系统还可以并行处理任务。&lt;/p&gt;    &lt;p&gt;本文并不是研究操作系统是怎么实现并发的，但在搞清楚编程语言是怎么实现并发处理之前，很有必要提前对操作系统支持并发提供的一些重要特性做一个全面的介绍。操作系统为了支持多任务处理，提供了进程管理与调度，同时在I/O上提供了多种访问文件或网络的系统调用方式。&lt;/p&gt;    &lt;h2&gt;操作系统的支持&lt;/h2&gt;    &lt;pre&gt;      &lt;code&gt;# 操作系统
## 进程(Process)
### 调度方式
- 抢占式(Preemptive)
- 协作式(Cooperative)
### 执行方式
- 用户线程(User-level Thread)
  - Coroutine
    - Verticle
  - Goroutine
  - Erlang process
  - Green Thread(Java)
- 内核线程(Kernel-level Thread)
- 纤程(Fiber)
## I/O
- 同步(Synchronous)
  - 阻塞式(Blocking)
  - 非阻塞式(Non-blocking)
  - 多路复用(Multiplexing)
  - 信号驱动(Signal Driven)
- 异步(Asynchronous)&lt;/code&gt;&lt;/pre&gt;    &lt;h3&gt;调度(Scheduling)&lt;/h3&gt;    &lt;p&gt;进程调度主要有抢占式调度和协作式调度两种：抢占式(Preemptive)与协作式(Cooperative)。&lt;/p&gt;    &lt;a href="https://www.slanglabs.in/blog/python-microservices-01-tornado-asyncio-lint-test-coverage-project-setup"&gt;      &lt;img alt="&amp;#25250;&amp;#21344;&amp;#24335;&amp;#19982;&amp;#21327;&amp;#20316;&amp;#24335;&amp;#20219;&amp;#21153;&amp;#35843;&amp;#24230;(Preemptive Multitasking vs. Cooperative Multitasking)"&gt;&lt;/img&gt;&lt;/a&gt;    &lt;p&gt;抢占式与协作式任务调度(Preemptive Multitasking vs. Cooperative Multitasking)&lt;/p&gt;    &lt;p&gt;抢占式调度往往在一些重要位置（Sleep Call，Timer Tick）放置了中断信号，通过这个信号通知操作系统调度器(Scheduler)进行进程切换。在抢占式模型中，正在运行的进程可能会被强行挂起，这是由于这些中断信号引发的。&lt;/p&gt;    &lt;p&gt;协作式调度也叫非抢占式调度，是指当前运行的进程通过自身代码逻辑出让CPU控制权。与抢占式调度的区别在于进程运行不会被中断信号打断，除非其主动出让控制权给其他进程。&lt;/p&gt;    &lt;blockquote&gt;      &lt;p&gt;以上描述并没有明确区分进程还是线程，实际在        &lt;u&gt;Linux系统的内核态上&lt;/u&gt;，用户态的线程统一按        &lt;u&gt;轻量级进程(Light-weight process)&lt;/u&gt;来处理，它们与真正的进程的区别是在一个用户态进程中的线程共享了相同的地址空间和其他资源（如打开的文件描述符），但在内核调度上并没有什么区别。&lt;/p&gt;&lt;/blockquote&gt;    &lt;p&gt;线程是进程的运行实例，哪怕在非多线程的进程中，在内核态实际运行进程的还是内核线程，所以接下来介绍下线程的分类。&lt;/p&gt;    &lt;h3&gt;线程(Thread)&lt;/h3&gt;    &lt;p&gt;我们在编程语言中见到的线程，一般指的是与内核线程一一映射的用户态线程，比如Java中的Thread其实就是内核线程。但一些编程语言如Erlang与Go都实现了更轻量级的用户线程。&lt;/p&gt;    &lt;ul&gt;      &lt;li&gt;用户线程(User-level Thread)        &lt;ul&gt;          &lt;li&gt;协程(Coroutines - Cooperative User-Level Threads)：应用程序通过线程库自行实现的            &lt;strong&gt;协作式调度&lt;/strong&gt;的用户线程，代表性的有Go语言的Goroutine（1.14之前的版本），Vert.x框架中的Verticle。&lt;/li&gt;          &lt;li&gt;Go Goroutine：Go语言的Goroutine在1.14之前是协程的机制，之后的版本采用了            &lt;a href="https://go.dev/doc/go1.14"&gt;异步抢占式调度(asynchronously preemptible)&lt;/a&gt;。&lt;/li&gt;          &lt;li&gt;Erlang process：Erlang VM(BEAM)管理的用户线程，与协程相比的优势在于它可以做到            &lt;strong&gt;公平调度&lt;/strong&gt;，不会出现协程中某个用户线程占用过多CPU周期。&lt;/li&gt;          &lt;li&gt;绿色线程(Green Thread)：类似于协程，是由            &lt;u&gt;Java JDK实现&lt;/u&gt;的，但因为            &lt;u&gt;早期Linux系统没实现内核态的抢占式调度&lt;/u&gt;，Green Thread只能在Solaris系统上发挥它的威力，最终在JDK 1.3之后被Native Thread取代。所以现行的JDK的线程实际是非常重量级的内核态线程，Java的            &lt;a href="https://github.com/openjdk/loom"&gt;Project Loom&lt;/a&gt;会尝试实现新的Green Thread方案，并且是抢占式的调度方案。&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;      &lt;li&gt;内核线程(Kernel-level Thread)：操作系统内核管理的        &lt;strong&gt;抢占式调度&lt;/strong&gt;的线程，是最终运行在CPU上实际执行任务的最小单元。&lt;/li&gt;      &lt;li&gt;纤程(Fibers)：操作系统内核管理的        &lt;strong&gt;协作式调度&lt;/strong&gt;的线程。这一系统级别的方案最终因硬件和软件的发展        &lt;u&gt;逐渐式微&lt;/u&gt;，现在的用户线程也能达到协作式调度的效果。&lt;/li&gt;&lt;/ul&gt;    &lt;p&gt;用户线程与内核线程的区别在于用户线程的调度是发生在用户态，内核中无法感知到用户线程的存在，并且调度也发生在用户态，一般是由线程库或编程语言运行时自行实现的。而内核线程的调度是由内核完成的，一般是抢占式调度。&lt;/p&gt;    &lt;h3&gt;用户线程(User-level Thread)&lt;/h3&gt;    &lt;p&gt;用户线程大多是采用协作调度的方式实现，本质上是      &lt;strong&gt;同步执行在与CPU核心数量相同的内核线程上的&lt;/strong&gt;，不仅能极大的降低了上下文开销，还能最佳的利用多核CPU的计算能力。&lt;/p&gt;    &lt;p&gt;用户线程的轻量除了体现在调度的上下文切换开销上，还体现了在对内存的需求上。如果要在4核心4GB内存的笔记本电脑中测试同时生成100万个线程的话，不同编程语言对内存的需求：&lt;/p&gt;    &lt;ul&gt;      &lt;li&gt;Elixir: 0.48 GB (Process)&lt;/li&gt;      &lt;li&gt;Golang: 1.91 GB (Goroutine)&lt;/li&gt;      &lt;li&gt;Java: 977 GB (Thread)&lt;/li&gt;      &lt;li&gt;PHP: 6836 GB (Laravel Request)&lt;/li&gt;&lt;/ul&gt;    &lt;blockquote&gt;      &lt;p&gt;数据来源：Programming Elixir        &lt;sup&gt;Chapter 15&lt;/sup&gt;&lt;/p&gt;&lt;/blockquote&gt;    &lt;p&gt;但用户线程的执行最终是由内核线程来完成，所以存在一个从用户线程到内核线程的映射模型。&lt;/p&gt;    &lt;h3&gt;线程模型(Thread Model)&lt;/h3&gt;    &lt;p&gt;可能有人会疑惑，用户线程与内核线程是一一映射的吗？总的来说有以下三种线程模型：&lt;/p&gt;    &lt;a href="https://medium.com/swlh/different-threading-models-why-i-feel-goroutine-is-better-though-with-some-limitations-b73863ba4dae"&gt;      &lt;img alt="&amp;#19981;&amp;#21516;&amp;#30340;&amp;#32447;&amp;#31243;&amp;#27169;&amp;#22411;(Different Threading Models)"&gt;&lt;/img&gt;&lt;/a&gt;    &lt;p&gt;不同的线程模型(Different Threading Models)&lt;/p&gt;    &lt;ul&gt;      &lt;li&gt;1x1 (kernel-level threading)：用户线程与内核线程是一一映射的。这是最简单的模型。在这种语境下，用户线程中的线程就是我们常规意义上说的线程，当程序创建一个线程时，也会在内核中创建一个内核线程。目前大多数操作系统如Linux、Solaris、FreeBSD、macOS与iOS内核的线程模型就是这种。&lt;/li&gt;      &lt;li&gt;Nx1 (user-level threading)：多个用户线程与一个内核线程映射。在这种模型中，内核线程只有一个，在应用内部不存在内核线程切换的开销，程序的并发能力是很高的。但一旦某个用户线程被阻塞（发生网络或文件I/O系统调用），其他用户线程也会被阻塞。另外应用也无法从多核CPU上获得更好的并发性。所以实际的使用场景中，这种模型并不常见。&lt;/li&gt;      &lt;li&gt;MxN (hybrid threading)：多个用户线程与多个内核线程映射。这种模型最为复杂，但也是最强大的线程模型，不仅有着很好的并发能力，同时还能获得多核CPU的处理能力。早期的Solaris内核中也支持这种线程模型，但因为其会导致内核调度过于复杂，逐渐被放弃。但在Erlang VM和Go语言的运行时就又实现了这种线程模型。&lt;/li&gt;&lt;/ul&gt;    &lt;a href="https://docs.oracle.com/cd/E19620-01/805-3024/6j2sumi1a/index.html"&gt;      &lt;img alt="&amp;#26089;&amp;#26399;Solaris&amp;#20869;&amp;#26680;&amp;#30340;&amp;#32447;&amp;#31243;&amp;#21644;&amp;#36731;&amp;#37327;&amp;#32423;&amp;#36827;&amp;#31243;(Threads and Lightweight Processes)"&gt;&lt;/img&gt;&lt;/a&gt;    &lt;p&gt;早期Solaris内核的线程和轻量级进程(Threads and Lightweight Processes)&lt;/p&gt;    &lt;blockquote&gt;      &lt;p&gt;轻量级进程(Light-weight process)：Solaris内核中的概念，但也会在其他系统内核中看到类似的概念。指的是用户线程和内核线程之间的接口，也可被认为是一个调度用户线程执行的虚拟CPU。当用户线程发出系统调用时，运行该线程的LWP调用内核并保持绑定到该内核线程至少直到系统调用完成。当LWP在内核中为用户线程执行系统调用时，它会运行一个内核线程。因此，每个LWP都与一个内核线程相关联。只有在用户线程完全由轻量级进程构成时，才可以说轻量级进程就是线程。Go语言中Goroutine的G-P-M调度模型中，P承担了类似LWP的角色。&lt;/p&gt;&lt;/blockquote&gt;    &lt;p&gt;应用程序为什么会费劲的设计出用户线程？操作系统提供的内核线程不香吗？这是因为操作系统内核的线程切换是重量级的操作，它需要进行上下文切换，而这会很耗时。&lt;/p&gt;    &lt;h3&gt;上下文切换(Context switching)&lt;/h3&gt;    &lt;p&gt;在进程间切换需要消耗一定的CPU时钟周期进行相关的状态管理工作，包括寄存器和内存映射的保存与读取、更新各种内部的表等。比如在Linux内核中，上下文切换需要涉及寄存器、栈指针、程序计数器的切换。&lt;/p&gt;    &lt;p&gt;在这篇      &lt;a href="https://blog.tsunanet.net/2010/11/how-long-does-it-take-to-make-context.html"&gt;How long does it take to make a context switch?&lt;/a&gt;中可以看到一个结论是：&lt;/p&gt;    &lt;blockquote&gt;      &lt;p&gt;Context switching is expensive. My rule of thumb is that it’ll cost you about 30µs of CPU overhead…Applications that create too many threads that are constantly fighting for CPU time (such as Apache’s HTTPd or many Java applications) can waste considerable amounts of CPU cycles just to switch back and forth between different threads…I think the sweet spot for optimal CPU use is to have the same number of worker threads as there are hardware threads, and write code in an asynchronous / non-blocking fashion.&lt;/p&gt;&lt;/blockquote&gt;    &lt;p&gt;因为线程调度的上下文切换成本非常昂贵，所以最佳的做法是应用程序使用和CPU核心相同的线程数，这样每个线程都能充分利用CPU核心的时间片，避免了应用内部多个线程的上下文切换开销。&lt;/p&gt;    &lt;p&gt;用户线程的轻量级让应用程序能够极大的提高并发性，但也会有一些问题，比如某个用户线程中发起一个网络请求导致底层的内核线程被阻塞，因为多个用户线程在共用这个内核线程，最终导致大量的用户线程被阻塞。&lt;/p&gt;    &lt;p&gt;解决这个问题需要了解操作系统的I/O模型。&lt;/p&gt;    &lt;h3&gt;I/O模型(I/O Model)&lt;/h3&gt;    &lt;p&gt;当应用程序需要访问文件或者网络资源时，应用内的线程将会花费大量的时间来等待数据的到来。如下图所示：&lt;/p&gt;    &lt;p&gt;      &lt;img alt=""&gt;&lt;/img&gt;&lt;/p&gt;    &lt;p&gt;如果把CPU处理计算机指令的速度类比成高铁的速度，那线程一次文件或网络的访问将会和蜗牛一样慢，这相当于你在高铁上让蜗牛去帮你取快递，对CPU来说是巨大的浪费。现代操作系统已经提供了多种I/O模型来解决这个问题。常见的I/O模型有：&lt;/p&gt;    &lt;a href="https://www.4e00.com/blog/linux/2017/09/29/unix-network-programming-charpter-6-io-multiplexing.html"&gt;      &lt;img alt="&amp;#20116;&amp;#31181;I/O&amp;#27169;&amp;#22411;&amp;#23545;&amp;#27604;(Comparison of the five I/O models)"&gt;&lt;/img&gt;&lt;/a&gt;    &lt;p&gt;五种I/O模型对比(Comparison of the five I/O models)&lt;/p&gt;    &lt;ul&gt;      &lt;li&gt;同步(Synchronous)        &lt;ul&gt;          &lt;li&gt;阻塞式(Blocking)：同步阻塞式是最常见的I/O模型。线程在访问文件或网络资源时，会因发起了内核的系统调用被挂起，内核会检查文件描述符是否可读，当文件描述符中存在数据时，内核会将数据复制给线程并交回控制权，线程从挂起状态切换成可运行状态等到内核调度运行。&lt;/li&gt;          &lt;li&gt;非阻塞式(Non-blocking)：线程在访问文件或网络资源时，因文件描述符是非阻塞的，线程在检查数据是否可读的阶段是非阻塞的。此模型需要线程不停的通过轮询(polling)的方式检查文件描述符是否可读。但之所以属于同步I/O，是因为在最终读取数据(            &lt;code&gt;recvfrom&lt;/code&gt;)时需要从内核态中拷贝数据(            &lt;code&gt;recvfrom&lt;/code&gt;)到用户态中，这个阶段线程依旧被阻塞住无法处理其他指令。&lt;/li&gt;          &lt;li&gt;多路复用(Multiplexing)：和非阻塞式的区别在于，多路复用模型的线程可以同时访问多个文件描述符，这很适合构建高并发的Web服务器或中间件。但此模型会在检查文件描述符时会被阻塞(            &lt;u&gt;              &lt;code&gt;select&lt;/code&gt;&lt;/u&gt;)，并且在读取数据(            &lt;code&gt;recvfrom&lt;/code&gt;)时也会被阻塞。和多路复用模型相似的是使用多线程和阻塞I/O，但当线程产生很多时会消耗大量的内存资源以及线程调度产生的上下文切换开销，所以多路复用模型一般只使用单线程模型。&lt;/li&gt;          &lt;li&gt;信号驱动(Signal Driven)：和上面的模型区别在于，之前的模型都需要线程主动轮询，信号驱动模型需要监听内核的            &lt;code&gt;SIGIO&lt;/code&gt;事件，通过注册事件处理函数，之后线程可以继续执行其他任务。当数据可读时，线程处理函数会以阻塞的方式从内核态复制数据到用户态。&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;      &lt;li&gt;异步(Asynchronous)：此模型和同步模型最大的区别在于，不仅在获取文件操作符时不会被阻塞，数据从内核态复制到用户态也不会被阻塞，因为内核会去做这个复制数据的工作，线程只需要在回调函数中使用数据即可。&lt;/li&gt;&lt;/ul&gt;    &lt;p&gt;关于I/O模型的更多细节，请参考：&lt;/p&gt;    &lt;ul&gt;      &lt;li&gt;        &lt;a href="https://rickhw.github.io/2019/02/27/ComputerScience/IO-Models/"&gt;Study Notes - I/O Models&lt;/a&gt;&lt;/li&gt;      &lt;li&gt;        &lt;a href="https://www.masterraghu.com/subjects/np/introduction/unix_network_programming_v1.3/ch06lev1sec2.html"&gt;I/O Models&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;    &lt;blockquote&gt;      &lt;p&gt;思考一个问题：如果用户线程不可避免的需要被挂起进（如访问共享资源但没有获得锁）而导致内核线程被挂起，如何调度可以让此内核线程上的用户线程可以继续运行？&lt;/p&gt;&lt;/blockquote&gt;    &lt;h2&gt;并发还是并行&lt;/h2&gt;    &lt;p&gt;前面讨论了很多和I/O相关的概念，并不是所有的计算机任务都是和I/O相关(I/O bound)的，比如很多算法都需要CPU做大量的计算，这时候CPU核心根本不会因为等待外部资源而空转，如果在这种计算密集型(CPU bound)任务中使用多线程技术，那么就会产生大量的线程上下文切换开销，最终会导致处理任务的性能变慢。&lt;/p&gt;    &lt;p&gt;在这篇      &lt;a href="https://www.ardanlabs.com/blog/2018/12/scheduling-in-go-part3.html"&gt;Scheduling In Go : Part III - Concurrency&lt;/a&gt;文章中，作者对比了两种类型工作在并发和并行模式的对比，并提供了一些经验总结：&lt;/p&gt;    &lt;ul&gt;      &lt;li&gt;CPU密集型(CPU bound)：如果任务是CPU密集型的，那么使用并行的方式来解决问题，这样可以最大的利用CPU核心的算力。如果使用并发的方式去处理，反而会增加        &lt;u&gt;复杂度&lt;/u&gt;。&lt;/li&gt;      &lt;li&gt;I/O密集型(I/O bound)：如果任务时I/O密集型的，那么使用并发的方式来解决问题，这样可以提升单个CPU核心的吞吐量(Throughput)。&lt;/li&gt;&lt;/ul&gt;    &lt;blockquote&gt;      &lt;p&gt;并发(Concurrent)与并行(Parallel)：并发是指同时处理(dealing with)很多事情，并行是指同时做(doing)很多事情。并行是并发的特殊情况，只能在计算机多核环境中实现。&lt;/p&gt;      &lt;p&gt;同步(Sync)与异步(Async)：一种编程模型。区别在于同步是可预测(predictable)的，异步是不可预测(unpredictable)的编程模型。&lt;/p&gt;&lt;/blockquote&gt;    &lt;h2&gt;总结&lt;/h2&gt;    &lt;p&gt;本篇从操作系统的视角介绍编程语言实现并发的底层概念，包括进程调度与I/O模型等。下篇开始介绍常见的      &lt;a href="https://www.bmpi.dev/dev/deep-in-program-language/how-to-implement-concurrency/concurrency-model/"&gt;并发模型&lt;/a&gt;。&lt;/p&gt;    &lt;div&gt;      &lt;p&gt;        &lt;strong&gt;更新日志&lt;/strong&gt;2022-04-15：根据此        &lt;a href="https://www.v2ex.com/t/846178#reply20"&gt;讨论帖&lt;/a&gt;修改更新。（感谢        &lt;a href="https://www.v2ex.com/member/lxdlam"&gt;@lxdlam&lt;/a&gt;）
2022-04-10：初稿发布。&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;
    &lt;div&gt; &lt;a href="https://itindex.net/"  title="IT 资讯"&gt;&lt;img src="https://itindex.net/images/iconWarning.gif" title="IT 资讯" border="0"/&gt; &lt;/a&gt;</description>
      <category />
      <guid isPermaLink="true">https://itindex.net/detail/62933-%E7%BC%96%E7%A8%8B%E8%AF%AD%E8%A8%80-%E5%B9%B6%E5%8F%91-%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F</guid>
      <pubDate>Sat, 07 Sep 2024 07:31:49 CST</pubDate>
    </item>
    <item>
      <title>每个人每天都只有24小时，希望我的选择真的是我的选择 | 枫言枫语</title>
      <link>https://itindex.net/detail/62844-%E4%B8%AA%E4%BA%BA-%E5%B8%8C%E6%9C%9B-%E9%80%89%E6%8B%A9</link>
      <description>&lt;div&gt;    &lt;p&gt;      &lt;img alt="" src="https://cdn.justinbot.com/wp-content/uploads/2023/08/inner-exploration-cover.jpg"&gt;&lt;/img&gt;&lt;/p&gt;    &lt;p&gt;我们生活在一个变化迅速的时代。这些变化一般被宣传为蓬勃的，积极的，向上的，比如科技日新月异，经济崛起腾飞，等等诸如此类。但对个体而言，这些变化也是一种挑战。&lt;/p&gt;    &lt;p&gt;通过各国多年间的贸易往来、资本互通、人口流动和知识传播，这些变化深刻影响了几乎所有国家的经济、政治与文化。中国改革开放还没不到50年，大家想必对“全球化”的体会更为深切。&lt;/p&gt;    &lt;p&gt;韩国首尔大学社会学系的张庆燮提出“压缩现代性”的概念，在经济后起的东亚社会，我们所面临的挑战比西方发达国家更大。因为西方国家经历了过去几百年的演变，人们的社会观念，道德伦理在代际更迭中可以更顺滑地转化——通俗的讲，父辈子辈的观念即便有所不同，几百年的时间也足够更换很多代人。可东亚国家就不一样了，长达数千年的“传统文化”给我们提供了一套非常完整且严格的规范。过去我们只需按照“传统”行事就行，虽然无趣，但不至于“不知道该做什么”。&lt;/p&gt;    &lt;p&gt;比如我生长的地区，小孩子到了一定年纪就要办“成人礼”。父母只需要根据村里老人的说法，在某个时辰（通常是凌晨），某个地点（通常是村里的祠堂），摆好祭神的盛宴，让这个小孩子穿着特定的服饰（通常必备的是肚兜、木屐）去磕头行礼。在古代社会，“成人”意味着孩子要走出家庭，到更广阔的天地去，或求学士官，或从事商贾。这些“礼”提供了人们行事的规范，也宣示了古代农业社会的嫡庶之分，男女之别，人们在照做的过程中习得了所处社会的等级制度。&lt;/p&gt;    &lt;p&gt;可见这些“传统礼仪”不仅有“仪式感”的作用，也有实际教育作用。在儒家，“礼”就是提供一套社会行为规范，不同的人有不同的身份，不同的身份应该履行何种礼仪何种义务均在其中，等级制度以此形成。&lt;/p&gt;    &lt;p&gt;在古代社会，我们的传统讲究“仁义礼智信”。在现代，我们要在短短数十年间，一边承袭“传统”，一边应对时代的变化。而且这些变化正在加速，我前阵子读了 Gay Talese (盖伊·特立斯)于1980年出版的      &lt;em&gt;Thy Neighbor&amp;apos;s Wife&lt;/em&gt;（简体译为      &lt;a href="https://book.douban.com/subject/27091742/"&gt;《邻人之妻》&lt;/a&gt;）。这本书让我意识到，刻板印象中“一直很开放”的美国，在60年代也“十分保守”。可见即便是美国，他们也在经历加速的社会观念变化。这些变化渗透在经济、政治、文化等多个领域。1960年代，裸体出版物在美国还是违法的，《花花公子》的创始人经常被告，性解放运动也才刚刚开始。而到了70年代后期，《花花公子》已可以光明正大地发行，达到它销量与影响力的巅峰。&lt;/p&gt;    &lt;p&gt;“社会规范”的更新是滞后的，而社会变革是超前的。这就解释了为什么我们学校教育的“家国理想”，市场需要的“商业技能”，和家庭提倡的“传统责任”，会有相当程度的不同，以及它们之间产生的张力对学生时代的我们造成的不同方向上的拉扯。复旦大学社会科学系的郑雅君在她出版的《金榜题名之后:大学生出路分化之谜》一作中，展示了来自不同环境的学生，在应对同样巨变的社会环境时截然不同的反应与选择。&lt;/p&gt;    &lt;p&gt;学生们的迷茫与不知所措，我也感同身受。不仅仅是职业选择，更是“想要什么不想要什么”，“因为什么而痛苦，因为什么而快乐”，“人生是否应该追求快乐”，“人生的意义是什么”之类的我都觉得离谱的困惑。&lt;/p&gt;    &lt;p&gt;上述所谓“压缩现代性”带来的矛盾与冲突是来自社会学的角度。人类是社会性动物，除了社会层面的影响以外，身边人的影响也十分显著。每个人成长环境不同，所面对的人生课题也不同。郑雅君在      &lt;a href="https://book.douban.com/subject/36190074/"&gt;《金榜题名之后》&lt;/a&gt;一书中分析了出身“弱势家庭”与“优势家庭”的学生，在上大学以前，他们的文化背景、眼界视野等“软实力”差距已不言而喻。显然，这些学生在就业选择上会侧重的方向就不一样。&lt;/p&gt;    &lt;p&gt;这些作出职业选择的基础，在后续的人生仍将持续产生影响。我自己在作长期规划时会把我认为重要的课题排列出来（在      &lt;a href="https://justinyan.me/post/tag/%E4%B8%AA%E4%BA%BAOKR%E5%AE%9E%E8%B7%B5"&gt;这一系列文章&lt;/a&gt;中有介绍该方法），近些年我觉得最为重要的是两个课题：&lt;/p&gt;    &lt;ol&gt;      &lt;li&gt;职业生涯 Career&lt;/li&gt;      &lt;li&gt;人际关系 Relationship&lt;/li&gt;&lt;/ol&gt;    &lt;p&gt;职业生涯不只是当前的工作，而是在接下来的人生当中，自己希望把时间用在什么事业上，这项事业可以是多元的，也可以是单一的，可以产生收入，也可以为爱发电。在古代，工作即一个人的身份标识(identity)，在我们这个时代，全职工作只是职业生涯的一部分，不一定是全部。&lt;/p&gt;    &lt;p&gt;2007 年 Tim Ferris (蒂莫西·费里斯)出版了      &lt;em&gt;The 4-Hour Workweek&lt;/em&gt;一书（简体译为      &lt;a href="https://book.douban.com/subject/27065607/"&gt;《每周工作4小时》&lt;/a&gt;），这本书的副标题是: Escape 9-5, Live Anywhere, and Join the New Rich。事实上 Tim Ferris 在此之前每天工作14小时，堪比996。正因为他尝试过“传统”的路径，觉得不适合自己，才会努力去探索新的生活方式。也是因为这个时代为他提供了新的支持，才使得他的探索得以实现。比如只要带一台电脑就可以在泰国边度假边工作，这在工匠时代是不可想象的。与此同时，新时代也存在大量新问题。&lt;/p&gt;    &lt;p&gt;2018 年 David Graeber (大卫·格雷伯)出版了      &lt;em&gt;Bullshit Jobs&lt;/em&gt;一书（简体译为      &lt;a href="https://book.douban.com/subject/35929434/"&gt;《毫无意义的工作》&lt;/a&gt;），这本书在 2022 年由中信出版社引入简体版之后，迅速获得广大打工人的追捧，成为“螺丝钉”们的代言。&lt;/p&gt;    &lt;p&gt;两本书都指出现代人痛苦的部分来源，其一是工作内容毫无意义，上班就是拧螺丝；其二是工作时间还非常长，个人时间变得稀缺。痛苦归痛苦，每天晚上灯火通明的办公楼照出了大部分人的实际选择。为什么大部分人还要一边震天叫骂一边似飞蛾扑火般自投罗网呢？&lt;/p&gt;    &lt;p&gt;拧螺丝的出现是大公司精细分工带来的必然结果，大公司是以技术发展为前提的大型组织。工业革命以前，到手工作坊当学徒是大部分人的“职业选择”。大工厂诞生以后，企业家给他的机器配上了“操作员”。农地变成了工厂，农民被迫成了工人。只要机器不开机，生产就会停滞，于是企业家恨不得工人24小时上班。直到1810年 Robert Own 喊出了 eight hours labour, eight hours recreation, eight hours rest (8小时工作，8小时休闲，8小时睡觉)的口号，才有了后人的朝九晚五。父母在工厂“按时上班”，孩子也会无人照顾。于是学校也要配合新的工业化形态，将孩子们培养成未来的工人，按时上学下学，逐渐形成了现代教育规范。1998 年 Zygmunt Bauman (齐格蒙特•鲍曼)出版了      &lt;em&gt;Work, Consumerism and the New Poor&lt;/em&gt;一书（简体译为      &lt;a href="https://book.douban.com/subject/35593780/"&gt;《工作、消费主义和新穷人》&lt;/a&gt;）中指出，我们现在习以为常的“工作伦理”——比如人不能没有工作的，工作的时候要勤奋努力等等——这些社会规范是由工厂资本家、新教伦理和政府等多方为了自己的利益共同促成的。他们的宣传势力强大，足以形成多数人认可的社会伦理。1932 年 Aldous Huxley (奥尔德斯·赫胥黎)出版的      &lt;em&gt;Brave New World&lt;/em&gt;（简体译为      &lt;a href="https://book.douban.com/subject/25782520/"&gt;《美丽新世界》&lt;/a&gt;）以及 1949 年 George Orwell (乔治·奥威尔)出版的      &lt;em&gt;1984&lt;/em&gt;（简体译为      &lt;a href="https://book.douban.com/subject/5406563/"&gt;《一九八四》&lt;/a&gt;）展示了宣传机器的一种面貌。另一方面，现代全球经济的运转机制过度强调“消费”而促成的消费主义陷阱亦无孔不入。&lt;/p&gt;    &lt;p&gt;如前文所云，人类是社会性动物，社会规范意味着大部分人认可或允许其存在的行为指南，如果一个人的行为不符合该规范，则很容易被视为异类，被群体排斥。在原始部落时代，这样的社群排斥很可能是致命的。最近几百年，社会巨变，可人类的大脑与身体却和几万年前的几乎一样。这就使得个体在瞬息万变的现代社会很容易产生不适应，在面对人生重大抉择的时候，选择随大流还是选择不一样的道路，显然前者是更容易做到的。&lt;/p&gt;    &lt;p&gt;选择随大流，我只需要找到既有的社会规范，照做就可以了，他的难度体现在照做也未必能做得好，但至少有迹可循。比如社会鼓励“赚大钱”，鼓励开豪车住豪宅，那我就照做，努力找高薪的工作，买豪车，住豪宅。我不一定做得到，但好歹目标已经给我设定好了，我既不需要思考这个目标为何存在，也不需要深究我到底是不是真的想要或需要达成这个目标。&lt;/p&gt;    &lt;p&gt;而为了走自己内心真正想要的路，其必要前提就是了解自己想要什么。光是回答这个问题已十分不易。在我很喜欢的 Blogger Tim Urban 他写过      &lt;a href="https://waitbutwhy.com/2018/04/picking-career.html"&gt;How to Pick a Career (That Actually Fits You)&lt;/a&gt;一文，文中他以“欲望的八爪鱼”和“审问地下室”的方式帮助自己了解这些“赚大钱”，“住大House”的欲望到底来自哪里。这些方法通俗易懂，值得一读。&lt;/p&gt;    &lt;p&gt;在岸见一郎与古贺史健合著的讲述阿德勒心理学的一书      &lt;a href="https://book.douban.com/subject/26369699/"&gt;《被讨厌的勇气》&lt;/a&gt;中，则提供了另一种反向思考的角度。书中提到一个有“红脸症”女孩的故事，她只要一跟人说话就脸红所以没有办法去认识陌生人，于是她来寻求老师帮助。于是老师问她：“如果你治好了你的红脸症，你想做什么呢？”女孩思考了一下说：“我想去跟喜欢的男孩子表白。”老师说：“嗯，这就是为什么你会脸红的原因。因为你不想去跟他表白。”因为她不希望表白了之后被人拒绝。&lt;/p&gt;    &lt;p&gt;所以虽然我行动上作出了某个选择，表面上看起来好像很痛苦，但实际上我的内心就是想要这个行动的结果。阿德勒心理学在《被讨厌的勇气》中被应用得拳拳到肉，是一本发人深省的书。不过分析技巧不一定要这么极端，浙大的陈海贤老师 2019 年出版的      &lt;a href="https://book.douban.com/subject/34836531/"&gt;《了不起的我》&lt;/a&gt;一书中提到一种“心理免疫的X光片”分析方法，一共分为4步，我们试试以小明为例分析996这件事情。&lt;/p&gt;    &lt;p&gt;假设小明在一个互联网企业工作，近期正好赶上一个迭代紧密的项目，时间紧任务重，不得不996，这让小明很痛苦。&lt;/p&gt;    &lt;ol&gt;      &lt;li&gt;小明希望达成的目标：        &lt;ul&gt;          &lt;li&gt;不要996工作，能有更多的个人时间，看电影玩游戏，陪女朋友以平息她的怒气。&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;      &lt;li&gt;小明正在做哪些跟目标完全相反的行为        &lt;ul&gt;          &lt;li&gt;乖乖996，甚至007。&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;      &lt;li&gt;这些与目标相反的行为有哪些隐含的好处或可以避免的损失        &lt;ul&gt;          &lt;li&gt;小明的项目正在起步阶段，乖乖听老板的话，努力干活，勤奋向上，希望项目上线后可以休息一下。另一方面，这既是挑战也是机会，大家都想要抓住机会，而且如果我不这么干，老板把我开了呢？&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;      &lt;li&gt;小明内心有一个重大的假设，这个假设是什么？        &lt;ul&gt;          &lt;li&gt;如果小明不996，老板就会把他开掉。反过来小明如果996，就能获得老板认可。那么这个假设是否成立呢？我想读者朋友们如果有一定工作经验，应该不难下判断。&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ol&gt;    &lt;p&gt;只是分析小明被迫996的表象，已能帮助小明更了解自己的内心，事实上前面提到的几种分析方法还能继续往下走，比如为什么这个社会要提倡勤奋工作，人不能没有工作呢？按照这个规范， Tim Ferris 每周工作4小时是不是该被贬斥为懒惰的人了？可是看起来好像大家还挺羡慕他的状态，觉得他很聪明呢？在这个时代，我相信骂他懒惰和夸他聪明的人都有，但要真正对一个人下判断之前，最好是深入了解他的所作所为。不要只看到一个人在网路上的一面就急于评价。&lt;/p&gt;    &lt;p&gt;自从社交网络的兴起以后，人们越来越擅长在社交网络发表自己的高光时刻，以获取更多点赞。来自瑞典的精神科医生 Anders Hansen (安德斯·汉森)的作品      &lt;em&gt;Skärmhjärnan&lt;/em&gt;（简体译为      &lt;a href="https://book.douban.com/subject/36091480/"&gt;《手机大脑》&lt;/a&gt;）指出人类这颗几万年前的大脑不断被现代社会的各种信息刺激而沦陷的现象。Neil Postman (尼尔·波兹曼)在 1985 年出版的      &lt;em&gt;Amusing Ourselves to Death&lt;/em&gt;（简体译为      &lt;a href="https://book.douban.com/subject/26319730/"&gt;《娱乐至死》&lt;/a&gt;）已经指出美国人不再阅读，而是被劣质的电视节目捕获，这将使越来越多的人不愿意训练自己的主动阅读能力，而是等着被喂养。虽然几十年过去了，电子游戏、“网瘾”等新科技纷纷登场取代电视节目的位置，但似乎书中所预言的反乌托邦景象并未真的发生。在《手机大脑》一书中，作者认为手机与电视、电子游戏的不同在于它无时无刻不被人类使用。每天使用4小时以上已成为常态，这种对人类大脑的侵入程度是前所未有的。&lt;/p&gt;    &lt;p&gt;我十分赞同。而且在互联网刚起步的理想主义时代，大家提倡信息自由，从 Web 1.0 自己制作静态网页对外发布信息，到 Web 2.0 开始有 BBS，Blog，RSS 等允许大家参与信息发布的形态。无不在鼓励人们“主动获取”信息，“主动输出”信息。而自从 Google Reader 倒下以后，Facebook/今日头条式的喂养服务开始大行其道，及至现如今抖音/Tik Tok的短视频推荐，无不针对人类大脑的弱点进行攻击。&lt;/p&gt;    &lt;p&gt;Daniel Lieberman (丹尼尔·利伯曼)在 2018 年出版的      &lt;em&gt;The Molecule of More&lt;/em&gt;（简体译为      &lt;a href="https://book.douban.com/subject/35545272/"&gt;《贪婪的多巴胺》&lt;/a&gt;）一书中解释了多巴胺这一化学物如何驱动人类的行为。有时候人们误解“多巴胺等于快乐”，其实多巴胺在人类大脑的奖励系统中只是负责“驱动人们做某事”，提供驱动力，但不保证结果一定快乐，甚至可能结果是自我伤害。这本书的原名直译是《想要更多的分子：你大脑里的一个单一化合物如何驱使爱、性与创造—以及它如何决定人类种族的命运》。&lt;/p&gt;    &lt;p&gt;针对无限刷手机这一现象，人们提出一个词，叫做 Doom Scrolling （“末日刷屏”）。其背后的动力来源就是手机App针对多巴胺驱动的陷阱。虽然像纪录片      &lt;em&gt;The Social Dilemma&lt;/em&gt;（简体译为      &lt;a href="https://movie.douban.com/subject/34960008/"&gt;《监视资本主义》&lt;/a&gt;），还有不少书可以点出其中有害的一面，但造成的实质影响却很有限。&lt;/p&gt;    &lt;p&gt;毕竟，接受多巴胺的驱动，很舒服。&lt;/p&gt;    &lt;p&gt;随大流，很舒服。&lt;/p&gt;    &lt;p&gt;而向内探索，拨开层层保护，找到真正想要的东西，很痛苦。但无论是随大流的痛苦还是向内探索的痛苦，都是值得庆幸的。因为如果不了解这个世界“存在另一种可能”的话，就不会产生痛苦。&lt;/p&gt;    &lt;p&gt;英国的精神分析与社会理论家 Erich Fromm (艾里希·弗洛姆) 1941 年出版的作品      &lt;em&gt;Escape from Freedom&lt;/em&gt;（简体译为      &lt;a href="https://book.douban.com/subject/26418475/"&gt;《逃避自由》&lt;/a&gt;）分析了新教改革前后及两次世界大战后的世界。在中世纪欧洲，人们由教会决定生活的方方面面，只要遵循“传统规范”赋予的行为准则就好了：如果我是铁匠，我就每天打铁，如果我是面包师，我就每天做面包。我不属于我，我属于一个更大的组织，这个组织可能是教会，也可能是行业工会。生活十分稳定，活动范围很小，日子一眼看得到尽头。如果希望发挥自主创造性，我就把武器打造得更锋利，把面包做得更好吃。&lt;/p&gt;    &lt;p&gt;新教改革以后，这些“传统规范”没了。马丁·路德掀起的改革浪潮呼应了人们在资本主义发展过程中，既获得“自由”，又失去“传统”保护的心理状态。失去“保护”可不是件令人开心的事情。&lt;/p&gt;    &lt;p&gt;今天如果有人在提问网站上面问：“我该选择一眼望到头的工作还是选择自由职业”，也许会有人回答：“肯定是自由职业啊！”。&lt;/p&gt;    &lt;p&gt;为什么呢？如果提问的人有那么“肯定”的话，恐怕也不会来提问了。&lt;/p&gt;    &lt;p&gt;最近有个20年前央视《半边天》栏目访谈农村妇女刘小样的视频广为传播。刘小样生长在一个传统力量强大的环境里，几乎从她呱呱坠地那一刻起，人生就被写死在不断循环的“传统”里。&lt;/p&gt;    &lt;blockquote&gt;      &lt;p&gt;在农村，有钱可以盖房，但不可以买书；&lt;/p&gt;      &lt;p&gt;可以打牌闲聊，但不可以去西安。&lt;/p&gt;      &lt;p&gt;不可以交际，不可以太张扬，不可以太个性，不可以太好，不可以太坏。&lt;/p&gt;      &lt;p&gt;有约定俗成的规矩，要打破它就会感到无助、无望、孤独，好像好多眼睛在盯着你。&lt;/p&gt;      &lt;p&gt;不需要别人阻止你，你会自觉自愿地去遵守这些规矩。&lt;/p&gt;&lt;/blockquote&gt;    &lt;p&gt;刘小样的冲突不在于“传统”本身，而在于“外面的世界”存在自由的可能。她想要去探索“外面的世界”，可是就这样一脚踏入自由的话，那多令人恐惧啊！孤独感，无能为力感扑面而来，旧传统已破，新规则未立。不是每个人都能轻易寻得新的替代，也不是每个人都喜欢建立新规则的冒险。所以与其恐惧，不如臣服。&lt;/p&gt;    &lt;p&gt;《逃避自由》举了一个比较极端的例子：纳粹执政时期的社会心理结构。在面对自由焦虑的过程中，人可以选择鼓起勇气，在恐惧与孤独的伴随中与黑暗搏杀，也可以选择逃避自由，放弃个性，消融在一个更伟大的东西里。对于中世纪的人们来说，这个更的伟大的东西是宗教，而对二战期间的德国人来说，这个更伟大的东西，是纳粹主义。&lt;/p&gt;    &lt;p&gt;我们现在所处的主流社会没有世界大战，没有纳粹主义。但是个人意识在觉醒，而“选择自由”的恐惧却不减。从社会学的角度来说，我们的社会需要更多配套的福利保障制度，帮助我们在进行多次试错后仍能为人生托底。从个体的角度来说，我们的人生规划不仅需要个人意识的觉醒，也需要深入探索内心真正想要的东西，而不是把自己的人生寄托于外部赋予的现成答案。&lt;/p&gt;    &lt;p&gt;这些现成的答案很多，“荣华富贵”可能是最世俗最简单也最容易被量化的现成答案了。在学校里就把分数提高，出了学校就把财富数字提高。我分数比你高我就厉害，你的存款比我多你就厉害。在这个最容易被理解的指标里面，存在一个单一数值，同时也存在一个隐含的竞争关系。毕竟只要范围足够小，大家就容易玩成一个零和游戏甚至负和游戏。在这样的游戏里，不竞争，怎么活下去，不比较，这个数值还有什么意义。&lt;/p&gt;    &lt;p&gt;可是人生并不是一个与外部竞争的游戏啊。英国纽卡斯尔大学的行为科学教授 Daniel Nettle (丹尼尔·列托)在 2005 年出版的      &lt;em&gt;Happiness: The Science Behind Your Smile&lt;/em&gt;（简体译为      &lt;a href="https://book.douban.com/subject/4737101/"&gt;《追究幸福：微笑中的科学》&lt;/a&gt;）提出的观点我十分认同：幸福并不主要产生于这个世界，而是来自于对待这个世界的方式。&lt;/p&gt;    &lt;p&gt;也就是说，通过向外的追寻，比较，竞争，我们再怎么努力也追不到真正的幸福。刷短视频可以满足一时的娱乐放松，但无限刷短视频刷不来真正的快乐。在多巴胺的刺激下，我们“想要”更多不确定的内容，“想要”看看下一个短视频是什么，但“想要”不等于喜爱。&lt;/p&gt;    &lt;p&gt;以前常听说 Time is Money，现在更常听说 Money is Time。&lt;/p&gt;    &lt;p&gt;最近读 George Gilder (乔治·吉尔德) 2023 年出版的      &lt;a href="https://book.douban.com/subject/36403216/"&gt;新书&lt;/a&gt;      &lt;em&gt;Life After Capitalism: The Meaning of Wealth, the Future of the Economy, and the Time Theory of Money&lt;/em&gt;（暂无简体版，直译为《后资本主义时代的生活：财富的意义、经济的未来以及金钱的时间理论》），他从经济学的角度分析人类经济的基础并不来自传统经济学、唯物主义者认为的“物质的稀缺”，而是来自“知识”。虽然这本书和本文主旨关系不大，但书中提到“时间”是对所有现代人都最公平的东西，我深表赞同。&lt;/p&gt;    &lt;p&gt;我自己有一份全职工作，业余时间写Blog，录Podcast，开发自己的App和服务，多年来一直如此。按这两年的流行词说法，我这叫 Slash Youth（斜杠青年）。有时候朋友会说：“诶你怎么有这么多时间可以又上班又看书又做播客的？”我通常都会回答：“每个人每天都有24小时，大家使用这24小时的方式不同而已。”&lt;/p&gt;    &lt;p&gt;这里还有社交网络传递信息的偏差，比如我拍摄一张咖啡店的照片，配一小段文字说我尝试了新店。在别人看来你好像在到处跑，度过了一个美好的周末，实际上我可能只是整个周末都在忙各种事情，正好路过一家咖啡店，花10分钟买了杯咖啡而已。这种透过社交网络的小孔窥视别人的人生的方式，很容易放大别人的真实经历。&lt;/p&gt;    &lt;p&gt;但回到每天24小时这件事情上来，因为我喜欢读书所以我每天都会有些时间用在阅读上。假设每天阅读1小时，而这1小时也许我的朋友用在刷抖音，或者看电视剧，或者玩游戏，或者跟别人约会。这些都是合理使用时间的方式，毕竟时间是自己的，不是任何人的，爱怎么用别人管不着。&lt;/p&gt;    &lt;p&gt;但是时间一点点流逝，我们的年龄在一天天增加，而人类的寿命始终是有限的。&lt;/p&gt;    &lt;p&gt;人终有一死，我们可以很明确地知道自己一定会死，但我们不知道在什么地方，什么时间，以什么样的方式死去。于是我们会有死亡焦虑。&lt;/p&gt;    &lt;p&gt;前两年我开始作长期个人计划，实践下来我发现很有助于我发现当下决策与未来的联系。一开始只作月度计划，并试图将一个月的目标与总目标关联。但今年我开始多看几个月，比如看到年底，可能会发生什么事情。比如我是不是希望去旅行度假，那么此刻我应该做些什么来让这件事情顺利发生？几个月前打球的时候我把脚崴了。当时我觉得过几天可能就好了，也许不用去医院那么麻烦。但当我把目光拉长到年底，如果去旅行可能要走很长的路，我的脚伤不好我就去不了，于是我就乖乖去医院了。&lt;/p&gt;    &lt;p&gt;很多时候我们的随大流选择，还带有“不用考虑未来”的好处。当下我身边的人是怎么做的，我跟着做就好了。于是从脚伤这件事情我就开始思考，一年后我希望自己变成什么样子，十年后呢？&lt;/p&gt;    &lt;p&gt;如果是一个大学生，十年后会希望自己的职业生涯有怎样的发展呢？在我们播客《      &lt;a href="https://justinyan.me/post/5753"&gt;Vol. 94 是光诗歌: 用诗歌发现大山孩子手里的光&lt;/a&gt;》这期节目里，是光诗歌公益组织的两位创始人在大学时期就慢慢建立自己对未来想要从事的事业的方向；在《      &lt;a href="https://justinyan.me/post/5785"&gt;Vol. 97 Harry: 数字游民与独立开发&lt;/a&gt;》这期节目里，独立开发者 Harry 在小孩子出生以后开始规划家庭的未来；在《      &lt;a href="https://justinyan.me/post/4848"&gt;Vol. 60 Sofish: 35岁不工作了，中场休息时他是怎么想的？&lt;/a&gt;》这期节目，Sofish 则选择不工作了先休息一下。那么我呢？十年后我也会是小孩子的父亲吗？如果是的话，我会希望自己成为一个怎样的父亲呢？我此刻应该做些什么呢？&lt;/p&gt;    &lt;p&gt;美国的存在主义精神分析师 Irvin Yalom (欧文·亚隆)于 2008 年出版的      &lt;em&gt;Staring at the Sun: Overcoming the Terror of Death&lt;/em&gt;（简体译为      &lt;a href="https://book.douban.com/subject/26660579/"&gt;《直视骄阳：征服死亡恐惧》&lt;/a&gt;）一书中直接把目光瞄准了一个人能达到的最远的未来：死亡之日。&lt;/p&gt;    &lt;p&gt;杜甫的时代，人生七十古来稀。现在我们的平均寿命要长得多，假设我能活到90岁，剩下的几十年我希望自己如何度过？焦虑是一种对未来的情绪，未来意味着尚未发生。适当的焦虑有助我们产生解决可能出现的问题的动力，死亡焦虑则可能是人类能体验到的最高级别的动力。&lt;/p&gt;    &lt;p&gt;这种力量有时候可能过于汹涌澎湃，以至将自己淹没。《直视骄阳》一书讲述的是作者在做心理咨询时遇到的各种案例，也包括作者自己面对死亡焦虑袭来时的自我分析。我想有时候大家的选择，往深处分析总会跟死亡焦虑有关。我降生到这个世界，希望对这个世界产生影响，希望留下点什么，时间在一点点流逝，死亡日期在一步步迫近，即便我把这些念头埋进潜意识里，它也会通过某种方式在意识层面浮现出来。&lt;/p&gt;    &lt;p&gt;通常它会带着各种伪装，比如把它的欲望包装成是父母的期待，是妻子丈夫的期待，要揭下这层伪装，就需要我们向内探索，向内探索，最终都会走到对自己死亡的探索。&lt;/p&gt;    &lt;p&gt;美国的投资人 Bill Perkins (比尔·帕金斯)在他 2022 年出版的      &lt;em&gt;Die With Zero&lt;/em&gt;（简体译为      &lt;a href="https://book.douban.com/subject/36242339/"&gt;《最优解人生》&lt;/a&gt;）一书中指出我们所赚取的金钱都是通过消耗我们的生命获取的，所以最好的消耗生命的方式就是在死亡之前把所有钱都花光。作者的想法有点极端，但提供了一个有意思的角度：假设能活到90岁，那么从今天开始算起，把剩下的生命时间以5年或10年为间隔切分成多个桶，把自己想做的事情放进每个桶里。这样我们会发现，20岁，30岁我们还能滑雪，能做各种极限运动，60岁，70岁就不一定了。我们被迫从什么时间能做什么事的角度来看到自己的人生，而不是一味地“延迟满足”。&lt;/p&gt;    &lt;p&gt;至于我们赚到的钱事实上都是生命这个概念，美国的 Vicki Robin (维姬·罗宾) 1992 年出版的 ****      &lt;em&gt;Your Money Or Your Life: Transforming Your Relationship with Money and Achieving Financial Independence&lt;/em&gt;（简体译为      &lt;a href="https://book.douban.com/subject/35611477/"&gt;《要钱还是要生活：没有财务自由，也能提前退休》&lt;/a&gt;）一书中就曾提出过把收入换算成生命能量的做法，很有意思。有用的地方在于，迫使我们把“努力赚很多很多钱”这种无上限的思维，转换成每天只有24小时，人终有一死的有限思维。只有在“有限”的框架下，我们才愿意去思考什么是重要的，什么是次要的。&lt;/p&gt;    &lt;p&gt;这些都是很有启发的想法，让我们暂时跳出习惯性的短视逻辑，以更长的时间线俯瞰人生。不管是4-Hour Work Week后开始的数字游民，还是这些年兴起的 F.I.R.E 运动（Financial Independence, Retire Early），都是在现代社会的基础上，人们为了脱离原有的“传统束缚”，挣脱枷锁自由的同时，为自己的失去的“传统保护”寻找替代方案的探索过程。这些人无疑是勇敢而且极富创造力的。&lt;/p&gt;    &lt;p&gt;勇敢不是鲁莽。勇敢是明知前路凶险，却依然愿意投身其中，并对自己充满自信，觉得一切问题终有解法。1847 年，在那个女性写作仍被世人侧目的时代，英国的 Charlotte Brontë (夏洛蒂·勃朗特)以 Currer Bell (科勒·贝尔)的男性化的名字出版了小说      &lt;em&gt;Jane Eyre&lt;/em&gt;（简体译为      &lt;a href="https://book.douban.com/subject/5063804/"&gt;《简·爱》&lt;/a&gt;）。小说取材自 Charlotte Brontë 的童年生活，并将作者对生活的希望投射其中。小说女主角 Jane，从寄养家庭到教会学校的变迁是被动的，但她主动求得家庭教师一职，离开学校踏入桑菲尔德庄园则是她改变自己人生的重要一步。&lt;/p&gt;    &lt;p&gt;踏入自由是可怕的，Jane 是勇敢的。阅读《简·爱》，我佩服主人公的勇气，但不清楚她勇气的来源。2020 年 Eric Jorgenson (埃里克·乔根森)在传奇投资人 Naval Ravikant (纳瓦尔•拉维坎特)的授权下，把 Naval 的Tweets，文章和接受的采访等材料编辑成      &lt;em&gt;The Almanack of Naval Ravikant&lt;/em&gt;一书（简体译为      &lt;a href="https://book.douban.com/subject/35876121/"&gt;《纳瓦尔宝典》&lt;/a&gt;）。Naval 在书中以碎片式的文字讲述了他的人生哲学，包括财富、幸福、自我救赎、哲学等层面。他在书中说:”The Present is All We Have.”（我们唯一拥有的就是当下。）&lt;/p&gt;    &lt;p&gt;当下，是什么？和向内探索有什么关联？&lt;/p&gt;    &lt;p&gt;UCLA 认知神经科学博士 Sam Harris (萨姆·哈里斯)在 2014 年出版的 Waking Up（简体译为      &lt;a href="https://book.douban.com/subject/35706913/"&gt;《“活在当下”指南》&lt;/a&gt;）一书指出心智独立于大脑之外，试图以“非宗教语言”的形式解释人类的精神追求。精神体验本身难以通过文字描述传达，但我在阅读本书的过程中却逐步体会到“正念”，或“冥想”训练可能带来的好处，并开始学习正念冥想(Mindfulness)。&lt;/p&gt;    &lt;p&gt;一切真正的思维转变，都必须结合思考变化与物理训练。有时候人们会陷入一个误区，以为“精神”与“身体”可以分离，但其实二者相互结合，密不可分。加拿大多伦多大学的临床心理学家 Jordan Peterson (乔丹·彼得森)于 2018 年出版的      &lt;em&gt;12 Rules for Life&lt;/em&gt;（简体译为      &lt;a href="https://book.douban.com/subject/34870933/"&gt;《人生十二法则》&lt;/a&gt;）一书中提到血清素与章鱼胺是如何影响龙虾的精神状态的。龙虾是一种地盘意识很强的生物，两只龙虾在一场争夺地盘的斗争分出胜负之后，它们体内的血清素和章鱼胺水平会发生明显变化。血清素高、章鱼胺低的龙虾往往会变得趾高气昂，斗志满满，反之则垂头丧气，毫无战意。实际上血清素也被用于治疗人类的抑郁症。&lt;/p&gt;    &lt;p&gt;      &lt;a href="https://www.ncbi.nlm.nih.gov/pmc/articles/PMC3044190/"&gt;有研究表明&lt;/a&gt;，冥想训练有助于提升人体血清素水平。冥想源自东方宗教，在佛教中表现为禅观打坐。这种内观训练是一种精神训练，因为带有舒缓精神压力的副作用，所以在现代社会又再度流行起来。训练形式多样，“呼吸观察”是最容易入门也最常见的一种。通过冥想训练，可以强化我们挣脱芜杂念头的能力。&lt;/p&gt;    &lt;p&gt;德国的 Eckhart Tolle 在某个夜晚陷入了严重的抑郁，他觉得生活的一切都充满敌意，毫无意义，尤其厌恶自己的存在。他想：“我再也无法忍受我自己了！”&lt;/p&gt;    &lt;p&gt;这时候他突然想到：“我是一个人还是两个人？如果我不能忍受我自己，那么肯定有两个我：‘我’和‘自己’。”也许，其中只有一个是真实的。后来他追求精神上的探索，于 1977 年出版了      &lt;em&gt;The Power of Now&lt;/em&gt;(简体译为      &lt;a href="https://book.douban.com/subject/2277299/"&gt;《当下的力量》&lt;/a&gt;)一书，以现代的语言解释“我”和“心智”之间的关系。&lt;/p&gt;    &lt;p&gt;和美国的 Michael Singer 于 2007 年出版的      &lt;em&gt;The Untethered Soul&lt;/em&gt;（简体译为      &lt;a href="https://book.douban.com/subject/35581777/"&gt;《清醒地活》&lt;/a&gt;）相似，他们都指出心智存在与大脑之外。我们的大脑无时无刻充满各种声音，这是正常的，也是令人迷失的。&lt;/p&gt;    &lt;p&gt;“我”应该控制我的大脑，让大脑成为我的工具，而不是反过来被我的大脑控制。前文提到的 Doom Scrolling 无疑是被大脑控制的例子。当我正在 Doom Scrolling 状态时，我很可能无法察觉。不识庐山真面目，只缘身在此山中。冥想是帮助我们从当前状态抽离，静观自己内心的好方法。&lt;/p&gt;    &lt;p&gt;有一次我跟朋友聊天，我提到冥想与前面几本书。他说这几部作品的逻辑都源自佛教，并推荐我阅读斯里兰卡德宝法师(Henepola Gunaratana)的作品: Mindfulness in Plain English（简体译为      &lt;a href="https://book.douban.com/subject/3910883/"&gt;《观呼吸》&lt;/a&gt;）。这是一本针对禅修方法的指南，冥想是其中一种。有些人可能是抱着“学习放松的方法”的想法来学习正念，但在佛教禅修当中，冥想并不仅仅是放松，放松只是它带来的副作用之一罢了。德宝法师的这本书，书如其名，In Plain English，非常平易近人，是学习冥想的人非常适合的读物。&lt;/p&gt;    &lt;p&gt;读完本作，我对佛教的核心理念又产生了进一步的兴趣。于是我的另一位朋友给我推荐宗萨蒋扬钦哲仁波切于 2007 年出版的      &lt;em&gt;What Makes You Not a Buddhist&lt;/em&gt;（简体译为      &lt;a href="https://book.douban.com/subject/27136747/"&gt;《正见》&lt;/a&gt;）。书名来自他一次坐飞机的经历，因为身穿藏红袍子，头发也剃了，所以邻座的先生觉得他应该是个佛教徒，两人就聊了起来。那位先生问了一个问题：“怎样才算一个佛教徒呢？”&lt;/p&gt;    &lt;p&gt;这个问题很简单，却也是最不容易回答。&lt;/p&gt;    &lt;blockquote&gt;      &lt;p&gt;如果问者真正有兴趣，那么完整的回答就不能在晚餐的闲聊中完成，而太过概括性的答案又会导致误解。&lt;/p&gt;      &lt;p&gt;假设你要给他们正确的回答，那么答案就会直指佛教两千五百年传统的基础：如果一个人接受下列四项真理，他就是佛教徒：一切和合事物皆无常（诸行无常），一切情绪皆苦（诸漏皆苦），一切事物皆无自性（诸法无我），涅超越概念（涅寂静）。这四句佛陀宣说的话，称为“四法印”。&lt;/p&gt;      &lt;p&gt;“印”在此处意指确定真实性之印记。虽然一般认为这四法印包含了佛教的一切，但在绝大多数的状况下，这种回答通常会冲淡了兴头，无法引起更多的趣味。话题也就转变，而结束了这个题目。&lt;/p&gt;&lt;/blockquote&gt;    &lt;p&gt;于是宗萨蒋扬钦哲仁波切写了这本书，这本书的目的不是要吸引信徒，让大家都去追随释迦摩尼，成为佛教徒。他有意避开禅坐技巧，修行，而是直指悉达多的核心理念，也即四法印。&lt;/p&gt;    &lt;p&gt;我不是佛教徒因为我不能全然接受佛教的真理，但这并不妨碍我理解悉达多的哲学，进行冥想训练，向内探索，发掘内心真实的想法。&lt;/p&gt;    &lt;p&gt;1992 年藏传佛教宁玛派的上师索甲仁波切出版了      &lt;em&gt;The Tibetan Book of Living and Dying&lt;/em&gt;（简体译为      &lt;a href="https://book.douban.com/subject/1050743/"&gt;《西藏生死书》&lt;/a&gt;）一书，虽然我不能接受书中描述的死后的世界以及超自然现象，但我能感同身受地体会他的上师在去世时那种超然物外的宁静。这种宁静自古难得，在本文所讨论的议题，能在面对死亡时的保持祥和，可谓精神状态之最高境界。&lt;/p&gt;    &lt;h2&gt;What&amp;apos;s Next?&lt;/h2&gt;    &lt;p&gt;现代社会因为科技的发展带动经济、政治、文化的社会变革，在我们有生之年的观测窗口，可见变化速率呈上升趋势。这种巨变随着全球化的进展让全世界多数国家都面对相似的问题。东亚国家的发展时间比西方国家更短，于是产生的“压缩的现代性”问题更加突出。&lt;/p&gt;    &lt;p&gt;个体处于巨变当中，一方面要面临“传统规范”与“自由新世界”的拉扯，渴望自由的同时又期望获得传统的保护；另一方面要面对个人内心的发展，在浪潮汹涌的现代向内探索，寻找坚实的立足点。&lt;/p&gt;    &lt;p&gt;带着几万年前就定型的大脑与身体，我们要穿越现代社会种种诱惑与陷阱，要排除外部世界的强大势力加持下的欲望施加（尤其是来自消费社会的外部势力），要从自己的内心寻得出自己真正想要的人生。&lt;/p&gt;    &lt;p&gt;这并不容易，但可以做到。&lt;/p&gt;    &lt;p&gt;首先要从随波逐流中抽离出来反观自己，哪怕最终作出的选择结果是一样的，但随大流的选择和自己仔细思考过后的选择，其主动性却截然不同。然后要在向内探索的过程中，通过训练与实践，逐步建立“我的想法能行”的自信心，慢慢具备探索未知世界的勇气。最后在勇敢的试错中，弯弯曲曲地走出属于自己的人生道路。&lt;/p&gt;    &lt;p&gt;人生是自己的。每个人每天都只有24小时。&lt;/p&gt;    &lt;p&gt;选择做什么是我的选择，但我希望确保真的是我的选择。&lt;/p&gt;    &lt;p&gt;2023.08.30/夜 于灯下&lt;/p&gt;    &lt;h2&gt;后记&lt;/h2&gt;    &lt;p&gt;自我成长是我常读的一类书籍，从社会学到心理学，我发现许多发人深省的作品都能追溯到几千年前的古老智慧。我一直想把读过的很有启发的作品集合起来做个主题分享，但我又不想只是列出书单。除了现在舆论环境不友好怕惹来莫名其妙的攻击以外，也怕这份“想帮助他人”的书单实际上可能乏人问津，根本没人需要这份帮助。以至于提笔四顾，总行文不得。近来与一些朋友交谈，发现他们的焦虑烦恼，我也曾经历过，既难受，又似身处迷宫而手无地图，不知从何处探索。虽然我现在也仍身处迷宫，但多得此前读过的书本与许多朋友的帮助，自觉我的迷雾已比几年前要清晰一些。于是我斗胆学《被讨厌的勇气》中的课题分离之法，写文章是我的课题，别人读与不读是别人的课题，我只管写我的便罢了。遂奋笔疾书，以成此文，至少可作为2023年8月，现阶段我的迷雾之痕迹。&lt;/p&gt;    &lt;p&gt;向内探索的过程是拨开迷雾的过程，这个过程仍将继续，未来可以预见会有许多弯路要走，人生亦复如是。就以我喜欢 Tim Urban 的一句话结束本文吧:&lt;/p&gt;    &lt;blockquote&gt;      &lt;p&gt;My goal for the future isn’t to avoid mistakes, it’s for the mistakes I do make to be my own.&lt;/p&gt;&lt;/blockquote&gt;    &lt;h2&gt;相关链接&lt;/h2&gt;    &lt;ul&gt;      &lt;li&gt;        &lt;a href="https://book.douban.com/subject/27091742/"&gt;《邻人之妻》&lt;/a&gt;&lt;/li&gt;      &lt;li&gt;        &lt;a href="https://book.douban.com/subject/36190074/"&gt;《金榜题名之后》&lt;/a&gt;|        &lt;a href="https://justinyan.me/post/5730"&gt;我的书评&lt;/a&gt;&lt;/li&gt;      &lt;li&gt;        &lt;a href="https://book.douban.com/subject/27065607/"&gt;《每周工作4小时》&lt;/a&gt;&lt;/li&gt;      &lt;li&gt;        &lt;a href="https://book.douban.com/subject/35929434/"&gt;《毫无意义的工作》&lt;/a&gt;&lt;/li&gt;      &lt;li&gt;        &lt;a href="https://book.douban.com/subject/35593780/"&gt;《工作、消费主义和新穷人》&lt;/a&gt;&lt;/li&gt;      &lt;li&gt;        &lt;a href="https://book.douban.com/subject/25782520/"&gt;《美丽新世界》&lt;/a&gt;&lt;/li&gt;      &lt;li&gt;        &lt;a href="https://book.douban.com/subject/5406563/"&gt;《一九八四》&lt;/a&gt;&lt;/li&gt;      &lt;li&gt;        &lt;a href="https://book.douban.com/subject/26369699/"&gt;《被讨厌的勇气》&lt;/a&gt;|        &lt;a href="https://justinyan.me/post/4625"&gt;我的书评&lt;/a&gt;&lt;/li&gt;      &lt;li&gt;        &lt;a href="https://book.douban.com/subject/34836531/"&gt;《了不起的我》&lt;/a&gt;|        &lt;a href="https://justinyan.me/post/4237"&gt;我的书评&lt;/a&gt;&lt;/li&gt;      &lt;li&gt;        &lt;a href="https://book.douban.com/subject/36091480/"&gt;《手机大脑》&lt;/a&gt;&lt;/li&gt;      &lt;li&gt;        &lt;a href="https://book.douban.com/subject/26319730/"&gt;《娱乐至死》&lt;/a&gt;|        &lt;a href="https://justinyan.me/post/4664"&gt;我的书评&lt;/a&gt;&lt;/li&gt;      &lt;li&gt;        &lt;a href="https://book.douban.com/subject/35545272/"&gt;《贪婪的多巴胺》&lt;/a&gt;&lt;/li&gt;      &lt;li&gt;        &lt;a href="https://movie.douban.com/subject/34960008/"&gt;《监视资本主义》&lt;/a&gt;&lt;/li&gt;      &lt;li&gt;        &lt;a href="https://book.douban.com/subject/26418475/"&gt;《逃避自由》&lt;/a&gt;|        &lt;a href="https://justinyan.me/post/5313"&gt;我的书评&lt;/a&gt;&lt;/li&gt;      &lt;li&gt;        &lt;a href="https://book.douban.com/subject/4737101/"&gt;《追究幸福》&lt;/a&gt;|        &lt;a href="https://justinyan.me/post/4802"&gt;我的书评&lt;/a&gt;&lt;/li&gt;      &lt;li&gt;        &lt;a href="https://book.douban.com/subject/36403216/"&gt;Life After Capitalism&lt;/a&gt;&lt;/li&gt;      &lt;li&gt;        &lt;a href="https://book.douban.com/subject/26660579/"&gt;《直视骄阳》&lt;/a&gt;&lt;/li&gt;      &lt;li&gt;        &lt;a href="https://book.douban.com/subject/36242339/"&gt;《最优解人生》&lt;/a&gt;&lt;/li&gt;      &lt;li&gt;        &lt;a href="https://book.douban.com/subject/35611477/"&gt;《要钱还是要生活》&lt;/a&gt;&lt;/li&gt;      &lt;li&gt;        &lt;a href="https://book.douban.com/subject/5063804/"&gt;《简·爱》&lt;/a&gt;|        &lt;a href="https://justinyan.me/post/4643"&gt;我的书评&lt;/a&gt;&lt;/li&gt;      &lt;li&gt;        &lt;a href="https://book.douban.com/subject/35876121/"&gt;《纳瓦尔宝典》&lt;/a&gt;&lt;/li&gt;      &lt;li&gt;        &lt;a href="https://book.douban.com/subject/35706913/"&gt;《“活在当下”指南》&lt;/a&gt;&lt;/li&gt;      &lt;li&gt;        &lt;a href="https://book.douban.com/subject/34870933/"&gt;《人生十二法则》&lt;/a&gt;|        &lt;a href="https://justinyan.me/post/4196"&gt;我的书评&lt;/a&gt;&lt;/li&gt;      &lt;li&gt;        &lt;a href="https://book.douban.com/subject/2277299/"&gt;《当下的力量》&lt;/a&gt;&lt;/li&gt;      &lt;li&gt;        &lt;a href="https://book.douban.com/subject/35581777/"&gt;《清醒地活》&lt;/a&gt;&lt;/li&gt;      &lt;li&gt;        &lt;a href="https://book.douban.com/subject/3910883/"&gt;《观呼吸》&lt;/a&gt;&lt;/li&gt;      &lt;li&gt;        &lt;a href="https://book.douban.com/subject/27136747/"&gt;《正见》&lt;/a&gt;&lt;/li&gt;      &lt;li&gt;        &lt;a href="https://book.douban.com/subject/1050743/"&gt;《西藏生死书》&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;    &lt;div&gt;      &lt;h3&gt;    &lt;br /&gt;&lt;/h3&gt;&lt;/div&gt;&lt;/div&gt;
    &lt;div&gt; &lt;a href="https://itindex.net/"  title="IT 资讯"&gt;&lt;img src="https://itindex.net/images/iconWarning.gif" title="IT 资讯" border="0"/&gt; &lt;/a&gt;</description>
      <category />
      <guid isPermaLink="true">https://itindex.net/detail/62844-%E4%B8%AA%E4%BA%BA-%E5%B8%8C%E6%9C%9B-%E9%80%89%E6%8B%A9</guid>
      <pubDate>Mon, 04 Sep 2023 22:30:01 CST</pubDate>
    </item>
    <item>
      <title>OpenAI Whisper + FFmpeg + TTS：动态实现跨语言视频音频翻译 - 掘金</title>
      <link>https://itindex.net/detail/62764-openai-whisper-ffmpeg</link>
      <description>&lt;div&gt;    &lt;blockquote&gt;      &lt;p&gt;本文作者系360奇舞团前端开发工程师&lt;/p&gt;&lt;/blockquote&gt;    &lt;h2&gt;摘要：&lt;/h2&gt;    &lt;p&gt;本文介绍了如何结合 OpenAI Whisper、FFmpeg 和 TTS（Text-to-Speech）技术，以实现将视频翻译为其他语言并更换声音的过程。我们将探讨如何使用 OpenAI Whisper 进行语音识别和翻译，然后使用 FFmpeg 提取视频音轨和处理视频，最后使用 TTS 技术生成新的语音并替换原视频的音轨。通过这种方式，我们可以为视频添加新的语言版本，同时保持其原始视觉内容。&lt;/p&gt;    &lt;h2&gt;引言：&lt;/h2&gt;    &lt;p&gt;现如今，全球范围内的视频内容正在迅速增长，跨语言传播和多语言支持成为了一个重要的需求。但是，手动为视频添加不同语言的字幕或配音可能非常耗时且昂贵。本文将介绍一种利用 OpenAI Whisper、FFmpeg 和 TTS 技术的方法，使我们能够将视频翻译为其他语言并更换声音，以满足多语言需求，同时降低成本和时间。&lt;/p&gt;    &lt;ol&gt;      &lt;li&gt;OpenAI Whisper：是一种强大的语音识别模型，能够将语音转换为文本，并支持多种语言。我们将使用 Whisper 将视频中的原始语音提取为文本，并通过翻译服务将其转换为目标语言的文本。&lt;/li&gt;      &lt;li&gt;FFmpeg：处理视频和音轨提取接下来，我们使用 FFmpeg 工具处理视频和提取音轨。FFmpeg 是一款功能强大的多媒体处理工具，它支持各种音视频处理操作。我们可以使用 FFmpeg 提取原视频的音轨，以便稍后替换为新生成的语音。&lt;/li&gt;      &lt;li&gt;TTS 技术：生成新的语音为了替换原视频的音轨，我们需要生成新的语音。这里我们使用 TTS（Text-to-Speech）技术，将先前翻译得到的目标语言文本转换为对应语言的语音。TTS 技术基于深度学习模型，可以生成自然流畅的语音，使其与原视频的内容相匹配。&lt;/li&gt;      &lt;li&gt;结合 Whisper、FFmpeg 和 TTS：实现视频翻译和更换声音最后，我们将 Whisper 生成的目标语言文本与 TTS 生成的新语音结合起来，并使用 FFmpeg 将新语音替换到原视频的音轨中。通过使用 FFmpeg 的音轨替换功能，我们可以确保新语音与视频内容同步，并生成具备目标。&lt;/li&gt;&lt;/ol&gt;    &lt;h2&gt;结果展示&lt;/h2&gt;    &lt;ul&gt;      &lt;li&gt;原视频：        &lt;a href="https://link.juejin.cn?target=https%3A%2F%2Fcaining0.github.io%2Fstatichtml.github.io%2Ftest.mp4" target="_blank" title=""&gt;caining0.github.io/statichtml.…&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;    &lt;ul&gt;      &lt;li&gt;转换后视频：        &lt;a href="https://link.juejin.cn?target=https%3A%2F%2Fcaining0.github.io%2Fstatichtml.github.io%2Foutput.mp4" target="_blank" title=""&gt;caining0.github.io/statichtml.…&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;    &lt;h2&gt;前提与依赖&lt;/h2&gt;    &lt;pre&gt;      &lt;code&gt;pip3 install openai-whisper
pip3 install ffmpeg-python
brew install ffmpeg
pip3 install TTS//https://github.com/coqui-ai/TTS&lt;/code&gt;&lt;/pre&gt;    &lt;h2&gt;openai-whisper用法&lt;/h2&gt;    &lt;h3&gt;命令行用法&lt;/h3&gt;    &lt;p&gt;以下命令将使用      &lt;code&gt;medium&lt;/code&gt;模型转录音频文件中的语音：&lt;/p&gt;    &lt;pre&gt;      &lt;code&gt;whisper audio.flac audio.mp3 audio.wav --model medium&lt;/code&gt;&lt;/pre&gt;    &lt;p&gt;默认设置（选择模型      &lt;code&gt;small&lt;/code&gt;）适用于转录英语。要转录包含非英语语音的音频文件，您可以使用以下选项指定语言      &lt;code&gt;--language&lt;/code&gt;：&lt;/p&gt;    &lt;pre&gt;      &lt;code&gt;whisper japanese.wav --language Japanese&lt;/code&gt;&lt;/pre&gt;    &lt;p&gt;添加      &lt;code&gt;--task translate&lt;/code&gt;会将语音翻译成英文：&lt;/p&gt;    &lt;pre&gt;      &lt;code&gt;whisper japanese.wav --language Japanese --task translate&lt;/code&gt;&lt;/pre&gt;    &lt;p&gt;运行以下命令以查看所有可用选项：&lt;/p&gt;    &lt;pre&gt;      &lt;code&gt;whisper --help&lt;/code&gt;&lt;/pre&gt;    &lt;h3&gt;Python 用法&lt;/h3&gt;    &lt;pre&gt;      &lt;code&gt;import whispermodel = whisper.load_model(&amp;quot;base&amp;quot;)result = model.transcribe(&amp;quot;audio.mp3&amp;quot;)
print(result[&amp;quot;text&amp;quot;])&lt;/code&gt;&lt;/pre&gt;    &lt;h3&gt;例子&lt;/h3&gt;    &lt;pre&gt;      &lt;code&gt;whisper test.mp4 --language Chinese --task translate&lt;/code&gt;&lt;/pre&gt;    &lt;pre&gt;      &lt;code&gt;[00:00.000 --&amp;gt; 00:03.400]  If the Chinese people come to design a new building, it will be like this[00:03.400 --&amp;gt; 00:06.360]  A new building that has been rebuilt by a Chinese city
[00:06.360 --&amp;gt; 00:09.480]  This is a real city, maybe it&amp;apos;s your hometown
[00:09.480 --&amp;gt; 00:12.640]  Let&amp;apos;s take a short film with us and show its real face
[00:12.640 --&amp;gt; 00:14.480]  The opening is a one-minute long lens
[00:14.480 --&amp;gt; 00:16.520]  First, the time has changed, the new season has no shadow
[00:16.520 --&amp;gt; 00:18.680]  A sense of depression is born
[00:18.680 --&amp;gt; 00:20.400]  We randomly saw the red tail of it
[00:20.400 --&amp;gt; 00:22.120]  This is the new building in the hundreds of square kilometers
[00:22.120 --&amp;gt; 00:24.480]  The blue protective tent inside the blue sky city in the front
[00:24.480 --&amp;gt; 00:26.080]  As in the front of the crystal ball
[00:26.080 --&amp;gt; 00:28.360]  The back is a larger environmental structure
[00:28.360 --&amp;gt; 00:29.800]  This is the shadow of the new building
[00:29.800 --&amp;gt; 00:30.600]  The lens is far away
[00:30.600 --&amp;gt; 00:32.040]  We see that there is a bandage
[00:32.040 --&amp;gt; 00:33.560]  It is passing through a huge star
[00:33.560 --&amp;gt; 00:35.240]  Those are the stars of the stars
[00:35.240 --&amp;gt; 00:37.280]  The stars do not affect the shape of the bandage
[00:37.280 --&amp;gt; 00:39.240]  This means that their motivation is super
[00:39.240 --&amp;gt; 00:42.040]  At this time, the lens enters the blue protective tent inside the first crystal ball&lt;/code&gt;&lt;/pre&gt;    &lt;h2&gt;TTS&lt;/h2&gt;    &lt;pre&gt;      &lt;code&gt;from TTS.api import TTSmodel_name = TTS.list_models()[0]tts = TTS(model_name)
tts.tts_to_file(text=&amp;quot;Hello world!&amp;quot;, speaker=tts.speakers[0], language=tts.languages[0], file_path=&amp;quot;output.wav&amp;quot;)#实践中需要把text更换为whisper提取内容&lt;/code&gt;&lt;/pre&gt;    &lt;h2&gt;ffmpeg&lt;/h2&gt;    &lt;ul&gt;      &lt;li&gt;提取无音频视频&lt;/li&gt;&lt;/ul&gt;    &lt;pre&gt;      &lt;code&gt;ffmpeg -i /Users/cnn/Downloads/test.mp4 -an -y output_new.mp4&lt;/code&gt;&lt;/pre&gt;    &lt;ul&gt;      &lt;li&gt;去噪&lt;/li&gt;&lt;/ul&gt;    &lt;pre&gt;      &lt;code&gt;ffmpeg -y -i output_new.wav -af &amp;quot;anlmdn=ns=20&amp;quot; output_clean.wav&lt;/code&gt;&lt;/pre&gt;    &lt;ul&gt;      &lt;li&gt;合并与剪切&lt;/li&gt;&lt;/ul&gt;    &lt;pre&gt;      &lt;code&gt;ffmpeg -i merge1.wav -i a_p1.wav -filter_complex &amp;quot;[0:0] [1:0] concat=n=2:v=0:a=1 [a]&amp;quot; -map [a] -y merge0.wav&lt;/code&gt;&lt;/pre&gt;    &lt;ul&gt;      &lt;li&gt;其他问题，由于tts生成语音，实际时长与原视频时长不一样，需要动态调整&lt;/li&gt;&lt;/ul&gt;    &lt;pre&gt;      &lt;code&gt;# 思路为，获取视频时长和原视频时间的比例，并设置，调整语速
ffmpeg -y -i output.wav -filter:a &amp;quot;atempo=0.8&amp;quot; output_new.wav&lt;/code&gt;&lt;/pre&gt;    &lt;h2&gt;前景&lt;/h2&gt;    &lt;p&gt;结合 OpenAI Whisper、FFmpeg 和 TTS 技术的跨语言视频翻译与语音本地化应用具有广阔的前景与市场潜力。随着全球化的推进，多语言视频内容需求日益增加，教育、媒体、娱乐和商务等领域都需要提供多语言支持。 这种应用可以帮助内容创作者快速将视频本地化，满足全球受众的需求，同时降低成本和时间投入。在教育领域，多语言支持可以促进全球学习交流与合作；媒体和娱乐行业可以通过本地化的视频内容吸引更广泛的受众市场。此外，企业在跨国业务和跨文化交流中也可以利用这种应用进行语音本地化，促进全球团队合作和商务沟通。未来，这种应用有望成为视频内容创作工具与服务的一部分，提供高效、自动化的跨语言翻译和语音本地化功能。总之，这种应用在满足多语言视频需求的同时，为各个行业带来商业机会，并推动全球化交流与合作的发展。&lt;/p&gt;    &lt;h2&gt;不足&lt;/h2&gt;    &lt;ul&gt;      &lt;li&gt;TTS略有杂音，后续优化，或者考虑收费版本，如Polly：        &lt;a href="https://link.juejin.cn?target=https%3A%2F%2Faws.amazon.com%2Fcn%2Fpolly%2F%25EF%25BC%258C" target="_blank" title=""&gt;aws.amazon.com/cn/polly/，&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;    &lt;h2&gt;引用&lt;/h2&gt;    &lt;ul&gt;      &lt;li&gt;        &lt;a href="https://link.juejin.cn?target=https%3A%2F%2Fgithub.com%2Fopenai%2Fwhisper" target="_blank" title=""&gt;github.com/openai/whis…&lt;/a&gt;&lt;/li&gt;      &lt;li&gt;        &lt;a href="https://link.juejin.cn?target=https%3A%2F%2Fgithub.com%2Fcoqui-ai%2FTTS" target="_blank" title=""&gt;github.com/coqui-ai/TT…&lt;/a&gt;&lt;/li&gt;      &lt;li&gt;        &lt;a href="https://link.juejin.cn?target=https%3A%2F%2Fffmpeg.org%2F" target="_blank" title=""&gt;ffmpeg.org/&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;
    &lt;div&gt; &lt;a href="https://itindex.net/"  title="IT 资讯"&gt;&lt;img src="https://itindex.net/images/iconWarning.gif" title="IT 资讯" border="0"/&gt; &lt;/a&gt;</description>
      <category />
      <guid isPermaLink="true">https://itindex.net/detail/62764-openai-whisper-ffmpeg</guid>
      <pubDate>Tue, 23 May 2023 22:41:18 CST</pubDate>
    </item>
    <item>
      <title>通向AGI之路：大型语言模型（LLM）技术精要 - 知乎</title>
      <link>https://itindex.net/detail/62585-agi-%E8%AF%AD%E8%A8%80%E6%A8%A1%E5%9E%8B-llm</link>
      <description>&lt;div&gt;    &lt;div&gt;      &lt;p&gt;ChatGPT出现后惊喜或惊醒了很多人。惊喜是因为没想到大型语言模型（LLM,Large Language Model）效果能好成这样；惊醒是顿悟到我们对LLM的认知及发展理念，距离世界最先进的想法，差得有点远。我属于既惊喜又惊醒的那一批，也是典型的中国人，中国人善于自我反思，于是开始反思，而这篇文章正是反思的结果。&lt;/p&gt;      &lt;p&gt;实话实说，国内在LLM模型相关技术方面，此刻，距离最先进技术的差距进一步加大了。技术领先或技术差距这事情，我觉得要动态地以发展的眼光来看。在Bert出现之后的一到两年间，其实国内在这块的技术追赶速度还是很快的，也提出了一些很好的改进模型，差距拉开的分水岭应该是在 GPT 3.0出来之后，也就是2020年年中左右。在当时，其实只有很少的人觉察到：GPT 3.0它不仅仅是一项具体的技术，其实体现的是LLM应该往何处去的一个发展理念。自此之后，差距拉得越来越远，ChatGPT只是这种发展理念差异的一个自然结果。所以，我个人认为，抛开是否有财力做超大型LLM这个因素，如果单从技术角度看，差距主要来自于对LLM的认知以及未来应往何处去的发展理念的不同。&lt;/p&gt;      &lt;p&gt;国内被国外技术甩得越来越远，这个是事实，不承认也不行。前阵子网上很多人担忧说国内AI现在处于“危急存亡之秋”，我觉得倒也不至于这么严重。君不见，这个世界上，具备这么超前眼光的只有OpenAI一家吗？包括Google在内，其实对于LLM发展理念的理解，明显都落后OpenAI一个身位。现实是OpenAI表现过于优秀，把所有人都甩开了，不仅仅是国内。&lt;/p&gt;      &lt;p&gt;我觉得，OpenAI对LLM在理念及相关技术方面，领先国外的Google、DeepMind大约半年到一年的时间，领先国内大概两年左右的时间。在LLM这个事情上，感觉梯队很明显，Google应该是排在第二位，最能体现Google技术眼光的是PaLM和Pathways，推出时间大概在22年2月到4月间，同一时期，OpenAI推出的却是InstructGPT，从这里就可以看出Google和OpenAI的差距了，至于为何这么说，你看了我后面的正文后大概能理解。DeepMind之前的重心一直在强化学习攻克游戏和AI for science这些方面，切入LLM其实很晚，应该是21年才开始重视这个方向，目前也处于追赶状态。Meta就更不用说了，重心一直不在LLM上，目前感觉也发力开始追赶。这还是目前做得最好的一批机构，尚且如此，更何况国内呢？我觉得情有可原。至于OpenAI关于LLM的理念是什么，我在本文的最后一部分，会谈谈我的认知。&lt;/p&gt;      &lt;p&gt;本文梳理自GPT 3.0出现之后的主流LLM技术，在此之前的主流技术可以参考：&lt;/p&gt;      &lt;a href="https://zhuanlan.zhihu.com/p/254821426" target="_blank"&gt;&lt;/a&gt;      &lt;p&gt;，我相信看完这两篇文章，能够让您对LLM领域的技术脉络，LLM技术发展过程中出现过的不同发展理念，乃至未来可能的发展趋势，有比较清晰的认知。当然，很多地方讲的内容是我个人看法，有很大的主观性，错漏难免，所以还请谨慎参考。&lt;/p&gt;      &lt;p&gt;本文试图回答下面一些问题：ChatGPT是否带来了NLP乃至AI领域的研究范式转换？如果是，那会带来怎样的影响？LLM从海量数据中学到了什么知识？LLM又是如何存取这些知识的？随着LLM规模逐步增大，会带来什么影响？什么是In Context Learning?为什么它是一项很神秘的技术？它和Instruct又是什么关系？LLM具备推理能力吗？思维链CoT又是怎么做的？等等，相信看完，能让您对这些问题有一个答案。&lt;/p&gt;      &lt;p&gt;首先，在谈LLM技术现状前，先宏观地谈下我心目中的研究范式转换问题。这样，我们才能“先见森林，再见树木”，对具体技术为何会是如此变化有个更清晰的认知。&lt;/p&gt;      &lt;h2&gt;潮流之巅：NLP研究范式的转换&lt;/h2&gt;      &lt;hr&gt;&lt;/hr&gt;      &lt;p&gt;如果我们把时间线往前拉得更长一些，回到NLP领域的深度学习时代，在更长时间窗口内观察技术变迁及其影响，可能会更容易看清其中的一些关键节点。我个人认为，在最近10年来NLP领域的技术发展过程中，可能存在两次大的研究范型转换。&lt;/p&gt;      &lt;h3&gt;范式转换1.0:从深度学习到两阶段预训练模型&lt;/h3&gt;      &lt;p&gt;这个范式转换所涵盖的时间范围，大致在深度学习引入NLP领域（2013年左右），到GPT 3.0出现之前（2020年5月左右）。&lt;/p&gt;      &lt;p&gt;在Bert和GPT模型出现之前，NLP领域流行的技术是深度学习模型，而NLP领域的深度学习，主要依托于以下几项关键技术：以大量的改进LSTM模型及少量的改进CNN模型作为典型的特征抽取器；以Sequence to Sequence（或叫encoder-decoder亦可）+Attention作为各种具体任务典型的总体技术框架。&lt;/p&gt;      &lt;p&gt;在这些核心技术加持下，NLP领域深度学习的主要研究目标，如果归纳一下，是如何有效增加模型层深或模型参数容量。就是说，怎么才能往encoder和decoder里不断叠加更深的LSTM或CNN层，来达成增加层深和模型容量的目标。这种努力，尽管确实不断增加了模型层深，但是从解决具体任务的效果角度看，总体而言，不算很成功，或者说和非深度学习方法相对，带来的优势不算大。&lt;/p&gt;      &lt;p&gt;深度学习之所以不够成功，我认为主要原因来自于两个方面：一方面是某个具体任务有限的训练数据总量。随着模型容量的增加，需要靠更大量的训练数据来支撑，否则即使你能把深度做起来，任务效果也做不上去。而在预训练模型出现之前，很明显这是NLP研究领域一个严重问题；另外一个方面是LSTM／CNN特征抽取器，表达能力不够强。意思是就算给你再多的数据也没用，因为你不能有效地吸收数据里蕴含的知识。主要应该是这两个原因，阻碍了深度学习在NLP领域的成功突围。&lt;/p&gt;      &lt;p&gt;Bert/GPT这两个预训练模型的出现，无论在学术研究角度看，还是工业应用角度来看，都代表了NLP领域的一个技术飞跃，并带来了整个领域研究范式的转换。这种范式转换带来的影响，体现在两个方面：首先，是部分NLP研究子领域的衰退乃至逐步消亡；其次，NLP不同子领域的技术方法和技术框架日趋统一，在Bert出现后一年左右，技术栈基本收敛到两种技术模式中。关于这两点，我们分头来谈。&lt;/p&gt;      &lt;p&gt;        &lt;strong&gt;影响一：中间任务的消亡&lt;/strong&gt;&lt;/p&gt;      &lt;p&gt;NLP是一个宏观研究领域的统称，里面有五花八门具体的子领域与子方向，如果仔细分析，从任务的性质角度，可以把这些任务分成两大类：一类可以叫做“中间任务”，一类可以称为“最终任务”。&lt;/p&gt;      &lt;p&gt;典型的中间任务包括：中文分词、词性标注、NER、句法分析、指代消解、语义Parser等，这类任务一般并不解决应用中的实际需求，大多数是作为那些解决实际需求任务的中间阶段或者辅助阶段存在的，比如几乎没有需求说，我要一个句法Parser，把这个句子的句法分析树给用户看看，用户不需要看到这些NLP的中间阶段处理结果，他只关心某个具体任务你有没有干好。“最终任务”包括比如文本分类、文本相似性计算、机器翻译、文本摘要等等，有很多。这类任务的特点是每个子领域都解决某个实际需求，任务结果基本能直接呈现给用户，比如用户确实存在给你一句英文，告诉他中文是什么的需求。&lt;/p&gt;      &lt;p&gt;按理说，“中间任务”就不应该出现，而之所以会存在，这是NLP技术发展水平不够高的一种体现。在技术发展早期阶段，因为当时的技术相对落后，很难一步做好有难度的最终任务。比如机器翻译，早期技术要做好机器翻译是很困难的，于是科研人员就把难题分而治之，分解成分词、词性标注、句法分析等各种中间阶段，先把每个中间阶段做好，然后再拼起来完成最终任务，这也是没办法的事情。&lt;/p&gt;      &lt;p&gt;但是自从Bert／GPT出现之后，其实就没有必要做这些中间任务了，因为通过大量数据的预训练，Bert／GPT已经把这些中间任务作为语言学特征，吸收到了Transformer的参数里，此时我们完全可以端到端地直接解决那些最终任务，而无须对这种中间过程专门建模。这里可能争议最大的是中文分词，其实道理也是一样的，哪些字应该组成一个词，这个其实你不用管，让LLM自己当特征去学就行了，只要对于解决任务有帮助，它自然会去学该学的合理分词方式，也未必一定要和我们人类理解的分词规则相同。&lt;/p&gt;      &lt;p&gt;基于以上认知，其实在Bert/GPT一出现，你就应该得出这类NLP的中间阶段的任务，会逐步退出历史舞台这个结论。&lt;/p&gt;      &lt;p&gt;        &lt;strong&gt;影响二：不同研究方向技术路线的统一&lt;/strong&gt;&lt;/p&gt;      &lt;p&gt;在说明具体影响前，我们先讨论下另外一种NLP任务划分方式，这对于理解后面内容有帮助。如果对“最终任务”进一步进行分类，又大致可以分为两大不同类型的任务：自然语言理解类任务和自然语言生成类任务。如果排除掉“中间任务”的话，典型的自然语言理解类任务包括文本分类、句子关系判断、情感倾向判断等，这种任务本质上都是分类任务，就是说输入一个句子（文章），或者两个句子，模型参考所有输入内容，最后给出属于哪个类别的判断。自然语言生成也包含很多NLP研究子方向，比如聊天机器人、机器翻译、文本摘要、问答系统等。生成类任务的特点是给定输入文本，对应地，模型要生成一串输出文本。这两者的差异主要体现在输入输出形式上&lt;/p&gt;      &lt;p&gt;自从Bert/GPT模型诞生后，出现了明显的技术统一趋向。首先，NLP中不同的子领域，其特征抽取器都逐渐从LSTM/CNN统一到Transformer上。其实，自Bert公开后不久，就应该意识到，这必然会成为技术趋势。至于其原因，在几年前我写的这篇：“&lt;/p&gt;      &lt;a href="https://zhuanlan.zhihu.com/p/54743941" target="_blank"&gt;&lt;/a&gt;      &lt;p&gt;” 中做了说明和分析，感兴趣的同学可参考。而且，目前Transformer不仅统一了NLP诸多领域，也正在逐步地替换图像处理各种任务中被广泛使用的CNN等其它模型的进程之中，类似的，多模态模型目前也基本都采用了Transformer模型。这种Transformer从NLP出发，攻城略地逐步统一AI越来越多领域的趋势，起始于2020年底出现的Vision Transformer (ViT) ，之后蓬勃发展，到目前已大获成功，且其继续向更多领域拓展的势头会越来越迅猛。&lt;/p&gt;      &lt;p&gt;其次，大多数NLP子领域的研发模式切换到了两阶段模式：模型预训练阶段+应用微调（Fine-tuning）或应用Zero／Few Shot Prompt模式。更准确地说，NLP各种任务其实收敛到了两个不同的预训练模型框架里：对于自然语言理解类任务，其技术体系统一到了以Bert为代表的“双向语言模型预训练+应用Fine-tuning”模式；而对于自然语言生成类任务，其技术体系则统一到了以GPT 2.0为代表的“自回归语言模型（即从左到右单向语言模型）+Zero /Few Shot Prompt”模式。至于为何会分化成两条技术路线，有其必然性，关于这点我们放在后面解释。&lt;/p&gt;      &lt;p&gt;这两种模式，看似比较相像，但其背后蕴含了迥异的发展思路，也会导向不同的未来发展方向。不过遗憾的是，我们中的绝大多数人，在当时都低估了GPT 这条发展路线的潜力，而把视觉中心聚焦到了Bert这种模式上。&lt;/p&gt;      &lt;h3&gt;        &lt;strong&gt;范式转换2.0: 从预训练模型走向通用人工智能 （AGI，Artificial General Intelligence）&lt;/strong&gt;&lt;/h3&gt;      &lt;p&gt;这个范式转换所涵盖的时间范围，大致在GPT3.0出现之后（20年6月左右），一直到目前为止，我们应该正处于这个范式转换过程中。&lt;/p&gt;      &lt;p&gt;ChatGPT是触发这次范型转换的关键节点，但是在InstructGPT出现之前，其实LLM处于这次范式转换前的一个过渡期。&lt;/p&gt;      &lt;p&gt;        &lt;strong&gt;过渡期：以GPT 3.0为代表的“自回归语言模型+Prompting”模式占据统治地位&lt;/strong&gt;&lt;/p&gt;      &lt;p&gt;前面说过，在预训练模型发展的早期，技术框架收敛到了Bert模式和GPT模式这两种不同的技术范型，而且人们普遍更看好Bert模式一些，相当多数的后续技术改进，都是沿着Bert那条路走的。但是，随着技术的继续发展，你会发现，目前规模最大的LLM模型，几乎清一色都是类似GPT 3.0这种“自回归语言模型+Prompting”模式的，比如GPT 3、PaLM、GLaM、Gopher、Chinchilla、MT-NLG、LaMDA等，没有例外。为什么会这样呢？背后一定有其必然性，我认为可能主要源于两个原因。&lt;/p&gt;      &lt;img src="data:image/svg+xml;utf8,&lt;svg xmlns='http://www.w3.org/2000/svg' width='2638' height='1116'&gt;&lt;/svg&gt;" width="2638"&gt;&lt;/img&gt;      &lt;p&gt;首先，Google的T5模型，在形式上统一了自然语言理解和自然语言生成任务的外在表现形式。如上图所示，标为红色的是个文本分类问题，黄色的是判断句子相似性的回归或分类问题，这都是典型的自然语言理解问题。在T5模型里，这些自然语言理解问题在输入输出形式上和生成问题保持了一致，也就是说，可以把分类问题转换成让LLM模型生成对应类别的字符串，这样理解和生成任务在表现形式就实现了完全的统一。&lt;/p&gt;      &lt;p&gt;这说明自然语言生成任务，在表现形式上可以兼容自然语言理解任务，若反过来，则很难做到这一点。这样的好处是：同一个LLM生成模型，可以解决几乎所有NLP问题。而如果仍然采取Bert模式，则这个LLM模型无法很好处理生成任务。既然这样，我们当然倾向于使用生成模型，这是一个原因。&lt;/p&gt;      &lt;p&gt;第二个原因，如果想要以零示例提示语（zero shot prompting）或少数示例提示语（few shot prompting）的方式做好任务，则必须要采取GPT模式。现在已有研究（参考：On the Role of Bidirectionality in Language Model Pre-Training）证明：如果是以fine-tuning方式解决下游任务，Bert模式的效果优于GPT模式；若是以zero shot/few shot prompting这种模式解决下游任务，则GPT模式效果要优于Bert模式。这说明了，生成模型更容易做好zero shot/few shot prompting方式的任务，而Bert模式以这种方式做任务，是天然有劣势的。这是第二个原因。&lt;/p&gt;      &lt;p&gt;但是问题来了：为什么我们要追求zero shot/few shot prompting这种方式来做任务呢？要解释清楚这个问题，我们首先需要搞清楚另外一个问题：什么样的LLM模型，对我们是最理想的？&lt;/p&gt;      &lt;img src="data:image/svg+xml;utf8,&lt;svg xmlns='http://www.w3.org/2000/svg' width='2204' height='1462'&gt;&lt;/svg&gt;" width="2204"&gt;&lt;/img&gt;      &lt;p&gt;上图展示了一个理想的LLM该有的样子。首先，LLM应该具备强大的自主学习能力。假设我们把世界上能获得的所有文本或者图片等不同类型的数据喂给它，它应该能够自动从中学习到里面包含的所有知识点，学习过程不需要人的介入，并且能灵活应用所学知识，来解决实际问题。因为数据是海量的，要吸收所有知识，就要非常多的模型参数来存储知识，所以这个模型必然会是一个巨无霸模型。&lt;/p&gt;      &lt;p&gt;其次，LLM应该能解决NLP任何子领域的问题，而不仅支持有限领域，甚至它应该可以响应NLP之外其它领域的问题，最好是任意领域的问题都能得到很好地回答。&lt;/p&gt;      &lt;p&gt;再者，当我们使用LLM解决某个具体领域问题的时候，应该用我们人类习惯的表达方式，就是说LLM应该理解人类的命令。这体现出让LLM适配人，而不是反过来，让人去适配LLM模型。人适配LLM的典型例子，比如绞尽脑汁去尝试各种不同的prompt，以试图找到好的提示语，才能很好地解决手头问题。关于这点，上图在人类和LLM交互的接口层，举了几个例子，说明什么是好的人使用LLM模型的接口形式。&lt;/p&gt;      &lt;p&gt;看完这个理想中的LLM，我们再回头解释上面遗留的问题：为什么我们要追求zero shot/few shot prompting这种方式来做任务呢？有两个原因。&lt;/p&gt;      &lt;p&gt;第一，这个LLM模型规模必然非常巨大，有能力作出这个模型，或改动这个模型参数的机构必然很少。而任务需求方是千千万万的中小机构甚至是个人，就算你把模型开源出来，他们也无力部署这个模型，更不用说再用Fine-tuning这种模式去修改模型参数了。所以，我们应该追求不修正模型参数，就能让任务需求方完成任务的方式，也就是应该采取prompt模式完成任务，而非Fine-tuning模式（由此可看出，soft prompting技术方向是违背这个发展趋势的）。模型制作方则将LLM作成公用服务，以LLM as Service的模式运行。作为服务支持方，考虑到千变万化的用户需求，所以LLM模型制作方更要追求让LLM能完成尽可能多类型的任务，这是附带的影响，也是为何超级大模型一定会追求走向AGI的现实因素。&lt;/p&gt;      &lt;p&gt;第二，zero shot prompting也好，few shot prompting也好，甚至促进LLM推理能力的思维链（CoT,Chain of Thought）Prompting也好，就是上图中接口层中的现有技术。具体而言，zero shot prompting的初衷，其实就是人类和LLM的理想接口，直接用人类所习惯的任务表述方式让LLM做事情，但是发现LLM并不能很好地理解，效果也不好。经过继续研究，转而发现：对于某项任务，如果给LLM几个示例，用这些示例来代表任务描述，效果会比zero shot prompting好，于是大家都去研究更好的few shot prompting技术。可以理解为，本来我们希望LLM能够用人类常用的命令方式来执行某个任务，但是目前技术还做不到，所以退而求其次，用这些替代技术来表达人类的任务需求。&lt;/p&gt;      &lt;p&gt;如果理解了上述逻辑，很容易得出如下结论：few shot prompting（也被称为In Context Learning）只是一种过渡时期的技术。如果我们能够更自然地去描述一个任务，而且LLM可以理解，那么，我们肯定会毫不犹豫地抛弃这些过渡期的技术，原因很明显，用这些方法来描述任务需求，并不符合人类的使用习惯。&lt;/p&gt;      &lt;p&gt;这也是为何我将GPT 3.0+Prompting列为过渡期技术的原因，ChatGPT的出现，改变了这个现状，用Instruct取代了Prompting，由此带来新的技术范式转换，并产生若干后续影响。&lt;/p&gt;      &lt;p&gt;        &lt;strong&gt;影响一：让LLM适配人的新型交互接口&lt;/strong&gt;&lt;/p&gt;      &lt;p&gt;在理想LLM的背景下，我们再来看ChatGPT，能更好理解它的技术贡献。ChatGPT应该是目前所有的现有技术里，最接近理想LLM的技术方法。如果归纳下ChatGPT最突出特点的话，我会用下面八个字：“能力强大，善解人意”。&lt;/p&gt;      &lt;p&gt;“能力强大”这一点，我相信应该主要归功于ChatGPT所依托的基础LLM GPT3.5。因为ChatGPT 尽管加入了人工标注数据，但是量级只有数万，这个规模的数据量，和训练GPT 3.5模型使用的几千亿token级别的数据量相比，包含的世界知识（数据中包含的事实与常识）可谓沧海一粟，几可忽略，基本不会对增强GPT 3.5的基础能力发挥什么作用。所以它的强大功能，应该主要来自于隐藏在背后的GPT 3.5。GPT 3.5对标理想LLM模型中的那个巨无霸模型。&lt;/p&gt;      &lt;p&gt;那么，ChatGPT向GPT 3.5模型注入新知识了吗？应该是注入了，这些知识就包含在几万人工标注数据里，不过注入的不是世界知识，而是人类偏好知识。所谓“人类偏好”，包含几方面的含义：首先，是人类表达一个任务的习惯说法。比如，人习惯说：“把下面句子从中文翻译成英文”，以此表达一个“机器翻译”的需求，但是LLM又不是人，它怎么会理解这句话到底是什么意思呢？你得想办法让LLM理解这句命令的含义，并正确执行。所以，ChatGPT通过人工标注数据，向GPT 3.5注入了这类知识，方便LLM理解人的命令，这是它“善解人意”的关键。其次，对于什么是好的回答，什么是不好的回答，人类有自己的标准，例如比较详细的回答是好的，带有歧视内容的回答是不好的，诸如此类。这是人类自身对回答质量好坏的偏好。人通过Reward Model反馈给LLM的数据里，包含这类信息。总体而言，ChatGPT把人类偏好知识注入GPT 3.5，以此来获得一个听得懂人话、也比较礼貌的LLM。&lt;/p&gt;      &lt;p&gt;可以看出，ChatGPT的最大贡献在于：基本实现了理想LLM的接口层，让LLM适配人的习惯命令表达方式，而不是反过来让人去适配LLM，绞尽脑汁地想出一个能Work的命令（这就是instruct技术出来之前，prompt技术在做的事情），而这增加了LLM的易用性和用户体验。是InstructGPT/ChatGPT首先意识到这个问题，并给出了很好的解决方案，这也是它最大的技术贡献。相对之前的few shot prompting，它是一种更符合人类表达习惯的人和LLM进行交互的人机接口技术。&lt;/p&gt;      &lt;p&gt;而这必将启发后续的LLM模型，继续在易用人机接口方面做进一步的工作，让LLM更听话。&lt;/p&gt;      &lt;p&gt;        &lt;strong&gt;影响二：很多NLP子领域不再具备独立研究价值&lt;/strong&gt;&lt;/p&gt;      &lt;p&gt;就NLP领域而言，这次范式转换，意味着很多目前独立存在的NLP研究领域，将被纳入LLM的技术体系，进而不再独立存在，逐步消失。经过第一次范式转换，尽管NLP中很多“中间任务”，继续作为独立研究领域存在不再必要，但是大多数“最终任务”，仍然是以独立研究领域存在的，只是切换成在“预训练+fine-tuning”框架下，面对领域独有问题，陆续提出新的改进方案。&lt;/p&gt;      &lt;p&gt;目前研究表明，很多NLP任务，随着LLM模型规模增长，效果会大幅提升。据此，我觉得可得到如下推论：大多数某领域所谓“独有”的问题，大概率只是缺乏领域知识导致的一种外在表象，只要领域知识足够多，这个所谓领域独有的问题，就可以被很好地解决掉，其实并不需要专门针对某个具体领域问题，冥思苦想去提出专用解决方案。也许AGI的真相超乎意料地简单：你只要把这个领域更多的数据交给LLM，让它自己学习更多知识即可。&lt;/p&gt;      &lt;p&gt;在这个背景下，同时，ChatGPT证明了我们现在是可以直接去追求理想LLM模型的，那么，未来的技术发展趋势应该是：追求规模越来越大的LLM模型，通过增加预训练数据的多样性，来涵盖越来越多的领域，LLM自主从领域数据中通过预训练过程学习领域知识，随着模型规模不断增大，很多问题随之得到解决。研究重心会投入到如何构建这个理想LLM模型，而非去解决某个领域的具体问题。这样，越来越多NLP的子领域会被纳入LLM的技术体系，进而逐步消失。&lt;/p&gt;      &lt;p&gt;我认为，判断某个具体领域是否该立即停止独立研究，其判断标准可采取以下两种方法，占其一即可：第一，判断某个任务，是否LLM的研究效果超过人类表现，对于那些LLM效果超过人类的研究领域，已无独立研究的必要。举个例子，GLUE与SuperGLUE测试集合里的很多任务，目前LLM效果已超过人类表现，与这个数据集合密切相关的研究领域，其实就没有继续独立存在的必要。第二，对比两种模式的任务效果，第一种模式是用较大的领域专用数据进行Fine-tuning，第二种是few-shot prompting或instruct-based方法。如果第二种方法效果达到或超过第一种方法，则意味着这个领域没有继续独立存在的必要性。如果用这个标准来看，其实很多研究领域，目前fine-tuning效果还是占优的（因为这种模式领域训练数据量大），看似还可独立存在。但是考虑到很多任务随着模型规模增大，few shot prompting效果持续增长，随着更大模型的出现，这个拐点很可能短期就会达到。&lt;/p&gt;      &lt;p&gt;如果上述猜测成立，将意味着如下残酷事实：对于很多NLP领域的研究人员，将面临往何处去的选择，是继续做领域独有问题呢？还是放弃这种看似前途不大的方式，转而去建设更好的LLM？如果选择转向去建设LLM，又有哪些机构有能力、有条件去做这个事情呢？你对这个问题的回答会是什么呢？&lt;/p&gt;      &lt;p&gt;        &lt;strong&gt;影响三：更多NLP之外的研究领域将被纳入LLM技术体系&lt;/strong&gt;&lt;/p&gt;      &lt;p&gt;如果站在AGI的视角，参照之前描述的理想LLM模型，它所能完成的任务，不应局限于NLP领域，或某一两个学科领域，理想中的LLM应该是领域无关的通用人工智能模型，它现在在某一两个领域做得好，不代表只能做这些任务。ChatGPT的出现，证明了现在这个时期，我们去追求AGI是有可行性的，而现在是抛开“领域学科”这个思维束缚的时候了。&lt;/p&gt;      &lt;p&gt;ChatGPT除了展示出以流畅的对话形式解决各种NLP任务外，也具备强大的代码能力。很自然的，之后越来越多其它的研究领域，也会被逐步纳入LLM体系中，成为通用人工智能的一部分。&lt;/p&gt;      &lt;img src="data:image/svg+xml;utf8,&lt;svg xmlns='http://www.w3.org/2000/svg' width='2164' height='1416'&gt;&lt;/svg&gt;" width="2164"&gt;&lt;/img&gt;      &lt;p&gt;LLM从NLP向外进行领域拓展，一个自然的选择就是图像处理及多模态相关任务。目前已经有些工作在尝试把多模态融入，让LLM成为一个支持多模态输入输出的通用人机接口，典型的例子包括DeepMind的Flamingo和微软的“Language Models are General-Purpose Interfaces”，上图展示了这种方式的概念结构。&lt;/p&gt;      &lt;p&gt;我的判断是无论是图像还是多模态，未来被融入LLM成为好用的功能，可能比我们想象的进度要慢。主要原因在于：尽管图像领域最近两年也一直在模仿Bert预训练的路子，尝试引入自监督学习，释放模型自主从图像数据中学习知识的能力，典型技术就是“对比学习”和MAE，这是两条不同的技术路线。然而，从目前效果来看，尽管取得了很大的技术进步，但貌似这条路尚未走通，这体现在图像领域预训练模型应用到下游任务，带来的效果收益，远不如Bert或GPT应用在NLP下游任务那样显著。所以，图像预处理模型仍需深入探索，以释放图像数据的潜力，而这会迟滞它们被统一到LLM大模型的时间。当然，如果哪天这条路被趟通，大概率会复现NLP领域目前的局面，就是图像处理各个研究子领域可能会逐步消失，被融入到大型LLM中来，直接完成终端任务。&lt;/p&gt;      &lt;p&gt;除了图像与多模态，很明显，其它领域也会逐渐被纳入到理想LLM中来，这个方向方兴未艾，是具备高价值的研究主题。&lt;/p&gt;      &lt;p&gt;        &lt;br /&gt;&lt;/p&gt;      &lt;p&gt;以上是我对范式转换的个人思考，接下来，我们来梳理下GPT 3.0之后LLM模型的主流技术进展。如理想LLM模型所示，相关的技术其实可以分为两大类；一类是关于LLM模型如何从数据中吸收知识，也包括模型规模增长对LLM吸收知识能力带来的影响；第二类是关于人如何使用LLM内在能力来解决任务的人机接口，包括In Context Learning和Instruct两种模式。思维链（CoT）prompting这种LLM推理技术，本质上也属于In Context Learning，因为比较重要，我就把它们单独拎出来讲一下。&lt;/p&gt;      &lt;h2&gt;学习者：从无尽数据到海量知识&lt;/h2&gt;      &lt;hr&gt;&lt;/hr&gt;      &lt;p&gt;从目前研究结果看，Transformer是足够强大的特征抽取器，尚不需要做特别的改进。那么通过预训练过程，Transformer学到了什么？知识是如何存取的？我们又如何修正错误知识？本节讲述这方面的研究进展。&lt;/p&gt;      &lt;h3&gt;求知之路：LLM学到了什么知识&lt;/h3&gt;      &lt;p&gt;LLM从海量自由文本中学习了大量知识，如果把这些知识做粗略分类的话，可以分为语言类知识和世界知识两大类。&lt;/p&gt;      &lt;p&gt;语言类知识指的是词法、词性、句法、语义等有助于人类或机器理解自然语言的知识。关于LLM能否捕获语言知识有较长研究历史，自从Bert出现以来就不断有相关研究，很早就有结论，各种实验充分证明LLM可以学习各种层次类型的语言学知识，这也是为何使用预训练模型后，各种语言理解类自然语言任务获得大幅效果提升的最重要原因之一。另外，各种研究也证明了浅层语言知识比如词法、词性、句法等知识存储在Transformer的低层和中层，而抽象的语言知识比如语义类知识，广泛分布在Transformer的中层和高层结构中。&lt;/p&gt;      &lt;p&gt;世界知识指的是在这个世界上发生的一些真实事件（事实型知识，Factual Knowledge），以及一些常识性知识(Common Sense Knowledge)。比如“拜登是现任美国总统”、“拜登是美国人”、“乌克兰总统泽连斯基与美国总统拜登举行会晤”，这些都是和拜登相关的事实类知识；而“人有两只眼睛”、“太阳从东方升起”这些属于常识性知识。关于LLM模型能否学习世界知识的研究也有很多，结论也比较一致：LLM确实从训练数据中吸收了大量世界知识，而这类知识主要分布在Transformer的中层和高层，尤其聚集在中层。而且，随着Transformer模型层深增加，能够学习到的知识数量逐渐以指数级增加（可参考：BERTnesia: Investigating the capture and forgetting of knowledge in BERT）。其实，你把LLM看作是一种以模型参数体现的隐式知识图谱，如果这么理解，我认为是一点问题也没有的。&lt;/p&gt;      &lt;p&gt;“When Do You Need Billions of Words of Pre-training Data?”这篇文章研究了预训练模型学习到的知识量与训练数据量的关系，它的结论是：对于Bert类型的语言模型来说，只用1000万到1亿单词的语料，就能学好句法语义等语言学知识，但是要学习事实类知识，则要更多的训练数据。这个结论其实也是在意料中的，毕竟语言学知识相对有限且静态，而事实类知识则数量巨大，且处于不断变化过程中。而目前研究证明了随着增加训练数据量，预训练模型在各种下游任务中效果越好，这说明了从增量的训练数据中学到的更主要是世界知识。&lt;/p&gt;      &lt;h3&gt;记忆之地：LLM如何存取知识&lt;/h3&gt;      &lt;p&gt;由上可知，LLM确实从数据中学到了很多语言类及世界知识。那么，对于某条具体的知识，LLM把它存储到了哪里？又是如何提取出来的？这也是一个有意思的问题。&lt;/p&gt;      &lt;p&gt;显然，知识一定存储在Transformer的模型参数里。从Transformer的结构看，模型参数由两部分构成：多头注意力（MHA）部分占了大约参数总体的三分之一，三分之二的参数集中在FFN结构中。MHA主要用于计算单词或知识间的相关强度，并对全局信息进行集成，更可能是在建立知识之间的联系，大概率不会存储具体知识点，那么很容易推论出LLM模型的知识主体是存储在Transformer的FFN结构里。&lt;/p&gt;      &lt;img src="data:image/svg+xml;utf8,&lt;svg xmlns='http://www.w3.org/2000/svg' width='2828' height='1496'&gt;&lt;/svg&gt;" width="2828"&gt;&lt;/img&gt;      &lt;p&gt;但这样的定位，粒度还是太粗，无法很好回答具体某条知识是如何存储与提取的，比如 “中国的首都是北京”这条知识，以三元组表达就是&amp;lt;北京，is-capital-of，中国&amp;gt;，其中“is-capital-of”代表实体间关系。这条知识它存储在LLM的哪里呢？&lt;/p&gt;      &lt;p&gt;“Transformer Feed-Forward Layers Are Key-Value Memories”给出了一个比较新颖的观察视角，它把Transformer的FFN看成存储大量具体知识的Key-Value存储器。如上图所示（图左是原始论文图，其实不太好理解，可以看做了注释的图右，更好理解些），FFN的第一层是个MLP宽隐层，这是Key层；第二层是MLP窄隐层，是Value层。FFN的输入层其实是某个单词对应的MHA的输出结果Embedding，也就是通过Self Attention，将整个句子有关的输入上下文集成到一起的Embedding，代表了整个输入句子的整体信息。&lt;/p&gt;      &lt;p&gt;Key层的每个神经元节点，记载了一对&amp;lt;Key,Value&amp;gt;信息。比如对于上图中FFN第一个隐层的第i个节点k_{i}，也许就是它记载了&amp;lt;北京，is-capital-of，中国&amp;gt;这条知识。k_{i}节点对应的key向量，其实指的是节点k_{i}和输入层每个节点的权重向量；而对应的Value向量，指的是节点k_{i}和FFN第二层的Value层每个节点形成连接的权重向量。每个神经元的Key向量，用于识别输入中的某种语言或者知识模式，是一种模式探测器。如果输入中包含它要检测的某种模式，那么输入向量和k_{i}节点的key权重进行向量内积计算，加上Relu，形成k_{i}的大数值响应，意味着k_{i}检测到了这个模式，于是再把这个响应值，通过k_{i}节点的Value权重向量向FFN第二层传播。这等价于将Value向量的值，用响应值加权，然后传递并体现到第二层Value层每个节点的输出上。如此这般，FFN的正向传播计算过程，看起来就像是通过Key检测到某种知识模式，然后取出对应的Value，并把Value体现在FFN的第二层输出上。当然，FFN第二层每个节点，会收集FFN的Key层所有节点信息，所以是一种混合响应，而Value层所有节点的混合响应，可以解读为代表输出单词的概率分布信息。&lt;/p&gt;      &lt;p&gt;听着可能还是比较复杂，我们用个极端的例子来说明。我们假设上图的节点k_{i}就是记载&amp;lt;北京，is-capital-of，中国&amp;gt;这条知识的Key-Value存储器，它的Key向量，用于检测”中国的首都是…”这个知识模式，它的Value向量，基本存储了与单词“北京”的Embedding比较接近的向量。当Transformer的输入是“中国的首都是[Mask]”的时候，k_{i}节点从输入层探测到这个知识模式，所以产生较大的响应输出。我们假设Key层其它神经元对这个输入都没有任何响应，那么对应的Value层的节点，其实只会接收到“北京”这个Value对应的单词embedding，并通过k_{i}的大响应值，进行了进一步的数值放大。于是，Mask位置对应的输出，就自然会输出“北京”这个单词。基本就是这么个过程，看着很复杂，其实很简单。&lt;/p&gt;      &lt;p&gt;而且这篇文章还指出，Transformer低层对句子的表层模式作出反应，高层对语义模式作出反应，就是说低层FFN存储词法、句法等表层知识，中层和高层存储语义及事实概念知识，这和其它研究结论是一致的。&lt;/p&gt;      &lt;p&gt;要我猜，把FFN看成Key-Value存储器这种思路，很可能不是最终的正确答案，但是距离最终正确答案的距离，估计也不太远。&lt;/p&gt;      &lt;h3&gt;知识涂改液：如何修正LLM里存储的知识&lt;/h3&gt;      &lt;p&gt;既然我们已知具体的某条世界知识存储在某个或者某些FFN节点的参数里，自然会引发另外一个问题：我们能否修正LLM模型里存储的错误或者过时的知识呢？比如对于问题：“英国的现任首相是谁？”鉴于近年来英国首相频繁更迭，你猜LLM更倾向输出“鲍里斯”还是更青睐“苏纳克”？很明显训练数据中包含“鲍里斯”的数据会更多，这种情况很大可能LLM会给出错误回答，于是我们就有修正LLM里存储的过时知识的必要性。&lt;/p&gt;      &lt;p&gt;如果归纳下，目前有三类不同方法来修正LLM里蕴含的知识：&lt;/p&gt;      &lt;p&gt;第一类方法从训练数据的源头来修正知识。“Towards Tracing Factual Knowledge in Language Models Back to the Training Data”这篇文章的研究目标是：对于指定的某条知识，我们是否可以定位到是哪些训练数据导致LLM学会了这条知识？答案是肯定的，这意味着我们可以逆向追踪到某条知识对应的训练数据源头。如果利用这项技术，假设我们想要删除某条知识，则可首先定位到其对应的数据源头，删除数据源，然后重新预训练整个LLM模型，这样即可达成删除LLM中相关知识的目的。但是这里有个问题，如果修正一小部分知识，我们就需要重新做一次模型预训练，这样做明显成本太高。所以这种方法不会太有发展前景，可能比较适合那种对于某个特定类别数据的一次性大规模删除场合，不适合少量多次的常规知识修正场景，比如可能比较适合用来做去除偏见等去toxic内容的处理。&lt;/p&gt;      &lt;p&gt;第二类方法是对LLM模型做一次fine-tuning来修正知识。一个直观能想到的方法是：我们可以根据要修正成的新知识来构建训练数据，然后让LLM模型在这个训练数据上做fine-tuning，这样指导LLM记住新的知识，遗忘旧的知识。这个方法简单直观，但是也有一些问题，首先它会带来灾难遗忘问题，就是说除了忘掉该忘的知识，还忘掉了不该忘的知识，导致这么做了之后有些下游任务效果下降。另外，因为目前的LLM模型规模非常大，即使是做fine-tuning，如果次数频繁，其实成本也相当高。对这种方法感兴趣的可以参考“Modifying Memories in Transformer Models”。&lt;/p&gt;      &lt;p&gt;另外一类方法直接修改LLM里某些知识对应的模型参数来修正知识。假设我们想要把旧知识&amp;lt;英国，现任首相，鲍里斯&amp;gt;，修正到&amp;lt;英国，现任首相，苏纳克&amp;gt;。首先我们想办法在LLM模型参数中，定位到存储旧知识的FFN节点，然后可以强行调整更改FFN中对应的模型参数，将旧知识替换成新的知识。可以看出，这种方法涉及到两项关键技术：首先是如何在LLM参数空间中定位某条知识的具体存储位置；其次是如何修正模型参数，来实现旧知识到新知识的修正。关于这类技术的细节，可以参考“Locating and Editing Factual Associations in GPT”和“Mass-Editing Memory in a Transformer”。理解这个修正LLM知识的过程，其实对于更深入理解LLM的内部运作机制是很有帮助的。&lt;/p&gt;      &lt;h2&gt;规模效应：当LLM越来越大时会发生什么&lt;/h2&gt;      &lt;hr&gt;&lt;/hr&gt;      &lt;p&gt;我们知道，近年来，LLM模型规模在快速增长，目前效果最好的LLM模型，其参数规模大都超过了千亿（100B）参数规模。比如，OpenAI的GPT 3的规模为175B，Google的LaMDA规模为137B，PaLM的规模为540B，DeepMind的Gogher规模为280B等，不一而足。国内也有中文巨型模型，比如智源GLM规模130B，华为“盘古”规模200B，百度“文心”规模260B，浪潮“源1.0”规模245B。那么，一个很自然的问题就是：随着LLM模型规模不断增长，会发生些什么呢？&lt;/p&gt;      &lt;p&gt;预训练模型的应用往往是两阶段的：预训练阶段，及具体场景应用阶段。在预训练阶段，其优化目标是交叉熵，对GPT这种自回归语言模型来说，也就是看LLM是否正确预测到了下一个单词；而场景应用阶段，一般要看具体场景的评价指标。一般我们的直觉是：如果LLM模型在预训练阶段的指标越好，自然它解决下游任务的能力就越强。然而，事实并非完全如此。现有研究已证明，预训练阶段的优化指标确实和下游任务表现出正相关关系，但是并非完全正相关。也就是说，只看预训练阶段的指标，来判断一个LLM模型是否够好，这是不够的。基于此，我们分头来看在这两个不同阶段，随着LLM模型增大，有什么影响。&lt;/p&gt;      &lt;img src="data:image/svg+xml;utf8,&lt;svg xmlns='http://www.w3.org/2000/svg' width='2548' height='1086'&gt;&lt;/svg&gt;" width="2548"&gt;&lt;/img&gt;      &lt;p&gt;首先，我们先看在预训练阶段，随着模型规模逐步增大，会发生什么。OpenAI在“Scaling Laws for Neural Language Models”中专门研究了这个问题，并提出LLM模型所遵循的“伸缩法则”（scaling law）。如上图所示，这个研究证明：当我们独立增加训练数据量、模型参数规模或者延长模型训练时间（比如从1个Epoch到2个Epoch），预训练模型在测试集上的Loss都会单调降低，也就是说模型效果越来越好。&lt;/p&gt;      &lt;p&gt;既然三个因素都重要，那么我们在实际做预训练的时候，就有一个算力如何分配的决策问题：假设用于训练LLM的算力总预算（比如多少GPU小时或者GPU天）给定，那么是应该多增加数据量、减少模型参数呢？还是说数据量和模型规模同时增加，减少训练步数呢？此消彼长，某个要素规模增长，就要降低其它因素的规模，以维持总算力不变，所以这里有各种可能的算力分配方案。最终OpenAI选择了同时增加训练数据量和模型参数，但是采用早停策略(early stopping)来减少训练步数的方案。因为它证明了：对于训练数据量和模型参数这两个要素，如果只单独增加其中某一个，这不是最好的选择，最好能按照一定比例同时增加两者，它的结论是优先增加模型参数，然后才是训练数据量。假设用于训练LLM的算力总预算增加了10倍，那么应该增加5.5倍的模型参数量，1.8倍的训练数据量，此时模型效果最佳。&lt;/p&gt;      &lt;p&gt;DeepMind的一项研究（参考：Training Compute-Optimal Large Language Models）更深入地探究了这个问题，其基本结论和OpenAI的结论差不多，比如确实需要同时增加训练数据量和模型参数，模型效果才会更好。而很多大模型在做预训练的时候，并没有考虑这一点，很多LLM大模型只是单调增加模型参数，而固定住了训练数据量，这个做法其实是不对的，限制了LLM模型的潜力。但是它修正了两者的比例关系，认为训练数据量和模型参数是同等重要的，也就是说，假设用于训练LLM的算力总预算增加了10倍，那么应该增加3.3倍的模型参数量，3.3倍的训练数据量，这样模型效果才最好。&lt;/p&gt;      &lt;p&gt;这意味着：增加训练数据量的重要性，比我们之前所认为的，还要重要。基于这个认知，DeepMind在设计Chinchilla模型时，在算力分配上选择了另外一种配置：对标数据量300B、模型参数量280B的Gopher模型，Chinchilla选择增加4倍的训练数据，但是将模型参数降低为Gopher的四分之一，大约为70B。但是无论预训练指标，还是很多下游任务指标，Chinchilla效果都要优于规模更大的Gopher。&lt;/p&gt;      &lt;p&gt;这带给我们如下启示：我们可以选择放大训练数据，并同比例地减少LLM模型参数，以达到在不降低模型效果的前提下，极大缩小模型规模的目的。缩小模型规模有很多好处，比如在应用的时候，推理速度会快很多等，无疑这是一个很有前途的LLM发展路线。&lt;/p&gt;      &lt;p&gt;以上是从预训练阶段来看模型规模的影响，如果从LLM解决下游具体任务效果的角度来看，随着模型规模增大，不同类型的任务有不同的表现，具体而言，有以下三类情况。&lt;/p&gt;      &lt;img src="data:image/svg+xml;utf8,&lt;svg xmlns='http://www.w3.org/2000/svg' width='2540' height='1352'&gt;&lt;/svg&gt;" width="2540"&gt;&lt;/img&gt;      &lt;p&gt;第一类任务完美体现了LLM模型的scaling law，就是说随着模型规模逐步放大，任务的表现越来越好，如上图里的（a）图所示。这类任务通常符合如下共性：它们往往都是知识密集型任务，也就是说如果LLM模型包含的知识量越多，这类任务表现越好。而很多研究已经证明越大的LLM模型学习效率越高，也就是说相同训练数据量，模型越大任务效果越好，说明面对的即使是同样的一批训练数据，更大的LLM模型相对规模小一些的模型，从中学到了更多的知识。更何况一般情况下，在增大LLM模型参数的时候，往往会同步增加训练数据量，这意味着大模型可以从更多数据中学习更多的知识点。这些研究可以很好地解释上图，为何随着模型规模增大，这些知识密集型的任务效果越来越好。大多数传统的自然语言理解类任务，其实都属于这种知识密集型任务，而很多任务在近两年获得了极大的效果提升，甚至超过了人类表现。很明显，这大概率是LLM模型的规模增长带来的，而非归功于某项具体的技术改进。&lt;/p&gt;      &lt;p&gt;第二类任务展现出LLM具备某种“涌现能力（Emergent Ability）”，如上图（b）所示。所谓“涌现能力”，指的是当模型参数规模未能达到某个阀值时，模型基本不具备解决此类任务的任何能力，体现为其性能和随机选择答案效果相当，但是当模型规模跨过阀值，LLM模型对此类任务的效果就出现突然的性能增长。也就是说，模型规模是解锁(unlock)LLM新能力的关键，随着模型规模越来越大，会逐渐解锁LLM越来越多的新能力。这是个很神奇的现象，因为它意味着如下让人对未来可报乐观预期的可能：或许很多任务，目前LLM还不能很好地解决，甚至站在现在这个时刻的我们看起来，LLM完全没有能力解决这类任务，但因LLM具备“涌现能力”，所以如果我们继续推大模型，也许某一天它的这项能力就被突然解锁了。LLM模型的规模增长会给我们带来意想不到的精彩礼物。&lt;/p&gt;      &lt;p&gt;“Beyond the Imitation Game: Quantifying and extrapolating the capabilities of language models”这篇文章指出，这类体现出“涌现能力”的任务也有一些共性：这些任务一般由多步骤构成，要解决这些任务，往往需要先解决多个中间步骤，而逻辑推理能力在最终解决这类任务中发挥重要作用。思维链（Chain of Thought）Prompting是典型的增强LLM推理能力的技术，能大幅提升此类任务的效果，关于CoT技术，在随后小节内容会做解释，此处暂不展开。&lt;/p&gt;      &lt;p&gt;问题是，为何LLM会出现这种“涌现能力”现象呢？上述文章以及“Emergent Abilities of Large Language Models”给出了几个可能的解释：&lt;/p&gt;      &lt;p&gt;一种可能解释是有些任务的评价指标不够平滑。比如说有些生成任务的判断标准，它要求模型输出的字符串，要和标准答案完全匹配才算对，否则就是0分。所以，即使随着模型增大，其效果在逐步变好，体现为输出了更多的正确字符片段，但是因为没有完全对，只要有任何小错误都给0分，只有当模型足够大，输出片段全部正确才能得分。也就是说，因为指标不够平滑，所以不能体现LLM其实正在逐步改善任务效果这一现实，看起来就是“涌现能力”这种外在表现。&lt;/p&gt;      &lt;p&gt;另外一种可能的解释是：有些任务由若干中间步骤构成，随着模型规模增大，解决每个步骤的能力也在逐步增强，但是只要有一个中间步骤是错的，最终答案就是错的，于是也会导致这种表面的“涌现能力”现象。&lt;/p&gt;      &lt;p&gt;当然，上面的解释目前还都是猜想，至于为何LLM会出现这种现象，还需要进一步更深入的研究。&lt;/p&gt;      &lt;img src="data:image/svg+xml;utf8,&lt;svg xmlns='http://www.w3.org/2000/svg' width='2374' height='1146'&gt;&lt;/svg&gt;" width="2374"&gt;&lt;/img&gt;      &lt;p&gt;还有少部分任务，随着模型规模增长，任务的效果曲线展现出U形特性：随着模型规模逐渐变大，任务效果逐渐变差，但是当模型规模进一步增长，则效果开始越来越好，呈现出U形增长趋势，如上图所示的粉红色PaLM模型在两个任务上的指标走势。为何这些任务表现得如此特殊呢？“Inverse scaling can become U-shaped”这篇文章给出了一种解释：这些任务，内部其实隐含了两种不同类型的子任务，一种是真正的任务，另外一种是“干扰任务（distractor task）”。当模型规模小的时候，无法识别任意一种子任务，所以模型的表现跟随机选择答案差不多，当模型增长到中等规模的时候，主要执行的是干扰任务，所以对真正的任务效果有负面影响，体现为真正任务效果的下降，而当进一步增加模型规模，则LLM可以忽略干扰任务，执行真正的任务，体现为效果开始增长。&lt;/p&gt;      &lt;p&gt;对于那些随着模型规模增大，效果一直下降的任务，如果采用思维链（CoT）Prompting，则部分任务的表现转换为遵循Scaling law，即模型规模越大效果越好，而其它任务则转换为U性增长曲线。这其实侧面说明了：此类任务应属于推理类型的任务，所以加入CoT后任务表现会发生质的变化。&lt;/p&gt;      &lt;h2&gt;人机接口:从In Context Learning到Instruct理解&lt;/h2&gt;      &lt;hr&gt;&lt;/hr&gt;      &lt;p&gt;一般我们经常提到的人和LLM的接口技术包括：zero shot prompting、few shot prompting、In Context Learning，以及Instruct。这些其实都是表达某个具体任务的描述方式。不过如果你看文献，会发现叫法比较乱。&lt;/p&gt;      &lt;p&gt;其中Instruct 是ChatGPT的接口方式，就是说人以自然语言给出任务的描述，比如“把这个句子从中文翻译成英文”，类似这种。zero shot prompting我理解其实就是现在的Instruct的早期叫法，以前大家习惯叫zero shot，现在很多改成叫Instruct。尽管是一个内涵，但是具体做法是两种做法。早期大家做zero shot prompting，实际上就是不知道怎么表达一个任务才好，于是就换不同的单词或者句子，反复在尝试好的任务表达方式，这种做法目前已经被证明是在拟合训练数据的分布，其实没啥意思。目前Instruct的做法则是给定命令表述语句，试图让LLM理解它。所以尽管表面都是任务的表述，但是思路是不同的。&lt;/p&gt;      &lt;p&gt;而In Context Learning和few shot prompting意思类似，就是给LLM几个示例作为范本，然后让LLM解决新问题。我个人认为In Context Learning也可以理解为某项任务的描述，只是Instruct是一种抽象的描述方式，In Context Learning是一种例子示范的例子说明法。当然，鉴于目前这几个叫法用的有点乱，所以上述理解仅代表个人看法。&lt;/p&gt;      &lt;p&gt;所以我们此处只对In Context Learning和Instruct进行介绍，不再提zero shot和few shot了。&lt;/p&gt;      &lt;h3&gt;神秘的In Context Learning&lt;/h3&gt;      &lt;p&gt;如果你细想，会发现In Context Learning是个很神奇的技术。它神奇在哪里呢？神奇在你提供给LLM几个样本示例&amp;lt;x_{1},y_{1}&amp;gt;,&amp;lt;x_{2},y_{2}&amp;gt;....&amp;lt;x_{n},y_{n}&amp;gt;，然后给它x_{n+1}，LLM竟然能够成功预测对应的y_{n+1}。听到这你会反问：这有什么神奇的呢？Fine-tuning不就是这样工作的吗？你要这么问的话，说明你对这个问题想得还不够深入。&lt;/p&gt;      &lt;img src="data:image/svg+xml;utf8,&lt;svg xmlns='http://www.w3.org/2000/svg' width='2672' height='1490'&gt;&lt;/svg&gt;" width="2672"&gt;&lt;/img&gt;      &lt;p&gt;Fine-tuning和In Context Learning表面看似都提供了一些例子给LLM，但两者有质的不同（参考上图示意）：Fine-tuning拿这些例子当作训练数据，利用反向传播去修正LLM的模型参数，而修正模型参数这个动作，确实体现了LLM从这些例子学习的过程。但是，In Context Learning只是拿出例子让LLM看了一眼，并没有根据例子，用反向传播去修正LLM模型参数的动作，就要求它去预测新例子。既然没有修正模型参数，这意味着貌似LLM并未经历一个学习过程，如果没有经历学习过程，那它为何能够做到仅看一眼，就能预测对新例子呢？这正是In Context Learning的神奇之处。这是否让你想起了一句歌词：“只是因为在人群中多看了你一眼  再也没能忘掉你容颜”，而这首歌名叫“传奇”。你说传奇不传奇？&lt;/p&gt;      &lt;p&gt;看似In Context Learning没从例子里学习知识，实际上，难道LLM通过一种奇怪的方式去学习？还是说，它确实也没学啥？关于这个问题的答案，目前仍是未解之谜。现有一些研究各有各的说法，五花八门，很难判断哪个讲述的是事实的真相，甚至有些研究结论还相互矛盾。这里提供几个目前的说法，至于谁对谁错，只能你自己把握了。当然，我认为追求这个神奇现象背后的真相，是一个好的研究课题。&lt;/p&gt;      &lt;p&gt;试图证明In Context Learning没有从例子中学习的工作是“Rethinking the Role of Demonstrations: What Makes In-Context Learning Work?”。它发现了：在提供给LLM的样本示例&amp;lt;x_{i},y_{i}&amp;gt;中，y_{i}是否x_{i}对应的正确答案，其实并不重要，如果我们把正确答案y_{i}替换成随机的另外一个答案y_{j}，这并不影响In Context Learning的效果。这起码说明了一点：In Context Learning并没有提供给LLM那个从x映射到y的映射函数信息：y=f(x)，否则的话你乱换正确标签，肯定会扰乱这个y=f(x)映射函数。也就是说，In Context Learning并未学习这个输入空间到输出空间的映射过程。&lt;/p&gt;      &lt;p&gt;真正对In Context Learning影响比较大的是：x和y的分布，也就是输入文本x的分布和候选答案y有哪些，如果你改变这两个分布，比如把y替换成候选答案之外的内容，则In Context Learning效果急剧下降。&lt;/p&gt;      &lt;p&gt;总之，这个工作证明了In Context Learning并未学习映射函数，但是输入和输出的分布很重要，这两个不能乱改。&lt;/p&gt;      &lt;p&gt;有些工作认为LLM还是从给出的示例学习了这个映射函数y=f(x)，不过是种隐式地学习。比如“What learning algorithm is in-context learning? Investigations with linear models”认为Transformer能够隐式地从示例中学习x到y的映射过程，它的激活函数中包含了一些简单映射函数，而LLM通过示例能够激发对应的那一个。而“Why Can GPT Learn In-Context? Language Models Secretly Perform Gradient Descent as Meta-Optimizers”这篇文章则将ICL看作是一种隐式的Fine-tuning。&lt;/p&gt;      &lt;p&gt;总而言之，目前这还是一个未解之谜。&lt;/p&gt;      &lt;h3&gt;神奇的Instruct理解&lt;/h3&gt;      &lt;p&gt;我们可以把Instruct当作一种方便人类理解的任务表述，在这个前提下，目前关于Instruct的研究可以分成两种：偏学术研究的Instruct，以及关于人类真实需求描述的Instruct。&lt;/p&gt;      &lt;img src="data:image/svg+xml;utf8,&lt;svg xmlns='http://www.w3.org/2000/svg' width='2676' height='1302'&gt;&lt;/svg&gt;" width="2676"&gt;&lt;/img&gt;      &lt;p&gt;我们先来看第一种：偏学术研究的Instruct。它的核心研究主题是多任务场景下，LLM模型对Instruct理解的泛化能力。如上图中FLAN模型所示，就是说有很多NLP任务，对于每个任务，研究人员构造一个或者多个Prompt模版作为任务的Instruct，然后用训练例子对LLM模型进行微调，让LLM以同时学习多个任务。训练好模型后，给LLM模型一个它没见过的全新任务的Instruct，然后让LLM 解决zero shot任务，从任务解决得是否足够好，来判断LLM模型是否有对Instruct理解的泛化能力。&lt;/p&gt;      &lt;p&gt;如果归纳下目前的研究结论（可参考“Scaling Instruction-Fine-tuned Language Models”／“Super-NaturalInstructions: Generalization via Declarative Instructions on 1600+ NLP Tasks”），能够有效增加LLM模型Instruct泛化能力的因素包括：增加多任务的任务数量、增加LLM模型大小、提供CoT Prompting， 以及增加任务的多样性。如果采取任意一项措施，都可以增加LLM模型的Instruct理解能力。&lt;/p&gt;      &lt;p&gt;第二种是人类真实需求下的Instruct，这类研究以InstructGPT和ChatGPT为代表。这类工作也是基于多任务的，但是和偏向学术研究类工作最大的不同，在于它是面向人类用户真实需求的。为什么这么说呢？因为它们用于LLM多任务训练的任务描述Prompt，是从大量用户提交的真实请求中抽样而来的，而不是固定好研究任务的范围，然后让研究人员来写任务描述prompt。这里所谓的“真实需求”，体现在两个方面：首先，因为是从用户提交的任务描述里随机抽取的，所以涵盖的任务类型更多样化，也更符合用户的真实需求；其次，某个任务的prompt描述，是用户提交的，体现了一般用户在表达任务需求时会怎么说，而不是你认为用户会怎么说。很明显，这类工作改出来的LLM模型，用户体验会更好。&lt;/p&gt;      &lt;p&gt;InstructGPT论文里，也拿这种方法和FLAN那种Instruct based方法做了比较。首先在GPT3上用FLAN提到的任务、数据以及Prompt模版进行微调，来在GPT 3上复现FLAN方法，然后和InstructGPT进行比较，因为InstructGPT的基础模型也是GPT3，所以只有数据和方法的差别，两者可比，结果发现FLAN方法的效果，距离InstructGPT有很大的差距。那么背后的原因是什么呢？论文分析数据后认为，FLAN方法涉及到的任务领域相对少，是InstructGPT涉及领域的子集，所以效果不好。也就是说，FLAN论文里涉及到的任务和用户真实需求是不符的，而这导致在真实场景下效果不够好。而这对我们的启示是：从用户数据中收集真实需求，这事情是很重要的。&lt;/p&gt;      &lt;h3&gt;In Context Learning和Instruct的联系&lt;/h3&gt;      &lt;p&gt;如果我们假设In Context Learning是用一些例子来具象地表达任务命令，Instruct是一种更符合人类习惯的抽象任务描述。那么，一个很自然的问题是：它们之间有什么联系吗？比如，我们是否能够提供给LLM完成某个任务的若干具体示例，让LLM找出其对应的自然语言描述的Instruct命令？&lt;/p&gt;      &lt;img src="data:image/svg+xml;utf8,&lt;svg xmlns='http://www.w3.org/2000/svg' width='2718' height='1188'&gt;&lt;/svg&gt;" width="2718"&gt;&lt;/img&gt;      &lt;p&gt;目前有零星的工作在探索这个问题，我认为这个方向是很有研究价值的。先说答案，答案是：Yes，LLM Can。“Large Language Models Are Human-Level Prompt Engineers”是做这个方向很有趣的工作，如上图所示，对于某项任务，给LLM一些示例，让LLM自动生成能够描述这项任务的自然语言命令，然后它再用LLM生成的任务描述去测试任务效果。它使用的基础模型是GPT 3和InstructGPT，经过这项技术加持后，LLM生成的Instruct的效果相比未采用这项技术的GPT 3 以及InstuctGPT来说，指标有极大地提升，而且在一些任务上超过人类的表现。&lt;/p&gt;      &lt;p&gt;这说明了：具象的任务示例和任务的自然语言描述之间，有种神秘的内在联系。至于这种联系到底是什么？我们目前对此还一无所知。&lt;/p&gt;      &lt;h2&gt;智慧之光：如何增强LLM的推理能力&lt;/h2&gt;      &lt;hr&gt;&lt;/hr&gt;      &lt;p&gt;目前很多研究已证明LLM对于知识具有强大的记忆能力，但是，一般我们不会因为一个人记忆能力强，就说这人很聪明，是否具有强大的推理能力，往往是我们判断一个人是否聪明的重要标准。类似的，如果LLM的效果想让人觉得很惊艳，强大的推理能力是必备的。推理能力本质上是综合运用很多相关知识点，去推导出新知识或新结论。关于LLM的推理能力，是最近一年来LLM里最重要和热门的研究领域之一。于是，我们关心的问题就是：LLM具备推理能力吗？如果具备，那么它的推理能力够强吗？&lt;/p&gt;      &lt;p&gt;这两个问题目前的答案似乎应该是：当模型规模足够大的时候，LLM本身是具备推理能力的，在简单推理问题上，LLM已经达到了很好的能力，但是复杂推理问题上，还需要更多深入的研究。&lt;/p&gt;      &lt;p&gt;如果梳理现有LLM推理相关工作的话，我把它们归到两大类，体现出挖掘或促进LLM推理能力不同的技术思路：第一类研究比较多，可以统称为基于Prompt的方法，核心思想是通过合适的提示语或提示样本，更好地激发出LLM本身就具备的推理能力，Google在这个方向做了大量很有成效的工作。第二类做法是在预训练过程中引入程序代码，和文本一起参与预训练，以此进一步增强LLM的推理能力，这应该是OpenAI实践出的思路。比如ChatGPT肯定具备很强的推理能力，但它并不要求用户必须提供一些推理示例，所以ChatGPT强大的推理能力，大概率来源于使用代码参与GPT 3.5的预训练。&lt;/p&gt;      &lt;p&gt;这两种思路其实大方向是迥异的：利用代码增强LLM推理能力，这体现出一种通过增加多样性的训练数据，来直接增强LLM推理能力的思路；而基于Prompt的方法，它并不会促进LLM本身的推理能力，只是让LLM在解决问题过程中更好地展示出这种能力的技术方法。可以看出，前者（代码方法）治本，后者治标。当然，两者其实也是互补的，但从长远看，治本的方法更重要。&lt;/p&gt;      &lt;h3&gt;基于Prompt的方法&lt;/h3&gt;      &lt;p&gt;这方面工作非常多，如果归纳一下的话，大致可以分为三条技术路线。&lt;/p&gt;      &lt;img src="data:image/svg+xml;utf8,&lt;svg xmlns='http://www.w3.org/2000/svg' width='2786' height='1412'&gt;&lt;/svg&gt;" width="2786"&gt;&lt;/img&gt;      &lt;p&gt;第一种思路是直接在问题上追加辅助推理Prompt。这种方法简单直接，但在众多领域都很有效。这个做法是由“Large language models are zero-shot reasoners”提出的，也被称为zero-shot CoT。具体而言，分为两个阶段（如上图所示），第一阶段在提问的问题上追加“Let’s think step by step”这句提示语，LLM会输出具体的推理过程；第二阶段，在第一阶段的问题后，拼接LLM输出的具体推理过程，并再追加Prompt=“Therefore, the answer (arabic numerals) is”，此时LLM会给出答案。如此简单的操作，却可以大幅增加LLM在各项推理任务中的效果，比如在数学推理测试集GSM8K上，加上提示语后，推理准确率直接从原先的10.4%提升到了40.4%，可谓神奇。&lt;/p&gt;      &lt;p&gt;为什么LLM会具备给一句“Let’s think step by step”提示语，就能列出详细的推理步骤并算出答案呢？其原因目前尚无定论，我的猜测是：很可能因为预训练数据里面存在大量的此种数据，就是以“Let’s think step by step”开头，然后后面是详细的推理步骤，最后给出答案，而LLM在预训练的时候记住了这些模式。而当我们输入这个提示语的时候，激发LLM模糊得“回忆”起某些例子的推导步骤，于是即可模仿这些例子进行步骤推理并给出答案。当然这只是我的无依据推论，若事实真的如此，如果你看过后面介绍的标准CoT做法，会发现Zero-shot CoT 本质上和标准CoT很可能没什么区别，只是标准CoT由人工来写推理步骤的示例，而Zero-shot CoT大概率是通过提示语，激活了记忆中的某些包含推理步骤的示例，很可能是如此区别。而标准CoT效果比Zero-Shot CoT效果好也完全可以理解，因为毕竟靠LLM回忆示例，精准性估计不会太高，而人工给出的示例，准确性是有保障的，所以自然标准CoT效果会更好。&lt;/p&gt;      &lt;p&gt;这侧面说明了一个道理，就是LLM本身是具备推理能力的，只是我们没有办法把它的这种能力激发出来而已，通过合适的提示语来进行两步提示，就在一定程度上可以释放出它的这种潜力。另外，对于中文，很可能存在另外一个黄金提示语，比如“详细解题思路如下”，类似这种，因为中文语料在讲解推理步骤的时候，经常用的引导句和“让我们一步一步来思考”应该是不同的，这是明显的西方说法，而探索出这个中文黄金提示语，其实也是很有必要的。&lt;/p&gt;      &lt;p&gt;第二种思路一般被称为基于示例的思维链（few-shot CoT,Chain of Thought）Prompting。这个方向目前是LLM推理研究的主方向，很多工作都是在这个思路上做的，我们简单介绍几个效果显著的代表性工作，基本能代表CoT的技术发展方向。&lt;/p&gt;      &lt;img src="data:image/svg+xml;utf8,&lt;svg xmlns='http://www.w3.org/2000/svg' width='2194' height='1256'&gt;&lt;/svg&gt;" width="2194"&gt;&lt;/img&gt;      &lt;p&gt;CoT的主体思想其实很直白；为了教会LLM模型学会推理，给出一些人工写好的推理示例，示例里把得到最终答案前，一步步的具体推理步骤说清楚，而这些人工写的详细推理过程，就是思维链Prompting，具体例子可参照上图中蓝色文字部分。CoT的意思是让LLM模型明白一个道理；就是在推理过程中，步子不要迈得太大，否则很容易出错，改变思维模式，化大问题为小问题，步步为营，积小胜为大胜。最早明确提出CoT这个概念的文章是“Chain of thought prompting elicits reasoning in large language models”，论文发布于22年1月份，虽然做法很简单，但是应用CoT后LLM模型的推理能力得到了巨大提升，GSM8K数学推理测试集准确率提高到60.1%左右。当然，这种给出详细推理步骤和中间过程的思想，并非CoT最早提出的，更早一些的“scratchpad”技术（可参考：Show Your Work: Scratchpads for Intermediate Computation with Language Models）首先采用了类似的思路。&lt;/p&gt;      &lt;img src="data:image/svg+xml;utf8,&lt;svg xmlns='http://www.w3.org/2000/svg' width='2418' height='1296'&gt;&lt;/svg&gt;" width="2418"&gt;&lt;/img&gt;      &lt;p&gt;CoT提出不久，很快在22年3月份，一项被称为“Self-Consistency”的改进技术就将GSM8K测试集准确率提高到74.4%，提出这项改进的论文是“Self-Consistency Improves Chain of Thought Reasoning in Language Models”。“Self-Consistency”的思路也很直观（参考上图）：首先可以利用CoT给出几个写了推理过程的示例，然后要求LLM对给定的问题进行推理，如果是CoT，直接输出一个推理过程和答案，整个过程就结束了。“Self-Consistency”则不然，它要求LLM输出多个不同的推理过程和答案，然后采用投票的方式选出最佳答案，思路非常简单直接，但是效果也确实好。“Self-Consistency”其实是教导LLM学会这么一个道理：孔乙己说过茴香豆的“茴”字有四种写法，类似的，一个数学题的正确解法也可以有很多种，每个不同的推导过程都指向最终的答案。条条大路通罗马，虽说也有个别迷路走到北京的，但是迷路的毕竟是少数，看看大多数人走到哪里，哪里就是正确答案。简单的方法往往蕴含着深刻的哲学含义，是不是这道理？&lt;/p&gt;      &lt;p&gt;再往后，“On the Advance of Making Language Models Better Reasoners”这个工作在“Self-Consistency”基础上，进一步集成了“从一个Prompt问题拓展到多个Prompt问题、检查推理中间步骤的正确性以及对多个输出的回答加权投票”这三个改进点，将GSM8K测试集准确率提高到83%左右。&lt;/p&gt;      &lt;img src="data:image/svg+xml;utf8,&lt;svg xmlns='http://www.w3.org/2000/svg' width='2056' height='1492'&gt;&lt;/svg&gt;" width="2056"&gt;&lt;/img&gt;      &lt;p&gt;第三种思路体现了一种分治算法的思想。当然这个所谓“分治”是我归纳的，别人没这么说。这种思路的核心思想是：对于一个复杂的推理问题，我们把它分解成若干容易解决的子问题，一一解决掉子问题后，我们再从子问题的答案推导复杂问题的答案。你看这确实比较类似分治算法的思想吧。我个人觉得，这种思路可能才是揭示问题本质、最终解决LLM复杂推理问题正宗的道路。我们以“Least-to-most prompting”技术为例来说明这种思路的一种具体实现方式，如上图所示：它分为两个阶段，第一个阶段，从原始问题我们可以得知最终要问的问题是什么，我们假设最终问题是Final Q，然后从原始问题填充Prompt模版：“如果要解决Final Q问题，那么我需要先解决”，然后把原始问题和这个Prompt交给LLM，让LLM模型给出答案，等于让LLM给出最终问题的前置子问题Sub Q；接下来我们进入第二个阶段，让LLM先回答刚才拿到的子问题Sub Q，并拿到对应的答案，然后原始问题拼接子问题Sub Q及对应答案，再去问LLM最终那个问题Final Q，此时LLM会给出最后的答案。如此这般，体现出拆解子问题，并从子问题的答案逐步找出最终答案的思路。&lt;/p&gt;      &lt;h3&gt;代码预训练增强LLM推理能力&lt;/h3&gt;      &lt;p&gt;以上是目前利用Prompt激发LLM模型推理能力的三种主流做法，而关于LLM的推理能力，目前还观察到一个有趣且费解的现象：除了文本外，如果能够加入程序代码一起参与模型预训练，则能大幅提升LLM模型的推理能力。这个结论从不少论文的实验部分都可以得出（可以参考：AUTOMATIC CHAIN OF THOUGHT PROMPTING IN LARGE LANGUAGE MODELS／Challenging BIG-Bench tasks and whether chain-of-thought can solve them等论文的实验部分）。&lt;/p&gt;      &lt;img src="data:image/svg+xml;utf8,&lt;svg xmlns='http://www.w3.org/2000/svg' width='2770' height='1164'&gt;&lt;/svg&gt;" width="2770"&gt;&lt;/img&gt;      &lt;p&gt;上图给出了一份实验数据，来自于论文“On the Advance of Making Language Models Better Reasoners”，其中GPT3 davinci就是标准的GPT 3模型，基于纯文本训练；code-davinci-002（OpenAI内部称为Codex）是同时在Code和NLP数据上训练的模型。如果比较两者效果，可以看出，不论采用具体哪种推理方法，仅仅是从纯文本预训练模型切换到文本和Code混合预训练模型，在几乎所有测试数据集合上，模型推理能力都得到了巨大的效果提升，比如我们以“Self Consistency”方法为例，在大多数据集合上的性能提升，都直接超过了20到50个百分点，这是很恐怖的性能提升，而其实在具体推理模型层面，我们什么也没做，仅仅是预训练的时候除了文本，额外加入了程序代码而已。&lt;/p&gt;      &lt;p&gt;除了这个现象，从上图数据中，我们还可以得出其它一些结论，比如GPT 3这种纯文本预训练模型，其实是具备相当程度的推理能力的，除了在GSM8K这种数学推理上效果比较差外，其它推理数据数据集合表现也还可以，前提你需要采用合适的方法，来激发出它本身就具备的这种能力；再比如，text-davinci-002，也就是在code-davinci-002基础上加入instruct fine-tuning后的模型（就是加入InstructGPT或ChatGPT模型的第一步），其推理能力要弱于Codex，但是有其它研究表明它在自然语言处理任务又要强于Codex。而这貌似说明了，加入instruct fine-tuning，会损害LLM模型的推理能力，但是会在一定程度上提升自然语言理解能力。而这些结论其实都是很有意思的，也能启发后续进一步的思考和探索。&lt;/p&gt;      &lt;p&gt;那么，一个自然的疑问是：为何预训练模型可以从代码的预训练中获得额外的推理能力？确切原因目前未知，值得深入探索。我猜测可能是因为原始版本的Codex（只使用代码训练，可参考文献：Evaluating Large Language Models Trained on Code）的代码训练是从文本生成代码，而且代码中往往包含很多文本注释，本质上这类似于预训练模型做了&amp;lt;文本,Code&amp;gt;两种数据的多模态对齐工作。而数据中必然包含相当比例的数学或逻辑问题的代码、描述和注释，很明显这些数学类或逻辑推理类的数据，对于解决下游数学推理问题是有帮助的，我猜大概率原因在此。&lt;/p&gt;      &lt;h3&gt;关于LLM推理能力的思考&lt;/h3&gt;      &lt;p&gt;上面介绍了LLM推理的主流技术思路和现有的一些结论，接下来谈谈我对LLM模型推理技术的思考，以下内容纯个人推断，没有太多证据，还请谨慎参考。我的判断是：虽然最近一年来，关于激发LLM的推理能力，这方面的技术进展很快，也取得了很大的技术进步，但是总体感觉是，我们可能走在正确的方向上，但是距离接触到真正的问题本质还有一段距离，对此要有更深入的思考和探索。&lt;/p&gt;      &lt;p&gt;首先，我比较赞同上述分治算法的主体思路，对于复杂的推理问题，我们应该把它拆解成若干简单的子问题，因为子问题对于LLM来说回答正确的概率就大很多，让LLM一一回答子问题后，再逐步推导出最终答案。受到“Least-to-most prompting”技术的启发，如果进一步思考，我觉得LLM推理本质上很可能会是如下两种可能的其中之一：不断和LLM进行交互的图上推理问题，抑或是不断和LLM进行交互的程序流程图执行问题。&lt;/p&gt;      &lt;img src="data:image/svg+xml;utf8,&lt;svg xmlns='http://www.w3.org/2000/svg' width='2654' height='1050'&gt;&lt;/svg&gt;" width="2654"&gt;&lt;/img&gt;      &lt;p&gt;先说图上推理问题，如上图所示，假设我们有办法能够把复杂问题拆解成由子问题或者子步骤构成的图结构，图中的节点是子问题或者子步骤，图中的边代表了子问题之间的依赖关系，就是说只有回答好子问题A，才能回答子问题B，而且图中大概率存在循环结构，就是反复做某几个子步骤。假设我们能够得到上述的子问题拆解图，那么可以根据依赖关系，引导LLM一步一步按照图结构，回答必须首先回答的子问题，直到推导出最终答案。&lt;/p&gt;      &lt;img src="data:image/svg+xml;utf8,&lt;svg xmlns='http://www.w3.org/2000/svg' width='2662' height='1112'&gt;&lt;/svg&gt;" width="2662"&gt;&lt;/img&gt;      &lt;p&gt;再说程序流程图问题，参考上图，假设我们有办法把复杂问题拆解成子问题或子步骤，并产生一个由子步骤构成的类似程序流程图的结构，在这个结构里，有些步骤会反复执行多次（循环结构），有些步骤的执行需要进行条件判断（条件分支）。总而言之，在执行每个子步骤的时候和LLM进行交互，得到子步骤的答案，然后按照流程不断执行，直到输出最终答案。类似这种模式。假设这个思路大致正确的话，也许可以从这个角度来解释为何加入代码会增强预训练模型的推理能力：大概率因为&amp;lt;文本，代码&amp;gt;的多模态预训练模型，在模型内部是通过类似这种隐含的程序流程图作为两个模态的桥梁，将两者联系起来的，即由文本描述到隐含的流程图，再映射到由流程图产生具体的代码。也就是说，这种多模态预训练，可以增强LLM模型从文本构建出隐含的流程图并按照流程图执行的能力，也就是加强了它的推理能力。&lt;/p&gt;      &lt;p&gt;当然，上述思路最大的问题是，我们如何根据文本描述的问题，能够靠LLM模型，或者其它模型，得到图结构或者流程图结构？这个可能是其中的难点。一种可能的思路就类似继续增强文本和更高质量的代码预训练，走隐式学习内部隐含结构的方法。而目前的CoT技术，如果套到上述思路来思考的话，可以这么理解：标准CoT，其实就是靠自然语言文本来描述图结构或者程序流程图的；而“Least-to-most prompting”技术，则是试图根据最后一个图节点，靠倒推来试图推导出其中的图结构，但是很明显，目前的方法限制了它倒推的深度，也就是说它只能推导出非常简单的图结构，这正是限制它能力的所在。&lt;/p&gt;      &lt;h2&gt;未来之路：LLM研究趋势及值得研究的重点方向&lt;/h2&gt;      &lt;hr&gt;&lt;/hr&gt;      &lt;p&gt;这里列出一些我个人认为比较重要的LLM研究领域，或值得深入探索的研究方向。&lt;/p&gt;      &lt;p&gt;        &lt;strong&gt;探索LLM模型的规模天花板&lt;/strong&gt;&lt;/p&gt;      &lt;p&gt;尽管继续推大LLM模型的规模，这事看似没有技术含量，但是其实这个事情异常重要。我个人判断，自从Bert出现以来，到GPT 3，再到ChatGPT，大概率这些给人印象深刻的关键技术突破，核心贡献都来自于LLM模型规模的增长，而非某项具体技术。说不定，揭开AGI真正的钥匙就是：超大规模及足够多样性的数据、超大规模的模型，以及充分的训练过程。再者，做超大规模的LLM模型，对技术团队的工程实现能力要求是非常高的，也不能认为这事情缺乏技术含量。&lt;/p&gt;      &lt;p&gt;那么继续推大LLM模型规模，有什么研究意义呢？我觉得有两方面的价值。首先，如上所述，我们已知，对于知识密集型的任务，随着模型规模越大，各种任务的效果会越来越好；而对很多推理类型的有难度的任务，加上CoT Prompting后，其效果也呈现出遵循Scaling law的趋向。那么，很自然的一个问题就是：对于这些任务，LLM的规模效应，能将这些任务解决到何种程度？这是包括我在内，很多人关心的问题。其次，考虑到LLM具备的神奇的“涌现能力”，如果我们继续增加模型规模，它会解锁哪些让我们意想不到的新能力呢？这也是很有意思的问题。考虑到以上两点，我们仍然需要不断增大模型规模，看看模型规模对解决各类任务的天花板在哪里。&lt;/p&gt;      &lt;p&gt;当然，这种事情也就只能说说，对99.99%的从业者来说，是没有机会和能力做这个事情的。要做这个事情，对研究机构的财力及投入意愿、工程能力、技术热情，都有极高的要求，缺一不可。能做这事情的机构，粗估下来，国外不超过5家，国内不超过3家。当然，考虑到成本问题，未来也许会出现“股份制大模型”，就是有能力的几家机构合作，群策群力，一起来共建超级大模型的现象。&lt;/p&gt;      &lt;p&gt;        &lt;strong&gt;增强LLM的复杂推理能力&lt;/strong&gt;&lt;/p&gt;      &lt;p&gt;正如之前对LLM推理能力的叙述，尽管LLM在最近一年推理能力得到了很大的提升，但是很多研究（参考：Limitations of Language Models in Arithmetic and Symbolic Induction／Large Language Models Still Can’t Plan）表明，目前LLM能够解决得比较好的推理问题，往往都相对简单，LLM的复杂推理能力仍然薄弱，比如即使是简单的字符拷贝推理或者加减乘除运算，当字符串或者数字非常长的时候，LLM推理能力会极速下降，再比如行为规划能力等复杂推理能力很弱。总而言之，加强LLM的复杂推理能力，应该是LLM未来研究中最重要的环节之一。&lt;/p&gt;      &lt;p&gt;前文有述，加入代码加入预训练，这是一种直接增强LLM推理能力的方向。这个方向目前研究尚显不足，更像是实践经验的总结，探索背后的原理，并进而引入更多类型除代码外的新型数据来增强LLM的推理能力，这可能是更本质提升推理能力的方向。&lt;/p&gt;      &lt;p&gt;        &lt;strong&gt;LLM纳入NLP之外更多其它研究领域&lt;/strong&gt;&lt;/p&gt;      &lt;p&gt;目前的ChatGPT擅长NLP和Code任务，作为通向AGI的重要种子选手，将图像、视频、音频等图像与多模态集成进入LLM，乃至AI for Science、机器人控制等更多、差异化更明显的其它领域逐步纳入LLM，是LLM通往AGI的必经之路。而这个方向才刚刚开始，因此具备很高的研究价值。&lt;/p&gt;      &lt;p&gt;        &lt;strong&gt;更易用的人和LLM的交互接口&lt;/strong&gt;&lt;/p&gt;      &lt;p&gt;如前所述，ChatGPT的最大技术贡献即在此。但是很明显，目前的技术并不完美，肯定还有很多命令LLM理解不了。所以，沿着这个方向，寻找更好的技术，来让人类使用自己习惯的命令表达方式，而LLM又能听懂，这是个新的，且非常有前景的技术方向。&lt;/p&gt;      &lt;p&gt;        &lt;strong&gt;建设高难度的综合任务评测数据集&lt;/strong&gt;&lt;/p&gt;      &lt;p&gt;好的评测数据集，是引导技术不断进步的基石。随着LLM模型逐步增大，任务效果快速提升，导致很多标准测试集快速过时。也就是说，这些数据集合相对现有技术来说，太容易了，在没有难度的测试集合下，我们不知道目前技术的缺陷和盲点在哪里。所以构建高难度的测试集合，是促进LLM技术进步的关键所在。&lt;/p&gt;      &lt;p&gt;目前行业应出现了一些新的测试集，有代表性的包括BIGBench、OPT-IML等。这些测试集合体现出一些特性，比如相对LLM现有技术具备一定的难度、综合了各种各样多种类型的任务等。&lt;/p&gt;      &lt;p&gt;受到ChatGPT的启发，我觉得除此外应纳入另一考虑因素：体现真实用户需求。就是说，这些任务的表述由用户真实发起，这种方式构建出来的LLM模型，才能解决用户实际需求。&lt;/p&gt;      &lt;p&gt;除此外，相信LLM会快速将能力溢出到NLP之外的领域，而如何融入更多其它领域的评测数据，也是需要提前去考虑。&lt;/p&gt;      &lt;p&gt;        &lt;strong&gt;高质量数据工程&lt;/strong&gt;&lt;/p&gt;      &lt;p&gt;对于预训练模型来说，数据是其根本，预训练过程可以理解为从数据中吸取其中所包含知识的过程。因此，我们需要进一步加强对高质量数据的挖掘、收集及清洗等工作。&lt;/p&gt;      &lt;p&gt;关于数据，需要考虑两个方面：数据的质量和数量。而根据T5的对比实验，我们可以得出结论：在数量和质量两个因素里，质量优先，正确的道路应该是在保证数据质量的前提下，再去增大数据规模。&lt;/p&gt;      &lt;p&gt;数据质量，包括数据的信息含量以及数据的多样性等多个衡量标准，比如Wiki明显就属于世界知识密度极高的高质量数据，这是从信息含量来说的；而增加数据类型的多样性，无疑是激发LLM各种新能力的根本，比如加入问答网站的数据，对于LLM的QA能力提升是有直接帮助的。多样化的数据赋予了LLM更好解决更多不同类型任务的能力，所以，这可能是数据质量里最关键的标准。&lt;/p&gt;      &lt;p&gt;关于数据数量，原则上互联网上公开发布的数据都可以纳入LLM模型的预训练过程。那么，它的极限在哪里？“Will we run out of data? An analysis of the limits of scaling datasets in Machine Learning” 对此进行了估算，结论是到2026年左右，高质量的NLP数据将会用光，低质量NLP数据会在2030到2050年用光，而低质量图像数据会在2030到2060年用光。而这意味着：要么到时我们有新类型的数据源，要么我们必须增加LLM模型对数据的利用效率。否则，目前这种数据驱动的模型优化方式将会停止进步，或者收益减少。&lt;/p&gt;      &lt;p&gt;        &lt;strong&gt;超大LLM模型Transformer的稀疏化&lt;/strong&gt;&lt;/p&gt;      &lt;p&gt;目前规模最大的LLM中，有相当比例的模型采取了稀疏（Sparse）结构，比如GPT 3、PaLM、GLaM等，GPT 4大概率也会走稀疏模型路线。之所以采用Sparse 化的模型，主要好处是它可以极大减少LLM的训练时间和在线推理时间。Switch Transformer论文里指出：在相同算力预算的前提下，使用稀疏化Transformer，相对Dense Transformer，LLM模型的训练速度可以提升4倍到7倍。为何Sparse模型可以加快训练和推理时间呢？这是因为尽管模型参数巨大，但是对于某个训练实例，Sparse模型通过路由机制，只使用整个参数中的一小部分，参与训练和推理的活跃参数量比较少，所以速度快。&lt;/p&gt;      &lt;p&gt;我认为未来超大的LLM模型大概率会收敛到稀疏模型。主要有两个原因：一方面，现有研究表明（参考：Large Models are Parsimonious Learners: Activation Sparsity in Trained Transformers），标准的Dense Transformer在训练和推理时，它本身也是稀疏激活的，就是说只有部分参数会被激活，大部分参数没有参与训练和推理过程。既然这样，我们不如直接迁移到稀疏模型；另外，毫无疑问LLM模型的规模会继续推大，而高昂的训练成本是妨碍其进一步扩大模型的重要阻力，使用稀疏模型可以极大降低超大模型的训练成本，所以随着模型规模越大，稀疏模型带来的收益越明显。考虑到这两个方面，大概率未来更大的LLM模型会采用稀疏模型方案。&lt;/p&gt;      &lt;p&gt;那为何目前其它大规模模型不走稀疏模型的路线呢？因为Sparse模型存在训练不稳定、容易过拟合等问题，不太容易训练好。所以，如何修正稀疏模型面临的问题，设计出更容易训练的稀疏模型，是很重要的未来研究方向。&lt;/p&gt;      &lt;h2&gt;取经之路：复刻ChatGPT时要注意些什么&lt;/h2&gt;      &lt;hr&gt;&lt;/hr&gt;      &lt;p&gt;如果希望能复刻类似ChatGPT这种效果令人惊艳的LLM模型，综合目前的各种研究结论，在做技术选型时需要重点权衡如下问题：&lt;/p&gt;      &lt;p&gt;首先，在预训练模式上，我们有三种选择：GPT这种自回归语言模型，Bert这种双向语言模型，以及T5这种混合模式(Encoder-Decoder架构，在Encoder采取双向语言模型，Decoder采取自回归语言模型，所以是一种混合结构，但其本质仍属于Bert模式)。我们应选择GPT这种自回归语言模型，其原因在本文范式转换部分有做分析。目前看，国内LLM在做这方面技术选型的时候，貌似很多都走了Bert双向语言模型或T5混合语言模型的技术路线，很可能方向走偏了。&lt;/p&gt;      &lt;p&gt;第二，强大的推理能力是让用户认可LLM的重要心理基础，而如果希望LLM能够具备强大的推理能力，根据目前经验，最好在做预训练的时候，要引入大量代码和文本一起进行LLM训练。至于其中的道理，在本文前面相关部分有对应分析。&lt;/p&gt;      &lt;p&gt;第三，如果希望模型参数规模不要那么巨大，但又希望效果仍然足够好，此时有两个技术选项可做配置：要么增强高质量数据收集、挖掘、清理等方面的工作，意思是我模型参数可以是ChatGPT/GPT 4的一半，但是要想达到类似的效果，那么高质量训练数据的数量就需要是ChatGPT/GPT 4模型的一倍（Chinchilla的路子）；另外一个可以有效减小模型规模的路线是采取文本检索（Retrieval based）模型+LLM的路线，这样也可以在效果相当的前提下，极大减少LLM模型的参数规模。这两个技术选型不互斥，反而是互补的，也即是说，可以同时采取这两个技术，在模型规模相对比较小的前提下，达到超级大模型类似的效果。&lt;/p&gt;      &lt;p&gt;第四，超级大模型因为模型规模大，所以训练成本过高，导致很少有机构有能力去做这件事。而且由上文分析可见，继续不断推大LLM模型规模是肯定会发生、也应该去做的事情。于是，如何通过技术手段降低LLM的训练成本就很重要。LLM的特征抽取器Sparse化是有效降低模型训练及推理成本的技术选择。由此可见，随着模型越来越大，LLM模型Sparse化是一个应该考虑的选项。&lt;/p&gt;      &lt;p&gt;第五，ChatGPT是目前最接近理想LLM的技术方案，而理想中的LLM应该是以一个几乎无所不能的基础通用大模型作为依托，来支持各种各样的上层任务类型。目前看，支持越来越多的任务类型，主要是通过增加LLM预训练数据的多样性来达成的，数据多样性越好，LLM能够支持的任务类型就越丰富。所以，应该重视通过增加数据多样性来增加LLM新能力的思路。&lt;/p&gt;      &lt;p&gt;第六，易用的人机操作接口。人类用他们自己习惯的表达方式来描述任务，而LLM要能够理解这些Instruct的真实含义。另外，也要注意这些Instruct是符合人类真实需求的，就是说，要从最终用户那里收集任务表述方式，而不能靠研发人员自己的臆想或猜测。ChatGPT给我最大的启发其实是这一点，至于是否用增强学习我倒觉得不重要，其它替代技术应该也能做类似的事情。&lt;/p&gt;      &lt;h2&gt;ChatGPT:为什么是OpenAI&lt;/h2&gt;      &lt;hr&gt;&lt;/hr&gt;      &lt;p&gt;为什么是OpenAI作出了ChatGPT，而不是其它机构呢？我们在这里可以做个简单分析。&lt;/p&gt;      &lt;p&gt;在本文开头，我们提到了OpenAI看待LLM的理念。OpenAI是怎么看待LLM的呢？回顾它不断推出的技术，可以看出，它其实从GPT 1.0开始，基本就坚定地把LLM看做是通往AGI的一条必由之路。具体而言，在OpenAI眼中，未来的AGI应该长这个样子：有一个任务无关的超大型LLM，用来从海量数据中学习各种知识，这个LLM以生成一切的方式，来解决各种各样的实际问题，而且它应该能听懂人类的命令，以便于人类使用。其实对LLM发展理念的理解，在前半部分，就是“构建一个任务无关的超大型LLM，让它从海量数据中学习各种知识”，这一点几乎是大家的共识，能体现出OpenAI眼光的其实是后半部分。&lt;/p&gt;      &lt;p&gt;OpenAI的理念比较超前，对自我定位从一开始就定得比较高，始终坚定不移地探索上述方式是否可以实现AGI。OpenAI之所以能作出ChatGPT，胜在一个是定位比较高，另一个是不受外界干扰，态度上坚定不移。&lt;/p&gt;      &lt;p&gt;我们可以回顾下它走的一些关键路程：GPT 1.0走的是生成模式的自回归语言模型路线，比Bert出来的还早些。Bert证明了：双向语言模型对于很多NLP理解类任务，效果比自回归这种单向语言模型效果更好。尽管如此，GPT 2.0并没有因此切换到双向语言模型这条路上，仍然走文本生成的路，而且开始尝试零示例（zero shot）prompt和少量示例（few shot）prompt。其实这时候， OpenAI心目中的AGI已经开始浮出水面，逐渐显示出轮廓了。只是因为zero shot/few shot效果比Bert+fine-tuning差的比较远，所以大家都没太当回事，甚至不理解它为什么要始终坚持走单向语言模型的路线。这个时候，我估计即使是OpenAI自己，也不一定能确保这条路肯定能走通。&lt;/p&gt;      &lt;p&gt;但是，这不妨碍它继续在这条路上往后走。GPT 3.0已经展示出了比较强大的zero shot/few shot prompt能力，这时候OpenAI心目中的AGI已经完全漏出水面，轮廓清晰，而且它的效果也证明了这条路，是有较大可能走得通的。GPT 3.0是一个决定LLM发展方向的叉路口和分水岭，与之对应的另外一条路是“Bert+fine-tuning”模式。在这个岔路口，不同的从业者选择走上了不同的道路，后面的技术差距也是从这里开始拉开的。很遗憾地是，国内很多从业者选择继续在“Bert+fine-tuning”这条路上往后走，这也是造成今天落后局面的一个关键时间节点。再往后，就是InstructGPT和ChatGPT了，OpenAI通过ChatGPT证明了一点；虽然我们距离真正的AGI，可能还有很长的路要走，但是通过超大LLM走向AGI这条路，目前看是可行的。&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;
    &lt;div&gt; &lt;a href="https://itindex.net/"  title="IT 资讯"&gt;&lt;img src="https://itindex.net/images/iconWarning.gif" title="IT 资讯" border="0"/&gt; &lt;/a&gt;</description>
      <category />
      <guid isPermaLink="true">https://itindex.net/detail/62585-agi-%E8%AF%AD%E8%A8%80%E6%A8%A1%E5%9E%8B-llm</guid>
      <pubDate>Thu, 12 Jan 2023 16:03:22 CST</pubDate>
    </item>
    <item>
      <title>最强语言 AI 诞生 - ChatGPT</title>
      <link>https://itindex.net/detail/62523-%E8%AF%AD%E8%A8%80-ai-chatgpt</link>
      <description>&lt;p&gt;
      &lt;img alt="" src="http://www.zhidaow.com/SEO /_image/ChatGPT.jpg?w=400" title=""&gt;&lt;/img&gt;  &lt;br /&gt;
    没错，最强语言 AI 已经诞生，那就是 ChatGPT。  &lt;br /&gt;
    ChatGPT 是 OpenAI 实验室最近推出的语言 AI，上周三推出，今天已经有 100万用户量，甚至马斯克都已经注意到了。  &lt;br /&gt;
      &lt;img alt="" src="http://www.zhidaow.com/SEO /_image/musk chatgpt.png?w=500" title=""&gt;&lt;/img&gt;  &lt;br /&gt;
    这两天也是各个圈子在一直分享和「玩」，有技术圈、web3 圈。  &lt;br /&gt;
    我也注册试玩了下，从 SEO 角度，内容质量和流畅度确实远超其他 AI 几条街。  &lt;br /&gt;
    我就直接抛几张图，你看下就知道了。  &lt;br /&gt;
      &lt;img alt="" src="http://www.zhidaow.com/SEO /_image/WX20221205-141607@2x.png" title=""&gt;&lt;/img&gt;
&lt;/p&gt;


 &lt;p&gt;
    不光是中文，还有英文、西班牙语等多种语言。  &lt;br /&gt;
      &lt;img alt="" src="http://www.zhidaow.com/SEO /_image/WX20221205-201813@2x.png" title=""&gt;&lt;/img&gt;
&lt;/p&gt;


 &lt;p&gt;
      &lt;img alt="" src="http://www.zhidaow.com/SEO /_image/WX20221205-201924@2x.png" title=""&gt;&lt;/img&gt;
&lt;/p&gt;


 &lt;p&gt;
    跟我之前看过的 Anyword 的 AI 能力对比，内容是真的有「干货」，而且语言流畅，还有列表展示，非常有条理。
&lt;/p&gt;


 &lt;p&gt;
    当然也有很多其他玩法，比如有的人用来写客户邮件、写 PRD、解答人生问题等
&lt;/p&gt;


 &lt;p&gt;
      &lt;img alt="" src="http://www.zhidaow.com/SEO /_image/5CB99C6B-BB6D-47E0-B157-87853BA4AC7F.png" title=""&gt;&lt;/img&gt;
&lt;/p&gt;


 &lt;p&gt;
      &lt;img alt="" src="http://www.zhidaow.com/SEO /_image/FjEbk7HUoAAfz9Z.jpeg?w=500" title=""&gt;&lt;/img&gt;
&lt;/p&gt;


 &lt;p&gt;
    总之，感觉是个革命性的 AI 算法，不光会影响 SEO，还会影响多个领域。  &lt;br /&gt;
    欢迎读者试玩（注册麻烦点）。
&lt;/p&gt;&lt;div&gt; &lt;a href="https://itindex.net/"  title="IT 资讯"&gt;&lt;img src="https://itindex.net/images/iconWarning.gif" title="IT 资讯" border="0"/&gt; &lt;/a&gt;</description>
      <category />
      <guid isPermaLink="true">https://itindex.net/detail/62523-%E8%AF%AD%E8%A8%80-ai-chatgpt</guid>
      <pubDate>Mon, 05 Dec 2022 20:15:00 CST</pubDate>
    </item>
    <item>
      <title>编程语言是如何实现并发的之操作系统篇 · 构建我的被动收入</title>
      <link>https://itindex.net/detail/62403-%E7%BC%96%E7%A8%8B%E8%AF%AD%E8%A8%80-%E5%B9%B6%E5%8F%91-%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F</link>
      <description>&lt;div&gt;    &lt;ul&gt;      &lt;li&gt;        &lt;a href="https://www.bmpi.dev/dev/deep-in-program-language/how-to-implement-concurrency/os-scheduling/#%E4%BB%8E%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F%E8%BF%90%E8%A1%8C%E7%A8%8B%E5%BA%8F%E8%AF%B4%E8%B5%B7"&gt;从操作系统运行程序说起&lt;/a&gt;&lt;/li&gt;      &lt;li&gt;        &lt;a href="https://www.bmpi.dev/dev/deep-in-program-language/how-to-implement-concurrency/os-scheduling/#%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F%E7%9A%84%E6%94%AF%E6%8C%81"&gt;操作系统的支持&lt;/a&gt;        &lt;ul&gt;          &lt;li&gt;            &lt;a href="https://www.bmpi.dev/dev/deep-in-program-language/how-to-implement-concurrency/os-scheduling/#%E8%B0%83%E5%BA%A6scheduling"&gt;调度(Scheduling)&lt;/a&gt;&lt;/li&gt;          &lt;li&gt;            &lt;a href="https://www.bmpi.dev/dev/deep-in-program-language/how-to-implement-concurrency/os-scheduling/#%E7%BA%BF%E7%A8%8Bthread"&gt;线程(Thread)&lt;/a&gt;&lt;/li&gt;          &lt;li&gt;            &lt;a href="https://www.bmpi.dev/dev/deep-in-program-language/how-to-implement-concurrency/os-scheduling/#%E7%94%A8%E6%88%B7%E7%BA%BF%E7%A8%8Buser-level-thread"&gt;用户线程(User-level Thread)&lt;/a&gt;&lt;/li&gt;          &lt;li&gt;            &lt;a href="https://www.bmpi.dev/dev/deep-in-program-language/how-to-implement-concurrency/os-scheduling/#%E7%BA%BF%E7%A8%8B%E6%A8%A1%E5%9E%8Bthread-model"&gt;线程模型(Thread Model)&lt;/a&gt;&lt;/li&gt;          &lt;li&gt;            &lt;a href="https://www.bmpi.dev/dev/deep-in-program-language/how-to-implement-concurrency/os-scheduling/#%E4%B8%8A%E4%B8%8B%E6%96%87%E5%88%87%E6%8D%A2context-switching"&gt;上下文切换(Context switching)&lt;/a&gt;&lt;/li&gt;          &lt;li&gt;            &lt;a href="https://www.bmpi.dev/dev/deep-in-program-language/how-to-implement-concurrency/os-scheduling/#io%E6%A8%A1%E5%9E%8Bio-model"&gt;I/O模型(I/O Model)&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;      &lt;li&gt;        &lt;a href="https://www.bmpi.dev/dev/deep-in-program-language/how-to-implement-concurrency/os-scheduling/#%E5%B9%B6%E5%8F%91%E8%BF%98%E6%98%AF%E5%B9%B6%E8%A1%8C"&gt;并发还是并行&lt;/a&gt;&lt;/li&gt;      &lt;li&gt;        &lt;a href="https://www.bmpi.dev/dev/deep-in-program-language/how-to-implement-concurrency/os-scheduling/#%E6%80%BB%E7%BB%93"&gt;总结&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;    &lt;h2&gt;从操作系统运行程序说起&lt;/h2&gt;    &lt;p&gt;      &lt;img alt=""&gt;&lt;/img&gt;&lt;/p&gt;    &lt;p&gt;这是一台拥有2个虚拟CPU核心的      &lt;u&gt;Linux&lt;/u&gt;服务器的      &lt;u&gt;系统监控界面&lt;/u&gt;。其中红框①中      &lt;code&gt;PPID&lt;/code&gt;代表父进程ID，      &lt;code&gt;PID&lt;/code&gt;代表进程或线程ID。红框②中      &lt;code&gt;CPU&lt;/code&gt;代表当前线程运行的CPU核心编号。红框③中是程序的运行命令，其中绿色代表的是      &lt;u&gt;线程，白色为进程&lt;/u&gt;。&lt;/p&gt;    &lt;p&gt;以PID为1375的进程为例，它的父进程为1086，可以通过PPID不断追溯至PID为1的      &lt;u&gt;        &lt;code&gt;init&lt;/code&gt;&lt;/u&gt;进程。从这可以看出Linux通过      &lt;u&gt;        &lt;code&gt;fork()&lt;/code&gt;&lt;/u&gt;的系统调用不断的复制出大量的需要被执行的程序进程。&lt;/p&gt;    &lt;p&gt;进程是操作系统进行      &lt;u&gt;资源分配&lt;/u&gt;的一个独立单位，而实际在CPU运行调度的是线程。以进程1375为例，它又创建了7个线程，如下：&lt;/p&gt;    &lt;pre&gt;      &lt;code&gt;$ ls /proc/1375/task/
1375  1429  1430  1431  1432  1433  1488
$ ls /proc/1375/task/1429
arch_status  cgroup      cmdline             cpuset   exe     gid_map  loginuid  mountinfo  ns         oom_score      patch_state  root       sessionid  smaps_rollup  statm    uid_map
attr         children    comm                cwd      fd      io       maps      mounts     numa_maps  oom_score_adj  personality  sched      setgroups  stack         status   wchan
auxv         clear_refs  cpu_resctrl_groups  environ  fdinfo  limits   mem       net        oom_adj    pagemap        projid_map   schedstat  smaps      stat          syscall&lt;/code&gt;&lt;/pre&gt;    &lt;p&gt;其中线程1430与1432是调度运行在2号CPU核心上的，如果持续观察这个监控界面，会发现同一个线程会不定时在两个CPU核心之间来回切换，这实际正是操作系统对这些线程在多核CPU上进行抢占式调度。&lt;/p&gt;    &lt;p&gt;操作系统之所以能用有限的CPU核心去运行非常多的程序，并且用户感觉这些程序是在同时运行。一方面操作系统（内核）可以通过一些方法实现并发处理任务（程序），另外一方面得益于多个CPU核心，操作系统还可以并行处理任务。&lt;/p&gt;    &lt;p&gt;本文并不是研究操作系统是怎么实现并发的，但在搞清楚编程语言是怎么实现并发处理之前，很有必要提前对操作系统支持并发提供的一些重要特性做一个全面的介绍。操作系统为了支持多任务处理，提供了进程管理与调度，同时在I/O上提供了多种访问文件或网络的系统调用方式。&lt;/p&gt;    &lt;h2&gt;操作系统的支持&lt;/h2&gt;    &lt;pre&gt;      &lt;code&gt;# 操作系统
## 进程(Process)
### 调度方式
- 抢占式(Preemptive)
- 协作式(Cooperative)
### 执行方式
- 用户线程(User-level Thread)
  - Coroutine
    - Verticle
  - Goroutine
  - Erlang process
  - Green Thread(Java)
- 内核线程(Kernel-level Thread)
- 纤程(Fiber)
## I/O
- 同步(Synchronous)
  - 阻塞式(Blocking)
  - 非阻塞式(Non-blocking)
  - 多路复用(Multiplexing)
  - 信号驱动(Signal Driven)
- 异步(Asynchronous)&lt;/code&gt;&lt;/pre&gt;    &lt;h3&gt;调度(Scheduling)&lt;/h3&gt;    &lt;p&gt;进程调度主要有抢占式调度和协作式调度两种：抢占式(Preemptive)与协作式(Cooperative)。&lt;/p&gt;    &lt;a href="https://www.slanglabs.in/blog/python-microservices-01-tornado-asyncio-lint-test-coverage-project-setup"&gt;      &lt;img alt="&amp;#25250;&amp;#21344;&amp;#24335;&amp;#19982;&amp;#21327;&amp;#20316;&amp;#24335;&amp;#20219;&amp;#21153;&amp;#35843;&amp;#24230;(Preemptive Multitasking vs. Cooperative Multitasking)"&gt;&lt;/img&gt;&lt;/a&gt;    &lt;p&gt;抢占式与协作式任务调度(Preemptive Multitasking vs. Cooperative Multitasking)&lt;/p&gt;    &lt;p&gt;抢占式调度往往在一些重要位置（Sleep Call，Timer Tick）放置了中断信号，通过这个信号通知操作系统调度器(Scheduler)进行进程切换。在抢占式模型中，正在运行的进程可能会被强行挂起，这是由于这些中断信号引发的。&lt;/p&gt;    &lt;p&gt;协作式调度也叫非抢占式调度，是指当前运行的进程通过自身代码逻辑出让CPU控制权。与抢占式调度的区别在于进程运行不会被中断信号打断，除非其主动出让控制权给其他进程。&lt;/p&gt;    &lt;blockquote&gt;      &lt;p&gt;以上描述并没有明确区分进程还是线程，实际在        &lt;u&gt;Linux系统的内核态上&lt;/u&gt;，用户态的线程统一按        &lt;u&gt;轻量级进程(Light-weight process)&lt;/u&gt;来处理，它们与真正的进程的区别是在一个用户态进程中的线程共享了相同的地址空间和其他资源（如打开的文件描述符），但在内核调度上并没有什么区别。&lt;/p&gt;&lt;/blockquote&gt;    &lt;p&gt;线程是进程的运行实例，哪怕在非多线程的进程中，在内核态实际运行进程的还是内核线程，所以接下来介绍下线程的分类。&lt;/p&gt;    &lt;h3&gt;线程(Thread)&lt;/h3&gt;    &lt;p&gt;我们在编程语言中见到的线程，一般指的是与内核线程一一映射的用户态线程，比如Java中的Thread其实就是内核线程。但一些编程语言如Erlang与Go都实现了更轻量级的用户线程。&lt;/p&gt;    &lt;ul&gt;      &lt;li&gt;用户线程(User-level Thread)        &lt;ul&gt;          &lt;li&gt;协程(Coroutines - Cooperative User-Level Threads)：应用程序通过线程库自行实现的            &lt;strong&gt;协作式调度&lt;/strong&gt;的用户线程，代表性的有Go语言的Goroutine（1.14之前的版本），Vert.x框架中的Verticle。&lt;/li&gt;          &lt;li&gt;Go Goroutine：Go语言的Goroutine在1.14之前是协程的机制，之后的版本采用了            &lt;a href="https://go.dev/doc/go1.14"&gt;异步抢占式调度(asynchronously preemptible)&lt;/a&gt;。&lt;/li&gt;          &lt;li&gt;Erlang process：Erlang VM(BEAM)管理的用户线程，与协程相比的优势在于它可以做到            &lt;strong&gt;公平调度&lt;/strong&gt;，不会出现协程中某个用户线程占用过多CPU周期。&lt;/li&gt;          &lt;li&gt;绿色线程(Green Thread)：类似于协程，是由            &lt;u&gt;Java JDK实现&lt;/u&gt;的，但因为            &lt;u&gt;早期Linux系统没实现内核态的抢占式调度&lt;/u&gt;，Green Thread只能在Solaris系统上发挥它的威力，最终在JDK 1.3之后被Native Thread取代。所以现行的JDK的线程实际是非常重量级的内核态线程，Java的            &lt;a href="https://github.com/openjdk/loom"&gt;Project Loom&lt;/a&gt;会尝试实现新的Green Thread方案，并且是抢占式的调度方案。&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;      &lt;li&gt;内核线程(Kernel-level Thread)：操作系统内核管理的        &lt;strong&gt;抢占式调度&lt;/strong&gt;的线程，是最终运行在CPU上实际执行任务的最小单元。&lt;/li&gt;      &lt;li&gt;纤程(Fibers)：操作系统内核管理的        &lt;strong&gt;协作式调度&lt;/strong&gt;的线程。这一系统级别的方案最终因硬件和软件的发展        &lt;u&gt;逐渐式微&lt;/u&gt;，现在的用户线程也能达到协作式调度的效果。&lt;/li&gt;&lt;/ul&gt;    &lt;p&gt;用户线程与内核线程的区别在于用户线程的调度是发生在用户态，内核中无法感知到用户线程的存在，并且调度也发生在用户态，一般是由线程库或编程语言运行时自行实现的。而内核线程的调度是由内核完成的，一般是抢占式调度。&lt;/p&gt;    &lt;h3&gt;用户线程(User-level Thread)&lt;/h3&gt;    &lt;p&gt;用户线程大多是采用协作调度的方式实现，本质上是      &lt;strong&gt;同步执行在与CPU核心数量相同的内核线程上的&lt;/strong&gt;，不仅能极大的降低了上下文开销，还能最佳的利用多核CPU的计算能力。&lt;/p&gt;    &lt;p&gt;用户线程的轻量除了提现在调度的上下文切换开销上，还体现了在对内存的需求上。如果要在4核心4GB内存的笔记本电脑中测试同时生成100万个线程的话，不同编程语言对内存的需求：&lt;/p&gt;    &lt;ul&gt;      &lt;li&gt;Elixir: 0.48 GB (Process)&lt;/li&gt;      &lt;li&gt;Golang: 1.91 GB (Goroutine)&lt;/li&gt;      &lt;li&gt;Java: 977 GB (Thread)&lt;/li&gt;      &lt;li&gt;PHP: 6836 GB (Laravel Request)&lt;/li&gt;&lt;/ul&gt;    &lt;blockquote&gt;      &lt;p&gt;数据来源：Programming Elixir        &lt;sup&gt;Chapter 15&lt;/sup&gt;&lt;/p&gt;&lt;/blockquote&gt;    &lt;p&gt;但用户线程的执行最终是由内核线程来完成，所以存在一个从用户线程到内核线程的映射模型。&lt;/p&gt;    &lt;h3&gt;线程模型(Thread Model)&lt;/h3&gt;    &lt;p&gt;可能有人会疑惑，用户线程与内核线程是一一映射的吗？总的来说有以下三种线程模型：&lt;/p&gt;    &lt;a href="https://medium.com/swlh/different-threading-models-why-i-feel-goroutine-is-better-though-with-some-limitations-b73863ba4dae"&gt;      &lt;img alt="&amp;#19981;&amp;#21516;&amp;#30340;&amp;#32447;&amp;#31243;&amp;#27169;&amp;#22411;(Different Threading Models)"&gt;&lt;/img&gt;&lt;/a&gt;    &lt;p&gt;不同的线程模型(Different Threading Models)&lt;/p&gt;    &lt;ul&gt;      &lt;li&gt;1x1 (kernel-level threading)：用户线程与内核线程是一一映射的。这是最简单的模型。在这种语境下，用户线程中的线程就是我们常规意义上说的线程，当程序创建一个线程时，也会在内核中创建一个内核线程。目前大多数操作系统如Linux、Solaris、FreeBSD、macOS与iOS内核的线程模型就是这种。&lt;/li&gt;      &lt;li&gt;Nx1 (user-level threading)：多个用户线程与一个内核线程映射。在这种模型中，内核线程只有一个，在应用内部不存在内核线程切换的开销，程序的并发能力是很高的。但一旦某个用户线程被阻塞（发生网络或文件I/O系统调用），其他用户线程也会被阻塞。另外应用也无法从多核CPU上获得更好的并发性。所以实际的使用场景中，这种模型并不常见。&lt;/li&gt;      &lt;li&gt;MxN (hybrid threading)：多个用户线程与多个内核线程映射。这种模型最为复杂，但也是最强大的线程模型，不仅有着很好的并发能力，同时还能获得多核CPU的处理能力。早期的Solaris内核中也支持这种线程模型，但因为其会导致内核调度过于复杂，逐渐被放弃。但在Erlang VM和Go语言的运行时就又实现了这种线程模型。&lt;/li&gt;&lt;/ul&gt;    &lt;a href="https://docs.oracle.com/cd/E19620-01/805-3024/6j2sumi1a/index.html"&gt;      &lt;img alt="&amp;#26089;&amp;#26399;Solaris&amp;#20869;&amp;#26680;&amp;#30340;&amp;#32447;&amp;#31243;&amp;#21644;&amp;#36731;&amp;#37327;&amp;#32423;&amp;#36827;&amp;#31243;(Threads and Lightweight Processes)"&gt;&lt;/img&gt;&lt;/a&gt;    &lt;p&gt;早期Solaris内核的线程和轻量级进程(Threads and Lightweight Processes)&lt;/p&gt;    &lt;blockquote&gt;      &lt;p&gt;轻量级进程(Light-weight process)：Solaris内核中的概念，但也会在其他系统内核中看到类似的概念。指的是用户线程和内核线程之间的接口，也可被认为是一个调度用户线程执行的虚拟CPU。当用户线程发出系统调用时，运行该线程的LWP调用内核并保持绑定到该内核线程至少直到系统调用完成。当LWP在内核中为用户线程执行系统调用时，它会运行一个内核线程。因此，每个LWP都与一个内核线程相关联。只有在用户线程完全由轻量级进程构成时，才可以说轻量级进程就是线程。Go语言中Goroutine的G-P-M调度模型中，P承担了类似LWP的角色。&lt;/p&gt;&lt;/blockquote&gt;    &lt;p&gt;应用程序为什么会费劲的设计出用户线程？操作系统提供的内核线程不香吗？这是因为操作系统内核的线程切换是重量级的操作，它需要进行上下文切换，而这会很耗时。&lt;/p&gt;    &lt;h3&gt;上下文切换(Context switching)&lt;/h3&gt;    &lt;p&gt;在进程间切换需要消耗一定的CPU时钟周期进行相关的状态管理工作，包括寄存器和内存映射的保存与读取、更新各种内部的表等。比如在Linux内核中，上下文切换需要涉及寄存器、栈指针、程序计数器的切换。&lt;/p&gt;    &lt;p&gt;在这篇      &lt;a href="https://blog.tsunanet.net/2010/11/how-long-does-it-take-to-make-context.html"&gt;How long does it take to make a context switch?&lt;/a&gt;中可以看到一个结论是：&lt;/p&gt;    &lt;blockquote&gt;      &lt;p&gt;Context switching is expensive. My rule of thumb is that it’ll cost you about 30µs of CPU overhead…Applications that create too many threads that are constantly fighting for CPU time (such as Apache’s HTTPd or many Java applications) can waste considerable amounts of CPU cycles just to switch back and forth between different threads…I think the sweet spot for optimal CPU use is to have the same number of worker threads as there are hardware threads, and write code in an asynchronous / non-blocking fashion.&lt;/p&gt;&lt;/blockquote&gt;    &lt;p&gt;因为线程调度的上下文切换成本非常昂贵，所以最佳的做法是应用程序使用和CPU核心相同的线程数，这样每个线程都能充分利用CPU核心的时间片，避免了应用内部多个线程的上下文切换开销。&lt;/p&gt;    &lt;p&gt;用户线程的轻量级让应用程序能够极大的提高并发性，但也会有一些问题，比如某个用户线程中发起一个网络请求导致底层的内核线程被阻塞，因为多个用户线程在共用这个内核线程，最终导致大量的用户线程被阻塞。&lt;/p&gt;    &lt;p&gt;解决这个问题需要了解操作系统的I/O模型。&lt;/p&gt;    &lt;h3&gt;I/O模型(I/O Model)&lt;/h3&gt;    &lt;p&gt;当应用程序需要访问文件或者网络资源时，应用内的线程将会花费大量的时间来等待数据的到来。如下图所示：&lt;/p&gt;    &lt;p&gt;      &lt;img alt=""&gt;&lt;/img&gt;&lt;/p&gt;    &lt;p&gt;如果把CPU处理计算机指令的速度类比成高铁的速度，那线程一次文件或网络的访问将会和蜗牛一样慢，这相当于你在高铁上让蜗牛去帮你取快递，对CPU来说是巨大的浪费。现代操作系统已经提供了多种I/O模型来解决这个问题。常见的I/O模型有：&lt;/p&gt;    &lt;a href="https://www.4e00.com/blog/linux/2017/09/29/unix-network-programming-charpter-6-io-multiplexing.html"&gt;      &lt;img alt="&amp;#20116;&amp;#31181;I/O&amp;#27169;&amp;#22411;&amp;#23545;&amp;#27604;(Comparison of the five I/O models)"&gt;&lt;/img&gt;&lt;/a&gt;    &lt;p&gt;五种I/O模型对比(Comparison of the five I/O models)&lt;/p&gt;    &lt;ul&gt;      &lt;li&gt;同步(Synchronous)        &lt;ul&gt;          &lt;li&gt;阻塞式(Blocking)：同步阻塞式是最常见的I/O模型。线程在访问文件或网络资源时，会因发起了内核的系统调用被挂起，内核会检查文件描述符是否可读，当文件描述符中存在数据时，内核会将数据复制给线程并交回控制权，线程从挂起状态切换成可运行状态等到内核调度运行。&lt;/li&gt;          &lt;li&gt;非阻塞式(Non-blocking)：线程在访问文件或网络资源时，因文件描述符是非阻塞的，线程在检查数据是否可读的阶段是非阻塞的。此模型需要线程不停的通过轮询(polling)的方式检查文件描述符是否可读。但之所以属于同步I/O，是因为在最终读取数据(            &lt;code&gt;recvfrom&lt;/code&gt;)时需要从内核态中拷贝数据(            &lt;code&gt;recvfrom&lt;/code&gt;)到用户态中，这个阶段线程依旧被阻塞住无法处理其他指令。&lt;/li&gt;          &lt;li&gt;多路复用(Multiplexing)：和非阻塞式的区别在于，多路复用模型的线程可以同时访问多个文件描述符，这很适合构建高并发的Web服务器或中间件。但此模型会在检查文件描述符时会被阻塞(            &lt;u&gt;              &lt;code&gt;select&lt;/code&gt;&lt;/u&gt;)，并且在读取数据(            &lt;code&gt;recvfrom&lt;/code&gt;)时也会被阻塞。和多路复用模型相似的是使用多线程和阻塞I/O，但当线程产生很多时会消耗大量的内存资源以及线程调度产生的上下文切换开销，所以多路复用模型一般只使用单线程模型。&lt;/li&gt;          &lt;li&gt;信号驱动(Signal Driven)：和上面的模型区别在于，之前的模型都需要线程主动轮询，信号驱动模型需要监听内核的            &lt;code&gt;SIGIO&lt;/code&gt;事件，通过注册事件处理函数，之后线程可以继续执行其他任务。当数据可读时，线程处理函数会以阻塞的方式从内核态复制数据到用户态。&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;      &lt;li&gt;异步(Asynchronous)：此模型和同步模型最大的区别在于，不仅在获取文件操作符时不会被阻塞，数据从内核态复制到用户态也不会被阻塞，因为内核会去做这个复制数据的工作，线程只需要在回调函数中使用数据即可。&lt;/li&gt;&lt;/ul&gt;    &lt;p&gt;关于I/O模型的更多细节，请参考：&lt;/p&gt;    &lt;ul&gt;      &lt;li&gt;        &lt;a href="https://rickhw.github.io/2019/02/27/ComputerScience/IO-Models/"&gt;Study Notes - I/O Models&lt;/a&gt;&lt;/li&gt;      &lt;li&gt;        &lt;a href="https://www.masterraghu.com/subjects/np/introduction/unix_network_programming_v1.3/ch06lev1sec2.html"&gt;I/O Models&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;    &lt;blockquote&gt;      &lt;p&gt;思考一个问题：如果用户线程不可避免的需要被挂起进（如访问共享资源但没有获得锁）而导致内核线程被挂起，如何调度可以让此内核线程上的用户线程可以继续运行？&lt;/p&gt;&lt;/blockquote&gt;    &lt;h2&gt;并发还是并行&lt;/h2&gt;    &lt;p&gt;前面讨论了很多和I/O相关的概念，并不是所有的计算机任务都是和I/O相关(I/O bound)的，比如很多算法都需要CPU做大量的计算，这时候CPU核心根本不会因为等待外部资源而空转，如果在这种计算密集型(CPU bound)任务中使用多线程技术，那么就会产生大量的线程上下文切换开销，最终会导致处理任务的性能变慢。&lt;/p&gt;    &lt;p&gt;在这篇      &lt;a href="https://www.ardanlabs.com/blog/2018/12/scheduling-in-go-part3.html"&gt;Scheduling In Go : Part III - Concurrency&lt;/a&gt;文章中，作者对比了两种类型工作在并发和并行模式的对比，并提供了一些经验总结：&lt;/p&gt;    &lt;ul&gt;      &lt;li&gt;CPU密集型(CPU bound)：如果任务是CPU密集型的，那么使用并行的方式来解决问题，这样可以最大的利用CPU核心的算力。如果使用并发的方式去处理，反而会增加        &lt;u&gt;复杂度&lt;/u&gt;。&lt;/li&gt;      &lt;li&gt;I/O密集型(I/O bound)：如果任务时I/O密集型的，那么使用并发的方式来解决问题，这样可以提升单个CPU核心的吞吐量(Throughput)。&lt;/li&gt;&lt;/ul&gt;    &lt;blockquote&gt;      &lt;p&gt;并发(Concurrent)与并行(Parallel)：并发是指同时处理(dealing with)很多事情，并行是指同时做(doing)很多事情。并行是并发的特殊情况，只能在计算机多核环境中实现。&lt;/p&gt;      &lt;p&gt;同步(Sync)与异步(Async)：一种编程模型。区别在于同步是可预测(predictable)的，异步是不可预测(unpredictable)的编程模型。&lt;/p&gt;&lt;/blockquote&gt;    &lt;h2&gt;总结&lt;/h2&gt;    &lt;p&gt;本篇从操作系统的视角介绍编程语言实现并发的底层概念，包括进程调度与I/O模型等。下篇开始介绍常见的      &lt;a href="https://www.bmpi.dev/dev/deep-in-program-language/how-to-implement-concurrency/concurrency-model/"&gt;并发模型&lt;/a&gt;。&lt;/p&gt;    &lt;div&gt;      &lt;p&gt;        &lt;strong&gt;更新日志&lt;/strong&gt;2022-04-15：根据此        &lt;a href="https://www.v2ex.com/t/846178#reply20"&gt;讨论帖&lt;/a&gt;修改更新。（感谢        &lt;a href="https://www.v2ex.com/member/lxdlam"&gt;@lxdlam&lt;/a&gt;）
2022-04-10：初稿发布。&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;
    &lt;div&gt; &lt;a href="https://itindex.net/"  title="IT 资讯"&gt;&lt;img src="https://itindex.net/images/iconWarning.gif" title="IT 资讯" border="0"/&gt; &lt;/a&gt;</description>
      <category />
      <guid isPermaLink="true">https://itindex.net/detail/62403-%E7%BC%96%E7%A8%8B%E8%AF%AD%E8%A8%80-%E5%B9%B6%E5%8F%91-%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F</guid>
      <pubDate>Sun, 04 Sep 2022 14:26:12 CST</pubDate>
    </item>
    <item>
      <title>编程语言是如何实现并发的之并发模型篇 · 构建我的被动收入</title>
      <link>https://itindex.net/detail/62279-%E7%BC%96%E7%A8%8B%E8%AF%AD%E8%A8%80-%E5%B9%B6%E5%8F%91-%E5%B9%B6%E5%8F%91</link>
      <description>&lt;div&gt;    &lt;div&gt;      &lt;p&gt;        &lt;strong&gt;初稿征集意见中&lt;/strong&gt;本文处于初稿状态，可能存在很多错误，如果你有不同的看法，欢迎不吝赐教，先行感谢！&lt;/p&gt;&lt;/div&gt;    &lt;ul&gt;      &lt;li&gt;        &lt;a href="https://www.bmpi.dev/dev/deep-in-program-language/how-to-implement-concurrency/concurrency-model/#%E5%B8%B8%E8%A7%81%E7%9A%84%E5%B9%B6%E5%8F%91%E6%A8%A1%E5%9E%8B"&gt;常见的并发模型&lt;/a&gt;        &lt;ul&gt;          &lt;li&gt;            &lt;a href="https://www.bmpi.dev/dev/deep-in-program-language/how-to-implement-concurrency/concurrency-model/#%E5%A4%9A%E8%BF%9B%E7%A8%8Bmultiprocessing"&gt;多进程(Multiprocessing)&lt;/a&gt;&lt;/li&gt;          &lt;li&gt;            &lt;a href="https://www.bmpi.dev/dev/deep-in-program-language/how-to-implement-concurrency/concurrency-model/#%E5%A4%9A%E7%BA%BF%E7%A8%8Bmultithreaded"&gt;多线程(Multithreaded)&lt;/a&gt;            &lt;ul&gt;              &lt;li&gt;                &lt;a href="https://www.bmpi.dev/dev/deep-in-program-language/how-to-implement-concurrency/concurrency-model/#%E5%85%B1%E4%BA%AB%E5%86%85%E5%AD%98%E9%80%9A%E4%BF%A1shared-memory-communication"&gt;共享内存通信(Shared memory communication)&lt;/a&gt;                &lt;ul&gt;                  &lt;li&gt;                    &lt;a href="https://www.bmpi.dev/dev/deep-in-program-language/how-to-implement-concurrency/concurrency-model/#lock"&gt;Lock&lt;/a&gt;&lt;/li&gt;                  &lt;li&gt;                    &lt;a href="https://www.bmpi.dev/dev/deep-in-program-language/how-to-implement-concurrency/concurrency-model/#stm"&gt;STM&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;              &lt;li&gt;                &lt;a href="https://www.bmpi.dev/dev/deep-in-program-language/how-to-implement-concurrency/concurrency-model/#%E6%B6%88%E6%81%AF%E4%BC%A0%E9%80%92%E9%80%9A%E4%BF%A1message-passing-communication"&gt;消息传递通信(Message passing communication)&lt;/a&gt;                &lt;ul&gt;                  &lt;li&gt;                    &lt;a href="https://www.bmpi.dev/dev/deep-in-program-language/how-to-implement-concurrency/concurrency-model/#csp"&gt;CSP&lt;/a&gt;&lt;/li&gt;                  &lt;li&gt;                    &lt;a href="https://www.bmpi.dev/dev/deep-in-program-language/how-to-implement-concurrency/concurrency-model/#actor"&gt;Actor&lt;/a&gt;                    &lt;ul&gt;                      &lt;li&gt;                        &lt;a href="https://www.bmpi.dev/dev/deep-in-program-language/how-to-implement-concurrency/concurrency-model/#vertx"&gt;Vert.x&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;          &lt;li&gt;            &lt;a href="https://www.bmpi.dev/dev/deep-in-program-language/how-to-implement-concurrency/concurrency-model/#%E4%BA%8B%E4%BB%B6%E9%A9%B1%E5%8A%A8event-driven"&gt;事件驱动(Event Driven)&lt;/a&gt;            &lt;ul&gt;              &lt;li&gt;                &lt;a href="https://www.bmpi.dev/dev/deep-in-program-language/how-to-implement-concurrency/concurrency-model/#event-loop-with-multiplexing"&gt;Event Loop with Multiplexing&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;      &lt;li&gt;        &lt;a href="https://www.bmpi.dev/dev/deep-in-program-language/how-to-implement-concurrency/concurrency-model/#%E7%BC%96%E7%A8%8B%E8%AF%AD%E8%A8%80%E7%9A%84%E5%AE%9E%E7%8E%B0"&gt;编程语言的实现&lt;/a&gt;        &lt;ul&gt;          &lt;li&gt;            &lt;a href="https://www.bmpi.dev/dev/deep-in-program-language/how-to-implement-concurrency/concurrency-model/#java"&gt;Java&lt;/a&gt;&lt;/li&gt;          &lt;li&gt;            &lt;a href="https://www.bmpi.dev/dev/deep-in-program-language/how-to-implement-concurrency/concurrency-model/#go"&gt;Go&lt;/a&gt;&lt;/li&gt;          &lt;li&gt;            &lt;a href="https://www.bmpi.dev/dev/deep-in-program-language/how-to-implement-concurrency/concurrency-model/#erlangelixir"&gt;Erlang/Elixir&lt;/a&gt;&lt;/li&gt;          &lt;li&gt;            &lt;a href="https://www.bmpi.dev/dev/deep-in-program-language/how-to-implement-concurrency/concurrency-model/#clojure"&gt;Clojure&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;      &lt;li&gt;        &lt;a href="https://www.bmpi.dev/dev/deep-in-program-language/how-to-implement-concurrency/concurrency-model/#%E8%B5%B0%E5%90%91%E9%AB%98%E5%B9%B6%E5%8F%91"&gt;走向高并发&lt;/a&gt;&lt;/li&gt;      &lt;li&gt;        &lt;a href="https://www.bmpi.dev/dev/deep-in-program-language/how-to-implement-concurrency/concurrency-model/#%E6%80%BB%E7%BB%93"&gt;总结&lt;/a&gt;&lt;/li&gt;      &lt;li&gt;        &lt;a href="https://www.bmpi.dev/dev/deep-in-program-language/how-to-implement-concurrency/concurrency-model/#%E5%8F%82%E8%80%83%E8%B5%84%E6%96%99"&gt;参考资料&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;    &lt;p&gt;在      &lt;a href="https://www.bmpi.dev/dev/deep-in-program-language/how-to-implement-concurrency/os-scheduling/"&gt;操作系统篇&lt;/a&gt;中介绍了从操作系统的视角中不同编程语言实现并发的共同的一些概念。本文将会介绍常见的并发模型及不同编程语言是如何实现的。&lt;/p&gt;    &lt;h2&gt;常见的并发模型&lt;/h2&gt;    &lt;pre&gt;      &lt;code&gt;## 并发模型
### 多进程(Multiprocessing)
- Fork
### 多线程(Multithreaded)
- 共享内存通信
  - Lock
    - Java/Go/Clojure/C
  - STM
    - Clojure
- 消息传递通信
  - CSP
    - Go
  - Actor
    - Erlang/OTP
    - Scala/Akka
    - Vert.x    
### 事件驱动(Event Driven)
- Event Loop 
  with Multiplexing
  - Nginx
  - Node.js
  - Redis
  - Twisted(Python)
  - Netty(Java)&lt;/code&gt;&lt;/pre&gt;    &lt;h3&gt;多进程(Multiprocessing)&lt;/h3&gt;    &lt;p&gt;多进程模型是利用操作系统的进程模型来实现并发的。典型的是Apache Web Server，每个用户请求接入的时候都会创建一个进程，这样应用就可以同时支持多个用户。&lt;/p&gt;    &lt;p&gt;      &lt;img alt=""&gt;&lt;/img&gt;&lt;/p&gt;    &lt;p&gt;如上图，在Linux系统中PID为1的名为P0的进程通过      &lt;code&gt;fork()&lt;/code&gt;系统调用创建了3个子进程。在多处理器的系统中，这些子进程可以并行运行在多个处理器上，当然这些进程也可以被同一个处理器通过      &lt;a href="https://www.bmpi.dev/dev/deep-in-program-language/how-to-implement-concurrency/os-scheduling/#%E4%B8%8A%E4%B8%8B%E6%96%87%E5%88%87%E6%8D%A2context-switching"&gt;上下文切换&lt;/a&gt;进行CPU分时共享。&lt;/p&gt;    &lt;p&gt;在图中M1、M2与M3都代表内存资源，在多进程中如果不同进程想共享内存中的数据必须通过      &lt;a href="https://en.wikipedia.org/wiki/Inter-process_communication"&gt;进程间通信&lt;/a&gt;的方式来实现。&lt;/p&gt;    &lt;p&gt;多进程模型的缺点在于创建进程的开销非常高，如果进程过多会很快消耗光系统资源，并且上下文切换在进程间的开销也很高，在      &lt;a href="https://www.bmpi.dev/dev/deep-in-program-language/how-to-implement-concurrency/os-scheduling/#%E5%B9%B6%E5%8F%91%E8%BF%98%E6%98%AF%E5%B9%B6%E8%A1%8C"&gt;I/O密集型任务&lt;/a&gt;的应用中，此并发模型很难满足需求。&lt;/p&gt;    &lt;h3&gt;多线程(Multithreaded)&lt;/h3&gt;    &lt;p&gt;在操作系统的视角看，比如Linux中，在进程中创建线程是通过      &lt;code&gt;clone()&lt;/code&gt;系统调用来实现，这和创建子进程的区别不大。线程与进程的区别在于同一个进程内的线程共享着进程分配的资源，线程不被分配资源，只是操作系统调度执行任务的抽象的最小单元。&lt;/p&gt;    &lt;p&gt;比如下图中，PID为10的进程P0通过      &lt;code&gt;clone()&lt;/code&gt;系统调用创建了3个线程，这些线程都可以访问进程分配的内存资源M0。&lt;/p&gt;    &lt;p&gt;      &lt;img alt=""&gt;&lt;/img&gt;&lt;/p&gt;    &lt;p&gt;我们也可以通过      &lt;code&gt;htop&lt;/code&gt;命令在Linux中看到这些进程及线程的运行信息，比如下图中所示PID为339328进程（它是一个基于JVM的Clojure应用）及其创建的线程信息：&lt;/p&gt;    &lt;p&gt;      &lt;img alt=""&gt;&lt;/img&gt;&lt;/p&gt;    &lt;p&gt;也可以通过      &lt;code&gt;/proc&lt;/code&gt;文件系统获取进程创建的线程的信息：&lt;/p&gt;    &lt;div&gt;      &lt;pre&gt;        &lt;code&gt;$ ls /proc/339328/task/1043773339340339342339344339346339348339350339357339359339361339363339367339380339388788478975443991563339328339341339343339345339347339349339353339358339360339362339364339378339382424498975439991561&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;    &lt;p&gt;相比多进程模型来说，因为线程比进程创建的系统开销小，所以多线程模型是很常见的实现并发的方式。但此种模型存在一个必须解决的问题，就是线程间通信的问题。但线程为什么要通信呢？那是因为大部分业务系统问题的解空间在用冯·诺伊曼计算机去实现的时候，都存在并发计算时线程间数据共享的问题。要数据共享有两种方式：&lt;/p&gt;    &lt;ul&gt;      &lt;li&gt;共享内存通信(Shared memory communication)：不同线程间可以访问同一内存地址空间，并可修改此地址空间的数据。&lt;/li&gt;      &lt;li&gt;消息传递通信(Message passing communication)：不同线程间只能通过收发消息的形式去通信，数据只能被拥有它的线程修改。&lt;/li&gt;&lt;/ul&gt;    &lt;h4&gt;共享内存通信(Shared memory communication)&lt;/h4&gt;    &lt;p&gt;      &lt;img alt=""&gt;&lt;/img&gt;&lt;/p&gt;    &lt;p&gt;因为线程间共享内存资源，在访问临界区域时会出现数据竞争（发生竞态条件，即代码的行为取决于各操作的时序）的问题，如果不能正确的处理此问题，程序会产生线程不安全的问题，最终导致程序崩溃或无法正常运行。&lt;/p&gt;    &lt;p&gt;解决竞态条件的方式是对数据进行同步(      &lt;a href="https://en.wikipedia.org/wiki/Synchronization_(computer_science)"&gt;Synchronize&lt;/a&gt;)访问。要实现同步访问常见的方式有：&lt;/p&gt;    &lt;ul&gt;      &lt;li&gt;锁(        &lt;a href="https://en.wikipedia.org/wiki/Lock_(computer_science)"&gt;Lock&lt;/a&gt;)：通过锁定临界区域来实现同步访问。&lt;/li&gt;      &lt;li&gt;信号量(        &lt;a href="https://en.wikipedia.org/wiki/Semaphore_(programming)"&gt;Semaphores&lt;/a&gt;)：可以通过信号量的增减控制对一个或多个线程对临界区域的访问。&lt;/li&gt;      &lt;li&gt;同步屏障(        &lt;a href="https://en.wikipedia.org/wiki/Barrier_(computer_science)"&gt;Barriers&lt;/a&gt;)：通过设置屏障控制不同线程执行周期实现同步访问。&lt;/li&gt;&lt;/ul&gt;    &lt;h5&gt;Lock&lt;/h5&gt;    &lt;p&gt;      &lt;img alt=""&gt;&lt;/img&gt;&lt;/p&gt;    &lt;p&gt;锁(Lock)，也叫互斥量(Mutex)。线程在操作临界区域资源时，需要先获取锁，然后才能操作，当操作完成后，需要释放锁。此模型利用了对底层硬件运行过程的形式化，这让其即简单又复杂。从锁的种类就可以看出来其复杂性：&lt;/p&gt;    &lt;ul&gt;      &lt;li&gt;自旋锁&lt;/li&gt;      &lt;li&gt;递归锁&lt;/li&gt;      &lt;li&gt;乐观/悲观锁&lt;/li&gt;      &lt;li&gt;公平/非公平锁&lt;/li&gt;      &lt;li&gt;独享/共享锁&lt;/li&gt;      &lt;li&gt;偏向/轻量级/重量锁&lt;/li&gt;      &lt;li&gt;分段锁&lt;/li&gt;&lt;/ul&gt;    &lt;p&gt;对锁的使用不当还会产生死锁问题(      &lt;a href="https://en.wikipedia.org/wiki/Deadlock"&gt;Deadlock&lt;/a&gt;)。在实际开发过程中，能不用锁就不用锁，可以考虑使用一些轻量级的替代方案如原子变量(Atomic)，或      &lt;a href="https://www.baeldung.com/lock-free-programming"&gt;无锁(lock-free)非阻塞(non-blocking)算法&lt;/a&gt;实现的数据结构。&lt;/p&gt;    &lt;blockquote&gt;      &lt;p&gt;原子变量的更新为何是线程安全的？因为CPU提供了CAS(        &lt;a href="https://en.wikipedia.org/wiki/Compare-and-swap"&gt;Compare-and-swap&lt;/a&gt;)的指令来更新原子变量，这条指令从硬件上确保了此操作是线程安全的。&lt;/p&gt;&lt;/blockquote&gt;    &lt;p&gt;此模型的优点：&lt;/p&gt;    &lt;ul&gt;      &lt;li&gt;大多编程语言都支持此模型；&lt;/li&gt;      &lt;li&gt;贴近硬件架构，使用得当性能很高；&lt;/li&gt;      &lt;li&gt;是其他并发模型的基础；&lt;/li&gt;&lt;/ul&gt;    &lt;p&gt;此模型的缺点：&lt;/p&gt;    &lt;ul&gt;      &lt;li&gt;不支持分布式内存模型，只解决了进程内的并发同步；&lt;/li&gt;      &lt;li&gt;不好调试与测试，想用好不容易；&lt;/li&gt;&lt;/ul&gt;    &lt;h5&gt;STM&lt;/h5&gt;    &lt;p&gt;锁模型是一种悲观的并发同步机制，但实际上冲突发生的概率并不高，所以乐观的并发同步机制性能更好。STM(Software transactional memory)就是这样一种用来代替锁模型的乐观并发同步机制。STM是用软件的方式去实现事务内存(Transactional memory)，而事务内存中的事务(Transactional)正是关系型数据库中的概念，一个事务必须满足      &lt;a href="https://en.wikipedia.org/wiki/ACID"&gt;ACID&lt;/a&gt;性质，如下图所示：&lt;/p&gt;    &lt;p&gt;      &lt;img alt=""&gt;&lt;/img&gt;&lt;/p&gt;    &lt;blockquote&gt;      &lt;p&gt;在t0时刻，T1、T2与T3线程同时获取要操作的同一数据的快照v0，之后T1线程在自己的事务里于t1时刻提交自己的写入值v1，之后T2线程在自己的事务里提交自己的写入值v2，由于在提交时刻会做冲突检测，此事务发现操作数据的快照已经发生变化，于是回滚自己的提交。之后开启新的事务重新获取最新的快照v1，并于时刻t2成功提交自己的写入值v2。在线程v3中由于是读取操作，并没有数据修改，所以在它的事务中使用的是最早的快照v0。&lt;/p&gt;&lt;/blockquote&gt;    &lt;p&gt;在STM的事务中尽可能避免副作用，比如在事务中去修改原子变量这种操作，可能会导致事务回滚失败。&lt;/p&gt;    &lt;p&gt;STM实现的一种方式是基于MVCC(      &lt;a href="https://en.wikipedia.org/wiki/Multiversion_concurrency_control"&gt;Multiversion concurrency control&lt;/a&gt;)。很多编程语言提供了这种并发模型的实现。&lt;/p&gt;    &lt;p&gt;此模型的优点：&lt;/p&gt;    &lt;ul&gt;      &lt;li&gt;相比锁模型更简单；&lt;/li&gt;      &lt;li&gt;大部分情况下更高效；&lt;/li&gt;&lt;/ul&gt;    &lt;p&gt;此模型的缺点：&lt;/p&gt;    &lt;ul&gt;      &lt;li&gt;在事务内需要避免产生副作用；&lt;/li&gt;      &lt;li&gt;不支持分布式内存模型，只解决了进程内的并发同步；&lt;/li&gt;&lt;/ul&gt;    &lt;h4&gt;消息传递通信(Message passing communication)&lt;/h4&gt;    &lt;p&gt;在锁模型中，生产者和消费者之间的通信是通过共享内存而完成的，要实现安全通信，必须给共享内存所属的临界区加锁。那如果生产者和消费者是通过消息传递完成通信的呢？那样我们就可以摆脱锁模型的限制了。&lt;/p&gt;    &lt;blockquote&gt;      &lt;p&gt;Do not communicate by sharing memory. Instead, share memory by communicating. Communication forces coordination. (Ivo Balbaert)&lt;/p&gt;&lt;/blockquote&gt;    &lt;h5&gt;CSP&lt;/h5&gt;    &lt;p&gt;通信顺序进程(      &lt;a href="https://en.wikipedia.org/wiki/Communicating_sequential_processes"&gt;CSP(Communicating sequential processes)&lt;/a&gt;)是一种形式语言，用来描述基于消息传递通信的安全并发模型。如下图所示：&lt;/p&gt;    &lt;p&gt;      &lt;img alt=""&gt;&lt;/img&gt;&lt;/p&gt;    &lt;p&gt;这些任务块之间的通信是基于通道(Channel)来完成的，当创建了一个通道之后，不同的任务块就可以通过持有这个通道来通信，通道可以被不同的任务块共享。通道两端任务块的通信可以是同步的，也可以是异步的。&lt;/p&gt;    &lt;p&gt;在这里的任务块不是如Java里重量级的线程类，在运行时是非常轻量级的代码块。这些代码块可以被调度到不同的线程中，最终被多个CPU内核并发执行。&lt;/p&gt;    &lt;p&gt;此模型的优点：&lt;/p&gt;    &lt;ul&gt;      &lt;li&gt;相比锁模型更简单；&lt;/li&gt;      &lt;li&gt;很容易实现高并发；&lt;/li&gt;&lt;/ul&gt;    &lt;p&gt;此模型的缺点：&lt;/p&gt;    &lt;ul&gt;      &lt;li&gt;不支持分布式内存模型，只解决了进程内的并发同步；&lt;/li&gt;&lt;/ul&gt;    &lt;h5&gt;Actor&lt;/h5&gt;    &lt;p&gt;演员模型(      &lt;a href="https://en.wikipedia.org/wiki/Actor_model"&gt;Actor&lt;/a&gt;)是一种类似面向对象编程思想的安全并发模型。在面向对象的世界里，对象是一种封装了状态及行为的实体，对象间通过消息去通信（通过对象调用其方法）。而在Actor模型中，一切皆Actor，每个Actor中都有自己的状态，其他Actor只能通过通信的方式来获取或修改被通信Actor的状态。Actor通信的方式类似收发邮件，它有自己的收件箱，如下图所示：&lt;/p&gt;    &lt;p&gt;      &lt;img alt=""&gt;&lt;/img&gt;&lt;/p&gt;    &lt;p&gt;在上述图中，我们可以看到相比CSP模型，Actor模型可以跨节点在分布式集群中运行。实际上Actor模型的代表Erlang正是天然分布式容错的编程语言。&lt;/p&gt;    &lt;p&gt;此模型的优点：&lt;/p&gt;    &lt;ul&gt;      &lt;li&gt;相比锁模型更简单；&lt;/li&gt;      &lt;li&gt;很容易实现高并发；&lt;/li&gt;      &lt;li&gt;支持分布式内存模型，能实现跨节点的并发同步；&lt;/li&gt;&lt;/ul&gt;    &lt;p&gt;此模型的缺点：&lt;/p&gt;    &lt;ul&gt;      &lt;li&gt;存在信箱满后消息丢失的问题;&lt;/li&gt;&lt;/ul&gt;    &lt;h6&gt;Vert.x&lt;/h6&gt;    &lt;p&gt;      &lt;a href="https://vertx.io/"&gt;Vert.x&lt;/a&gt;是一个基于JVM的反应式模型的工具包，在解决并发同步的问题上它采用了类似Actor模型的方式，如下图所示：&lt;/p&gt;    &lt;p&gt;      &lt;img alt=""&gt;&lt;/img&gt;&lt;/p&gt;    &lt;p&gt;在它的架构里最基本的计算单元名为Verticle，这些Verticle之间通过事件总线(Event Bus)进行异步通信，当然也可以像Actor一样跨节点通信。和Actor模型不同的地方在于Vert.x支持多种语言，因为Event Bus解耦了实现Verticle的语言限制。&lt;/p&gt;    &lt;h3&gt;事件驱动(Event Driven)&lt;/h3&gt;    &lt;p&gt;在多线程方式实现的并发模型中，我们解决问题的方式是通过创建更多的线程来提高系统的并发处理能力。但线程创建的开销及线程间上下文调度切换的开销并不是很小，所以纵使系统的硬件资源很充足，也存在一定的上限。那么有没有可能只创建一个线程，而且这个线程可以同时处理很多个任务呢？当然是可以的，这正是基于I/O多路复用的事件循环处理并发模型的解法，通过单线程来并发处理I/O密集型的任务。&lt;/p&gt;    &lt;blockquote&gt;      &lt;p&gt;Less is more.&lt;/p&gt;&lt;/blockquote&gt;    &lt;h4&gt;Event Loop with Multiplexing&lt;/h4&gt;    &lt;p&gt;      &lt;img alt=""&gt;&lt;/img&gt;&lt;/p&gt;    &lt;p&gt;此模型巧妙的利用了系统内核提供的I/O多路复用系统调用，将多个socket连接转换成一个事件队列(event queue)，只需要单个线程即可循环处理这个事件队列。当然这个线程是有可能被阻塞或长期占用的，针对这种类型的任务处理可以单独使用一个      &lt;a href="https://www.nginx.com/blog/thread-pools-boost-performance-9x/"&gt;线程池&lt;/a&gt;去做，这样就不会阻塞Event Loop的线程了。&lt;/p&gt;    &lt;p&gt;此模型的优点：&lt;/p&gt;    &lt;ul&gt;      &lt;li&gt;单线程对系统资源的占用很小；&lt;/li&gt;      &lt;li&gt;很容易实现高并发；&lt;/li&gt;&lt;/ul&gt;    &lt;p&gt;此模型的缺点：&lt;/p&gt;    &lt;ul&gt;      &lt;li&gt;不支持分布式内存模型，只解决了进程内的并发同步；&lt;/li&gt;&lt;/ul&gt;    &lt;h2&gt;编程语言的实现&lt;/h2&gt;    &lt;p&gt;许多编程语言标准库或三方库都已支持上述大多数的并发模型，但因为一些历史原因带来的兼容性问题，开发者的使用体验好坏不一。以下仅简单介绍下各种编程语言标准库对并发模型的实现及流行三方库的扩展支持。&lt;/p&gt;    &lt;h3&gt;Java&lt;/h3&gt;    &lt;p&gt;Java是一门面向对象的编程语言，标准库对并发的支持是      &lt;strong&gt;基于共享内存通信的锁模型&lt;/strong&gt;，因此用Java的标准库来实现高并发是一件非常有挑战的事情，想不踩坑太难。&lt;/p&gt;    &lt;p&gt;想深入了解Java的并发模型，可以参考      &lt;a href="https://book.douban.com/subject/10484692/"&gt;《Java并发编程实战》&lt;/a&gt;。&lt;/p&gt;    &lt;p&gt;当然基于Java的三方库实现了很多并发模型，如：&lt;/p&gt;    &lt;ul&gt;      &lt;li&gt;Actor:        &lt;a href="https://doc.akka.io/docs/akka/current/?language=java"&gt;Akka&lt;/a&gt;&lt;/li&gt;      &lt;li&gt;Event Loop with Multiplexing        &lt;ul&gt;          &lt;li&gt;            &lt;a href="https://netty.io/"&gt;Netty&lt;/a&gt;&lt;/li&gt;          &lt;li&gt;            &lt;a href="https://github.com/nginx-clojure/nginx-clojure/"&gt;Nginx-Clojure&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ul&gt;    &lt;h3&gt;Go&lt;/h3&gt;    &lt;p&gt;在Go流行的时期流传着一个故事：一个PHP的普通开发者在一周内学会了Go语言，之后开发出了一个高并发的Web应用，要用Java实现同样的性能，至少需要多年的经验。&lt;/p&gt;    &lt;p&gt;暂且不论这个故事是否合理，但它展示了Go语言的两大亮点：&lt;/p&gt;    &lt;ul&gt;      &lt;li&gt;语法简单易学；&lt;/li&gt;      &lt;li&gt;天然支持高并发模型；&lt;/li&gt;&lt;/ul&gt;    &lt;p&gt;Go在语言层面实现了      &lt;strong&gt;CSP并发模型&lt;/strong&gt;，因此能让开发者以非常低的成本写出高并发的Web应用。在对CSP并发模型的实现中，Go任务块一般是一个函数，这个函数的调度是由Go语言的调度器来完成，可以被调度在不同的线程中。如果在这个函数中出现了阻塞线程的如网络I/O的操作，调度器会委托给Netpoller去执行，而Netpoller的底层正是对操作系统I/O多路复用技术的封装。&lt;/p&gt;    &lt;p&gt;Go高并发的秘诀在于它的G-P-M运行时调度模型，详细的设计可参考这篇文章：      &lt;a href="https://www.ardanlabs.com/blog/2018/08/scheduling-in-go-part2.html"&gt;Scheduling In Go : Part II - Go Scheduler&lt;/a&gt;。&lt;/p&gt;    &lt;h3&gt;Erlang/Elixir&lt;/h3&gt;    &lt;p&gt;Erlang是一门天然分布式、高并发、容错的编程语言，它是      &lt;strong&gt;Actor并发模型&lt;/strong&gt;的代表编程语言。Elixir是基于Erlang虚拟机(BEAM)的一种不纯粹的、动态类型的函数式语言。它们自然原生支持Actor并发模型，所以在开发高并发的分布式容错应用时，可以考虑使用Elixir，它强大的并发模型及富有表达力的语法可以提供非常好的开发体验。&lt;/p&gt;    &lt;p&gt;Erlang的虚拟机在运行时实现了      &lt;u&gt;软实时抢占式调度&lt;/u&gt;，详细的信息可参考这篇文章：      &lt;a href="https://jlouisramblings.blogspot.com/2013/01/how-erlang-does-scheduling.html"&gt;How Erlang does scheduling&lt;/a&gt;。&lt;/p&gt;    &lt;h3&gt;Clojure&lt;/h3&gt;    &lt;p&gt;Clojure是基于JVM平台的Lisp方言，是不纯粹的、动态类型的函数式语言（这点倒和Elixir类似）。Clojure可以直接调用Java的库，这让其可支持非常多的并发模型，但最有特色的就是它的标准库实现了STM的并发模型，官方提供的异步库      &lt;a href="https://github.com/clojure/core.async"&gt;core.async&lt;/a&gt;也实现了CSP的并发模型。当然还可以通过      &lt;a href="https://github.com/nginx-clojure/nginx-clojure/"&gt;Nginx-Clojure&lt;/a&gt;实现基于I/O多路复用的高并发模型。&lt;/p&gt;    &lt;p&gt;Clojure支持非常多的并发原语，想了解可参考这篇文章：      &lt;a href="https://ericnormand.me/guide/clojure-concurrency"&gt;Clojure Concurrency Tutorial&lt;/a&gt;。&lt;/p&gt;    &lt;h2&gt;走向高并发&lt;/h2&gt;    &lt;p&gt;1999年的时候      &lt;a href="https://en.wikipedia.org/wiki/C10k_problem"&gt;C10K&lt;/a&gt;的问题被提出，当时在单机上并发处理上万的连接是一件富有挑战的事情，最终借助操作系统提供的一些支持如进程调度与I/O模型，通过一些高并发的模型如I/O多路复用，我们可以在单机上支持上万甚至更多的并发连接。&lt;/p&gt;    &lt;p&gt;二十多年过去了，互联网从Web1走向了      &lt;a href="https://www.bmpi.dev/dev/glimpse-of-web3/"&gt;Web3&lt;/a&gt;，联网的设备从PC走向了IoT，我们已经到了万物互联的时代。C10K的问题已经转变为      &lt;strong&gt;C10M&lt;/strong&gt;的问题，如何在单机上支持百万乃至千万的连接呢？&lt;/p&gt;    &lt;p&gt;在这篇      &lt;a href="https://phoenixframework.org/blog/the-road-to-2-million-websocket-connections"&gt;The Road to 2 Million Websocket Connections in Phoenix&lt;/a&gt;中我们可以看到如何用Elixir的Web框架Phoenix在一台40核128GB内存的机器上支撑两百万的Websocket长链接，最终因Linux内核的限制而无法进一步提高并发链接数，并没有达到服务器的极限。&lt;/p&gt;    &lt;p&gt;Migratorydata甚至使用Java在一台12核96GB内存的机器上支撑了上千万的Websocket长连接，更多细节见这两篇文章：&lt;/p&gt;    &lt;ul&gt;      &lt;li&gt;        &lt;a href="https://migratorydata.com/blog/migratorydata-solved-the-c10m-problem/"&gt;How MigratoryData solved the C10M problem: 10 Million Concurrent Connections on a Single Commodity Server&lt;/a&gt;&lt;/li&gt;      &lt;li&gt;        &lt;a href="https://arxiv.org/pdf/1712.09876.pdf"&gt;Reliable Messaging to Millions of Users with MigratoryData&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;    &lt;p&gt;当单机并发达10K时，内核是解决方案，当单机并发达10M时，内核是瓶颈。比如Linux内核需要32GB内存来维护上千万的Socket连接。所以在单机千万级的解决方案需要在内核之外的应用层去做更多的事情，感兴趣的读者可以看这篇文章：      &lt;a href="http://highscalability.com/blog/2013/5/13/the-secret-to-10-million-concurrent-connections-the-kernel-i.html"&gt;The Secret to 10 Million Concurrent Connections -The Kernel is the Problem, Not the Solution&lt;/a&gt;。&lt;/p&gt;    &lt;h2&gt;总结&lt;/h2&gt;    &lt;p&gt;在软件开发过程中，安全至关重要。编程的两大安全难题是      &lt;u&gt;线程安全与内存安全&lt;/u&gt;。这个系列的两篇文章都是在尝试介绍不同编程语言是如何解决线程安全从而更容易的实现高并发。&lt;/p&gt;    &lt;p&gt;另外一个想借助这篇文章分享的一个观点是：问题可以被更复杂的方案去解决，当然也可以通过另一种截然不同的思路去更简单的解决。当你觉得一个方案很复杂的时候，试着去找一个完全不同方向的方案，也许会更容易一些。&lt;/p&gt;    &lt;h2&gt;参考资料&lt;/h2&gt;    &lt;ul&gt;      &lt;li&gt;        &lt;a href="https://www.masterraghu.com/subjects/np/introduction/unix_network_programming_v1.3/ch06lev1sec2.html"&gt;I/O Models&lt;/a&gt;&lt;/li&gt;      &lt;li&gt;        &lt;a href="https://web.archive.org/web/20160423223903/http://concur.rspace.googlecode.com/hg/talk/concur.html#slide-5"&gt;Concurrency is not Parallelism (it’s better)&lt;/a&gt;&lt;/li&gt;      &lt;li&gt;        &lt;a href="https://www.loginradius.com/blog/engineering/callback-vs-promises-vs-async-await/"&gt;Callback vs Promises vs Async Await&lt;/a&gt;&lt;/li&gt;      &lt;li&gt;        &lt;a href="https://betterprogramming.pub/sync-vs-async-vs-concurrent-vs-parallel-5754cdb60f66"&gt;Sync vs. Async vs. Concurrent vs. Parallel&lt;/a&gt;&lt;/li&gt;      &lt;li&gt;        &lt;a href="https://www.thegeekstuff.com/2013/11/linux-process-and-threads/"&gt;What are Linux Processes, Threads, Light Weight Processes, and Process State&lt;/a&gt;&lt;/li&gt;      &lt;li&gt;        &lt;a href="https://gist.github.com/jboner/2841832"&gt;Latency Numbers Every Programmer Should Know&lt;/a&gt;&lt;/li&gt;      &lt;li&gt;        &lt;a href="https://www.cs.uaf.edu/2015/fall/cs301/lecture/11_16_thread_user.html"&gt;Cooperative User-Level Threads (Coroutines)&lt;/a&gt;&lt;/li&gt;      &lt;li&gt;        &lt;a href="https://en.m.wikipedia.org/wiki/Green_threads"&gt;Green threads - Wikipedia&lt;/a&gt;&lt;/li&gt;      &lt;li&gt;        &lt;a href="https://stackoverflow.com/questions/5878231/what-exactly-makes-erlang-process-green-thread-coroutine-lighter-than-kernel"&gt;multithreading&lt;/a&gt;&lt;/li&gt;      &lt;li&gt;        &lt;a href="https://news.ycombinator.com/item?id=193440"&gt;Ask HN: Erlang and network connections?&lt;/a&gt;&lt;/li&gt;      &lt;li&gt;        &lt;a href="https://en.wikipedia.org/wiki/Thread_(computing)#Threading_models"&gt;Thread (computing) - Wikipedia&lt;/a&gt;&lt;/li&gt;      &lt;li&gt;        &lt;a href="https://berb.github.io/diploma-thesis/community/index.html"&gt;Concurrent Programming for Scalable Web Architectures&lt;/a&gt;&lt;/li&gt;      &lt;li&gt;        &lt;a href="http://tutorials.jenkov.com/java-concurrency/concurrency-models.html"&gt;Concurrency Models&lt;/a&gt;&lt;/li&gt;      &lt;li&gt;        &lt;a href="http://java.ociweb.com/mark/stm/article.html"&gt;Software Transactional Memory&lt;/a&gt;&lt;/li&gt;      &lt;li&gt;        &lt;a href="https://naghavi.me/blog/vertx-concurrency-model/"&gt;Vert.x concurrency model&lt;/a&gt;&lt;/li&gt;      &lt;li&gt;        &lt;a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/EventLoop"&gt;The event loop - JavaScript | MDN&lt;/a&gt;&lt;/li&gt;      &lt;li&gt;        &lt;a href="https://v8.dev/blog/fast-async"&gt;Faster async functions and promises · V8&lt;/a&gt;&lt;/li&gt;      &lt;li&gt;        &lt;a href="https://mp.weixin.qq.com/s/9g0wVT-5PpmXRoKJZo-skA"&gt;透过 rust 探索系统的本原：并发篇&lt;/a&gt;&lt;/li&gt;      &lt;li&gt;        &lt;a href="https://zhuanlan.zhihu.com/p/137339439"&gt;并发模型&lt;/a&gt;&lt;/li&gt;      &lt;li&gt;        &lt;a href="https://book.douban.com/subject/26337939/"&gt;七周七并发模型&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;    &lt;div&gt;      &lt;p&gt;        &lt;strong&gt;更新日志&lt;/strong&gt;2022-05-27：初稿发布。        &lt;br /&gt;2022-05-07：开始写作。&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;
    &lt;div&gt; &lt;a href="https://itindex.net/"  title="IT 资讯"&gt;&lt;img src="https://itindex.net/images/iconWarning.gif" title="IT 资讯" border="0"/&gt; &lt;/a&gt;</description>
      <category />
      <guid isPermaLink="true">https://itindex.net/detail/62279-%E7%BC%96%E7%A8%8B%E8%AF%AD%E8%A8%80-%E5%B9%B6%E5%8F%91-%E5%B9%B6%E5%8F%91</guid>
      <pubDate>Sun, 29 May 2022 07:15:54 CST</pubDate>
    </item>
    <item>
      <title>腾讯人最喜欢的编程语言是什么？ | 内含完整报告_TAPD敏捷研发-CSDN博客</title>
      <link>https://itindex.net/detail/61729-%E8%85%BE%E8%AE%AF-%E7%BC%96%E7%A8%8B%E8%AF%AD%E8%A8%80-%E5%AE%8C%E6%95%B4</link>
      <description>&lt;div&gt;    &lt;p&gt;      &lt;strong&gt;先抛结论：这份报告，含金量很足，请认真研读&lt;/strong&gt;&lt;/p&gt;    &lt;p&gt;刚刚，腾讯正式对外发布2020年度《腾讯研发大数据报告》，这份由腾讯技术委员会出品的报告，披露了过去一年腾讯在研发投入、研发效能及开源协同等方面的重要数据。&lt;/p&gt;    &lt;p&gt;大家普遍关注的问题，在这里都可以找到答案，比如，腾讯人最喜欢什么编程语言，还有什么技术leader坚持写代码，腾讯开源协同进展等等，你都能在这份报告中找到答案。&lt;/p&gt;    &lt;p&gt;准备好了吗，一起带你去感受吧。&lt;/p&gt;    &lt;h3&gt;研发人员占比68%，新增代码20亿行&lt;/h3&gt;    &lt;p&gt;腾讯在研发投入上持续加码。报告显示，2020年腾讯研发人员占公司总人数的68%，同比去年增长16%，在科技企业中位居前列。&lt;/p&gt;    &lt;p&gt;      &lt;img alt="" src="https://img-blog.csdnimg.cn/img_convert/bddb8c61cc0e0150409045682f7fc7cf.png"&gt;&lt;/img&gt;&lt;/p&gt;    &lt;p&gt;在开源协同、自研上云两大技术战略的推动下，腾讯研发效能进一步提升，2020年腾讯新增研发项目超4000个，同比增长22%；新增代码超过20亿行，同比增长67%。研发人员日均完成5242个需求，有30%的需求能够在1天之内得到响应，平均需求响应时长缩短8.66小时，有46%的需求能够在3天内开发完成，单个Bug的平均解决时长较去年缩短了15%，研发更敏捷。&lt;/p&gt;    &lt;p&gt;      &lt;img alt="" src="https://img-blog.csdnimg.cn/img_convert/016758d2535a878caff18858d843cd8b.png"&gt;&lt;/img&gt;&lt;/p&gt;    &lt;p&gt;代码质量也是研发人员关注的重点。腾讯倡导“小批量、多批次”的代码提交策略。2020年，代码评审覆盖率达7成，平均每位评审人参评90次，平均每次评审293行代码。&lt;/p&gt;    &lt;p&gt;      &lt;img alt="" src="https://img-blog.csdnimg.cn/img_convert/95e633d575222b889713046579142200.png"&gt;&lt;/img&gt;&lt;/p&gt;    &lt;p&gt;在研发持续交付方面，腾讯平均每周构建次数达170万次，项目年均产物大小1TB，年均交付次数5万次，全年共推动修复代码Bug和安全漏洞131万个，编译加速累计节省编译耗时5.8万个小时。&lt;/p&gt;    &lt;p&gt;      &lt;img alt="" src="https://img-blog.csdnimg.cn/img_convert/41b9857b9953fb3e89c2fa3180ef3a4d.png"&gt;&lt;/img&gt;&lt;/p&gt;    &lt;h3&gt;DevOps工具协同集成，研发效能持续提升&lt;/h3&gt;    &lt;p&gt;在长期的研发实践中，腾讯推动了代码管理平台工蜂、敏捷研发协作平台 TAPD、智能化持续集成平台腾讯 CI（蓝盾）、集成化研效门户智研、企业级研发云平台等多个工具平台协同集成，共同组成了贯穿上下游的研效工具链体系。这一体系的标准化落地，进一步降低了开发成本、增强了研发人员的使用体验。TAPD、腾讯工蜂、蓝盾三大腾讯主流研发工具的日均API请求量达到四千万次。&lt;/p&gt;    &lt;p&gt;      &lt;img alt="" src="https://img-blog.csdnimg.cn/img_convert/badb5bb6024404959aa2405b62e0edc4.png"&gt;&lt;/img&gt;&lt;/p&gt;    &lt;p&gt;2020年，腾讯通过信通院《研发运营一体化（ DevOps ）能力成熟度模型》系统和工具部分首批评估，获评为卓越级。这意味着腾讯形成了业内领先的研发体系，研发效能工具得到了国家级的权威认可。&lt;/p&gt;    &lt;p&gt;C++蝉联腾讯最受欢迎的编程语言。随着云计算和微服务相关技术的进一步发展，Go语言使用次数增速第一，并超越JavaScript成为腾讯第二受欢迎的编程语言。同时，TypeScript以其优秀的架构设计和高兼容性，成为了2020年增速第二的语言，也是最具潜力的前端语言。&lt;/p&gt;    &lt;p&gt;      &lt;img alt="" src="https://img-blog.csdnimg.cn/img_convert/6aae7069cc88a9bf91b8ccbd9489c272.png"&gt;&lt;/img&gt;&lt;/p&gt;    &lt;p&gt;技术管理人员继续保持在研发方面的高参与度。腾讯70%的技术Leader持续输出代码。2020年全年，平均每人输出3.2万行，并且参与142次代码评审。54%的12级及以上技术专家潜心编码，人均输出代码3万余行，参与98次代码评审。&lt;/p&gt;    &lt;p&gt;      &lt;img alt="" src="https://img-blog.csdnimg.cn/img_convert/7a30ba177f87812360e5ed5d540568e5.png"&gt;&lt;/img&gt;&lt;/p&gt;    &lt;h3&gt;开源协同深入人心，开源贡献度居全球科技企业头部&lt;/h3&gt;    &lt;p&gt;2018年技术委员会成立以来，开源协同已成为腾讯在技术发展层面的一个关键词，开放的技术氛围和开放的代码文化逐渐深入人心。腾讯内部开源代码库新增超过57000个，比2019年增长了29%，有超过17000名研发人员参与贡献内部开源项目。&lt;/p&gt;    &lt;p&gt;      &lt;img alt="" src="https://img-blog.csdnimg.cn/img_convert/a746254e016f55714d11a69eae32cf33.png"&gt;&lt;/img&gt;&lt;/p&gt;    &lt;p&gt;上线两年时间的腾讯内部技术交流社区“码客”，成为了腾讯研发人员精进技术、交流心得的“根据地”。2020年，码客上有200+个技术圈子助力研发人员学习成长。其中，55%的技术问题能够在提出后的1小时内得到响应，84%的技术问题可以在1天内得到解决。医疗AI、黑灰产人机对抗、Rust语言等新技术话题的关注度不断提升。&lt;/p&gt;    &lt;p&gt;除社区分享交流之外，内部竞赛比拼也是腾讯研发人员自我提升的重点方向，2020年腾讯内部技术赛事吸引了近万名研发人员参与，赛事代码总提交次数达316万次。&lt;/p&gt;    &lt;p&gt;      &lt;img alt="" src="https://img-blog.csdnimg.cn/img_convert/217fc7a2cabb86a47e5fe841907446ef.png"&gt;&lt;/img&gt;&lt;/p&gt;    &lt;p&gt;开源向内提升了公司的研发效率，向外则是连接全球开发者共享知识、共建技术的桥梁。2020年是腾讯开源十周年，十年来，腾讯开源项目在Github上的全球Star数每年都有30%的增长，已经成为全球开源贡献最大的科技公司之一。&lt;/p&gt;    &lt;p&gt;腾讯深度参与了数十个国际知名开源项目的贡献，在OpenJDK、KVM等多个顶级开源社区贡献榜中，腾讯均在国内排行第一，作为主要贡献者主导了7个国际知名开源项目的版本发布。腾讯向多个国际顶级开源基金会捐赠了6个开源项目，两大开源项目TencentOS Tiny、TKEstack入选国内首个开源基金会首批捐献项目。&lt;/p&gt;    &lt;p&gt;      &lt;img alt="" src="https://img-blog.csdnimg.cn/img_convert/b196a941a9aec9160405b22c60c44af2.png"&gt;&lt;/img&gt;&lt;/p&gt;    &lt;p&gt;今年抗疫期间，腾讯第一时间参与到Linux基金会全新的公共卫生计划LFPH中，作为中国唯一的创始成员单位，为全球合作抗击疫情做出了贡献。&lt;/p&gt;    &lt;h3&gt;用技术连接公益&lt;/h3&gt;    &lt;p&gt;“技术助力公益”则是腾讯技术文化的温暖一面。2020年，腾讯共有1132名研发人员参与了技术公益志愿者活动，总服务时长超过725个工作日，其中最多的一名同事共参与12个志愿项目。&lt;/p&gt;    &lt;p&gt;      &lt;img alt="" src="https://img-blog.csdnimg.cn/img_convert/aeffd45110dd1c08f020df17f36b432f.png"&gt;&lt;/img&gt;&lt;/p&gt;    &lt;p&gt;腾讯即视团队积极探索AI安全技术在智慧养老领域的落地，打造智能视频分析解决方案，推出了“智能跌倒监测系统”，当系统发现老人跌倒时，会自动识别老人姿态，并自动报警，让老人得到及时救治，使养老更加智能、高效和安全。&lt;/p&gt;    &lt;p&gt;在新冠肺炎疫情爆发的初期，在全国各地的腾讯人快速响应战疫需求，远程协作交付需求9万个，需求交付效率提升17%，交付了许多助疫新项目。通过各类疫情服务小程序，帮助民众更便捷地获取疫情信息和服务；通过腾讯会议、企业微信、腾讯文档等产品，帮助企业远程协作；通过在线教育的综合解决方案，服务全国超 1亿的师生授课、学习；为科研机构提供人工智能和算力支持，加速医药研究。&lt;/p&gt;    &lt;p&gt;      &lt;img alt="" src="https://img-blog.csdnimg.cn/img_convert/6990b0e9923c7abc19700951a47f0e66.png"&gt;&lt;/img&gt;&lt;/p&gt;    &lt;p&gt;扫码观看鹅厂研发大数据揭秘👇&lt;/p&gt;    &lt;p&gt;      &lt;img alt="" src="https://img-blog.csdnimg.cn/20210319160928224.jpg?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MTIwODI2Ng==,size_16,color_FFFFFF,t_70"&gt;&lt;/img&gt;&lt;/p&gt;    &lt;p&gt; &lt;/p&gt;&lt;/div&gt;
    &lt;div&gt; &lt;a href="https://itindex.net/"  title="IT 资讯"&gt;&lt;img src="https://itindex.net/images/iconWarning.gif" title="IT 资讯" border="0"/&gt; &lt;/a&gt;</description>
      <category />
      <guid isPermaLink="true">https://itindex.net/detail/61729-%E8%85%BE%E8%AE%AF-%E7%BC%96%E7%A8%8B%E8%AF%AD%E8%A8%80-%E5%AE%8C%E6%95%B4</guid>
      <pubDate>Tue, 24 Aug 2021 07:43:01 CST</pubDate>
    </item>
    <item>
      <title>人类语言各不相通，历史上第一个翻译是如何做到的？</title>
      <link>https://itindex.net/detail/60407-%E4%BA%BA%E7%B1%BB-%E8%AF%AD%E8%A8%80-%E5%8E%86%E5%8F%B2</link>
      <description>&lt;div&gt;
  &lt;div&gt;

   &lt;div&gt;



&lt;/div&gt;

   &lt;div&gt;




    &lt;div&gt;


     &lt;div&gt;

      &lt;strong&gt;
       &lt;img src="http://pic4.zhimg.com/v2-03c667b01ffaf2734c4532c85fb0f3ef_is.jpg"&gt;&lt;/img&gt;
zeno，恐惧无聊者
       &lt;a href="https://www.zhihu.com/question/375221083/answer/1043332454"&gt;查看知乎原文&lt;/a&gt;
&lt;/strong&gt;

      &lt;div&gt;
       &lt;p&gt;我讲一个田野调查的故事来回答这个问题吧。&lt;/p&gt;
       &lt;p&gt;对濒临灭绝的语言进行田野调查工作并把它们记载下来的人，我通常称他们为追风者。&lt;/p&gt;
       &lt;p&gt;在明治末期，有一个学者把自己的全部人生都献给了日本唯一少数民族阿伊努族的语言研究。他的名字叫金田一京助。在那个语言学方兴未艾的年代，几乎所有的原住民也即土著的语言都被歧视为未开化的语言，劣等语言。阿伊努语亦不例外。在金田一京助之前虽然也有人研究过阿伊努语，但是并未成体系。也从未有人发现阿伊努语里存在着一个巨大的长篇叙事诗。&lt;/p&gt;
       &lt;p&gt;阿伊努人是居住在日本北海道以及库页岛的少数民族，根据考古学上的研究，阿伊努人可能跟最早日本本土的绳文人有渊源。可以说他们很有可能是最早的日本原住民。在此不得不再次提到著名的『p 音考』的作者上田万年。金田一京助可以说最早便是受到了上田万年的精神鼓舞。上田万年曾经叹息说到，全世界只有日本有阿伊努人，阿伊努语的研究是日本学者的责任。&lt;/p&gt;
       &lt;p&gt;然而当时几乎所有语言学者和学生都在研究西方其他语言，没有人关心阿伊努语。金田一京助最开始去北海道阿伊努部落里收集基础单词的。在北海道的阿伊努部落，金田一京助没遇到太大的阻碍，而且金田一京助很聪明，他知道学习阿伊努语收集单词的比较好的对象是年轻女性，部落里的女性比较亲切细心，年轻女性的一些反应都很自然。&lt;/p&gt;
       &lt;p&gt;上了年纪的女性则会比较照顾别人的面子，说错了只要能理解都不会去特意纠正别人，这对语言学习是个很不利的因素。这次的北海道生活使金田一京助最震惊的莫过于ユーカラ这个长篇叙事诗的发现。但是北海道好像已经没有了会背诵完整ユーカラ的人了，所以只记录了一些片段，哪怕是片段的ユーカラ也从傍晚记录到了深夜十二点。&lt;/p&gt;
       &lt;p&gt;当时，有一本英国人传教士バチェラー编写的『アイヌ英和辞典』，这本字典其实是一本不太负责的字典，但是有时候也能派上点用场。令人困惑的是，ユーカラ片段里的单词也好，语法也好，这本字典上什么都查不到&lt;/p&gt;
       &lt;p&gt;。ユーカラ可以说是了解阿伊努和阿伊努语的巨大宝库，可是目前根本无法解读。金田一京助听说更北方的库页岛（サハリン，Sakhalin）上的阿伊努人说的话，北海道的阿伊努人已经听不懂了，于是金田一京助想到了可以去库页岛先研究库页岛的阿伊努语，然后再通过比较这两种阿伊努语来追溯更古老的原形，这也许是解读ユーカラ的唯一途径了。上田万年给了他一百日元，他大伯给了他一百日元，于是金田一京助就揣着这两百日元独自一人前往库页岛了（这个时候的 200 日元，大约相当于现在的 20 万日元，也即一个普通工薪族的月薪）。&lt;/p&gt;
       &lt;p&gt;金田一京助在库页岛的开始的经历可以回答“第一个会英语的人到底是怎么学会的”这个问题了。库页岛上的阿伊努人对日本人是有敌意的（其实就算没有仇恨，对于陌生人也是有防范心的）。一般来说，成年人对于金田一京助根本就不想理会，更不要说跟他交流并且教他阿伊努语了。只有一种人会没有敌意和防范心，那就是小孩。&lt;/p&gt;
       &lt;p&gt;金田一京助在做了四天无用功后终于发现这个绝好的对象，于是凑到正在玩耍的孩子群里去，给他们在地上画画。画了眼睛，孩子们当然毫无顾忌地就会说出“眼睛”这个词的阿伊努语，画了鼻子也会毫无顾忌地说出鼻子的阿伊努语。就这样，收集到了很多基础词，然而这样收集是有限制的，最重要的一个单词并没收集到。这个单词是就是所有语言里都有的“什么”。&lt;/p&gt;
       &lt;p&gt;只要知道了这个单词，就可以用这个单词问更多更多甚至是抽象意义的词语了。于是金田一京助拿出一张纸，在上面画了一个没有人看得懂的东西。孩子们看不懂就自然会问“什么”，这么一来，“什么”就收集到了。这个词就是关键的突破口。&lt;/p&gt;
       &lt;p&gt;在呆了大约 45 天之后，这 45 天的成就放在今天来看是令人咋舌的。不仅收集了 4000 多个单词，而且基本语法大致学会，并且基础的听和说都会了。回来之后，上田万年很是高兴，狠狠地招待了金田一京助一番。靠着这次的成果，金田一京助立刻发现在北海道记录的ユーカラ片段上，库页岛的单词和语法立即派上了用场。&lt;/p&gt;
       &lt;p&gt;这表明，库页岛的阿伊努语是更加古老一点，更加“正宗”一点的阿伊努语。接下来的工作便是继续到库页岛记录更加完整的ユーカラ。当时库页岛还是有少数老人记着比较完整的ユーカラ（库页岛的阿伊努人把它叫做ハウキ）。如果不去库页岛趁着这些老人们还活着记录的话，阿伊努的口传文学长篇叙事诗将永远失传。但是，很多时候，做学问做研究的路是孤独而辛苦的，与很多的学者一样，面临着资金问题。金田一京助打算先找一份学校的国语教师的工作干着，然后一点点地存钱积累研究资金。&lt;/p&gt;
       &lt;p&gt;当他家人知道他要研究阿伊努语时，几乎所有人都是带着失望的目光。就像现代社会中，一个年轻人放弃了薪水很好的工作去辛苦地干着自己想干的事情一样，家人和亲戚的目光总是失望的。这种世俗的目光总是会让人很痛苦。面对着世俗的眼光，金田一京助只有在内心中不停地对自己说：“我坚持做的研究并不是无意义的。”还有一点让人觉得孤独的是，同期的同学们都进入了西方文学、西方哲学等听上去高端大气上档次的思想学科，唯独自己却在研究“野蛮人”的东西。&lt;/p&gt;
       &lt;p&gt;之后，明治 45 年（1912 年），是明治天皇驾崩的一年，这一年，金田一京助经历了人生最痛苦的一年，走到了人生最低谷。长子、好友石川啄木、父亲一个接一个地逝去。并且当时三省堂一度破产，导致金田一京助没有了收入来源。金田一京助曾一度把阿伊努语的笔记本狠狠地摔到榻榻米上想过要放弃这个研究。但是毫无疑问，金田一京助是个很智慧的人，心态的调整很厉害。他反过来想，为了这个事业连父亲都牺牲掉了，怎么能就此放弃。可以说，这是一个化悲痛为力量的典范。&lt;/p&gt;
       &lt;p&gt;正好在那个时候，政治风向上有了变化，随着拓植博览会的召开，在上野的树林里建了很多有乡土味的房子供给日本境内的少数民族居住。于是很多北海道的阿伊努人和库页岛的阿伊努人都来到了上野。这是一个绝好的机会。金田一京助妻子的姐姐是一个很智慧的女性，全力维持生计来支持金田一京助去上野公园跟阿伊努人接触。更加幸运的是，在获得全时间段出入许可后，金田一京助在夜里朗诵起了ユーカラ后，北海道和库页岛的阿伊努人都涌了过来。几乎无人可以想象，在东京会有人知道ユーカラ。&lt;/p&gt;
       &lt;p&gt;很多阿伊努人都是含泪听着金田一京助朗诵的ユーカラ。于是，在这样的契机下，金田一京助就能够融入到阿伊努人的圈子里，阿伊努人都很热心地帮助他解答阿伊努语以及ユーカラ里还不懂的地方。随着知名度的提高，终于有阿伊努人提供了一些可贵的消息源。在北海道的日高沙流川岸边有一个叫紫云古津（しうんこつ）村子，里面住着可能是最后一个ユーカラ记得很完整的盲者老人。他叫ワカルパ。据金田一京助说，他可以称得上是阿伊努的荷马。&lt;/p&gt;
       &lt;p&gt;荷马也是个盲诗人，据说是荷马史诗最后的传诵者。虽然荷马的存在一直有争议，但是正因为有人用文字记录了荷马时代的吟游诗人口头传诵的叙事诗，才得以让宝贵的文学作品兼史料的荷马史诗保存了下来。ワカルパ自己都提出了想有人来记录ユーカラ，这么绝好的机会是非常难得的。然而最大的困难还是经济。&lt;/p&gt;
       &lt;p&gt;上田万年再一次在经济上帮助了金田一京助，对于他来说，上田万年可以说是“士为知己者死”一般的恩师了。就这样把ワカルパ叫到东京来了。从早到晚，大概就这样记录了三个月，大学笔记本花了整整十本。上田万年看到这十本的记录，着实吓了一跳。日本最古老的文献《古事记》的序文中写了古事记整本书都是太安万侣笔头记录了稗田阿礼一个人口述的内容而成的。&lt;/p&gt;
       &lt;p&gt;正好这个时候，日本新一代的古典学者安藤正次等人都觉得一个人是不可能背诵得出那么多的内容的，主张序文的内容不可信。而从ワカルパ的记忆力以及他脑中储存的ユーカラ的信息量来看，这十本内容足以证明人类中是存在具有惊人记忆力的人的。&lt;/p&gt;
       &lt;p&gt;可惜的是，ワカルパ在留下了十本ユーカラ后，回村子里为了给人治病结果自己染病而亡了。金田一京助亲自跑过去悼念他。并且与阿伊努们一起通宵达旦地唱歌，唱的当然便是ユーカラ。很幸运的，又记录了其他老妇人教的其他口传文学（包括一位路过去干活的邻村老妇独个知道的阿伊努的“羽衣传说”）。此后金田一京助的生活开始有了起色。&lt;/p&gt;
       &lt;p&gt;几年后，金田一京助再次去北海道寻找传诵者，这次遇到了 16 岁的阿伊努少女知里幸惠。这是围绕着阿伊努语的另一个悲伤的故事。金田一京助面对着幸惠的“我们阿伊努的ユーカラ真的值得先生如此费心费力吗”提问，告诉她，ユーカラ是伟大的文学作品，跟荷马史诗具有同等价值，是珍贵史料，是宝典也是圣典一般的存在。从此，幸惠开始了ユーカラ的研究。&lt;/p&gt;
       &lt;p&gt;幸惠后来进行了她短暂一生的最后一项工作，把ユーカラ翻译成日语。她的伟大作品『アイヌ神謡集』1922 年 9 月 18 日完成的那一天夜里，幸惠因心脏病发作而过世，那时她才 19 岁。幸惠先天心脏有问题。据金田一京助亲口叙述，就在她把打字机把作品打完并和原稿原文校正完最后一页后，喊了金田一一声后便心脏病发作了。&lt;/p&gt;
       &lt;p&gt;写到这里，之后的幸惠的弟弟，知里真志保的故事我也没有心情再写下去了。1961 年，真志保去世后，只剩金田一京助一个人继续着阿伊努语的研究工作了，他也没有发现还有人愿意继任他的工作，时不时会感叹等自己退休了，阿伊努语的课程恐怕要永远地绝迹了。不过还好，后面总算是有了其他人继续研究阿伊努语。进入 21 世纪后，幸惠的『アイヌ神謡集』开始翻译成其他国家的文字，民间纪念她的人开始多起来了。这也算是对追风者们的一种安慰了吧。&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;


     &lt;div&gt;      &lt;a href="http://www.zhihu.com/question/375221083"&gt;查看知乎讨论&lt;/a&gt;&lt;/div&gt;

&lt;/div&gt;


&lt;/div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt; &lt;a href="https://itindex.net/"  title="IT 资讯"&gt;&lt;img src="https://itindex.net/images/iconWarning.gif" title="IT 资讯" border="0"/&gt; &lt;/a&gt;</description>
      <category />
      <guid isPermaLink="true">https://itindex.net/detail/60407-%E4%BA%BA%E7%B1%BB-%E8%AF%AD%E8%A8%80-%E5%8E%86%E5%8F%B2</guid>
      <pubDate>Mon, 02 Mar 2020 08:21:25 CST</pubDate>
    </item>
    <item>
      <title>Go语言项目的安全评估技术</title>
      <link>https://itindex.net/detail/60137-go-%E8%AF%AD%E8%A8%80-%E9%A1%B9%E7%9B%AE</link>
      <description>&lt;div&gt;  &lt;p&gt;在今年夏天我们对   &lt;a href="https://github.com/trailofbits/audit-kubernetes" rel="nofollow,noindex" target="_blank"&gt;Kubernetes的评估&lt;/a&gt;成功之后，我们收到了大量Go项目的安全评估需求。为此，我们将在其他编译语言中使用过的安全评估技术和策略调整适配到多个Go项目中。&lt;/p&gt;  &lt;p&gt;我们从了解语言的设计开始，识别出开发人员可能无法完全理解语言语义特性的地方。多数这些被误解的语义来自我们向客户报告的调查结果以及对语言本身的独立研究。尽管不是详尽无遗，但其中一些问题领域包括作用域、协程、错误处理和依赖管理。值得注意的是，其中许多与运行时没有直接关系。默认情况下，Go运行时本身的设计是安全的，避免了很多类似C语言的漏洞。&lt;/p&gt;  &lt;p&gt;对根本原因有了更好地理解后，我们搜索了现有的能帮助我们快速有效检测客户端代码库的工具。结果我们找到一些静态和动态开源工具，其中包括了一些与Go无关的工具。为了配合这些工具使用，我们还确定了几种有助于检测的编译器配置。&lt;/p&gt;  &lt;h2&gt;一. 静态分析&lt;/h2&gt;  &lt;p&gt;由于Go是一种编译型语言，因此编译器在生成二进制可执行文件之前就检测并杜绝了许多潜在的错误模式。虽然对于新的Go开发人员来说，这些编译器的输出   &lt;a href="https://tip.golang.org/doc/faq#unused_variables_and_imports" rel="nofollow,noindex" target="_blank"&gt;比较烦&lt;/a&gt;，但是这些警告对于防止意外行为以及保持代码的清洁和可读性非常重要。&lt;/p&gt;  &lt;p&gt;静态分析趋向于捕获很多未包括在编译器错误和警告中的悬而未决的问题。在Go语言生态系统中，有   &lt;a href="https://github.com/mre/awesome-static-analysis#go" rel="nofollow,noindex" target="_blank"&gt;许多不同的工具&lt;/a&gt;，例如   &lt;a href="https://tip.golang.org/cmd/vet/" rel="nofollow,noindex" target="_blank"&gt;go-vet&lt;/a&gt;、   &lt;a href="https://github.com/dominikh/go-tools" rel="nofollow,noindex" target="_blank"&gt;staticcheck&lt;/a&gt;和   &lt;a href="https://godoc.org/golang.org/x/tools/go/analysis" rel="nofollow,noindex" target="_blank"&gt;analysis包&lt;/a&gt;中的工具。这些工具通常会识别出诸如变量遮蔽、不安全的指针使用以及未使用的函数返回值之类的问题。调查这些工具显示警告的项目区域通常会发现可被利用(进行安全攻击)的功能特性。&lt;/p&gt;  &lt;p&gt;这些工具绝不是完美的。例如，go-vet可能会错过非常常见的问题，例如下面例子中这种。&lt;/p&gt;  &lt;pre&gt;package main

import &amp;quot;fmt&amp;quot;

func A() (bool, error) { return false, fmt.Errorf(&amp;quot;I get overridden!&amp;quot;) }

func B() (bool, error) { return true, nil }

func main() {
    aSuccess, err := A()
    bSuccess, err := B()
    if err != nil {
        fmt.Println(err)
    }
    fmt.Println(aSuccess, &amp;quot;:&amp;quot;, bSuccess)
}&lt;/pre&gt;  &lt;p&gt;这个例子未使用A函数的err返回值，并在表达式左侧为bSuccess赋值期间立即重新对err做了赋值。编译器针对这种情况不会提供警告，而go-vet也不会检测到该问题；   &lt;a href="https://github.com/kisielk/errcheck" rel="nofollow,noindex" target="_blank"&gt;errcheck&lt;/a&gt;也不会。实际上，能成功识别这种情况的工具是前面提到的staticcheck和   &lt;a href="https://github.com/gordonklaus/ineffassign" rel="nofollow,noindex" target="_blank"&gt;ineffassign&lt;/a&gt;，它们将A的错误返回值标识为未使用或无效。&lt;/p&gt;  &lt;p&gt;示例程序的输出以及errcheck，go-vet，staticcheck和ineffassign的检查结果如下：&lt;/p&gt;  &lt;pre&gt;$ go run .
false : true
$ errcheck .
$ go vet .
$ staticcheck .
main.go:5:50: error strings should not be capitalized (ST1005)
main.go:5:50: error strings should not end with punctuation or a newline (ST1005)
main.go:10:12: this value of err is never used (SA4006)
$ ineffassign .
main.go:10:12: ineffectual assignment to err&lt;/pre&gt;  &lt;p&gt;当您深入研究此示例时，您可能会想知道为什么编译器没有针对此问题发出警告。当程序中有未使用的变量时，Go编译器将出错，但此示例成功通过编译。这是由“短变量声明”的语义引起的。下面是短变量声明的语法规范：&lt;/p&gt;  &lt;pre&gt;ShortVarDecl = IdentifierList &amp;quot;:=&amp;quot; ExpressionList .&lt;/pre&gt;  &lt;p&gt;根据规范，短变量声明具有重新声明变量的特殊功能，只要：&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;重新声明在多变量短声明中。&lt;/li&gt;   &lt;li&gt;重新声明的变量在同一代码块或函数的参数列表中声明较早。&lt;/li&gt;   &lt;li&gt;重新声明的变量与先前的声明具有相同的类型。&lt;/li&gt;   &lt;li&gt;声明中至少有一个非空白变量(“_”)是新变量。&lt;/li&gt;&lt;/ul&gt;  &lt;p&gt;所有这些约束在上一个示例中均得到满足，从而防止了编译器针对此问题产生编译错误。&lt;/p&gt;  &lt;p&gt;许多工具都具有类似这样的极端情况，即它们在识别相关问题或识别问题但以不同的方式描述时均未成功。使问题复杂化的是，这些工具通常需要先构建Go源代码，然后才能执行分析。如果分析人员无法轻松构建代码库或其依赖项，这将使第三方安全评估变得复杂。&lt;/p&gt;  &lt;p&gt;尽管存在这些困难，但只要付出一点点努力，这些工具就可以很好地提示我们在项目中从何处查找问题。我们建议至少使用   &lt;a href="https://github.com/securego/gosec" rel="nofollow,noindex" target="_blank"&gt;gosec&lt;/a&gt;、   &lt;a href="https://tip.golang.org/cmd/vet/" rel="nofollow,noindex" target="_blank"&gt;go-vet&lt;/a&gt;和   &lt;a href="https://staticcheck.io/" rel="nofollow,noindex" target="_blank"&gt;staticcheck&lt;/a&gt;。对大多数代码库而言，这些工具具有良好的文档和人机工效。他们还提供了针对常见问题的多种检查（例如ineffassign或errcheck）。但是，要对特定类型的问题进行更深入的分析，可能必须使用更具体的分析器，直接针对   &lt;a href="https://godoc.org/golang.org/x/tools/go/ssa" rel="nofollow,noindex" target="_blank"&gt;SSA&lt;/a&gt;开发定制的工具或使用   &lt;a href="https://semmle.com/" rel="nofollow,noindex" target="_blank"&gt;semmle&lt;/a&gt;。&lt;/p&gt;  &lt;h2&gt;二. 动态分析&lt;/h2&gt;  &lt;p&gt;一旦执行了静态分析并检查了结果，动态分析技术通常是获得更深层结果的下一步。由于Go的内存安全性，动态分析通常发现的问题是导致硬崩溃(hard crash)或程序状态无效的问题。Go社区已经建立了各种工具和方法来帮助识别Go生态系统中这些类型的问题。此外，可以改造现有的与语言无关的工具以满足Go动态分析的需求，我们将在下面展示。&lt;/p&gt;  &lt;h3&gt;1. 模糊测试&lt;/h3&gt;  &lt;p&gt;Go语言领域中最著名的动态测试工具可能是   &lt;a href="https://github.com/dvyukov/" rel="nofollow,noindex" target="_blank"&gt;Dimitry Vyukov&lt;/a&gt;的   &lt;a href="https://github.com/dvyukov/go-fuzz" rel="nofollow,noindex" target="_blank"&gt;go-fuzz&lt;/a&gt;了。该工具使您可以快速有效地实施模糊测试，并且它已经有了不错的   &lt;a href="https://github.com/dvyukov/go-fuzz#trophies" rel="nofollow,noindex" target="_blank"&gt;战利品&lt;/a&gt;。更高级的用户在猎错过程中可能还会发现   &lt;a href="https://github.com/dvyukov/go-fuzz#random-notes" rel="nofollow,noindex" target="_blank"&gt;分布式的模糊测试&lt;/a&gt;和   &lt;a href="https://github.com/dvyukov/go-fuzz#libfuzzer-support" rel="nofollow,noindex" target="_blank"&gt;libFuzzer的支持&lt;/a&gt;非常有用。&lt;/p&gt;  &lt;p&gt;Google还发布了一个更原生的模糊器(fuzzer)，它拥有一个与上面的go-fuzz相似的名字：   &lt;a href="https://github.com/google/gofuzz" rel="nofollow,noindex" target="_blank"&gt;gofuzz&lt;/a&gt;。它通过初始化具有随机值的结构来帮助用户。与Dimitry的go-fuzz不同，Google的gofuzz不会生成夹具(harness)或协助提供存储崩溃时的输出信息、模糊输入或任何其他类型的信息。尽管这对于测试某些目标可能是不利的，但它使轻量级且可扩展的框架成为可能。&lt;/p&gt;  &lt;p&gt;为了简洁起见，我们请您参考各自自述文件中这两个工具的示例。&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;    &lt;a href="https://github.com/google/gofuzz#gofuzz" rel="nofollow,noindex" target="_blank"&gt;google/gofuzz#gofuzz&lt;/a&gt;&lt;/li&gt;   &lt;li&gt;    &lt;a href="https://github.com/dvyukov/go-fuzz#usage" rel="nofollow,noindex" target="_blank"&gt;dvyukov/go-fuzz#usage&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;  &lt;h3&gt;2. 属性测试(property test)&lt;/h3&gt;  &lt;p&gt;译注：属性测试指编写对你的代码来说为真的逻辑语句（即“属性”），然后使用自动化工具来生成测试输入（一般来说，是指某种特定类型的随机生成输入数据），并观察程序接受该输入时属性是否保持不变。如果某个输入违反了某一条属性，则证明用户程序存在错误 – 摘自网络。&lt;/p&gt;  &lt;p&gt;与传统的模糊测试方法不同，Go的testing包（通常用于单元测试和集成测试）为Go函数的“黑盒测试” 提供了   &lt;a href="https://golang.org/pkg/testing/quick/" rel="nofollow,noindex" target="_blank"&gt;testing/quick子包&lt;/a&gt;。换句话说，它提供了属性测试的基本原语。给定一个函数和生成器，该包可用于构建夹具，以测试在给定输入生成器范围的情况下潜在的属性违规。以下示例是直接摘自官方文档。&lt;/p&gt;  &lt;pre&gt;func TestOddMultipleOfThree(t *testing.T) {
    f := func(x int) bool {
        y := OddMultipleOfThree(x)
        return y%2 == 1 &amp;amp;&amp;amp; y%3 == 0
    }
    if err := quick.Check(f, nil); err != nil {
        t.Error(err)
    }
}&lt;/pre&gt;  &lt;p&gt;上面示例正在测试OddMultipleOfThree函数，其返回值应始终为3的奇数倍。如果不是，则f函数将返回false并将违反该属性。这是由quick.Check功能检测到的。&lt;/p&gt;  &lt;p&gt;虽然此包提供的功能对于属性测试的简单应用是可以接受的，但重要的属性通常不能很好地适合这种基本界面。为了解决这些缺点，诞生了   &lt;a href="https://github.com/leanovate/gopter" rel="nofollow,noindex" target="_blank"&gt;leanovate/gopter框架&lt;/a&gt;。Gopter为常见的Go类型提供了各种各样的生成器，并且支持您创建与Gopter兼容的   &lt;a href="https://godoc.org/github.com/leanovate/gopter#Gen" rel="nofollow,noindex" target="_blank"&gt;自定义生成器&lt;/a&gt;。通过   &lt;a href="https://godoc.org/github.com/leanovate/gopter/commands" rel="nofollow,noindex" target="_blank"&gt;gopter/commands子包&lt;/a&gt;还支持状态测试，这对于测试跨操作序列的属性是否有用很有有帮助。除此之外，当违反属性时，Gopter会缩小生成的输入。请参阅下面的输出中输入收缩的属性测试的简要示例。&lt;/p&gt;  &lt;p&gt;Compute结构的测试夹具：&lt;/p&gt;  &lt;pre&gt;package main_test
import (
  &amp;quot;github.com/leanovate/gopter&amp;quot;
  &amp;quot;github.com/leanovate/gopter/gen&amp;quot;
  &amp;quot;github.com/leanovate/gopter/prop&amp;quot;
  &amp;quot;math&amp;quot;
  &amp;quot;testing&amp;quot;
)

type Compute struct {
  A uint32
  B uint32
}

func (c *Compute) CoerceInt () { c.A = c.A % 10; c.B = c.B % 10; }
func (c Compute) Add () uint32 { return c.A + c.B }
func (c Compute) Subtract () uint32 { return c.A - c.B }
func (c Compute) Divide () uint32 { return c.A / c.B }
func (c Compute) Multiply () uint32 { return c.A * c.B }

func TestCompute(t *testing.T) {
  parameters := gopter.DefaultTestParameters()
  parameters.Rng.Seed(1234) // Just for this example to generate reproducible results

  properties := gopter.NewProperties(parameters)

  properties.Property(&amp;quot;Add should never fail.&amp;quot;, prop.ForAll(
    func(a uint32, b uint32) bool {
      inpCompute := Compute{A: a, B: b}
      inpCompute.CoerceInt()
      inpCompute.Add()
      return true
    },
    gen.UInt32Range(0, math.MaxUint32),
    gen.UInt32Range(0, math.MaxUint32),
  ))

  properties.Property(&amp;quot;Subtract should never fail.&amp;quot;, prop.ForAll(
    func(a uint32, b uint32) bool {
      inpCompute := Compute{A: a, B: b}
      inpCompute.CoerceInt()
      inpCompute.Subtract()
      return true
    },
    gen.UInt32Range(0, math.MaxUint32),
    gen.UInt32Range(0, math.MaxUint32),
  ))

  properties.Property(&amp;quot;Multiply should never fail.&amp;quot;, prop.ForAll(
    func(a uint32, b uint32) bool {
      inpCompute := Compute{A: a, B: b}
      inpCompute.CoerceInt()
      inpCompute.Multiply()
      return true
    },
    gen.UInt32Range(0, math.MaxUint32),
    gen.UInt32Range(0, math.MaxUint32),
  ))

  properties.Property(&amp;quot;Divide should never fail.&amp;quot;, prop.ForAll(
    func(a uint32, b uint32) bool {
      inpCompute := Compute{A: a, B: b}
      inpCompute.CoerceInt()
      inpCompute.Divide()
      return true
    },
    gen.UInt32Range(0, math.MaxUint32),
    gen.UInt32Range(0, math.MaxUint32),
  ))

  properties.TestingRun(t)
}&lt;/pre&gt;  &lt;p&gt;执行测试夹具并观察属性测试的输出（除法失败）：&lt;/p&gt;  &lt;pre&gt;user@host:~/Desktop/gopter_math$ go test
+ Add should never fail.: OK, passed 100 tests.
Elapsed time: 253.291µs
+ Subtract should never fail.: OK, passed 100 tests.
Elapsed time: 203.55µs
+ Multiply should never fail.: OK, passed 100 tests.
Elapsed time: 203.464µs
! Divide should never fail.: Error on property evaluation after 1 passed
   tests: Check paniced: runtime error: integer divide by zero
goroutine 5 [running]:
runtime/debug.Stack(0x5583a0, 0xc0000ccd80, 0xc00009d580)
    /usr/lib/go-1.12/src/runtime/debug/stack.go:24 +0x9d
github.com/leanovate/gopter/prop.checkConditionFunc.func2.1(0xc00009d9c0)
    /home/user/go/src/github.com/leanovate/gopter/prop/check_condition_func.g
  o:43 +0xeb
panic(0x554480, 0x6aa440)
    /usr/lib/go-1.12/src/runtime/panic.go:522 +0x1b5
_/home/user/Desktop/gopter_math_test.Compute.Divide(...)
    /home/user/Desktop/gopter_math/main_test.go:18
_/home/user/Desktop/gopter_math_test.TestCompute.func4(0x0, 0x0)
    /home/user/Desktop/gopter_math/main_test.go:63 +0x3d
# snip for brevity;

ARG_0: 0
ARG_0_ORIGINAL (1 shrinks): 117380812
ARG_1: 0
ARG_1_ORIGINAL (1 shrinks): 3287875120
Elapsed time: 183.113µs
--- FAIL: TestCompute (0.00s)
    properties.go:57: failed with initial seed: 1568637945819043624
FAIL
exit status 1
FAIL    _/home/user/Desktop/gopter_math 0.004s&lt;/pre&gt;  &lt;h3&gt;3. 故障注入&lt;/h3&gt;  &lt;p&gt;在攻击Go系统时，故障注入令人惊讶地有效。我们使用此方法发现的最常见错误包括对error类型的处理。因为error在Go中只是一种类型，所以当它返回时，它不会像panic语句那样自行改变程序的执行流程。我们通过强制生成来自最低级别(内核)的错误来识别此类错误。由于Go会生成静态二进制文件，因此必须在不使用LD_PRELOAD的情况下注入故障。我们的工具之一   &lt;a href="https://github.com/trailofbits/krf" rel="nofollow,noindex" target="_blank"&gt;KRF&lt;/a&gt;使我们能够做到这一点。&lt;/p&gt;  &lt;p&gt;在我们最近的Kubernetes代码库评估中，我们使用KRF找到了一个vendored依赖深处的   &lt;a href="https://github.com/kubernetes/kubernetes/issues/81135" rel="nofollow,noindex" target="_blank"&gt;问题&lt;/a&gt;，只需通过随机为进程和其子进程发起的read和write系统调用制造故障。该技术对通常与底层系统交互的Kubelet十分有效。该错误是在ionice命令出现错误时触发的，未向STDOUT输出信息并向STDERR发送错误。记录错误后，将继续执行而不是将STDERR的错误返回给调用方。这导致STDOUT后续被索引，从而导致索引超出范围导致运行时panic。&lt;/p&gt;  &lt;p&gt;下面是导致kubelet panic的调用栈信息：&lt;/p&gt;  &lt;pre&gt;E0320 19:31:54.493854    6450 fs.go:591] Failed to read from stdout for cmd [ionice -c3 nice -n 19 du -s /var/lib/docker/overlay2/bbfc9596c0b12fb31c70db5ffdb78f47af303247bea7b93eee2cbf9062e307d8/diff] - read |0: bad file descriptor
panic: runtime error: index out of range

goroutine 289 [running]:
k8s.io/kubernetes/vendor/github.com/google/cadvisor/fs.GetDirDiskUsage(0xc001192c60, 0x5e, 0x1bf08eb000, 0x1, 0x0, 0xc0011a7188)
    /workspace/anago-v1.13.4-beta.0.55+c27b913fddd1a6/src/k8s.io/kubernetes/_output/dockerized/go/src/k8s.io/kubernetes/vendor/github.com/google/cadvisor/fs/fs.go:600 +0xa86
k8s.io/kubernetes/vendor/github.com/google/cadvisor/fs.(*RealFsInfo).GetDirDiskUsage(0xc000bdbb60, 0xc001192c60, 0x5e, 0x1bf08eb000, 0x0, 0x0, 0x0)
    /workspace/anago-v1.13.4-beta.0.55+c27b913fddd1a6/src/k8s.io/kubernetes/_output/dockerized/go/src/k8s.io/kubernetes/vendor/github.com/google/cadvisor/fs/fs.go:565 +0x89
k8s.io/kubernetes/vendor/github.com/google/cadvisor/container/common.(*realFsHandler).update(0xc000ee7560, 0x0, 0x0)
    /workspace/anago-v1.13.4-beta.0.55+c27b913fddd1a6/src/k8s.io/kubernetes/_output/dockerized/go/src/k8s.io/kubernetes/vendor/github.com/google/cadvisor/container/common/fsHandler.go:82 +0x36a
k8s.io/kubernetes/vendor/github.com/google/cadvisor/container/common.(*realFsHandler).trackUsage(0xc000ee7560)
    /workspace/anago-v1.13.4-beta.0.55+c27b913fddd1a6/src/k8s.io/kubernetes/_output/dockerized/go/src/k8s.io/kubernetes/vendor/github.com/google/cadvisor/container/common/fsHandler.go:120 +0x13b
created by
k8s.io/kubernetes/vendor/github.com/google/cadvisor/container/common.(*realFsHandler).Start
    /workspace/anago-v1.13.4-beta.0.55+c27b913fddd1a6/src/k8s.io/kubernetes/_output/dockerized/go/src/k8s.io/kubernetes/vendor/github.com/google/cadvisor/container/common/fsHandler.go:142 +0x3f&lt;/pre&gt;  &lt;p&gt;下面例子：记录了STDERR日志但未将error返回调用方。&lt;/p&gt;  &lt;pre&gt;stdoutb, souterr := ioutil.ReadAll(stdoutp)
if souterr != nil {
    klog.Errorf(&amp;quot;Failed to read from stdout for cmd %v - %v&amp;quot;, cmd.Args, souterr)
}&lt;/pre&gt;  &lt;p&gt;当stdout为空，也尝试使用索引，这是运行时出现panic的原因：&lt;/p&gt;  &lt;pre&gt;usageInKb, err := strconv.ParseUint(strings.Fields(stdout)[0], 10, 64)&lt;/pre&gt;  &lt;p&gt;更完整的包含重现上述问题的步骤，可参见我们的   &lt;a href="https://github.com/kubernetes/community/blob/master/wg-security-audit/findings/Kubernetes%20Final%20Report.pdf" rel="nofollow,noindex" target="_blank"&gt;Kubernetes最终报告&lt;/a&gt;附录G（第109页），那里详细介绍了针对Kubelet使用KRF的方法。&lt;/p&gt;  &lt;p&gt;Go的编译器还允许将测量工具包含在二进制文件中，从而可以在运行时检测race状况，这对于将潜在的race识别为攻击者非常有用，但也可以用来识别对defer、panic和recover的不正确处理。我们构建了   &lt;a href="https://github.com/trailofbits/on-edge" rel="nofollow,noindex" target="_blank"&gt;Trailofbits/on-edge&lt;/a&gt;来做到这一点：识别函数入口点和函数panic点之间的全局状态变化，并通过Go race检测器”泄露”此信息。有关OnEdge的更多详细信息，请参见我们以前的博客文章   &lt;a href="https://blog.trailofbits.com/2019/06/26/panicking-the-right-way-in-go/" rel="nofollow,noindex" target="_blank"&gt;“在Go中选择正确panic的方式”&lt;/a&gt;。&lt;/p&gt;  &lt;p&gt;实践中，我们建议使用：&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;dvyukov/go-fuzz为组件解析输入建立夹具&lt;/li&gt;   &lt;li&gt;google/gofuzz用于测试结构验证&lt;/li&gt;   &lt;li&gt;leanovate/gopter用于增强现有的单元和集成测试以及测试规范的正确性&lt;/li&gt;   &lt;li&gt;Trailofbits/krf和Trailofbits/on-edge用于测试错误处理。&lt;/li&gt;&lt;/ul&gt;  &lt;p&gt;除KRF外，所有这些工具在实践中都需要付出一些努力。&lt;/p&gt;  &lt;h2&gt;三. 利用编译器的优势&lt;/h2&gt;  &lt;p&gt;Go编译器具有许多内置功能和指令(directive)，可帮助我们查找错误。这些功能隐藏在各种开关中中，并且需要一些配置才能达到我们的目的。&lt;/p&gt;  &lt;h3&gt;1. 颠覆类型系统&lt;/h3&gt;  &lt;p&gt;有时在尝试测试系统功能时，导出函数不是我们要测试的。要获得对所需的函数的测试访问权，可能需要重命名许多函数，以便可以将其导出，这可能会很麻烦。要解决此问题，可以使用编译器的   &lt;a href="https://tip.golang.org/cmd/compile/#hdr-Compiler_Directives" rel="nofollow,noindex" target="_blank"&gt;build指令(directive)&lt;/a&gt;进行名称链接(name linking)以及导出系统的访问控制。作为此功能的示例，下面的程序（从   &lt;a href="https://stackoverflow.com/a/32135975" rel="nofollow,noindex" target="_blank"&gt;Stack Overflow答案&lt;/a&gt;中提取）访问未导出的reflect.typelinks函数，并随后迭代类型链接表以识别已编译程序中存在的类型。&lt;/p&gt;  &lt;p&gt;下面是使用linkname build directive的Stack Overflow答案的通用版本:&lt;/p&gt;  &lt;pre&gt;package main

import (
    &amp;quot;fmt&amp;quot;
    &amp;quot;reflect&amp;quot;
    &amp;quot;unsafe&amp;quot;
)

func Typelinks() (sections []unsafe.Pointer, offset [][]int32) {
    return typelinks()
}

//go:linkname typelinks reflect.typelinks
func typelinks() (sections []unsafe.Pointer, offset [][]int32)

func Add(p unsafe.Pointer, x uintptr, whySafe string) unsafe.Pointer {
    return add(p, x, whySafe)
}

//go:linkname add reflect.add
func add(p unsafe.Pointer, x uintptr, whySafe string) unsafe.Pointer

func main() {
    sections, offsets := Typelinks()
    for i, base := range sections {
        for _, offset := range offsets[i] {
            typeAddr := Add(base, uintptr(offset), &amp;quot;&amp;quot;)
            typ := reflect.TypeOf(*(*interface{})(unsafe.Pointer(&amp;amp;typeAddr)))
            fmt.Println(typ)
        }
    }
}&lt;/pre&gt;  &lt;p&gt;下面是typelinks表的输出：&lt;/p&gt;  &lt;pre&gt;$ go run main.go
**reflect.rtype
**runtime._defer
**runtime._type
**runtime.funcval
**runtime.g
**runtime.hchan
**runtime.heapArena
**runtime.itab
**runtime.mcache
**runtime.moduledata
**runtime.mspan
**runtime.notInHeap
**runtime.p
**runtime.special
**runtime.sudog
**runtime.treapNode
**sync.entry
**sync.poolChainElt
**syscall.Dirent
**uint8&lt;/pre&gt;  &lt;p&gt;如果需要在运行时进行更精细的控制（即，不仅仅是linkname指令），则可以编写Go的   &lt;a href="https://golang.org/doc/asm#introduction" rel="nofollow,noindex" target="_blank"&gt;中间汇编码&lt;/a&gt;，并在编译过程中包括它。尽管在某些地方它可能不完整且有些过时，但是   &lt;a href="https://golang.org/doc/asm#introduction" rel="nofollow,noindex" target="_blank"&gt;teh-cmc/go-internals&lt;/a&gt;提供了有关Go如何组装函数的很好的介绍。&lt;/p&gt;  &lt;h3&gt;2. 编译器生成的覆盖图&lt;/h3&gt;  &lt;p&gt;为了帮助进行测试，Go编译器可以   &lt;a href="https://blog.golang.org/cover" rel="nofollow,noindex" target="_blank"&gt;执行预处理&lt;/a&gt;以生成coverage信息。这旨在标识单元测试和集成测试的测试覆盖范围信息，但是我们也可以使用它来标识由模糊测试和属性测试生成的测试覆盖范围。Filippo Valsorda在   &lt;a href="https://blog.cloudflare.com/go-coverage-with-external-tests/" rel="nofollow,noindex" target="_blank"&gt;博客文章&lt;/a&gt;中提供了一个简单的示例。&lt;/p&gt;  &lt;h3&gt;3. 类型宽度安全&lt;/h3&gt;  &lt;p&gt;Go支持根据目标平台自动确定整数和浮点数的大小。但是，它也允许使用固定宽度的定义，例如int32和int64。当混合使用自动宽度和固定宽度大小时，对于跨多个目标平台的行为，可能会出现错误的假设。&lt;/p&gt;  &lt;p&gt;针对目标的32位和64位平台构建进行测试将有助于识别特定于平台的问题。这些问题通常在执行验证、解码或类型转换的时候发现，原因在于对源和目标类型属性做出了不正确的假设。在Kubernetes安全评估中就有一些这样的示例，特别是   &lt;a href="https://github.com/kubernetes/kubernetes/issues/81121" rel="nofollow,noindex" target="_blank"&gt;TOB-K8S-015：使用strconv.Atoi并将结果向下转换时的溢出&lt;/a&gt;（Kubernetes最终报告中的第42页），下面是这个示例。&lt;/p&gt;  &lt;pre&gt;// updatePodContainers updates PodSpec.Containers.Ports with passed parameters.
func updatePodPorts(params map[string]string, podSpec *v1.PodSpec) (err error) {
    port := -1
    hostPort := -1
    if len(params[&amp;quot;port&amp;quot;]) &amp;gt; 0 {
        port, err = strconv.Atoi(params[&amp;quot;port&amp;quot;]) // &amp;lt;-- this should parse port as strconv.ParseUint(params[&amp;quot;port&amp;quot;], 10, 16)
        if err != nil {
            return err
        }
    }
       // (...)
    // Don&amp;apos;t include the port if it was not specified.
    if len(params[&amp;quot;port&amp;quot;]) &amp;gt; 0 {
        podSpec.Containers[0].Ports = []v1.ContainerPort{
            {
                ContainerPort: int32(port), // &amp;lt;-- this should later just be uint16(port)
            },
        }&lt;/pre&gt;  &lt;p&gt;错误的类型宽度假设导致的溢出：&lt;/p&gt;  &lt;pre&gt;root@k8s-1:/home/vagrant# kubectl expose deployment nginx-deployment --port 4294967377 --target-port 4294967376
E0402 09:25:31.888983    3625 intstr.go:61] value: 4294967376 overflows int32
goroutine 1 [running]:
runtime/debug.Stack(0xc000e54eb8, 0xc4f1e9b8, 0xa3ce32e2a3d43b34)
    /usr/local/go/src/runtime/debug/stack.go:24 +0xa7
k8s.io/kubernetes/vendor/k8s.io/apimachinery/pkg/util/intstr.FromInt(0x100000050, 0xa, 0x100000050, 0x0, 0x0)
...
service/nginx-deployment exposed&lt;/pre&gt;  &lt;p&gt;实际上，很少需要颠覆类型系统。最需要的测试目标已经是导出了的，可以通过import获得。我们建议仅在需要助手和测试类似的未导出函数时才使用此功能。至于测试类型宽度安全性，我们建议您尽可能对所有目标进行编译，即使没有直接支持也是如此，因为不同目标上的问题可能更明显。最后，我们建议至少生成包含单元测试和集成测试的项目的覆盖率报告。它有助于确定未经直接测试的区域，这些区域可以优先进行审查。&lt;/p&gt;  &lt;h2&gt;四. 有关依赖的说明&lt;/h2&gt;  &lt;p&gt;在诸如JavaScript和Rust的语言中，依赖项管理器内置了对依赖项审核的支持-扫描项目依赖项以查找已知存在漏洞的版本。在Go中，不存在这样的工具，至少没有处于公开可用且非实验状态的。&lt;/p&gt;  &lt;p&gt;这种缺乏可能是由于存在多种不同的依赖关系管理方法：   &lt;a href="https://blog.golang.org/using-go-modules" rel="nofollow,noindex" target="_blank"&gt;go-mod&lt;/a&gt;，   &lt;a href="https://golang.org/cmd/go/#hdr-Legacy_GOPATH_go_get" rel="nofollow,noindex" target="_blank"&gt;go-get&lt;/a&gt;，   &lt;a href="https://golang.org/cmd/go/#hdr-Vendor_Directories" rel="nofollow,noindex" target="_blank"&gt;vendored&lt;/a&gt;等。这些不同的方法使用根本不同的实现方案，导致无法直接识别依赖关系及其版本。此外，在某些情况下，开发人员通常会随后修改其vendor的依赖的源代码。&lt;/p&gt;  &lt;p&gt;在Go的开发过程中，依赖管理问题的解决已经取得了进展，大多数开发人员都在朝使用go mod的方向发展。这样就可以通过项目中的go.mod跟踪和依赖项并进行版本控制，从而为以后的依赖项扫描工作打开了大门。我们可以在   &lt;a href="https://github.com/jeremylong/DependencyCheck" rel="nofollow,noindex" target="_blank"&gt;OWASP DependencyCheck工具&lt;/a&gt;中看到此类工作的示例，该工具是具有实验性质的go mod插件。&lt;/p&gt;  &lt;h2&gt;五. 结论&lt;/h2&gt;  &lt;p&gt;最终，Go生态系统中有许多可以使用的工具。尽管大多数情况是完全不同的，但是各种静态分析工具可帮助识别给定项目中的“悬而未决的问题”。当寻求更深层次的关注时，可以使用模糊测试，属性测试和故障注入工具。编译器配置随后增强了动态技术，使构建测试夹具和评估其有效性变得更加容易。&lt;/p&gt;  &lt;p&gt;本文翻译自   &lt;a href="https://blog.trailofbits.com/2019/11/07/attacking-go-vr-ttps/" rel="nofollow,noindex" target="_blank"&gt;“Security assessment techniques for Go projects”&lt;/a&gt;。&lt;/p&gt;  &lt;p&gt;我的网课“   &lt;a href="https://coding.imooc.com/class/284.html" rel="nofollow,noindex" target="_blank"&gt;Kubernetes实战：高可用集群搭建、配置、运维与应用&lt;/a&gt;”在慕课网上线了，感谢小伙伴们学习支持！&lt;/p&gt;  &lt;p&gt;   &lt;a href="https://51smspush.com/" rel="nofollow,noindex" target="_blank"&gt;我爱发短信&lt;/a&gt;：企业级短信平台定制开发专家 https://51smspush.com/&lt;/p&gt;  &lt;p&gt;smspush : 可部署在企业内部的定制化短信平台，三网覆盖，不惧大并发接入，可定制扩展； 短信内容你来定，不再受约束, 接口丰富，支持长短信，签名可选。&lt;/p&gt;  &lt;p&gt;著名云主机服务厂商DigitalOcean发布最新的主机计划，入门级Droplet配置升级为：1 core CPU、1G内存、25G高速SSD，价格5$/月。有使用DigitalOcean需求的朋友，可以打开这个   &lt;a href="https://m.do.co/c/bff6eed92687" rel="nofollow,noindex" target="_blank"&gt;链接地址&lt;/a&gt;：https://m.do.co/c/bff6eed92687 开启你的DO主机之路。&lt;/p&gt;  &lt;p&gt;Gopher Daily(Gopher每日新闻)归档仓库 – https://github.com/bigwhite/gopherdaily&lt;/p&gt;  &lt;p&gt;我的联系方式：&lt;/p&gt;  &lt;p&gt;微博：https://weibo.com/bigwhite20xx&lt;/p&gt;  &lt;p&gt;微信公众号：iamtonybai&lt;/p&gt;  &lt;p&gt;博客：tonybai.com&lt;/p&gt;  &lt;p&gt;github: https://github.com/bigwhite&lt;/p&gt;  &lt;div&gt;   &lt;p&gt;微信赞赏：&lt;/p&gt;   &lt;img src="https://img2.tuicool.com/7jmyQfJ.jpg!web"&gt;&lt;/img&gt;&lt;/div&gt;  &lt;p&gt;商务合作方式：撰稿、出书、培训、在线课程、合伙创业、咨询、广告合作。&lt;/p&gt;  &lt;p&gt;© 2019,bigwhite. 版权所有.&lt;/p&gt;&lt;/div&gt;&lt;div&gt; &lt;a href="https://itindex.net/"  title="IT 资讯"&gt;&lt;img src="https://itindex.net/images/iconWarning.gif" title="IT 资讯" border="0"/&gt; &lt;/a&gt;</description>
      <category>tuicool</category>
      <guid isPermaLink="true">https://itindex.net/detail/60137-go-%E8%AF%AD%E8%A8%80-%E9%A1%B9%E7%9B%AE</guid>
      <pubDate>Sat, 09 Nov 2019 00:00:00 CST</pubDate>
    </item>
    <item>
      <title>GO 工具包安装方法  - Go语言中文网 - Golang中文社区</title>
      <link>https://itindex.net/detail/59875-go-%E5%B7%A5%E5%85%B7-%E6%96%B9%E6%B3%95</link>
      <description>&lt;div&gt;    &lt;p&gt;go 安装依赖包一般会通过四种路径      &lt;br /&gt;&lt;/p&gt;    &lt;blockquote&gt;      &lt;p&gt;1.github.com/&lt;/p&gt;      &lt;p&gt;2.golang.org/&lt;/p&gt;      &lt;p&gt;3.gopkg.in/&lt;/p&gt;      &lt;p&gt;4.honnet.co/&lt;/p&gt;&lt;/blockquote&gt;    &lt;p&gt;比如我们可以通过go get github.com/xxx来下载安装包&lt;/p&gt;    &lt;p&gt;下载好之后, 通过go install github.com/xxx来安装包&lt;/p&gt;    &lt;p&gt;安装包会下载到$GOPATH/src文件中&lt;/p&gt;    &lt;p&gt;安装后的执行文件在$GOPATH/bin文件&lt;/p&gt;    &lt;p&gt;      &lt;strong&gt;常见错误&lt;/strong&gt;&lt;/p&gt;    &lt;p&gt;当我们执行go get golang.org/x/tools/cmd/goimports会报错&lt;/p&gt;    &lt;blockquote&gt;      &lt;p&gt;        &lt;em&gt;package golang.org/x/tools/cmd/goimports: unrecognized import path &amp;quot;golang.org/x/tools/cmd/goimports&amp;quot;&lt;/em&gt;&lt;/p&gt;&lt;/blockquote&gt;    &lt;p&gt;这个问题会出现在高版本的 golang, 一般的解决办法是&lt;/p&gt;    &lt;blockquote&gt;      &lt;p&gt;# 创建文件夹&lt;/p&gt;      &lt;p&gt;mkdir$GOPATH/src/golang.org/x/&lt;/p&gt;      &lt;p&gt;# 进入文件夹&lt;/p&gt;      &lt;p&gt;cd$GOPATH/src/golang.org/x/&lt;/p&gt;      &lt;p&gt;# 下载源码&lt;/p&gt;      &lt;p&gt;git clone https://github.com/golang/tools.git&lt;/p&gt;      &lt;p&gt;# 安装&lt;/p&gt;      &lt;p&gt;go install golang.org/x/tools/cmd/goimports&lt;/p&gt;&lt;/blockquote&gt;    &lt;p&gt;同理可解决其他处在golang.org/x/路径下的包&lt;/p&gt;&lt;/div&gt;
    &lt;div&gt; &lt;a href="https://itindex.net/"  title="IT 资讯"&gt;&lt;img src="https://itindex.net/images/iconWarning.gif" title="IT 资讯" border="0"/&gt; &lt;/a&gt;</description>
      <category />
      <guid isPermaLink="true">https://itindex.net/detail/59875-go-%E5%B7%A5%E5%85%B7-%E6%96%B9%E6%B3%95</guid>
      <pubDate>Mon, 29 Jul 2019 11:58:45 CST</pubDate>
    </item>
    <item>
      <title>[深度]周明：自然语言处理的未来之路 | CCF-GAIR 2019</title>
      <link>https://itindex.net/detail/59834-%E6%B7%B1%E5%BA%A6-%E8%87%AA%E7%84%B6%E8%AF%AD%E8%A8%80-%E6%9C%AA%E6%9D%A5%E4%B9%8B%E8%B7%AF</link>
      <description>&lt;p&gt;  &lt;img src="https://static.leiphone.com/uploads/new/images/20190713/5d299f979a4a6.png?imageView2/2/w/740"&gt;&lt;/img&gt;&lt;/p&gt; &lt;p&gt;雷锋网按：7 月 12 日-7 月 14 日，2019 第四届全球人工智能与机器人峰会（CCF-GAIR 2019）于深圳正式召开。峰会由中国计算机学会（CCF）主办，雷锋网、香港中文大学（深圳）承办，深圳市人工智能与机器人研究院协办，得到了深圳市政府的大力指导，是国内人工智能和机器人学术界、工业界及投资界三大领域的顶级交流博览盛会，旨在打造国内人工智能领域极具实力的跨界交流合作平台。&lt;/p&gt; &lt;p&gt;周明博士在CCF-GAIR 2019会议上从什么是自然语言处理（NLP）、当前技术体系以及未来发展等角度，解读了NLP未来发展之路。我们来看。&lt;/p&gt; &lt;p&gt;  &lt;img src="https://static.leiphone.com/uploads/new/images/20190713/5d299f83e3b20.png?imageView2/2/w/740"&gt;&lt;/img&gt;&lt;/p&gt; &lt;p&gt;大家下午好！今天非常荣幸来到CCF-GRIR大会，今天下午这个论坛非常有意义，讲的是中国人工智能四十周年纪念活动。&lt;/p&gt; &lt;p&gt;我是1985年在哈工大开始从事机器翻译研究的，到现在也已经有30多年了，经历了规则、统计和神经网络的三个阶段。回想过去真是感慨万千，当时可以说是筚路蓝缕，没有什么东西，但是大家有一番热情，要把中国自然语言、机器翻译、人工智能推到世界的前沿。&lt;/p&gt; &lt;p&gt;中国人工智能开始于1979年到今天转眼过去40年了。回首看一下我们的自然语言处理进展到什么程度了？我们未来的路在哪里？这就是我今天要给大家介绍的。&lt;/p&gt; &lt;p&gt;过去40年，自然语言基本上经历了从规则到统计，到现在的神经网络。相比过去，目前可以说是自然语言处理最黄金的时期，在很多领域都取得了突破性的进展。但我们审慎地看到神经网络自然语言处理过度依赖计算资源和数据，在建模、推理和解释方面还存在许多的不足。因此我们想问一下，这种模式是否可以持续？在未来的3到5年，NLP如何发展？&lt;/p&gt; &lt;p&gt;为了回答这个问题，我想把神经网络自然语言处理的技术在这里捋一遍，有哪些关键的技术点，存在哪些不足，我们未来又如何发展。我的观点是：NLP未来的发展需要计算、数据、技术、人才、合作、应用等各个方面长期协同发展。&lt;/p&gt; &lt;h2&gt;一、   什么叫自然语言处理？&lt;/h2&gt; &lt;p&gt;什么叫自然语言处理？自然语言处理就是用计算机对人类语言进行处理，使得计算机具备人类的听、说、读、写能力，它是未来人工智能技术最为关键的核心之一。比尔·盖茨说过，“自然语言处理是人工智能皇冠上的明珠，如果我们能够推进自然语言处理，就可以再造一个微软。”&lt;/p&gt; &lt;p&gt;难度：把NLP看作人工智能皇冠上的明珠，其难度可想而知。来看下面这个例子：&lt;/p&gt; &lt;p&gt;  &lt;img src="https://static.leiphone.com/uploads/new/images/20190713/5d299f844b700.png?imageView2/2/w/740"&gt;&lt;/img&gt;&lt;/p&gt; &lt;p&gt;词完全一样，意义截然相反。人在理解的时候有常识，有背景，所以能够理解；可电脑没有常识、没有背景，只是根据字面来处理，因此它理解的都是一样的。这就是自然语言处理的难处。&lt;/p&gt; &lt;p&gt;  &lt;img src="https://static.leiphone.com/uploads/new/images/20190713/5d299f851a6eb.png?imageView2/2/w/740"&gt;&lt;/img&gt;&lt;/p&gt; &lt;p&gt;历史：自然语言处理随着计算机的出现而出现，最早是做规则的系统，后面做统计的系统，现在做神经网络的系统。咱们中国的自然语言出现一点也不晚，建国之初就有人开始做俄汉机器翻译系统，后面又有人做英汉机器翻译系统。我个人也有幸亲历和见证了机器翻译的发展。我在哈工大的读研时候（导师李生教授，1985年），从事中英机器翻译研究，所研制的CEMT系统是中国最早通过正式鉴定的中英机器翻译系统（1989年）。后来我在日本高电社领导研发了中日机器翻译产品J-北京（1998年）。我1999年加入微软之后先后从事了基于实例和基于统计机器翻译研究，最近几年我们做神经机器翻译研究。&lt;/p&gt; &lt;p&gt;可以说中国的自然语言处理是与世界的发展同步的。目前我可以很负责任地说，咱们中国的自然语言处理总体来讲位居世界第二，仅次美国。为什么能有这么好的发展？得益于中国40年改革开放，得益于各大公司和很多学校的合作，尤其值得指出的是微软研究院与相关学校的合作影响深远。同时也得益于包括CCF在内的各个学会过去几十年在NLP领域深耕，举办学术会议（NLPCC最近进入CCF-国际会议列表）和各类暑期学校和讲习班，促进学校、企业、公司各个单位合作，并推动研究协同式、平台式发展。&lt;/p&gt; &lt;p&gt;  &lt;img src="https://static.leiphone.com/uploads/new/images/20190713/5d299f89cca15.png?imageView2/2/w/740"&gt;&lt;/img&gt;&lt;/p&gt; &lt;p&gt;  &lt;strong&gt;定位：&lt;/strong&gt;人工智能就是用电脑来实现人类独具的智能。使得电脑能听、会说、理解语言、会思考、解决问题、会创造。具体概括来讲包括：运算智能、感知智能、认知智能和创造智能。运算智能就是记忆和计算的能力。这一点计算机已经远远超过人类。而感知智能就是电脑感知环境的能力，包括听觉，视觉，触觉等等。相当于人类的耳朵、眼睛和手。认知智能包括语言理解、知识和推理。创造智能体现对未见过、未发生事物，运用经验，通过想象力、设计、实验、验证并予以实现的智力过程。目前随着感知智能的大幅度进步，人们的焦点逐渐转向了认知智能。其中语言智能，也就是自然语言理解，则被认为是皇冠上的明珠。一旦有突破，则会大幅度推动认知智能，并提高人工智能的技术，并促进在很多重要场景落地。&lt;/p&gt; &lt;p&gt;过去几年，由于数据越来越多，出现各种测试集；算法越来越复杂、越来越先进，包括神经网络的架构、预训练模型等等；计算能力越来越高，在这三大因素的作用下，自然语言处理得到了飞速的发展。&lt;/p&gt; &lt;p&gt;  &lt;img src="https://static.leiphone.com/uploads/new/images/20190713/5d299f892651e.png?imageView2/2/w/740"&gt;&lt;/img&gt;   &lt;br /&gt;&lt;/p&gt; &lt;p&gt;微软在四个NLP典型任务取得了突破性的进展。第一个是聊天机器人，我们中、日、英三种语言的聊天机器人均能达到跟人自由聊天23轮以上，目前在世界上是最好的。还有我们的阅读理解技术、机器翻译技术和语法检查系统，在目前的测试集下都居世界领先水平，而且在相应的测试集下都突破了人类的标注水平。&lt;/p&gt; &lt;p&gt;自然语言有很多的应用，像我们每天都用的输入法、词典、翻译，以及我们跟中科院合作的手语翻译、必应的语音助手、小冰，还有自然语言的文本生成，对联、诗词、猜谜、音乐等等。&lt;/p&gt; &lt;h2&gt;二、技术体系&lt;/h2&gt; &lt;p&gt;我给大家捋一下神经网络自然语言处理的技术体系。&lt;/p&gt; &lt;p&gt;  &lt;strong&gt;首先是词的编码。&lt;/strong&gt;词编码的目的是用多维向量来表征词的语义。怎么做呢？著名的方法有两个，一个是CBOW（(Continuous Bag-of-Words），用周围的词预测当前的词；另一个是Skip-gram，用当前的词预测周围的词。通过大规模的学习训练，就可以得到每个词稳定的多维向量，作为它的语义表示。&lt;/p&gt; &lt;p&gt;  &lt;strong&gt;有了词的语义表示，我们就可以进而生成句子的语义表示，也叫句子的编码。&lt;/strong&gt;一般通过RNN（循环神经网络）或者CNN（卷积神经网络）来做。RNN从左到右对句子进行建模，每个词对应一个隐状态，该引状态代表了从句首到当前词的语义信息，句尾的状态就代表了全句的信息。CNN从理论上分别进行词嵌入+位置嵌入+卷积，加上一个向量表示，对应句子的语义。&lt;/p&gt; &lt;p&gt;  &lt;strong&gt;基于这样的表征，我们就可以做编码、解码机制。&lt;/strong&gt;比如说我们可以用图上的红点，它代表全句的语义信息，来进行解码，可以从一种语言翻译成另一种语言，凡是从一个序列串变成另外一个序列串都可以通过编码、解码机制来运行。&lt;/p&gt; &lt;p&gt;  &lt;strong&gt;随后又引入了注意力模型。&lt;/strong&gt;它综合考量了在当前状态下对应的编码的每一个隐状态，加权平均，来体现当前的动态输入。这类技术引入之后，神经网络机器翻译就得到了飞速的发展。&lt;/p&gt; &lt;p&gt;  &lt;strong&gt;后面又引入了Transformer。&lt;/strong&gt;Transformer引入了自编码，一个词跟周围的词建立相似，引入多头，可以引入多种特征表达，所以编码效果或者编码的信息更加丰富。&lt;/p&gt; &lt;p&gt;  &lt;strong&gt;现在大家都在追捧预训练模型。&lt;/strong&gt;它有几个方法，第一个是ELMo，从左到右对句子编码，也可以从右到左对句子编码，每一层对应的节点并起来，就形成了当前这个词在上下文的语义表示。用的时候就用这个语义加上词本身的词嵌入，来做后续的任务，性能便得到相应的提高。&lt;/p&gt; &lt;p&gt;  &lt;strong&gt;还有去年10月份比较火的BERT。&lt;/strong&gt;它用左边、右边的信息来预测最外部的词的信息，同时它也可以判断下一句是真的下一句还是伪造的下一句，用两种方式对句子每一个词进行编码，得到的训练结果就表征了这个词在上下文中的语义表示。基于这样的语义表示，就可以判断两个句子的关系，比如说是不是附属关系，判断一个句子的分类（例如Q&amp;amp;A中，判断回答对应的边界是不是对应提问），以及对输入的每一个词做一个标注，结果就得到一个词性标注。&lt;/p&gt; &lt;p&gt;  &lt;strong&gt;预训练模型引起了很多人的关注。&lt;/strong&gt;最早是一个静态的词的表征，所谓静态词的表征，就是不管上下文，表征是一样的，比如“bank”这个词有多个意思，它的表征也是一样的。但是ELMo就要根据上下文体现它唯一的表征。基于以上的方法，人们又开发了一系列的新的方法，比如说GPT-2，以及最近的XLNET，以及UNILM、MASS、MT-DNN、XLM，都是基于这种思路的扩充，解决相应的任务各有所长。其中微软研究院的UNILM可同时训练得到类似BERT和GPT的模型，而微软MASS采用encoder-decoder训练在机器翻译上效果比较好。还有MT-DNN强调用多任务学习预训练模型，而XLM学习多语言BERT模型，在跨语言迁移学习方面应用效果显著。针对预训练模型很多公司都有一些改进，这里就不一一列举了。   &lt;br /&gt;&lt;/p&gt; &lt;p&gt;   &lt;img src="https://static.leiphone.com/uploads/new/images/20190713/5d299f88c1eaf.png?imageView2/2/w/740"&gt;&lt;/img&gt;&lt;/p&gt; &lt;p&gt;现在由于这种预训练模型大行其道，人们在思考，自然语言处理是不是应该改换一种新的模态。过去我们都说用基于知识的方法来充实当前的输入，但是过去都没有做到特别好，而这种新的预训练模型给我们带来一个新的启发：&lt;/p&gt; &lt;p&gt;我们可以针对大规模的语料，提前训练好一个模型，这个模型既代表了语言的结构信息，也有可能代表了所在领域甚至常识的信息，只不过我们看不懂。加上我们未来的预定的任务，这个任务只有很小的训练样本，把通过大训练样本得到的预训练模型，做到小训练样本上，效果就得到了非常好的提升。&lt;/p&gt; &lt;p&gt;&lt;/p&gt; &lt;h2&gt;三、未来发展&lt;/h2&gt; &lt;p&gt;现在，NLP在许多任务上的性能都已经超越了人类。听起来世界一片大好，我们把数据准备好，买一大堆机器，只需要去训练就好了，不用管太多的事情。所以现在好多人在刷榜，有了新的任务，搞一堆模型、一堆数据、一堆机器，刷个榜，我们就毕业了。&lt;/p&gt; &lt;p&gt;但是我认为不是这样的，反而有强烈的危机感。&lt;/p&gt; &lt;p&gt;下面我就跟大家分析一下，目前存在的问题，以及我们应该怎么做才好。&lt;/p&gt; &lt;p&gt;  &lt;strong&gt;第一个是无休止的计算资源的军备竞赛。&lt;/strong&gt;现在大家都用大规模的机器训练，同样的算法，只要训练速度快，就可以快速迭代，然后你的水平就比别人高。与之同时，当然也特别耗资源，许多模型一训练可能要好几天或者好几万美金。有时候它管事，但有时候也不管事。举个例子：&lt;/p&gt; &lt;p&gt;  &lt;img src="https://static.leiphone.com/uploads/new/images/20190713/5d29a1eb267e7.png?imageView2/2/w/740"&gt;&lt;/img&gt;&lt;/p&gt; &lt;p&gt;在这个例子中，它用了10倍的蛮力，但是只有0.2%的效率提升。由于用了很多的资源，造成了环境的污染。最近有一篇网上比较火的论文，就是在讨论这个计算模型。如果我们太依赖算力，就会对环境产生很大的影响。&lt;/p&gt; &lt;p&gt;  &lt;strong&gt;第二个是过度依赖数据。&lt;/strong&gt;首先你要标数据，标注的代价是非常大的。其次，数据有隐含歧视的问题，通过数据分析，可能会得到歧视性的结果。另外数据有偏差，数据在标注的时候请人标注，人都是偷懒的，想最简单的方法去标注，结果标注的数据千篇一律，基于这样的数据学的模型也只能解决标注的数据，拿到真实任务上由于跟你标注分布不一样，所以根本不好使。比如说我们做Q&amp;amp;A问答系统，我们在所有的问答里面都假设是第一名，但到了搜索引擎上有很多简单的问题都解决不好。此外，还有数据隐私保护等等问题。&lt;/p&gt; &lt;p&gt;我们现在再往前走一走，看一看，假如我们不在乎资源，不在乎计算，我们看神经网络处理一些典型的任务，它的表现如何，有哪些问题。   &lt;br /&gt;&lt;/p&gt; &lt;p&gt;我这里选了三个最典型的问题。第一个是Rich Resource Tasks，即有足够资源的任务，比如中英机器翻译，网上有很多的资源。第二个Low Resources Tasks，即资源很少或没有资源，比如说中文到希伯来语的翻译，几乎没有什么资源。第三个是Multi-turn Tasks，就是多轮的意思，我们的客服都是多轮的。这三类问题基本上代表了自然语言最基本的问题，如果这三类问题都解决得很好，自然语言就基本OK了。我们看看这三类问题现在处于什么位置上。&lt;/p&gt; &lt;p&gt;  &lt;strong&gt;针对Rich Resource Tasks，我们做一个中-英神经网络机器翻译错误分析。&lt;/strong&gt;这是一个大语料训练的结果，&lt;/p&gt; &lt;p&gt;  &lt;img src="https://static.leiphone.com/uploads/new/images/20190713/5d299f8541dbe.png?imageView2/2/w/740"&gt;&lt;/img&gt;   &lt;br /&gt;&lt;/p&gt; &lt;p&gt;我们可以看到，尽管是基于大语料的，但翻出来的结果还有很多错误，包括翻错词、丢词、不合语法等。&lt;/p&gt; &lt;p&gt;  &lt;img src="https://static.leiphone.com/uploads/new/images/20190713/5d299f8746e65.png?imageView2/2/w/740"&gt;&lt;/img&gt;&lt;/p&gt; &lt;p&gt;例如这个“土方”不是“earth”，而是“土耳其”的意思。因为神经网络现在不可解释，它是黑箱，你也不知道它在哪儿丢的，有可能是数据问题，有可能是模型问题。&lt;/p&gt; &lt;p&gt;   &lt;img src="https://static.leiphone.com/uploads/new/images/20190713/5d299f8bf00f6.png?imageView2/2/w/740"&gt;&lt;/img&gt;&lt;/p&gt; &lt;p&gt;还有成语，成语是很麻烦的，你即使学了很多的成语，在一个新的句子中，成语的翻译也要发生变化，所以它要动态的计算。&lt;/p&gt; &lt;p&gt;所以即使在这样的足够资源的算法里面，仍然存在众多的问题要研究，比如说丢词，如何把词典集成进来，如何上下文判断一些问题，然后还有领域自适应、主体自适应等等，谁也不敢说这些问题通过Rich-Resource就解决了，这里面有上下文件联系的问题，还有数据歧视的问题，还有Multi-task learning，还有Human knowledge。&lt;/p&gt; &lt;p&gt;  &lt;strong&gt;第二个是Low Resources Tasks，就是没什么语料，学起来很难，因此要借力。&lt;/strong&gt;常用的有三种。&lt;/p&gt; &lt;ul&gt;  &lt;li&gt;   &lt;p&gt;第一是迁移模型，把从其它语料中学习到的内容迁移过来。迁移训练最常见的就是前面介绍的预训练模型，把它加到目标任务上。&lt;/p&gt;&lt;/li&gt;  &lt;li&gt;   &lt;p&gt;第二是跨语言学习，即从其它语言学习过来。比如说英文有很多语料，我把英文的训练模型用到法语、德语上，这个方式很流行。&lt;/p&gt;&lt;/li&gt;  &lt;li&gt;   &lt;p&gt;第三是利用种子进行迭代学习，比如我有一个小辞典，有几条规则，有几条双语，我能不能用它当做一个引子，做一个冷启动，启动之后再迭代改进。&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;虽然我们做了很多的研究，但是在Low-Resource方面，我们并没有一个很好的办法。首先Low-Resource如何建模，如何从数据分析中做无监督或少监督的学习，这是没有明确回答的问题。怎么做Transfer Learning，怎么做Unsupervised learning，也是目前的一个难题。还有一些先验的规则辞典，如何让它冷启动起来；人能不能参与其中帮助一个开始弱小的系统逐渐变得更加强大。这些都是目前热门的话题，都还没有很好地解决。&lt;/p&gt; &lt;p&gt;  &lt;strong&gt;第三个是Multi-turn Task（多轮问题）。&lt;/strong&gt;以多轮对话为例。我们看下面这个例子：   &lt;br /&gt;&lt;/p&gt; &lt;p&gt;  &lt;img src="https://static.leiphone.com/uploads/new/images/20190713/5d299f8b622a4.png?imageView2/2/w/740"&gt;&lt;/img&gt;&lt;/p&gt; &lt;p&gt;我们可以看到，对于小孩子很简单的问题，电脑却不知道该怎么回答。其原因在于目前的自然语言处理还没有很好地解决常识和推理的问题。&lt;/p&gt; &lt;p&gt;  &lt;img src="https://static.leiphone.com/uploads/new/images/20190713/5d299f8aa79e5.png?imageView2/2/w/740"&gt;&lt;/img&gt;&lt;/p&gt; &lt;p&gt;此外，还有前后不一致、自我矛盾的问题。比如说用户问“你今天多大了”？聊天机器人说“我16了”。隔几天用户又问“你今天多大了”？它可能说“我24岁”，自己前后不一致了.还有空间不一致、逻辑不一致的问题.这就需要人跟机器对话的时候，要有一个记忆体系，把说过的话的特征存储起来，将来在用的时候，要抽取这样的信息来表征一个机器人各方面的信息。&lt;/p&gt; &lt;p&gt;推理是要做很多事情。第一是要了解上下文，说过什么话，答过什么问题，干过什么事都要存储起来，记忆起来。第二是各种各样的知识要用起来。第三才是推理的部分，这里面涉及到语义分析、上下文的指代消解、省略消解。最后，还有就是可解释的问题，如果你的推理不可解释的话，那就没有人会相信，导致你的系统无法进行进一步的推进。&lt;/p&gt; &lt;p&gt;  &lt;img src="https://static.leiphone.com/uploads/new/images/20190713/5d29a30e58d39.png?imageView2/2/w/740"&gt;&lt;/img&gt;&lt;/p&gt; &lt;p&gt;我们要做推理，一般来讲就是设计这样的模型.它有记忆，记住我说过什么话，或者有哪些知识；有一个读的装置和一个写的装置，来了一个问题，经过分析，到记忆里把状态和知识找出来，把原来的记忆找出来，然后改变我们的对话状态；更新在记忆里的一些存储。得到答案后，还要反过来更新我们的记忆和存储。&lt;/p&gt; &lt;h2&gt;四、未来之路&lt;/h2&gt; &lt;p&gt;我们未来到底需要什么样的自然语言处理系统呢？我认为要做出可解释、有知识、有道德、可自我学习的NLP系统。这是一个很高的目标，现在离这个目标差得很远。&lt;/p&gt; &lt;p&gt;我们怎么样来实现这样的目标呢？我们要从具体的任务出发，找出存在的问题。刚才我说了，Rich-Resource存在什么问题呢？上下文建模、数据纠偏、多任务学习、人类知识的理解。再往下，Low-Resource又有什么问题要解决呢？我也列出了一些问题。多轮要解决什么问题呢？就是要解决知识常识、上下文建模、推理机制、可解释等等。&lt;/p&gt; &lt;p&gt;如果我们有所推进的话，我们的认知智能就会进一步提升，包括语言的理解水平、推理水平、回答问题能力、分析能力、解决问题的能力、写作能力、对话能力等等。然后再加上感知智能的进步，声音、图象、文字的识别和生成的能力，以及多模态文、图交叉的能力，通过文字可以生成图象，根据图象可以生成描述的文字等等，我们就可以推进很多人类的应用，包括搜索引擎、智能客服，包括教育、财政、电子商务等等各个方面的应用。也可以把AI技术用在我们的产业上，帮助产业实现数字化转型。&lt;/p&gt; &lt;p&gt;要想实现这件事其实是不容易的，需要各个方面综合努力，所以NLP的未来之路需要不同的公司、学校、政府、企业、投资等等各个角度进行配合。&lt;/p&gt; &lt;p&gt;  &lt;img src="https://static.leiphone.com/uploads/new/images/20190713/5d299f93a2708.png?imageView2/2/w/740"&gt;&lt;/img&gt;&lt;/p&gt; &lt;p&gt;我这里总结一下，主要有6个角度非常重要。&lt;/p&gt; &lt;p&gt;第一是计算机的能力，刚才说到芯片、存储器、云计算和管理，与之有关的还有模型压缩和加速问题。&lt;/p&gt; &lt;p&gt;第二是数据方面，数据非常重要，全社会都要贡献自己的数据，然后取长补短，大家一起努力。数据上面还有一个隐私保护下的学习，这是非常重要的一点。&lt;/p&gt; &lt;p&gt;第三是模型，刚才说到很多，有监督的学习、无监督的学习、少监督的学习，然后是预训练模型，还有神经网络跟人类知识和常识如何结合，把推理和可解释性融入到我们的学习体系之中。&lt;/p&gt; &lt;p&gt;第四是人才培养，一定要靠人来实现整体的过程。人才如何进行培养呢？要注重实践性，让他们有很强的实践意识，而不是天天去推公式，还要有逻辑上的理解。&lt;/p&gt; &lt;p&gt;第五是合作，校企合作、不同学科的合作、国家的合作、企业界、投资界、政府各个方面的合作，形成一个生态，大家在里面各得其所，来稳步推进。&lt;/p&gt; &lt;p&gt;第六是强调应用，通过应用获得真实的数据、用户的反馈，然后改进我们的系统，也通过应用提升学生的动手能力，也是通过应用使我们了解人和机器在一个真实的系统里如何相得益彰、互相配合，实现人工智能和人类智能的双向结合。   &lt;br /&gt;&lt;/p&gt; &lt;p&gt;谢谢大家！  &lt;br /&gt;&lt;/p&gt; &lt;p&gt;  &lt;br /&gt;&lt;/p&gt; &lt;p&gt;雷锋网报道。&lt;/p&gt;&lt;div&gt; &lt;a href="https://itindex.net/"  title="IT 资讯"&gt;&lt;img src="https://itindex.net/images/iconWarning.gif" title="IT 资讯" border="0"/&gt; &lt;/a&gt;</description>
      <category>人工智能</category>
      <guid isPermaLink="true">https://itindex.net/detail/59834-%E6%B7%B1%E5%BA%A6-%E8%87%AA%E7%84%B6%E8%AF%AD%E8%A8%80-%E6%9C%AA%E6%9D%A5%E4%B9%8B%E8%B7%AF</guid>
      <pubDate>Sun, 14 Jul 2019 13:52:00 CST</pubDate>
    </item>
    <item>
      <title>个人对全栈工程师和JVM编程语言的一些理解</title>
      <link>https://itindex.net/detail/59306-%E4%B8%AA%E4%BA%BA-%E5%B7%A5%E7%A8%8B%E5%B8%88-jvm</link>
      <description>&lt;p&gt;全栈工程师、JVM生态。&lt;/p&gt;
 &lt;p&gt;我个人对全栈工程师和JVM编程语言的一些理解，大家有不同看法的，我们一起交流梳理下。&lt;/p&gt;
 &lt;p&gt;全栈工程师从我的视角来看，是熟练使用多种编程语言，满足前后端各种业务、技术需求的服务和应用开发。因为语言都有自己的特点、独特性和应用领域，没有能解决所有问题的最佳语言，所以未来混合编程会很普遍，这对开发者也提出了更高要求，需要了解、掌握和使用多种语言。&lt;/p&gt;
 &lt;p&gt;但目前主流观点还是以JavaScript/TypeScript/Node.js为主流的全栈工程师。&lt;/p&gt;
 &lt;p&gt;Java也可简单理解为Android + Server的全栈语言，一个优秀Java工程师可同时完成Android和Server的开发。&lt;/p&gt;
 &lt;p&gt;当然，其它语言也有类似的全栈功能，如：C++。&lt;/p&gt;
 &lt;p&gt;JVM是个巨大生态系统，服务端语言除了Java，还有：Scala、Clojure和Kotlin。&lt;/p&gt;
 &lt;p&gt;Kotlin目前主要还是用于Android开发。&lt;/p&gt;
 &lt;p&gt;Scala是面向对象和函数式语言的混合，因为Apache Spark和Kafka也日益流行，但学习曲线很高。&lt;/p&gt;
 &lt;p&gt;Clojure是JVM上的Lisp，这三门语言的定位可简单描述为：&lt;/p&gt;
 &lt;p&gt;Clojure is about Data, Scala is about Types, Java is about Objects.&lt;/p&gt;
 &lt;p&gt;这三门语言的应用领域是服务端开发，Apache基金会大部分项目是Java项目，&lt;/p&gt;
 &lt;p&gt;若自己定位大数据工程师，是需要在Hadoop和Spark上有深度历练的。&lt;/p&gt;
 &lt;p&gt;一些思考：&lt;/p&gt;
 &lt;p&gt;1、若专注服务端开发，可选择JVM阵营，因为JVM的强项就是服务端；  &lt;br /&gt;
2、除JVM外，Python、PHP、Go也都是Web服务端语言的选择；  &lt;br /&gt;
3、此外，Python是数据科学和人工智能的首选语言；  &lt;br /&gt;
4、全栈开发基本是JavaScript系的天下，从Web、App到Server；  &lt;br /&gt;
5、Java仍是目前市场主流，不是因为它很好，主要是市场决定。更好用的Scala和Clojure是小众语言，生产力更高，若坚持使用并努力提升，机会也很大，毕竟函数式语言是未来，现在主流语言都或多或少在融合函数式编程；  &lt;br /&gt;
6、以生态系统的方式去思考一种编程语言，GitHub Awesome 是个很好的开始。&lt;/p&gt;
 &lt;p&gt;以下语言链接，可拓展思路和关注点：  &lt;br /&gt;
  &lt;a href="https://github.com/sindresorhus/awesome-nodejs" rel="noopener" target="_blank"&gt;Awesome Node.js&lt;/a&gt;  &lt;br /&gt;
  &lt;a href="https://github.com/vinta/awesome-python" rel="noopener" target="_blank"&gt;Awesome Python&lt;/a&gt;  &lt;br /&gt;
  &lt;a href="https://github.com/ziadoz/awesome-php" rel="noopener" target="_blank"&gt;Awesome PHP&lt;/a&gt;  &lt;br /&gt;
  &lt;a href="https://github.com/avelino/awesome-go" rel="noopener" target="_blank"&gt;Awesome Go&lt;/a&gt;  &lt;br /&gt;
  &lt;a href="https://github.com/akullpp/awesome-java" rel="noopener" target="_blank"&gt;Awesome Java&lt;/a&gt;  &lt;br /&gt;
  &lt;a href="https://github.com/KotlinBy/awesome-kotlin" rel="noopener" target="_blank"&gt;Awesome Kotlin&lt;/a&gt;  &lt;br /&gt;
  &lt;a href="https://github.com/lauris/awesome-scala" rel="noopener" target="_blank"&gt;Awesome Scala&lt;/a&gt;  &lt;br /&gt;
  &lt;a href="https://github.com/razum2um/awesome-clojure" rel="noopener" target="_blank"&gt;Awesome Clojure&lt;/a&gt;  &lt;br /&gt;
  &lt;a href="https://github.com/fffaraz/awesome-cpp" rel="noopener" target="_blank"&gt;Awesome C++&lt;/a&gt;
&lt;/p&gt; &lt;p&gt;  &lt;a href="http://www.bshare.cn/share?url=http%3A%2F%2Fblog.huihoo.com%2F%3Fp%3D1416&amp;title=%E4%B8%AA%E4%BA%BA%E5%AF%B9%E5%85%A8%E6%A0%88%E5%B7%A5%E7%A8%8B%E5%B8%88%E5%92%8CJVM%E7%BC%96%E7%A8%8B%E8%AF%AD%E8%A8%80%E7%9A%84%E4%B8%80%E4%BA%9B%E7%90%86%E8%A7%A3" title="&amp;#29992;bShare&amp;#20998;&amp;#20139;&amp;#25110;&amp;#25910;&amp;#34255;&amp;#26412;&amp;#25991;"&gt;   &lt;img alt="&amp;#29992;bShare&amp;#20998;&amp;#20139;&amp;#25110;&amp;#25910;&amp;#34255;&amp;#26412;&amp;#25991;" src="http://static.bshare.cn/frame/images/button_custom1-zh.gif"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;
 &lt;br /&gt;&lt;div&gt; &lt;a href="https://itindex.net/"  title="IT 资讯"&gt;&lt;img src="https://itindex.net/images/iconWarning.gif" title="IT 资讯" border="0"/&gt; &lt;/a&gt;</description>
      <category>Java</category>
      <guid isPermaLink="true">https://itindex.net/detail/59306-%E4%B8%AA%E4%BA%BA-%E5%B7%A5%E7%A8%8B%E5%B8%88-jvm</guid>
      <pubDate>Sat, 23 Feb 2019 22:02:56 CST</pubDate>
    </item>
    <item>
      <title>自然语言处理最新教材开放下载，乔治亚理工大学官方推荐</title>
      <link>https://itindex.net/detail/58428-%E8%87%AA%E7%84%B6%E8%AF%AD%E8%A8%80-%E6%95%99%E6%9D%90-%E5%BC%80%E6%94%BE</link>
      <description>&lt;p&gt;开放地址：https://github.com/jacobeisenstein/gt-nlp-class/tree/master/notes&lt;/p&gt;&lt;p&gt;&lt;img data-ratio="0.44948453608247424" src="https://image.jiqizhixin.com/uploads/editor/2b7052fc-b2be-476b-9994-2b91d926e5c6/1528010174508.png" data-w="1940" class="fr-fic fr-dib" style="width: 700%;"&gt;&lt;/p&gt;&lt;p&gt;Eisenstein 将这一本非常完善的教材称之为「Notes」，它是在乔治亚理工大学学习&lt;mark data-id="c8ff5114-6cbb-49ca-8a89-3ee2826be0b4" data-type="technologies"&gt;自然语言处理&lt;/mark&gt;相关领域所需要了解的基础。例如在介绍&lt;mark data-id="c8ff5114-6cbb-49ca-8a89-3ee2826be0b4" data-type="technologies"&gt;自然语言处理&lt;/mark&gt;理论与方法的课程 CS4650/7650 中，这本开放书籍就作为标准的课程教材。&lt;/p&gt;&lt;p&gt;CS4650/7650 2018 春季课程需要阅读 GitHub 目录下 eisenstein-nlp-notes-jan-10-2018.pdf 文件，而另外一个文件 eisenstein-nlp-notes.pdf 会包含一些章节上的更新，不过它会在整个学期内进行。Eisenstein 表示这本开放书籍也可以用于其它研究或课程，书籍上的任何误差或反馈都能直接发邮件给作者。&lt;/p&gt;&lt;p&gt;&lt;mark data-id="c8ff5114-6cbb-49ca-8a89-3ee2826be0b4" data-type="technologies"&gt;自然语言处理&lt;/mark&gt;是令计算机能访问人类语言的一组方法。在过去的十年中，&lt;mark data-id="c8ff5114-6cbb-49ca-8a89-3ee2826be0b4" data-type="technologies"&gt;自然语言处理&lt;/mark&gt;已经深入了我们的日常生活：自动&lt;mark data-id="7237ee05-f07e-4fd9-a9ac-96e5bc1f50e9" data-type="technologies"&gt;机器翻译&lt;/mark&gt;在网站和社交媒体中已经无处不在、&lt;mark data-id="3fe4290f-6dd3-43ed-9324-cf23aa588830" data-type="technologies"&gt;文本分类&lt;/mark&gt;确保了电子邮箱在海量垃圾邮件中屹立不倒、搜索引擎已经不再只是字符匹配与网络分析，它已经能理解高维度的复杂语言，还有近来对话系统的兴起也令信息的分享与交互更高效。&lt;/p&gt;&lt;p&gt;这些强大的应用其实都基于一套通用的思想，即利用算法、语言规则、&lt;mark data-id="95a97f4b-79d2-4bbc-91ae-300f074dff9f" data-type="technologies"&gt;逻辑&lt;/mark&gt;和统计知识理解自然语言。这本书的目的是提供这些思想与技术的基础，并应用于各种实际的任务中。此外，这本书除了详细的概念与算法，同时还包括一些高阶主题，读者可按需求学习与阅读。&lt;/p&gt;&lt;p&gt;这本书的主要章节如下可分为四部分：&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;学习：这一章节介绍了一套&lt;mark data-id="1a0e9c5e-6502-4cd7-8683-6b5ca6c48be2" data-type="technologies"&gt;机器学习&lt;/mark&gt;工具，它也是整本教科书对不同问题建模的基础。由于重点在于介绍&lt;mark data-id="1a0e9c5e-6502-4cd7-8683-6b5ca6c48be2" data-type="technologies"&gt;机器学习&lt;/mark&gt;，因此我们使用的语言任务都非常简单，即以词袋&lt;mark data-id="3fe4290f-6dd3-43ed-9324-cf23aa588830" data-type="technologies"&gt;文本分类&lt;/mark&gt;为模型示例。第四章介绍了一些更具语言意义的&lt;mark data-id="3fe4290f-6dd3-43ed-9324-cf23aa588830" data-type="technologies"&gt;文本分类&lt;/mark&gt;应用。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;序列与树：这一章节将自然语言作为结构化的数据进行处理，它描述了语言用序列和树进行表示的方法，以及这些表示所添加的限制。第 9 章介绍了有限状态自动机（finite state automata）。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;语义：本章节从广泛的角度看待基于文本表达和计算语义的努力，包括形式&lt;mark data-id="95a97f4b-79d2-4bbc-91ae-300f074dff9f" data-type="technologies"&gt;逻辑&lt;/mark&gt;和神经&lt;mark data-id="2feeb7b3-2bea-4238-9c79-0d235ffc71cc" data-type="technologies"&gt;词嵌入&lt;/mark&gt;等方面。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;应用：最后一章介绍了三种&lt;mark data-id="c8ff5114-6cbb-49ca-8a89-3ee2826be0b4" data-type="technologies"&gt;自然语言处理&lt;/mark&gt;中最重要的应用：&lt;mark data-id="ec0b0595-c797-4111-99b3-b533b4fca9c1" data-type="technologies"&gt;信息抽取&lt;/mark&gt;、&lt;mark data-id="7237ee05-f07e-4fd9-a9ac-96e5bc1f50e9" data-type="technologies"&gt;机器翻译&lt;/mark&gt;和文本生成。我们不仅将了解使用前面章节技术所构建的知名系统，同时还会理解&lt;mark data-id="72b0bcc0-d8f9-4edd-919f-fa7c2560388c" data-type="technologies"&gt;神经网络&lt;/mark&gt;&lt;mark data-id="60bee267-89dc-4606-ba24-6b3f7d1f6189" data-type="technologies"&gt;注意力机制&lt;/mark&gt;等前沿问题。&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;mark data-id="c8ff5114-6cbb-49ca-8a89-3ee2826be0b4" data-type="technologies"&gt;自然语言处理&lt;/mark&gt;其实与很多学科都有关系，包括最直接的计算语言学、&lt;mark data-id="1a0e9c5e-6502-4cd7-8683-6b5ca6c48be2" data-type="technologies"&gt;机器学习&lt;/mark&gt;和统计学等。其实计算语言学基本上就等同于&lt;mark data-id="c8ff5114-6cbb-49ca-8a89-3ee2826be0b4" data-type="technologies"&gt;自然语言处理&lt;/mark&gt;，它关注于设计并分析表征人类&lt;mark data-id="c8ff5114-6cbb-49ca-8a89-3ee2826be0b4" data-type="technologies"&gt;自然语言处理&lt;/mark&gt;的算法。而我们熟知的&lt;mark data-id="1a0e9c5e-6502-4cd7-8683-6b5ca6c48be2" data-type="technologies"&gt;机器学习&lt;/mark&gt;正好为这些「表征」提供算法支持，例如在自然语言建模中，&lt;mark data-id="1a0e9c5e-6502-4cd7-8683-6b5ca6c48be2" data-type="technologies"&gt;机器学习&lt;/mark&gt;提供了 n-gram 和循环&lt;mark data-id="72b0bcc0-d8f9-4edd-919f-fa7c2560388c" data-type="technologies"&gt;神经网络&lt;/mark&gt;等多种方法预测最自然的语句。&lt;/p&gt;&lt;p&gt;在 Eisenstein 的这本书中，有非常多值得我们仔细探讨的主题，例如如何基于简单的&lt;mark data-id="1ccbfcc7-1b56-44d6-b64b-729d855abcb1" data-type="technologies"&gt;感知&lt;/mark&gt;机或&lt;mark data-id="9cbd3df9-2050-4c7c-8eaa-ca53c512083c" data-type="technologies"&gt;支持向量机&lt;/mark&gt;进行线性&lt;mark data-id="3fe4290f-6dd3-43ed-9324-cf23aa588830" data-type="technologies"&gt;文本分类&lt;/mark&gt;、如何使用循环网络实现语言建模，以及序列标注任务中的&lt;mark data-id="18758be2-6393-456d-b8bc-1cbad4c9b4eb" data-type="technologies"&gt;维特比算法&lt;/mark&gt;和隐马尔科夫链等知识。但限于本文只简要介绍这本书，因此我们主要介绍 Eisenstein 所述的&lt;mark data-id="c8ff5114-6cbb-49ca-8a89-3ee2826be0b4" data-type="technologies"&gt;自然语言处理&lt;/mark&gt;三大主题。&lt;/p&gt;&lt;p style="text-align: center;"&gt;&lt;strong&gt;&lt;mark data-id="c8ff5114-6cbb-49ca-8a89-3ee2826be0b4" data-type="technologies"&gt;自然语言处理&lt;/mark&gt;的三大主题&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;mark data-id="c8ff5114-6cbb-49ca-8a89-3ee2826be0b4" data-type="technologies"&gt;自然语言处理&lt;/mark&gt;涵盖了非常多的任务、方法和语言现象。虽然很多任务之间都无法进行比较，但还是有一些公共的主题。基本上，&lt;mark data-id="c8ff5114-6cbb-49ca-8a89-3ee2826be0b4" data-type="technologies"&gt;自然语言处理&lt;/mark&gt;包括学习与知识、搜索和学习以及 NLP 中关系式、组合式和分布式的观点。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;学习与知识&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;近来深度模型在&lt;mark data-id="6e614199-9e49-450e-9078-61fb2b122da9" data-type="technologies"&gt;计算机视觉&lt;/mark&gt;和&lt;mark data-id="b929f5bf-7b52-4aa0-9db4-332c06240318" data-type="technologies"&gt;语音识别&lt;/mark&gt;等方面取得的成果促进了端到端学习方法的发展，传统&lt;mark data-id="1a0e9c5e-6502-4cd7-8683-6b5ca6c48be2" data-type="technologies"&gt;机器学习&lt;/mark&gt;中基于光学和音韵学等经过&lt;mark data-id="898dc2c6-690b-4c29-82b6-f79e7b71d329" data-type="technologies"&gt;特征工程&lt;/mark&gt;的特定表示方法已经不再流行。但是，很多&lt;mark data-id="1a0e9c5e-6502-4cd7-8683-6b5ca6c48be2" data-type="technologies"&gt;机器学习&lt;/mark&gt;基本只逐元素地处理自然语言，语法&lt;mark data-id="61ab5a9c-a246-4ae1-b18e-b6d4102b06a7" data-type="technologies"&gt;解析树&lt;/mark&gt;等语言学表征仍然没有像视觉中的&lt;mark data-id="b16fcc74-8dc2-4a94-8190-cc8878d5c2d4" data-type="technologies"&gt;边缘检测&lt;/mark&gt;器那样有高效的表示方法。语言学家也通常会讨论能编码一组专门用来促进语言理解和生成抽象概念的「语言能力」，但不管这些是不是合理，在训练数据有限的情况下语言结构尤其重要。&lt;/p&gt;&lt;p&gt;现在其实有很多方法将&lt;mark data-id="c8ff5114-6cbb-49ca-8a89-3ee2826be0b4" data-type="technologies"&gt;自然语言处理&lt;/mark&gt;中的知识与学习结合在一起，很多监督式的学习系统利用工程化的特征，将数据转化为有利于学习的表征。例如在&lt;mark data-id="3fe4290f-6dd3-43ed-9324-cf23aa588830" data-type="technologies"&gt;文本分类&lt;/mark&gt;任务中，识别每一个词的词干可能会非常有用，因此这样的学习系统可以更容易概括相关术语，例如鲸鱼和捕鲸等。这在很多复杂语言中非常有用，因为复杂的词缀通常都添加在词干的后面。这些特征可以从手工处理的数据中获得，例如将每个单词&lt;mark data-id="8ec6a68f-ad96-4b85-ab72-6f8931886922" data-type="technologies"&gt;映射&lt;/mark&gt;到单一表单的字典。此外，特征也可以从一般任务的语言处理系统获得，例如从建立在有监督&lt;mark data-id="1a0e9c5e-6502-4cd7-8683-6b5ca6c48be2" data-type="technologies"&gt;机器学习&lt;/mark&gt;的语法解析或&lt;mark data-id="5b71072d-4494-43eb-8730-302c4a90f45e" data-type="technologies"&gt;词性标注&lt;/mark&gt;等模型获取。&lt;/p&gt;&lt;p&gt;学习和知识的另一项结合即体现在模型结构：我们建立的&lt;mark data-id="1a0e9c5e-6502-4cd7-8683-6b5ca6c48be2" data-type="technologies"&gt;机器学习&lt;/mark&gt;模型架构受语言理论的影响。例如在自然语言中，句子的组织通常描述为构成性的，语义较小的单位逐渐构成语义较大的单位。这个想法可以加入深度&lt;mark data-id="72b0bcc0-d8f9-4edd-919f-fa7c2560388c" data-type="technologies"&gt;神经网络&lt;/mark&gt;体系架构中，并使用当代技术进行训练（Dyer et al., 2016）。&lt;/p&gt;&lt;p&gt;目前，有关&lt;mark data-id="1a0e9c5e-6502-4cd7-8683-6b5ca6c48be2" data-type="technologies"&gt;机器学习&lt;/mark&gt;与语言知识相对重要性的争论愈演愈烈。没有&lt;mark data-id="1a0e9c5e-6502-4cd7-8683-6b5ca6c48be2" data-type="technologies"&gt;机器学习&lt;/mark&gt;研究者愿意听到他们的工程学方法是不科学的炼金术，语言学家也不希望听到他们所寻找的一般语言学结构与原理和大数据无关。然而这两种类型的研究显然都各有发展空间，我们需要知道端到端的学习还能走多远，同时还需要继续研究能泛化到各种应用、场景和语言的语言学表征。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;搜索和学习&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;很多&lt;mark data-id="c8ff5114-6cbb-49ca-8a89-3ee2826be0b4" data-type="technologies"&gt;自然语言处理&lt;/mark&gt;问题在数学上都可以表述为&lt;mark data-id="6b0ab16a-5108-4551-9a55-3e90444de1db" data-type="technologies"&gt;最优化问题&lt;/mark&gt;的形式：&lt;/p&gt;&lt;p&gt;&lt;img data-ratio="0.2978723404255319" src="https://image.jiqizhixin.com/uploads/editor/a0542877-4fda-4d2b-b0de-075b2b9f8cfa/1528010174214.png" data-w="188" class="fr-fic fr-dib" style="width: 31.73%;"&gt;其中 x 是属于集合 X 的输入；y 是属于集合 Y 的输出；φ是评分函数，将集合 X*Y &lt;mark data-id="8ec6a68f-ad96-4b85-ab72-6f8931886922" data-type="technologies"&gt;映射&lt;/mark&gt;到实数上；θ是φ的&lt;mark data-id="2e982b73-88e2-41e8-a430-f7ae5a9af4bf" data-type="technologies"&gt;参数&lt;/mark&gt;向量；y hat 是预测输出，其值的选择需要使评分函数最大化。这种形式化定义在通常的监督&lt;mark data-id="1a0e9c5e-6502-4cd7-8683-6b5ca6c48be2" data-type="technologies"&gt;机器学习&lt;/mark&gt;问题中是很普遍的，而在&lt;mark data-id="c8ff5114-6cbb-49ca-8a89-3ee2826be0b4" data-type="technologies"&gt;自然语言处理&lt;/mark&gt;中，输入-输出对可能是文本-情感，或不同语言的翻译等。&lt;/p&gt;&lt;p&gt;在这种形式化定义下，语言处理算法有两个不同的模块，即搜索和学习：&lt;/p&gt;&lt;p&gt;搜索模块即找到使评分函数φ最大化的预测输出，当搜索空间足够小（即数据量较小）或评分函数能分解成几个较容易处理的部分时，这很容易。但通常情况下，评分函数的结构复杂得多，并且在语言处理算法中，输出通常是离散型的，这时搜索通常依赖于组合优化机制。&lt;/p&gt;&lt;p&gt;学习模块即寻找&lt;mark data-id="2e982b73-88e2-41e8-a430-f7ae5a9af4bf" data-type="technologies"&gt;参数&lt;/mark&gt;向量θ，一般通过处理标记数据对得到。和搜索一样，学习也是通过优化框架进行。但由于&lt;mark data-id="2e982b73-88e2-41e8-a430-f7ae5a9af4bf" data-type="technologies"&gt;参数&lt;/mark&gt;通常是连续的，因此学习算法依赖于数值优化。&lt;/p&gt;&lt;p&gt;将&lt;mark data-id="c8ff5114-6cbb-49ca-8a89-3ee2826be0b4" data-type="technologies"&gt;自然语言处理&lt;/mark&gt;算法分成两种不同的模块可以使我们能重用多种不同任务和模型的通用算法，既聚焦于模型设计，同时又能利用过去在搜索、优化和学习问题的研究成果。&lt;/p&gt;&lt;p&gt;当模型能分辨细微的语言差异时，称为具有表达性（expressive）。表达性通常需要在学习和搜索的效率之间进行权衡。很多&lt;mark data-id="c8ff5114-6cbb-49ca-8a89-3ee2826be0b4" data-type="technologies"&gt;自然语言处理&lt;/mark&gt;的重要问题都需要表达性，其计算复杂度随收入数据的增加指数式增长。在这些模型中，确定性的搜索通常是不可行的。其难解性使得明确分离搜索和学习模块变得很困难：如果搜索需要一系列启发式近似，那么学习在这些特定的启发式下工作良好的模型会更有利。这启发了一些研究者在搜索和学习中采用更加集成化的方法。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;关系式、组合式和分布式的观点&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;任何语言元素（例如单词、句子、段落甚至发音）都可以至少用三个观点来描述。考虑单词「记者」：「记者」是「职业」的子范畴，「主持人」是「记者」的子范畴；此外，记者执行的是「新闻工作」，这又是「写作」的子范畴。这种对意义的关系式的观点是语义&lt;mark data-id="5170588b-aa23-451a-bd35-bd6f290af761" data-type="technologies"&gt;本体论&lt;/mark&gt;的基础，例如 Word-Net 枚举了单词和其它基本语义单元之间的关系。关系式的观点具有强大的推理能力，但在计算上很难形式化，通常单词的含义是不独立于具体场景的。&lt;/p&gt;&lt;p&gt;某些单词之间的关系可以通过书写上的相似性和组合性而互相联系，例如复数形式、组合型单词等。进一步，在对句子和段落的分析中，通过单词的组合和句子的组合来得到完整含义。此即组合式的观点。组合观点的威力在于它为理解完整文本和对话提供了路线图，通过单一的解析透镜，从最小的部分开始逐步得到完整的含义。&lt;/p&gt;&lt;p&gt;对于某些不可分解的单词，组合观点不能提供很多帮助，但可以通过上下文来确定其含义。此即分布式的观点。它还可以帮助找到意义相似的不同单词。分布式的观点可以从未标记的数据中学习含义。和关系式以及组合式的语义不同，其并不需要手动标注或专家知识。因此，分布式语义覆盖了很大范围的语言现象，但是精确度不高。&lt;/p&gt;&lt;p&gt;关系式、组合式和分布式的观点对于语言含义的理解都有贡献，三者对于&lt;mark data-id="c8ff5114-6cbb-49ca-8a89-3ee2826be0b4" data-type="technologies"&gt;自然语言处理&lt;/mark&gt;都是很重要的。目前，它们之间的协作并不容易，各自使用的表征和算法较难兼容。&lt;/p&gt;&lt;p&gt;最后，Eisenstein 表示阅读这本书也需要一些背景知识：&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;数学与&lt;mark data-id="1a0e9c5e-6502-4cd7-8683-6b5ca6c48be2" data-type="technologies"&gt;机器学习&lt;/mark&gt;：这本书需要多元微分学和线性代数的基础知识，包括函数微分、偏微分与向量和矩阵的运算等。读者也应该熟悉概率论与统计学，包括基本分布、数字特征、&lt;mark data-id="2e982b73-88e2-41e8-a430-f7ae5a9af4bf" data-type="technologies"&gt;参数&lt;/mark&gt;估计和假设检验等。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;语言学：除了语法基本概念，如名词和动词等，这本书并不要求我们接受过语言学方面的训练。整本书会根据需要在各章节中引入语言学概念，包括形态和句法学（第 9 章）、&lt;mark data-id="f0c7ff48-80c0-4a6a-828d-be410fc65c99" data-type="technologies"&gt;语义学&lt;/mark&gt;（第 12、13 章）和语篇学（第 16 章）。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;计算机科学：这本书主要面向计算机科学的学生与研究者，读者应该了解一些关于算法和复杂性理论分析的入门课程。此外，读者也需要了解一些算法时间和内存成本的渐进分析，即简单的&lt;mark data-id="0db6bb0f-3501-4809-8eef-a445e0a69907" data-type="technologies"&gt;动态规划&lt;/mark&gt;内容。&lt;br&gt;&lt;img src="https://image.jiqizhixin.com/uploads/editor/373ed3f1-256f-4092-a68e-c615eb703740/1528010213122.png" width="48px" class="fr-fic fr-dib" style="width: 6.17%;"&gt;&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div&gt; &lt;a href="https://itindex.net/"  title="IT 资讯"&gt;&lt;img src="https://itindex.net/images/iconWarning.gif" title="IT 资讯" border="0"/&gt; &lt;/a&gt;</description>
      <category />
      <guid isPermaLink="true">https://itindex.net/detail/58428-%E8%87%AA%E7%84%B6%E8%AF%AD%E8%A8%80-%E6%95%99%E6%9D%90-%E5%BC%80%E6%94%BE</guid>
      <pubDate>Sun, 03 Jun 2018 16:06:00 CST</pubDate>
    </item>
    <item>
      <title>自然语言处理领域重要论文&amp;资源全索引</title>
      <link>https://itindex.net/detail/57557-%E8%87%AA%E7%84%B6%E8%AF%AD%E8%A8%80-%E9%A2%86%E5%9F%9F-%E8%AE%BA%E6%96%87</link>
      <description>&lt;blockquote&gt;自然语言处理（NLP）是人工智能研究中极具挑战的一个分支。随着深度学习等技术的引入，NLP&amp;nbsp;领域正在以前所未有的速度向前发展。但对于初学者来说，这一领域目前有哪些研究和资源是必读的？最近，Kyubyong Park&amp;nbsp;为我们整理了一份完整列表。&lt;/blockquote&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;font color="#880000"&gt;GitHub&amp;nbsp;项目链接：https://github.com/Kyubyong/nlp_tasks&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;本人从事自然语言处理任务（NLP）的研究已经有很长时间了，有一天我想到，我需要为庞大的&amp;nbsp;NLP&amp;nbsp;领域做一个概览，我知道自己肯定不是想要一睹&amp;nbsp;NLP&amp;nbsp;任务的全貌的第一个人。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;我曾竭尽所能的研究过尽可能多种类型的&amp;nbsp;NLP&amp;nbsp;任务，但由于个人知识的局限，我承认还远远没有穷尽整个领域。目前，该项目选取的参考文献都偏重最新的深度学习研究成果。我希望这些能为想要深入钻研一个&amp;nbsp;NLP&amp;nbsp;任务的人们提供一个开端。这个项目将持续更新，不过，我更希望与更多人合作。如果你有意愿的话，欢迎对这个项目作出贡献。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;b&gt;回指解析&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;See Coreference Resolution&amp;nbsp;（https://github.com/Kyubyong/nlp_tasks#coreference-resolution）&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;b&gt;自动作文评分&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;论文：AutomaticText Scoring Using Neural Networks&amp;nbsp;（https://arxiv.org/abs/1606.04289）&lt;/li&gt;&lt;li&gt;论文：ANeural Approach to Automated Essay Scoring&amp;nbsp;（http://www.aclweb.org/old_anthology/D/D16/D16-1193.pdf）&lt;/li&gt;&lt;li&gt;竞赛：Kaggle:The Hewlett Foundation: Automated Essay Scoring&amp;nbsp;（https://www.kaggle.com/c/asap-aes）&lt;/li&gt;&lt;li&gt;项目：EnhancedAI Scoring Engine（https://github.com/edx/ease）&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;b&gt;自动语音识别&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;WIKI Speech recognition（https://en.wikipedia.org/wiki/Speech_recognition）&lt;/li&gt;&lt;li&gt;论文：DeepSpeech 2: End-to-End Speech Recognition in English and Mandarin&amp;nbsp;（https://arxiv.org/abs/1512.02595）&lt;/li&gt;&lt;li&gt;论文：WaveNet:A Generative Model for Raw Audio&amp;nbsp;（https://arxiv.org/abs/1609.03499）&lt;/li&gt;&lt;li&gt;项目：A TensorFlow implementation of Baidu's DeepSpeech architecture&amp;nbsp;（https://github.com/mozilla/DeepSpeech）&lt;/li&gt;&lt;li&gt;项目：Speech-to-Text-WaveNet: End-to-end sentence level English speech recognition using DeepMind's WaveNet（https://github.com/buriburisuri/speech-to-text-wavenet）&lt;/li&gt;&lt;li&gt;竞赛：The 5thCHiME Speech Separation and Recognition Challenge&amp;nbsp;（http://spandh.dcs.shef.ac.uk/chime_challenge/）&lt;/li&gt;&lt;li&gt;资源：The 5thCHiME Speech Separation and Recognition Challenge&amp;nbsp;（http://spandh.dcs.shef.ac.uk/chime_challenge/download.html）&lt;/li&gt;&lt;li&gt;资源：CSTRVCTK Corpus&amp;nbsp;（http://homepages.inf.ed.ac.uk/jyamagis/page3/page58/page58.html）&lt;/li&gt;&lt;li&gt;资源：LibriSpeechASR corpus&amp;nbsp;（http://www.openslr.org/12/）&lt;/li&gt;&lt;li&gt;资源：Switchboard-1Telephone Speech Corpus&amp;nbsp;（https://catalog.ldc.upenn.edu/ldc97s62）&lt;/li&gt;&lt;li&gt;资源：TED-LIUMCorpus&amp;nbsp;（http://www-lium.univ-lemans.fr/en/content/ted-lium-corpus）&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;自动摘要&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;WIKI Automatic summarization&amp;nbsp;（https://en.wikipedia.org/wiki/Automatic_summarization）&lt;/li&gt;&lt;li&gt;书籍：AutomaticText Summarization&amp;nbsp;（https://www.amazon.com/Automatic-Text-Summarization-Juan-Manuel-Torres-Moreno/dp/1848216688/ref=sr_1_1?s=books&amp;amp;ie=UTF8&amp;amp;qid=1507782304&amp;amp;sr=1-1&amp;amp;keywords=Automatic+Text+Summarization）&lt;/li&gt;&lt;li&gt;论文：TextSummarization Using Neural Networks&amp;nbsp;（http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.823.8025&amp;amp;rep=rep1&amp;amp;type=pdf）&lt;/li&gt;&lt;li&gt;论文：Rankingwith Recursive Neural Networks and Its Application to Multi-DocumentSummarization&amp;nbsp;（https://www.aaai.org/ocs/index.php/AAAI/AAAI15/paper/viewFile/9414/9520）&lt;/li&gt;&lt;li&gt;资源：TextAnalytics Conferences（TAC）（https://tac.nist.gov/data/index.html）&lt;/li&gt;&lt;li&gt;资源：DocumentUnderstanding Conferences&amp;nbsp;（DUC）（http://www-nlpir.nist.gov/projects/duc/data.html）&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;b&gt;指代消解&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;INFO Coreference Resolution（https://nlp.stanford.edu/projects/coref.shtml）&lt;/li&gt;&lt;li&gt;论文：DeepReinforcement Learning for Mention-Ranking Coreference Models&amp;nbsp;（https://arxiv.org/abs/1609.08667）&lt;/li&gt;&lt;li&gt;论文：ImprovingCoreference Resolution by Learning Entity-Level Distributed Representations（https://arxiv.org/abs/1606.01323）&lt;/li&gt;&lt;li&gt;竞赛：CoNLL2012 Shared Task: Modeling Multilingual Unrestricted Coreference in OntoNotes（http://conll.cemantix.org/2012/task-description.html）&lt;/li&gt;&lt;li&gt;竞赛：CoNLL2011 Shared Task: Modeling Unrestricted Coreference in OntoNotes&amp;nbsp;（http://conll.cemantix.org/2011/task-description.html）&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;b&gt;实体链接&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;见「命名实体消歧」部分&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;b&gt;语法错误纠正&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;论文：NeuralNetwork Translation Models for Grammatical Error Correction&amp;nbsp;（https://arxiv.org/abs/1606.00189）&lt;/li&gt;&lt;li&gt;竞赛：CoNLL-2013Shared Task: Grammatical Error Correction&amp;nbsp;（http://www.comp.nus.edu.sg/~nlp/conll13st.html）&lt;/li&gt;&lt;li&gt;竞赛：CoNLL-2014Shared Task: Grammatical Error Correction&amp;nbsp;（http://www.comp.nus.edu.sg/~nlp/conll14st.html）&lt;/li&gt;&lt;li&gt;资源：NUSNon-commercial research/trial corpus license&amp;nbsp;（http://www.comp.nus.edu.sg/~nlp/conll14st/nucle_license.pdf）&lt;/li&gt;&lt;li&gt;资源：Lang-8Learner Corpora（http://cl.naist.jp/nldata/lang-8/）&lt;/li&gt;&lt;li&gt;资源：CornellMovie--Dialogs Corpus&amp;nbsp;（http://www.cs.cornell.edu/~cristian/Cornell_Movie-Dialogs_Corpus.html）&lt;/li&gt;&lt;li&gt;项目：DeepText Corrector（https://github.com/atpaino/deep-text-corrector）&lt;/li&gt;&lt;li&gt;产品：deepgrammar（http://deepgrammar.com/）&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;b&gt;字素音素转换&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;论文：Grapheme-to-PhonemeModels for&amp;nbsp;（Almost）&amp;nbsp;Any Language&amp;nbsp;（https://pdfs.semanticscholar.org/b9c8/fef9b6f16b92c6859f6106524fdb053e9577.pdf）&lt;/li&gt;&lt;li&gt;论文：PolyglotNeural Language Models: A Case Study in Cross-Lingual Phonetic RepresentationLearning&amp;nbsp;（https://arxiv.org/pdf/1605.03832.pdf）&lt;/li&gt;&lt;li&gt;论文：MultitaskSequence-to-Sequence Models for Grapheme-to-Phoneme Conversion&amp;nbsp;（https://pdfs.semanticscholar.org/26d0/09959fa2b2e18cddb5783493738a1c1ede2f.pdf）&lt;/li&gt;&lt;li&gt;项目：Sequence-to-Sequence G2P toolkit&amp;nbsp;（https://github.com/cmusphinx/g2p-seq2seq）&lt;/li&gt;&lt;li&gt;资源：Multilingual Pronunciation Data&amp;nbsp;（https://drive.google.com/drive/folders/0B7R_gATfZJ2aWkpSWHpXUklWUmM）&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;b&gt;语种猜测&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;见「语种辨别」部分&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;b&gt;语种辨别&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;WIKI Language identification&amp;nbsp;（https://en.wikipedia.org/wiki/Language_identification）&lt;/li&gt;&lt;li&gt;论文：AUTOMATICLANGUAGE IDENTIFICATION USING DEEP NEURAL NETWORKS&amp;nbsp;（https://repositorio.uam.es/bitstream/handle/10486/666848/automatic_lopez-moreno_ICASSP_2014_ps.pdf?sequence=1）&lt;/li&gt;&lt;li&gt;竞赛：&amp;nbsp;2015Language Recognition Evaluation&amp;nbsp;（https://www.nist.gov/itl/iad/mig/2015-language-recognition-evaluation）&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;b&gt;语言建模&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;WIKI Language model&amp;nbsp;（https://en.wikipedia.org/wiki/Language_model）&lt;/li&gt;&lt;li&gt;工具包：&amp;nbsp;KenLMLanguage Model Toolkit&amp;nbsp;（http://kheafield.com/code/kenlm/）&lt;/li&gt;&lt;li&gt;论文：DistributedRepresentations of Words and Phrases and their Compositionality&amp;nbsp;（http://papers.nips.cc/paper/5021-distributed-representations-of-words-and-phrases-and-their-compositionality.pdf）&lt;/li&gt;&lt;li&gt;论文：Character-AwareNeural Language Models&amp;nbsp;（https://www.aaai.org/ocs/index.php/AAAI/AAAI16/paper/viewFile/12489/12017）&lt;/li&gt;&lt;li&gt;资源：&amp;nbsp;PennTreebank&amp;nbsp;（https://github.com/townie/PTB-dataset-from-Tomas-Mikolov-s-webpage/tree/master/data）&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;b&gt;语种识别&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;见「语种辨别」部分&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;b&gt;同一词类&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;WIKI Lemmatisation&amp;nbsp;（https://en.wikipedia.org/wiki/Lemmatisation）&lt;/li&gt;&lt;li&gt;论文：&amp;nbsp;JointLemmatization and Morphological Tagging with LEMMING&amp;nbsp;（http://www.cis.lmu.de/~muellets/pdf/emnlp_2015.pdf）&lt;/li&gt;&lt;li&gt;工具包：WordNet Lemmatizer&amp;nbsp;（http://www.nltk.org/api/nltk.stem.html#nltk.stem.wordnet.WordNetLemmatizer.lemmatize）&lt;/li&gt;&lt;li&gt;资源：Treebank-3&amp;nbsp;（https://catalog.ldc.upenn.edu/ldc99t42）&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;b&gt;观唇辨意&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;WIKI Lip reading&amp;nbsp;（https://en.wikipedia.org/wiki/Lip_reading）&lt;/li&gt;&lt;li&gt;论文：LipReading Sentences in the Wild&amp;nbsp;（https://arxiv.org/abs/1611.05358）&lt;/li&gt;&lt;li&gt;论文：3DConvolutional Neural Networks for Cross Audio-Visual Matching Recognition&amp;nbsp;（https://arxiv.org/abs/1706.05739）&lt;/li&gt;&lt;li&gt;项目：&amp;nbsp;LipReading - Cross Audio-Visual Recognition using 3D Convolutional Neural Networks（https://github.com/astorfi/lip-reading-deeplearning）&lt;/li&gt;&lt;li&gt;资源：&amp;nbsp;TheGRID audiovisual sentence corpus&amp;nbsp;（http://spandh.dcs.shef.ac.uk/gridcorpus/）&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;b&gt;机器翻译&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;论文：NeuralMachine Translation by Jointly Learning to Align and Translate&amp;nbsp;（https://arxiv.org/abs/1409.0473）&lt;/li&gt;&lt;li&gt;论文：NeuralMachine Translation in Linear Time&amp;nbsp;（https://arxiv.org/abs/1610.10099）&lt;/li&gt;&lt;li&gt;论文：&lt;a href="http://mp.weixin.qq.com/s?__biz=MzA3MzI4MjgzMw==&amp;mid=2650727887&amp;amp;idx=5&amp;amp;sn=a5991e49a4b1df2ea70ddbb84631ff9c&amp;amp;chksm=871b21b1b06ca8a71be9ec7ee1d7d5ef46eef1116c3d396f3cc467b95186d278bcdd8e6ac07c&amp;amp;scene=21#wechat_redirect" target="_blank"&gt;AttentionIs All You Need&lt;/a&gt;&amp;nbsp;（https://arxiv.org/abs/1706.03762）&lt;/li&gt;&lt;li&gt;竞赛：&amp;nbsp;ACL2014 NINTH WORKSHOP ON STATISTICAL MACHINE TRANSLATION&amp;nbsp;（http://www.statmt.org/wmt14/translation-task.html#download）&lt;/li&gt;&lt;li&gt;竞赛：&amp;nbsp;EMNLP2017 SECOND CONFERENCE ON MACHINE TRANSLATION&amp;nbsp;（WMT17）（http://www.statmt.org/wmt17/translation-task.html）&lt;/li&gt;&lt;li&gt;资源：OpenSubtitles2016&amp;nbsp;（http://opus.lingfil.uu.se/OpenSubtitles2016.php）&lt;/li&gt;&lt;li&gt;资源：&amp;nbsp;WIT3:Web Inventory of Transcribed and Translated Talks&amp;nbsp;（https://wit3.fbk.eu/）&lt;/li&gt;&lt;li&gt;资源：&amp;nbsp;TheQCRI Educational Domain&amp;nbsp;（QED）&amp;nbsp;Corpus&amp;nbsp;（http://alt.qcri.org/resources/qedcorpus/）&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;b&gt;生成词法变化&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;WIKI Inflection&amp;nbsp;（https://en.wikipedia.org/wiki/Inflection）&lt;/li&gt;&lt;li&gt;论文：MorphologicalInflection Generation Using Character Sequence to Sequence Learning&amp;nbsp;（https://arxiv.org/abs/1512.06110）&lt;/li&gt;&lt;li&gt;竞赛：SIGMORPHON 2016 Shared Task: Morphological Reinflection&amp;nbsp;（http://ryancotterell.github.io/sigmorphon2016/）&lt;/li&gt;&lt;li&gt;资源：sigmorphon2016&amp;nbsp;（https://github.com/ryancotterell/sigmorphon2016）&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;b&gt;命名实体消歧&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;WIKI Entity linking&amp;nbsp;（https://en.wikipedia.org/wiki/Entity_linking）&lt;/li&gt;&lt;li&gt;论文：Robustand Collective Entity Disambiguation through Semantic Embeddings&amp;nbsp;（http://www.stefanzwicklbauer.info/pdf/Sigir_2016.pdf）&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;b&gt;命名实体识别&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;WIKI Named-entity recognition&amp;nbsp;（https://en.wikipedia.org/wiki/Named-entity_recognition）&lt;/li&gt;&lt;li&gt;论文：NeuralArchitectures for Named Entity Recognition&amp;nbsp;（https://arxiv.org/abs/1603.01360）&lt;/li&gt;&lt;li&gt;项目：&amp;nbsp;OSUTwitter NLP Tools&amp;nbsp;（https://github.com/aritter/twitter_nlp）&lt;/li&gt;&lt;li&gt;竞赛：&amp;nbsp;NamedEntity Recognition in Twitter&amp;nbsp;（https://noisy-text.github.io/2016/ner-shared-task.html）&lt;/li&gt;&lt;li&gt;竞赛：&amp;nbsp;CoNLL2002 Language-Independent Named Entity Recognition&amp;nbsp;（https://www.clips.uantwerpen.be/conll2002/ner/）&lt;/li&gt;&lt;li&gt;竞赛：Introduction to the CoNLL-2003 Shared Task: Language-Independent Named EntityRecognition&amp;nbsp;（http://aclweb.org/anthology/W03-0419）&lt;/li&gt;&lt;li&gt;资源：CoNLL-2002 NER corpus&amp;nbsp;（https://github.com/teropa/nlp/tree/master/resources/corpora/conll2002）&lt;/li&gt;&lt;li&gt;资源：CoNLL-2003 NER corpus&amp;nbsp;（https://github.com/synalp/NER/tree/master/corpus/CoNLL-2003）&lt;/li&gt;&lt;li&gt;资源：&amp;nbsp;NUTNamed Entity Recognition in Twitter Shared task&amp;nbsp;（https://github.com/aritter/twitter_nlp/tree/master/data/annotated/wnut16）&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;b&gt;释义检测&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;论文：DynamicPooling and Unfolding Recursive Autoencoders for Paraphrase Detection&amp;nbsp;（http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.650.7199&amp;amp;rep=rep1&amp;amp;type=pdf）&lt;/li&gt;&lt;li&gt;项目：Paralex: Paraphrase-Driven Learning for Open Question Answering&amp;nbsp;（http://knowitall.cs.washington.edu/paralex/）&lt;/li&gt;&lt;li&gt;资源：Microsoft Research Paraphrase Corpus&amp;nbsp;（https://www.microsoft.com/en-us/download/details.aspx?id=52398）&lt;/li&gt;&lt;li&gt;资源：Microsoft Research Video Description Corpus&amp;nbsp;（https://www.microsoft.com/en-us/download/details.aspx?id=52422&amp;amp;from=http%3A%2F%2Fresearch.microsoft.com%2Fen-us%2Fdownloads%2F38cf15fd-b8df-477e-a4e4-a4680caa75af%2F）&lt;/li&gt;&lt;li&gt;资源：&amp;nbsp;PascalDataset&amp;nbsp;（http://nlp.cs.illinois.edu/HockenmaierGroup/pascal-sentences/index.html）&lt;/li&gt;&lt;li&gt;资源：Flicker Dataset&amp;nbsp;（http://nlp.cs.illinois.edu/HockenmaierGroup/8k-pictures.html）&lt;/li&gt;&lt;li&gt;资源：&amp;nbsp;TheSICK data set&amp;nbsp;（http://clic.cimec.unitn.it/composes/sick.html）&lt;/li&gt;&lt;li&gt;资源：&amp;nbsp;PPDB:The Paraphrase Database&amp;nbsp;（http://www.cis.upenn.edu/~ccb/ppdb/）&lt;/li&gt;&lt;li&gt;资源：WikiAnswers Paraphrase Corpus&amp;nbsp;（http://knowitall.cs.washington.edu/paralex/wikianswers-paraphrases-1.0.tar.gz）&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;b&gt;语法分析&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;WIKI Parsing&amp;nbsp;（https://en.wikipedia.org/wiki/Parsing）&lt;/li&gt;&lt;li&gt;工具包：&amp;nbsp;TheStanford Parser: A statistical parser&amp;nbsp;（https://nlp.stanford.edu/software/lex-parser.shtml）&lt;/li&gt;&lt;li&gt;工具包：&amp;nbsp;spaCyparser&amp;nbsp;（https://spacy.io/docs/usage/dependency-parse）&lt;/li&gt;&lt;li&gt;论文：A fastand accurate dependency parser using neural networks&amp;nbsp;（http://www.aclweb.org/anthology/D14-1082）&lt;/li&gt;&lt;li&gt;竞赛：&amp;nbsp;CoNLL2017 Shared Task: Multilingual Parsing from Raw Text to Universal Dependencies&amp;nbsp;（http://universaldependencies.org/conll17/）&lt;/li&gt;&lt;li&gt;竞赛：&amp;nbsp;CoNLL2016 Shared Task: Multilingual Shallow Discourse Parsing&amp;nbsp;（http://www.cs.brandeis.edu/~clp/conll16st/）&lt;/li&gt;&lt;li&gt;竞赛：&amp;nbsp;CoNLL2015 Shared Task: Shallow Discourse Parsing&amp;nbsp;（http://www.cs.brandeis.edu/~clp/conll15st/）&lt;/li&gt;&lt;li&gt;竞赛：SemEval-2016 Task 8: The meaning representations may be abstract, but this taskis concrete!&amp;nbsp;（http://alt.qcri.org/semeval2016/task8/）&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;b&gt;词性标记&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;WIKI Part-of-speech tagging&amp;nbsp;（https://en.wikipedia.org/wiki/Part-of-speech_tagging）&lt;/li&gt;&lt;li&gt;论文：MultilingualPart-of-Speech Tagging with Bidirectional Long Short-Term Memory Models andAuxiliary Loss&amp;nbsp;（https://arxiv.org/pdf/1604.05529.pdf）&lt;/li&gt;&lt;li&gt;论文：UnsupervisedPart-Of-Speech Tagging with Anchor Hidden Markov Models&amp;nbsp;（https://transacl.org/ojs/index.php/tacl/article/viewFile/837/192）&lt;/li&gt;&lt;li&gt;资源：Treebank-3&amp;nbsp;（https://catalog.ldc.upenn.edu/ldc99t42）&lt;/li&gt;&lt;li&gt;工具包：nltk.tag package&amp;nbsp;（http://www.nltk.org/api/nltk.tag.html）&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;b&gt;拼音-中文转换&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;论文：NeuralNetwork Language Model for Chinese Pinyin Input Method Engine&amp;nbsp;（http://aclweb.org/anthology/Y15-1052）&lt;/li&gt;&lt;li&gt;项目：&amp;nbsp;NeuralChinese Transliterator&amp;nbsp;（https://github.com/Kyubyong/neural_chinese_transliterator）&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;b&gt;问答系统&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;WIKI Question answering&amp;nbsp;（https://en.wikipedia.org/wiki/Question_answering）&lt;/li&gt;&lt;li&gt;论文：Ask MeAnything: Dynamic Memory Networks for Natural Language Processing&amp;nbsp;（http://www.thespermwhale.com/jaseweston/ram/papers/paper_21.pdf）&lt;/li&gt;&lt;li&gt;论文：DynamicMemory Networks for Visual and Textual Question Answering&amp;nbsp;（http://proceedings.mlr.press/v48/xiong16.pdf）&lt;/li&gt;&lt;li&gt;竞赛：&amp;nbsp;TRECQuestion Answering Task&amp;nbsp;（http://trec.nist.gov/data/qamain.html）&lt;/li&gt;&lt;li&gt;竞赛：NTCIR-8: Advanced Cross-lingual Information Access&amp;nbsp;（ACLIA）（http://aclia.lti.cs.cmu.edu/ntcir8/Home）&lt;/li&gt;&lt;li&gt;竞赛：&amp;nbsp;CLEFQuestion Answering Track&amp;nbsp;（http://nlp.uned.es/clef-qa/）&lt;/li&gt;&lt;li&gt;竞赛：SemEval-2017 Task 3: Community Question Answering&amp;nbsp;（http://alt.qcri.org/semeval2017/task3/）&lt;/li&gt;&lt;li&gt;资源：&amp;nbsp;MSMARCO: Microsoft MAchine Reading COmprehension Dataset&amp;nbsp;（http://www.msmarco.org/）&lt;/li&gt;&lt;li&gt;资源：Maluuba NewsQA&amp;nbsp;（https://github.com/Maluuba/newsqa）&lt;/li&gt;&lt;li&gt;资源：&amp;nbsp;SQuAD:100,000+ Questions for Machine Comprehension of Text&amp;nbsp;（https://rajpurkar.github.io/SQuAD-explorer/）&lt;/li&gt;&lt;li&gt;资源：GraphQuestions: A Characteristic-rich Question Answering Dataset&amp;nbsp;（https://github.com/ysu1989/GraphQuestions）&lt;/li&gt;&lt;li&gt;资源：&amp;nbsp;StoryCloze Test and ROCStories Corpora&amp;nbsp;（http://cs.rochester.edu/nlp/rocstories/）&lt;/li&gt;&lt;li&gt;资源：Microsoft Research WikiQA Corpus&amp;nbsp;（https://www.microsoft.com/en-us/download/details.aspx?id=52419&amp;amp;from=http%3A%2F%2Fresearch.microsoft.com%2Fen-us%2Fdownloads%2F4495da01-db8c-4041-a7f6-7984a4f6a905%2Fdefault.aspx）&lt;/li&gt;&lt;li&gt;资源：DeepMind Q&amp;amp;A Dataset&amp;nbsp;（http://cs.nyu.edu/~kcho/DMQA/）&lt;/li&gt;&lt;li&gt;资源：&amp;nbsp;QASent（http://cs.stanford.edu/people/mengqiu/data/qg-emnlp07-data.tgz）&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;b&gt;关系提取&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;WIKI Relationship extraction&amp;nbsp;（https://en.wikipedia.org/wiki/Relationship_extraction）&lt;/li&gt;&lt;li&gt;论文：A deeplearning approach for relationship extraction from interaction context insocial manufacturing paradigm&amp;nbsp;（http://www.sciencedirect.com/science/article/pii/S0950705116001210）&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;b&gt;语义角色标注&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;WIKI Semantic role labeling&amp;nbsp;（https://en.wikipedia.org/wiki/Semantic_role_labeling）&lt;/li&gt;&lt;li&gt;书籍：Semantic Role Labeling&amp;nbsp;（https://www.amazon.com/Semantic-Labeling-Synthesis-Lectures-Technologies/dp/1598298313/ref=sr_1_1?s=books&amp;amp;ie=UTF8&amp;amp;qid=1507776173&amp;amp;sr=1-1&amp;amp;keywords=Semantic+Role+Labeling）&lt;/li&gt;&lt;li&gt;论文：End-to-endLearning of Semantic Role Labeling Using Recurrent Neural Networks&amp;nbsp;（http://www.aclweb.org/anthology/P/P15/P15-1109.pdf）&lt;/li&gt;&lt;li&gt;论文：NeuralSemantic Role Labeling with Dependency Path Embeddi ngs&amp;nbsp;（https://arxiv.org/abs/1605.07515）&lt;/li&gt;&lt;li&gt;竞赛：CoNLL-2005 Shared Task: Semantic Role Labeling&amp;nbsp;（http://www.cs.upc.edu/~srlconll/st05/st05.html）&lt;/li&gt;&lt;li&gt;竞赛：CoNLL-2004 Shared Task: Semantic Role Labeling&amp;nbsp;（http://www.cs.upc.edu/~srlconll/st04/st04.html）&lt;/li&gt;&lt;li&gt;工具包：Illinois Semantic Role Labeler&amp;nbsp;（SRL）（http://cogcomp.org/page/software_view/SRL）&lt;/li&gt;&lt;li&gt;资源：CoNLL-2005 Shared Task: Semantic Role Labeling&amp;nbsp;（http://www.cs.upc.edu/~srlconll/soft.html）&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;b&gt;语句边界消歧&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;WIKI Sentence boundary disambiguation&amp;nbsp;（https://en.wikipedia.org/wiki/Sentence_boundary_disambiguation）&lt;/li&gt;&lt;li&gt;论文：AQuantitative and Qualitative Evaluation of Sentence Boundary Detection for theClinical Domain&amp;nbsp;（https://www.ncbi.nlm.nih.gov/pmc/articles/PMC5001746/）&lt;/li&gt;&lt;li&gt;工具包：&amp;nbsp;NLTKTokenizers&amp;nbsp;（http://www.nltk.org/_modules/nltk/tokenize.html）&lt;/li&gt;&lt;li&gt;资源：&amp;nbsp;TheBritish National Corpus&amp;nbsp;（http://www.natcorp.ox.ac.uk/）&lt;/li&gt;&lt;li&gt;资源：Switchboard-1 Telephone Speech Corpus&amp;nbsp;（https://catalog.ldc.upenn.edu/ldc97s62）&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;b&gt;情绪分析&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;WIKI Sentiment analysis&amp;nbsp;（https://en.wikipedia.org/wiki/Sentiment_analysis）&lt;/li&gt;&lt;li&gt;INFO Awesome Sentiment Analysis&amp;nbsp;（https://github.com/xiamx/awesome-sentiment-analysis）&lt;/li&gt;&lt;li&gt;竞赛：Kaggle: UMICH SI650 - Sentiment Classification&amp;nbsp;（https://www.kaggle.com/c/si650winter11#description）&lt;/li&gt;&lt;li&gt;竞赛：SemEval-2017 Task 4: Sentiment Analysis in Twitter&amp;nbsp;（http://alt.qcri.org/semeval2017/task4/）&lt;/li&gt;&lt;li&gt;竞赛：SemEval-2017 Task 5: Fine-Grained Sentiment Analysis on Financial Microblogsand News&amp;nbsp;（http://alt.qcri.org/semeval2017/task5/）&lt;/li&gt;&lt;li&gt;项目：SenticNet&amp;nbsp;（http://sentic.net/about/）&lt;/li&gt;&lt;li&gt;资源：Multi-Domain Sentiment Dataset&amp;nbsp;（version2.0）（http://www.cs.jhu.edu/~mdredze/datasets/sentiment/）&lt;/li&gt;&lt;li&gt;资源：Stanford Sentiment Treebank&amp;nbsp;（https://nlp.stanford.edu/sentiment/code.html）&lt;/li&gt;&lt;li&gt;资源：Twitter Sentiment Corpus&amp;nbsp;（http://www.sananalytics.com/lab/twitter-sentiment/）&lt;/li&gt;&lt;li&gt;资源：Twitter Sentiment Analysis Training Corpus&amp;nbsp;（http://thinknook.com/twitter-sentiment-analysis-training-corpus-dataset-2012-09-22/）&lt;/li&gt;&lt;li&gt;资源：&amp;nbsp;AFINN:List of English words rated for valence&amp;nbsp;（http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6010）&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;b&gt;源分离&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;WIKI Source separation&amp;nbsp;（https://en.wikipedia.org/wiki/Source_separation）&lt;/li&gt;&lt;li&gt;论文：FromBlind to Guided Audio Source Separation&amp;nbsp;（https://hal-univ-rennes1.archives-ouvertes.fr/hal-00922378/document）&lt;/li&gt;&lt;li&gt;论文：JointOptimization of Masks and Deep Recurrent Neural Networks for Monaural SourceSeparation&amp;nbsp;（https://arxiv.org/abs/1502.04149）&lt;/li&gt;&lt;li&gt;竞赛：&amp;nbsp;SignalSeparation Evaluation Campaign&amp;nbsp;（SiSEC）（https://sisec.inria.fr/）&lt;/li&gt;&lt;li&gt;竞赛：&amp;nbsp;CHiMESpeech Separation and Recognition Challenge&amp;nbsp;（http://spandh.dcs.shef.ac.uk/chime_challenge/）&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;b&gt;说话人认证&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;见「说话人识别」部分&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;b&gt;语音身份分离&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;WIKI Speaker diarisation&amp;nbsp;（https://en.wikipedia.org/wiki/Speaker_diarisation）&lt;/li&gt;&lt;li&gt;论文：DNN-basedspeaker clustering for speaker diarisation&amp;nbsp;（http://eprints.whiterose.ac.uk/109281/1/milner_is16.pdf）&lt;/li&gt;&lt;li&gt;论文：UnsupervisedMethods for Speaker Diarization: An Integrated and Iterative Approach&amp;nbsp;（http://groups.csail.mit.edu/sls/publications/2013/Shum_IEEE_Oct-2013.pdf）&lt;/li&gt;&lt;li&gt;论文：Audio-VisualSpeaker Diarization Based on Spatiotemporal Bayesian Fusion&amp;nbsp;（https://arxiv.org/pdf/1603.09725.pdf）&lt;/li&gt;&lt;li&gt;竞赛：&amp;nbsp;RichTranscription Evaluation&amp;nbsp;（https://www.nist.gov/itl/iad/mig/rich-transcription-evaluation）&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;b&gt;说话人识别&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;WIKI Speaker recognition&amp;nbsp;（https://en.wikipedia.org/wiki/Speaker_recognition）&lt;/li&gt;&lt;li&gt;论文：A NOVELSCHEME FOR SPEAKER RECOGNITION USING A PHONETICALLY-AWARE DEEP NEURAL NETWORK&amp;nbsp;（https://pdfs.semanticscholar.org/204a/ff8e21791c0a4113a3f75d0e6424a003c321.pdf）&lt;/li&gt;&lt;li&gt;论文：DEEPNEURAL NETWORKS FOR SMALL FOOTPRINT TEXT-DEPENDENT SPEAKER VERIFICATION&amp;nbsp;（https://static.googleusercontent.com/media/research.google.com/en//pubs/archive/41939.pdf）&lt;/li&gt;&lt;li&gt;竞赛：&amp;nbsp;NISTSpeaker Recognition Evaluation&amp;nbsp;（SRE）（https://www.nist.gov/itl/iad/mig/speaker-recognition）&lt;/li&gt;&lt;li&gt;INFO Are there any suggestions for free databases for speakerrecognition?&amp;nbsp;（https://www.researchgate.net/post/Are_there_any_suggestions_for_free_databases_for_speaker_recognition）&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;b&gt;唇读&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;见「观唇辨意」部分&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;b&gt;语音识别&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;见「自动语音识别」部分&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;b&gt;语音分割&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;WIKI Speech_segmentation&amp;nbsp;（https://en.wikipedia.org/wiki/Speech_segmentation）&lt;/li&gt;&lt;li&gt;论文：WordSegmentation by 8-Month-Olds: When Speech Cues Count More Than Statistics&amp;nbsp;（http://www.utm.toronto.edu/infant-child-centre/sites/files/infant-child-centre/public/shared/elizabeth-johnson/Johnson_Jusczyk.pdf）&lt;/li&gt;&lt;li&gt;论文：UnsupervisedWord Segmentation and Lexicon Discovery Using Acoustic Word Embeddings&amp;nbsp;（https://arxiv.org/abs/1603.02845）&lt;/li&gt;&lt;li&gt;论文：UnsupervisedLexicon Discovery from Acoustic Inpu&amp;nbsp;（http://www.aclweb.org/old_anthology/Q/Q15/Q15-1028.pdf）&lt;/li&gt;&lt;li&gt;论文：Weaklysupervised spoken term discovery using cross-lingual side information&amp;nbsp;（http://www.research.ed.ac.uk/portal/files/29957958/1609.06530v1.pdf）&lt;/li&gt;&lt;li&gt;资源：CALLHOME Spanish Speech&amp;nbsp;（https://catalog.ldc.upenn.edu/ldc96s35）&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;b&gt;语音合成&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;WIKI Speech synthesis&amp;nbsp;（https://en.wikipedia.org/wiki/Speech_synthesis）&lt;/li&gt;&lt;li&gt;论文：WaveNet:A Generative Model for Raw Audio&amp;nbsp;（https://arxiv.org/abs/1609.03499）&lt;/li&gt;&lt;li&gt;论文：Tacotron:Towards End-to-End Speech Synthesis&amp;nbsp;（https://arxiv.org/abs/1703.10135）&lt;/li&gt;&lt;li&gt;论文：DeepVoice 2: Multi-Speaker Neural Text-to-Speech&amp;nbsp;（https://arxiv.org/abs/1705.08947）&lt;/li&gt;&lt;li&gt;资源：&amp;nbsp;TheWorld English Bible&amp;nbsp;（https://github.com/Kyubyong/tacotron）&lt;/li&gt;&lt;li&gt;资源：&amp;nbsp;LJSpeech Dataset&amp;nbsp;（https://github.com/keithito/tacotron）&lt;/li&gt;&lt;li&gt;资源：&amp;nbsp;LessacData&amp;nbsp;（http://www.cstr.ed.ac.uk/projects/blizzard/2011/lessac_blizzard2011/）&lt;/li&gt;&lt;li&gt;竞赛：Blizzard Challenge 2017&amp;nbsp;（https://synsig.org/index.php/Blizzard_Challenge_2017）&lt;/li&gt;&lt;li&gt;PRODUCT Lyrebird&amp;nbsp;（https://lyrebird.ai/）&lt;/li&gt;&lt;li&gt;项目：&amp;nbsp;TheFestvox project&amp;nbsp;（http://www.festvox.org/index.html）&lt;/li&gt;&lt;li&gt;工具包：Merlin: The Neural Network&amp;nbsp;（NN）&amp;nbsp;based Speech Synthesis System&amp;nbsp;（https://github.com/CSTR-Edinburgh/merlin）&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;b&gt;语音增强&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;WIKI Speech enhancement&amp;nbsp;（https://en.wikipedia.org/wiki/Speech_enhancement）&lt;/li&gt;&lt;li&gt;书籍：&amp;nbsp;Speechenhancement: theory and practice&amp;nbsp;（https://www.amazon.com/Speech-Enhancement-Theory-Practice-Second/dp/1466504218/ref=sr_1_1?ie=UTF8&amp;amp;qid=1507874199&amp;amp;sr=8-1&amp;amp;keywords=Speech+enhancement%3A+theory+and+practice）&lt;/li&gt;&lt;li&gt;论文&amp;nbsp;AnExperimental Study on Speech Enhancement BasedonDeepNeuralNetwork&amp;nbsp;（http://staff.ustc.edu.cn/~jundu/Speech%20signal%20processing/publications/SPL2014_Xu.pdf）&lt;/li&gt;&lt;li&gt;论文：&amp;nbsp;ARegression Approach to Speech Enhancement BasedonDeepNeuralNetworks&amp;nbsp;（https://www.researchgate.net/profile/Yong_Xu63/publication/272436458_A_Regression_Approach_to_Speech_Enhancement_Based_on_Deep_Neural_Networks/links/57fdfdda08aeaf819a5bdd97.pdf）&lt;/li&gt;&lt;li&gt;论文：&amp;nbsp;SpeechEnhancement Based on Deep Denoising Autoencoder&amp;nbsp;（https://www.researchgate.net/profile/Yu_Tsao/publication/283600839_Speech_enhancement_based_on_deep_denoising_Auto-Encoder/links/577b486108ae213761c9c7f8/Speech-enhancement-based-on-deep-denoising-Auto-Encoder.pdf）&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;b&gt;语音文本转换&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;见「自动语音识别」部分&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;b&gt;口语的术语检测&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;见「语音分割」部分&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;b&gt;词干提取&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;WIKI Stemming&amp;nbsp;（https://en.wikipedia.org/wiki/Stemming）&lt;/li&gt;&lt;li&gt;论文：&amp;nbsp;ABACKPROPAGATION NEURAL NETWORK TO IMPROVE ARABIC STEMMING&amp;nbsp;（http://www.jatit.org/volumes/Vol82No3/7Vol82No3.pdf）&lt;/li&gt;&lt;li&gt;工具包：&amp;nbsp;NLTKStemmers&amp;nbsp;（http://www.nltk.org/howto/stem.html）&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;b&gt;术语提取&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;WIKI Terminology extraction&amp;nbsp;（https://en.wikipedia.org/wiki/Terminology_extraction）&lt;/li&gt;&lt;li&gt;论文：&amp;nbsp;NeuralAttention Models for Sequence Classification: Analysis and Application to KeyTerm Extraction and Dialogue Act Detection&amp;nbsp;（https://arxiv.org/pdf/1604.00077.pdf）&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;b&gt;文本简化&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;WIKI Text simplification&amp;nbsp;（https://en.wikipedia.org/wiki/Text_simplification）&lt;/li&gt;&lt;li&gt;论文：Aligning Sentences from Standard Wikipedia to Simple Wikipedia&amp;nbsp;（https://ssli.ee.washington.edu/~hannaneh/papers/simplification.pdf）&lt;/li&gt;&lt;li&gt;论文：Problems in Current Text Simplification Research: New Data Can Help&amp;nbsp;（https://pdfs.semanticscholar.org/2b8d/a013966c0c5e020ebc842d49d8ed166c8783.pdf）&lt;/li&gt;&lt;li&gt;资源：Newsela Data&amp;nbsp;（https://newsela.com/data/）&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;b&gt;文本语音转换&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;见「语音合成」部分&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;b&gt;文本蕴涵&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;WIKI Textual entailment&amp;nbsp;（https://en.wikipedia.org/wiki/Textual_entailment）&lt;/li&gt;&lt;li&gt;项目：Textual Entailment with TensorFlow&amp;nbsp;（https://github.com/Steven-Hewitt/Entailment-with-Tensorflow）&lt;/li&gt;&lt;li&gt;论文：Textual Entailment with Structured Attentions and Composition&amp;nbsp;（https://arxiv.org/pdf/1701.01126.pdf）&lt;/li&gt;&lt;li&gt;竞赛：SemEval-2014 Task 1: Evaluation of compositional distributional semantic modelson full sentences through semantic relatedness and textual entailment&amp;nbsp;（http://alt.qcri.org/semeval2014/task1/）&lt;/li&gt;&lt;li&gt;竞赛：SemEval-2013 Task 7: The Joint Student Response Analysis and 8th RecognizingTextual Entailment Challenge&amp;nbsp;（https://www.cs.york.ac.uk/semeval-2013/task7.html）&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;b&gt;声音转换&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;论文：PHONETIC POSTERIORGRAMS FOR MANY-TO-ONE VOICE CONVERSION WITHOUT PARALLEL DATATRAINING&amp;nbsp;（http://www1.se.cuhk.edu.hk/~hccl/publications/pub/2016_paper_297.pdf）&lt;/li&gt;&lt;li&gt;项目：&amp;nbsp;Animplementation of voice conversion system utilizing phonetic posteriorgrams&amp;nbsp;（https://github.com/sesenosannko/ppg_vc）&lt;/li&gt;&lt;li&gt;竞赛：&amp;nbsp;VoiceConversion Challenge 2016&amp;nbsp;（http://www.vc-challenge.org/vcc2016/index.html）&lt;/li&gt;&lt;li&gt;竞赛：&amp;nbsp;VoiceConversion Challenge 2018&amp;nbsp;（http://www.vc-challenge.org/）&lt;/li&gt;&lt;li&gt;资源：CMU_ARCTIC speech synthesis databases&amp;nbsp;（http://festvox.org/cmu_arctic/）&lt;/li&gt;&lt;li&gt;资源：&amp;nbsp;TIMITAcoustic-Phonetic Continuous Speech Corpus&amp;nbsp;（https://catalog.ldc.upenn.edu/ldc93s1）&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;b&gt;声音识别&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;见「说话人识别」部分&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;b&gt;词嵌入&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;WIKI Word embedding&amp;nbsp;（https://en.wikipedia.org/wiki/Word_embedding）&lt;/li&gt;&lt;li&gt;工具包：Gensim: word2vec&amp;nbsp;（https://radimrehurek.com/gensim/models/word2vec.html）&lt;/li&gt;&lt;li&gt;工具包：fastText&amp;nbsp;（https://github.com/facebookresearch/fastText）&lt;/li&gt;&lt;li&gt;工具包：&amp;nbsp;GloVe:Global Vectors for Word Representation&amp;nbsp;（https://nlp.stanford.edu/projects/glove/）&lt;/li&gt;&lt;li&gt;INFO Where to get a pretrained model&amp;nbsp;（https://github.com/3Top/word2vec-api）&lt;/li&gt;&lt;li&gt;项目：Pre-trained word vectors of 30+ languages&amp;nbsp;（https://github.com/Kyubyong/wordvectors）&lt;/li&gt;&lt;li&gt;项目：Polyglot: Distributed word representations for multilingual NLP&amp;nbsp;（https://sites.google.com/site/rmyeid/projects/polyglot）&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;b&gt;词预测&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;INFO What is Word Prediction?&amp;nbsp;（http://www2.edc.org/ncip/library/wp/what_is.htm）&lt;/li&gt;&lt;li&gt;论文：&amp;nbsp;Theprediction of character based on recurrent neural network language model&amp;nbsp;（http://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=7960065）&lt;/li&gt;&lt;li&gt;论文：&amp;nbsp;AnEmbedded Deep Learning based Word Prediction&amp;nbsp;（https://arxiv.org/abs/1707.01662）&lt;/li&gt;&lt;li&gt;论文：Evaluating Word Prediction: Framing Keystroke Savings&amp;nbsp;（http://aclweb.org/anthology/P08-2066）&lt;/li&gt;&lt;li&gt;资源：&amp;nbsp;AnEmbedded Deep Learning based Word Prediction&amp;nbsp;（https://github.com/Meinwerk/WordPrediction/master.zip）&lt;/li&gt;&lt;li&gt;项目：&amp;nbsp;WordPrediction using Convolutional Neural Networks—can you do better than iPhone™Keyboard?&amp;nbsp;（https://github.com/Kyubyong/word_prediction）&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;b&gt;词分割&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;WIKI Word segmentation&amp;nbsp;（https://en.wikipedia.org/wiki/Text_segmentation#Segmentation_problems）&lt;/li&gt;&lt;li&gt;论文：&amp;nbsp;NeuralWord Segmentation Learning for Chinese&amp;nbsp;（https://arxiv.org/abs/1606.04300）&lt;/li&gt;&lt;li&gt;项目：Convolutional neural network for Chinese word segmentation&amp;nbsp;（https://github.com/chqiwang/convseg）&lt;/li&gt;&lt;li&gt;工具包：Stanford Word Segmenter&amp;nbsp;（https://nlp.stanford.edu/software/segmenter.html）&lt;/li&gt;&lt;li&gt;工具包：&amp;nbsp;NLTKTokenizers&amp;nbsp;（http://www.nltk.org/_modules/nltk/tokenize.html）&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;b&gt;词义消歧&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;资源：Word-sense disambiguation&amp;nbsp;（https://en.wikipedia.org/wiki/Word-sense_disambiguation）&lt;/li&gt;&lt;li&gt;论文：Train-O-Matic: Large-Scale Supervised Word Sense Disambiguation in MultipleLanguages without Manual Training Data&amp;nbsp;（http://www.aclweb.org/anthology/D17-1008）&lt;/li&gt;&lt;li&gt;资源：Train-O-Matic Data&amp;nbsp;（http://trainomatic.org/data/train-o-matic-data.zip）&lt;/li&gt;&lt;li&gt;资源：BabelNet&amp;nbsp;（http://babelnet.org/）&lt;/li&gt;&lt;/ul&gt;&lt;div&gt; &lt;a href="https://itindex.net/"  title="IT 资讯"&gt;&lt;img src="https://itindex.net/images/iconWarning.gif" title="IT 资讯" border="0"/&gt; &lt;/a&gt;</description>
      <category />
      <guid isPermaLink="true">https://itindex.net/detail/57557-%E8%87%AA%E7%84%B6%E8%AF%AD%E8%A8%80-%E9%A2%86%E5%9F%9F-%E8%AE%BA%E6%96%87</guid>
      <pubDate>Sat, 14 Oct 2017 11:51:54 CST</pubDate>
    </item>
    <item>
      <title>GitHub - hankcs/HanLP: 自然语言处理 中文分词 词性标注 命名实体识别 依存句法分析 关键词提取 自动摘要 短语提取 拼音 简繁转换</title>
      <link>https://itindex.net/detail/57362-github-hankcs-hanlp</link>
      <description>&lt;article class="markdown-body entry-content" itemprop="text"&gt;&lt;h1&gt;&lt;a aria-hidden="true" class="anchor" href="#hanlp-han-language-processing" id="user-content-hanlp-han-language-processing"&gt;&lt;/a&gt;&lt;svg aria-hidden="true" class="octicon octicon-link" height="16" version="1.1" viewBox="0 0 16 16" width="16"&gt;&lt;a aria-hidden="true" class="anchor" href="#hanlp-han-language-processing" id="user-content-hanlp-han-language-processing"&gt;&lt;/a&gt;&lt;path d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z" fill-rule="evenodd"&gt;&lt;a aria-hidden="true" class="anchor" href="#hanlp-han-language-processing" id="user-content-hanlp-han-language-processing"&gt;&lt;/a&gt;&lt;/path&gt;&lt;/svg&gt;HanLP: Han Language Processing&lt;/h1&gt;&lt;p&gt;汉语言处理包&lt;a href="https://maven-badges.herokuapp.com/maven-central/com.hankcs/hanlp/"&gt;&lt;img alt="Maven Central" data-canonical-src="https://maven-badges.herokuapp.com/maven-central/com.hankcs/hanlp/badge.svg" src="https://camo.githubusercontent.com/dc6b1a87ebafd2c18a000887c063ab1415ddcdd6/68747470733a2f2f6d6176656e2d6261646765732e6865726f6b756170702e636f6d2f6d6176656e2d63656e7472616c2f636f6d2e68616e6b63732f68616e6c702f62616467652e737667" style="max-width:100%;"&gt;&lt;/a&gt;&lt;a href="https://github.com/hankcs/hanlp/releases"&gt;&lt;img alt="GitHub release" data-canonical-src="https://img.shields.io/github/release/hankcs/HanLP.svg" src="https://camo.githubusercontent.com/697f43a3d9d012256876858245cad40f6606b7b5/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f72656c656173652f68616e6b63732f48616e4c502e737667" style="max-width:100%;"&gt;&lt;/a&gt;&lt;a href="https://www.apache.org/licenses/LICENSE-2.0.html"&gt;&lt;img alt="License" data-canonical-src="https://img.shields.io/badge/license-Apache%202-4EB1BA.svg" src="https://camo.githubusercontent.com/8cb994f6c4a156c623fe057fccd7fb7d7d2e8c9b/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f6c6963656e73652d417061636865253230322d3445423142412e737667" style="max-width:100%;"&gt;&lt;/a&gt;&lt;a href="https://hub.docker.com/r/samurais/hanlp-api/"&gt;&lt;img alt="Docker Pulls" data-canonical-src="https://img.shields.io/docker/pulls/samurais/hanlp-api.svg?maxAge=2592000" src="https://camo.githubusercontent.com/5d07b0bc46f9a9b976631d748828692685f683f4/68747470733a2f2f696d672e736869656c64732e696f2f646f636b65722f70756c6c732f73616d75726169732f68616e6c702d6170692e7376673f6d61784167653d32353932303030" style="max-width:100%;"&gt;&lt;/a&gt;&lt;a href="https://hub.docker.com/r/samurais/hanlp-api/"&gt;&lt;img alt="Docker Stars" data-canonical-src="https://img.shields.io/docker/stars/samurais/hanlp-api.svg?maxAge=2592000" src="https://camo.githubusercontent.com/4b0c76b0fa02220759e2017d2b856a9487ea31f9/68747470733a2f2f696d672e736869656c64732e696f2f646f636b65722f73746172732f73616d75726169732f68616e6c702d6170692e7376673f6d61784167653d32353932303030" style="max-width:100%;"&gt;&lt;/a&gt;&lt;a href="https://microbadger.com/#/images/samurais/hanlp-api"&gt;&lt;img alt="Docker Layers" data-canonical-src="https://images.microbadger.com/badges/image/samurais/hanlp-api.svg" src="https://camo.githubusercontent.com/eb4e936d07c7b387f12c1065e0567090fc0f0f54/68747470733a2f2f696d616765732e6d6963726f6261646765722e636f6d2f6261646765732f696d6167652f73616d75726169732f68616e6c702d6170692e737667" style="max-width:100%;"&gt;&lt;/a&gt;&lt;/p&gt;&lt;hr&gt;&lt;p&gt;&lt;strong&gt;HanLP&lt;/strong&gt;是由一系列模型与算法组成的Java工具包，目标是普及自然语言处理在生产环境中的应用。&lt;strong&gt;HanLP&lt;/strong&gt;具备功能完善、性能高效、架构清晰、语料时新、可自定义的特点。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;HanLP&lt;/strong&gt;提供下列功能：&lt;/p&gt;&lt;blockquote&gt;&lt;ul&gt;&lt;li&gt;中文分词&lt;/li&gt;&lt;/ul&gt;&lt;/blockquote&gt;&lt;ul&gt;&lt;li&gt;最短路分词&lt;/li&gt;&lt;li&gt;N-最短路分词&lt;/li&gt;&lt;li&gt;CRF分词&lt;/li&gt;&lt;li&gt;索引分词&lt;/li&gt;&lt;li&gt;极速词典分词&lt;/li&gt;&lt;li&gt;用户自定义词典&lt;/li&gt;&lt;/ul&gt;&lt;blockquote&gt;&lt;ul&gt;&lt;li&gt;词性标注&lt;/li&gt;&lt;li&gt;命名实体识别&lt;/li&gt;&lt;/ul&gt;&lt;/blockquote&gt;&lt;ul&gt;&lt;li&gt;中国人名识别&lt;/li&gt;&lt;li&gt;音译人名识别&lt;/li&gt;&lt;li&gt;日本人名识别&lt;/li&gt;&lt;li&gt;地名识别&lt;/li&gt;&lt;li&gt;实体机构名识别&lt;/li&gt;&lt;/ul&gt;&lt;blockquote&gt;&lt;ul&gt;&lt;li&gt;关键词提取&lt;/li&gt;&lt;/ul&gt;&lt;/blockquote&gt;&lt;ul&gt;&lt;li&gt;TextRank关键词提取&lt;/li&gt;&lt;/ul&gt;&lt;blockquote&gt;&lt;ul&gt;&lt;li&gt;自动摘要&lt;/li&gt;&lt;/ul&gt;&lt;/blockquote&gt;&lt;ul&gt;&lt;li&gt;TextRank自动摘要&lt;/li&gt;&lt;/ul&gt;&lt;blockquote&gt;&lt;ul&gt;&lt;li&gt;短语提取&lt;/li&gt;&lt;/ul&gt;&lt;/blockquote&gt;&lt;ul&gt;&lt;li&gt;基于互信息和左右信息熵的短语提取&lt;/li&gt;&lt;/ul&gt;&lt;blockquote&gt;&lt;ul&gt;&lt;li&gt;拼音转换&lt;/li&gt;&lt;/ul&gt;&lt;/blockquote&gt;&lt;ul&gt;&lt;li&gt;多音字&lt;/li&gt;&lt;li&gt;声母&lt;/li&gt;&lt;li&gt;韵母&lt;/li&gt;&lt;li&gt;声调&lt;/li&gt;&lt;/ul&gt;&lt;blockquote&gt;&lt;ul&gt;&lt;li&gt;简繁转换&lt;/li&gt;&lt;/ul&gt;&lt;/blockquote&gt;&lt;ul&gt;&lt;li&gt;繁体中文分词&lt;/li&gt;&lt;li&gt;简繁分歧词（简体、繁体、臺灣正體、香港繁體）&lt;/li&gt;&lt;/ul&gt;&lt;blockquote&gt;&lt;ul&gt;&lt;li&gt;文本推荐&lt;/li&gt;&lt;/ul&gt;&lt;/blockquote&gt;&lt;ul&gt;&lt;li&gt;语义推荐&lt;/li&gt;&lt;li&gt;拼音推荐&lt;/li&gt;&lt;li&gt;字词推荐&lt;/li&gt;&lt;/ul&gt;&lt;blockquote&gt;&lt;ul&gt;&lt;li&gt;依存句法分析&lt;/li&gt;&lt;/ul&gt;&lt;/blockquote&gt;&lt;ul&gt;&lt;li&gt;基于神经网络的高性能依存句法分析器&lt;/li&gt;&lt;li&gt;MaxEnt依存句法分析&lt;/li&gt;&lt;li&gt;CRF依存句法分析&lt;/li&gt;&lt;/ul&gt;&lt;blockquote&gt;&lt;ul&gt;&lt;li&gt;语料库工具&lt;/li&gt;&lt;/ul&gt;&lt;/blockquote&gt;&lt;ul&gt;&lt;li&gt;分词语料预处理&lt;/li&gt;&lt;li&gt;词频词性词典制作&lt;/li&gt;&lt;li&gt;BiGram统计&lt;/li&gt;&lt;li&gt;词共现统计&lt;/li&gt;&lt;li&gt;CoNLL语料预处理&lt;/li&gt;&lt;li&gt;CoNLL UA/LA/DA评测工具&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;在提供丰富功能的同时，&lt;strong&gt;HanLP&lt;/strong&gt;内部模块坚持低耦合、模型坚持惰性加载、服务坚持静态提供、词典坚持明文发布，使用非常方便，同时自带一些语料处理工具，帮助用户训练自己的模型。&lt;/p&gt;&lt;hr&gt;&lt;h2&gt;&lt;a aria-hidden="true" class="anchor" href="#项目主页" id="user-content-项目主页"&gt;&lt;/a&gt;&lt;svg aria-hidden="true" class="octicon octicon-link" height="16" version="1.1" viewBox="0 0 16 16" width="16"&gt;&lt;a aria-hidden="true" class="anchor" href="#项目主页" id="user-content-项目主页"&gt;&lt;/a&gt;&lt;path d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z" fill-rule="evenodd"&gt;&lt;a aria-hidden="true" class="anchor" href="#项目主页" id="user-content-项目主页"&gt;&lt;/a&gt;&lt;/path&gt;&lt;/svg&gt;项目主页&lt;/h2&gt;&lt;p&gt;HanLP下载地址：&lt;a href="https://github.com/hankcs/HanLP/releases"&gt;https://github.com/hankcs/HanLP/releases&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Solr、Lucene插件：&lt;a href="https://github.com/hankcs/hanlp-solr-plugin"&gt;https://github.com/hankcs/hanlp-solr-plugin&lt;/a&gt;&lt;/p&gt;&lt;p&gt;更多细节：&lt;a href="https://github.com/hankcs/HanLP/wiki"&gt;https://github.com/hankcs/HanLP/wiki&lt;/a&gt;&lt;/p&gt;&lt;hr&gt;&lt;h2&gt;&lt;a aria-hidden="true" class="anchor" href="#下载与配置" id="user-content-下载与配置"&gt;&lt;/a&gt;&lt;svg aria-hidden="true" class="octicon octicon-link" height="16" version="1.1" viewBox="0 0 16 16" width="16"&gt;&lt;a aria-hidden="true" class="anchor" href="#下载与配置" id="user-content-下载与配置"&gt;&lt;/a&gt;&lt;path d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z" fill-rule="evenodd"&gt;&lt;a aria-hidden="true" class="anchor" href="#下载与配置" id="user-content-下载与配置"&gt;&lt;/a&gt;&lt;/path&gt;&lt;/svg&gt;下载与配置&lt;/h2&gt;&lt;h3&gt;&lt;a aria-hidden="true" class="anchor" href="#方式一maven" id="user-content-方式一maven"&gt;&lt;/a&gt;&lt;svg aria-hidden="true" class="octicon octicon-link" height="16" version="1.1" viewBox="0 0 16 16" width="16"&gt;&lt;a aria-hidden="true" class="anchor" href="#方式一maven" id="user-content-方式一maven"&gt;&lt;/a&gt;&lt;path d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z" fill-rule="evenodd"&gt;&lt;a aria-hidden="true" class="anchor" href="#方式一maven" id="user-content-方式一maven"&gt;&lt;/a&gt;&lt;/path&gt;&lt;/svg&gt;方式一、Maven&lt;/h3&gt;&lt;p&gt;为了方便用户，特提供内置了数据包的Portable版，只需在pom.xml加入：&lt;/p&gt;&lt;pre&gt;&lt;code&gt;&amp;lt;dependency&amp;gt;&#xD;
    &amp;lt;groupId&amp;gt;com.hankcs&amp;lt;/groupId&amp;gt;&#xD;
    &amp;lt;artifactId&amp;gt;hanlp&amp;lt;/artifactId&amp;gt;&#xD;
    &amp;lt;version&amp;gt;portable-1.3.4&amp;lt;/version&amp;gt;&#xD;
&amp;lt;/dependency&amp;gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;零配置，即可使用基本功能（除CRF分词、依存句法分析外的全部功能）。如果用户有自定义的需求，可以参考方式二，使用hanlp.properties进行配置。&lt;/p&gt;&lt;h3&gt;&lt;a aria-hidden="true" class="anchor" href="#方式二下载jardatahanlpproperties" id="user-content-方式二下载jardatahanlpproperties"&gt;&lt;/a&gt;&lt;svg aria-hidden="true" class="octicon octicon-link" height="16" version="1.1" viewBox="0 0 16 16" width="16"&gt;&lt;a aria-hidden="true" class="anchor" href="#方式二下载jardatahanlpproperties" id="user-content-方式二下载jardatahanlpproperties"&gt;&lt;/a&gt;&lt;path d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z" fill-rule="evenodd"&gt;&lt;a aria-hidden="true" class="anchor" href="#方式二下载jardatahanlpproperties" id="user-content-方式二下载jardatahanlpproperties"&gt;&lt;/a&gt;&lt;/path&gt;&lt;/svg&gt;方式二、下载jar、data、hanlp.properties&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;HanLP&lt;/strong&gt;将数据与程序分离，给予用户自定义的自由。&lt;/p&gt;&lt;h4&gt;&lt;a aria-hidden="true" class="anchor" href="#1下载jar" id="user-content-1下载jar"&gt;&lt;/a&gt;&lt;svg aria-hidden="true" class="octicon octicon-link" height="16" version="1.1" viewBox="0 0 16 16" width="16"&gt;&lt;a aria-hidden="true" class="anchor" href="#1下载jar" id="user-content-1下载jar"&gt;&lt;/a&gt;&lt;path d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z" fill-rule="evenodd"&gt;&lt;a aria-hidden="true" class="anchor" href="#1下载jar" id="user-content-1下载jar"&gt;&lt;/a&gt;&lt;/path&gt;&lt;/svg&gt;1、下载jar&lt;/h4&gt;&lt;p&gt;&lt;a href="https://github.com/hankcs/HanLP/releases"&gt;hanlp.jar&lt;/a&gt;&lt;/p&gt;&lt;h4&gt;&lt;a aria-hidden="true" class="anchor" href="#2下载data" id="user-content-2下载data"&gt;&lt;/a&gt;&lt;svg aria-hidden="true" class="octicon octicon-link" height="16" version="1.1" viewBox="0 0 16 16" width="16"&gt;&lt;a aria-hidden="true" class="anchor" href="#2下载data" id="user-content-2下载data"&gt;&lt;/a&gt;&lt;path d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z" fill-rule="evenodd"&gt;&lt;a aria-hidden="true" class="anchor" href="#2下载data" id="user-content-2下载data"&gt;&lt;/a&gt;&lt;/path&gt;&lt;/svg&gt;2、下载data&lt;/h4&gt;&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;数据包&lt;/th&gt;&lt;th align="right"&gt;功能&lt;/th&gt;&lt;th align="center"&gt;体积（MB）&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;a href="https://github.com/hankcs/HanLP/releases"&gt;data.zip&lt;/a&gt;&lt;/td&gt;&lt;td align="right"&gt;全部&lt;/td&gt;&lt;td align="center"&gt;255&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;下载后解压到任意目录，接下来通过配置文件告诉HanLP数据包的位置。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;HanLP&lt;/strong&gt;中的数据分为&lt;em&gt;词典&lt;/em&gt;和&lt;em&gt;模型&lt;/em&gt;，其中&lt;em&gt;词典&lt;/em&gt;是词法分析必需的，&lt;em&gt;模型&lt;/em&gt;是句法分析必需的。&lt;/p&gt;&lt;pre&gt;&lt;code&gt;data&#xD;
│&#xD;
├─dictionary&#xD;
└─model&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;用户可以自行增删替换，如果不需要句法分析功能的话，随时可以删除model文件夹。&lt;/p&gt;&lt;ul&gt;&lt;li&gt;模型跟词典没有绝对的区别，隐马模型被做成人人都可以编辑的词典形式，不代表它不是模型。&lt;/li&gt;&lt;li&gt;GitHub代码库中已经包含了data.zip中的词典，直接编译运行自动缓存即可；模型则需要额外下载。&lt;/li&gt;&lt;/ul&gt;&lt;h4&gt;&lt;a aria-hidden="true" class="anchor" href="#3配置文件" id="user-content-3配置文件"&gt;&lt;/a&gt;&lt;svg aria-hidden="true" class="octicon octicon-link" height="16" version="1.1" viewBox="0 0 16 16" width="16"&gt;&lt;a aria-hidden="true" class="anchor" href="#3配置文件" id="user-content-3配置文件"&gt;&lt;/a&gt;&lt;path d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z" fill-rule="evenodd"&gt;&lt;a aria-hidden="true" class="anchor" href="#3配置文件" id="user-content-3配置文件"&gt;&lt;/a&gt;&lt;/path&gt;&lt;/svg&gt;3、配置文件&lt;/h4&gt;&lt;p&gt;示例配置文件:&lt;a href="https://github.com/hankcs/HanLP/releases"&gt;hanlp.properties&lt;/a&gt;在GitHub的发布页中，&lt;code&gt;hanlp.properties&lt;/code&gt;一般和&lt;code&gt;jar&lt;/code&gt;打包在同一个&lt;code&gt;zip&lt;/code&gt;包中。&lt;/p&gt;&lt;p&gt;配置文件的作用是告诉HanLP数据包的位置，只需修改第一行&lt;/p&gt;&lt;pre&gt;&lt;code&gt;root=usr/home/HanLP/&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;为data的&lt;strong&gt;父目录&lt;/strong&gt;即可，比如data目录是&lt;code&gt;/Users/hankcs/Documents/data&lt;/code&gt;，那么&lt;code&gt;root=/Users/hankcs/Documents/&lt;/code&gt;。&lt;/p&gt;&lt;ul&gt;&lt;li&gt;如果选用mini词典的话，则需要修改配置文件：&lt;/li&gt;&lt;/ul&gt;&lt;pre&gt;&lt;code&gt;CoreDictionaryPath=data/dictionary/CoreNatureDictionary.mini.txt&#xD;
BiGramDictionaryPath=data/dictionary/CoreNatureDictionary.ngram.mini.txt&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;最后将HanLP.properties放入classpath即可，对于任何项目，都可以放到src或resources目录下，编译时IDE会自动将其复制到classpath中。&lt;/p&gt;&lt;p&gt;如果放置不当，HanLP会智能提示当前环境下的合适路径，并且尝试从项目根目录读取数据集。&lt;/p&gt;&lt;h2&gt;&lt;a aria-hidden="true" class="anchor" href="#调用方法" id="user-content-调用方法"&gt;&lt;/a&gt;&lt;svg aria-hidden="true" class="octicon octicon-link" height="16" version="1.1" viewBox="0 0 16 16" width="16"&gt;&lt;a aria-hidden="true" class="anchor" href="#调用方法" id="user-content-调用方法"&gt;&lt;/a&gt;&lt;path d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z" fill-rule="evenodd"&gt;&lt;a aria-hidden="true" class="anchor" href="#调用方法" id="user-content-调用方法"&gt;&lt;/a&gt;&lt;/path&gt;&lt;/svg&gt;调用方法&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;HanLP&lt;/strong&gt;几乎所有的功能都可以通过工具类&lt;code&gt;HanLP&lt;/code&gt;快捷调用，当你想不起来调用方法时，只需键入&lt;code&gt;HanLP.&lt;/code&gt;，IDE应当会给出提示，并展示&lt;strong&gt;HanLP&lt;/strong&gt;完善的文档。&lt;/p&gt;&lt;p&gt;&lt;em&gt;推荐用户始终通过工具类&lt;code&gt;HanLP&lt;/code&gt;调用，这么做的好处是，将来&lt;strong&gt;HanLP&lt;/strong&gt;升级后，用户无需修改调用代码。&lt;/em&gt;&lt;/p&gt;&lt;p&gt;所有Demo都位于&lt;a href="https://github.com/hankcs/HanLP/tree/master/src/test/java/com/hankcs/demo"&gt;com.hankcs.demo&lt;/a&gt;下，比文档覆盖了更多细节，强烈建议运行一遍。&lt;/p&gt;&lt;h3&gt;&lt;a aria-hidden="true" class="anchor" href="#1-第一个demo" id="user-content-1-第一个demo"&gt;&lt;/a&gt;&lt;svg aria-hidden="true" class="octicon octicon-link" height="16" version="1.1" viewBox="0 0 16 16" width="16"&gt;&lt;a aria-hidden="true" class="anchor" href="#1-第一个demo" id="user-content-1-第一个demo"&gt;&lt;/a&gt;&lt;path d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z" fill-rule="evenodd"&gt;&lt;a aria-hidden="true" class="anchor" href="#1-第一个demo" id="user-content-1-第一个demo"&gt;&lt;/a&gt;&lt;/path&gt;&lt;/svg&gt;1. 第一个Demo&lt;/h3&gt;&lt;div class="highlight highlight-source-java"&gt;&lt;pre&gt;&lt;span class="pl-smi"&gt;System&lt;/span&gt;&lt;span class="pl-k"&gt;.&lt;/span&gt;out&lt;span class="pl-k"&gt;.&lt;/span&gt;println(&lt;span class="pl-smi"&gt;HanLP&lt;/span&gt;&lt;span class="pl-k"&gt;.&lt;/span&gt;segment(&lt;span class="pl-s"&gt;&lt;span class="pl-pds"&gt;"&lt;/span&gt;你好，欢迎使用HanLP汉语处理包！&lt;span class="pl-pds"&gt;"&lt;/span&gt;&lt;/span&gt;));&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;&lt;li&gt;内存要求&lt;ul&gt;&lt;li&gt;&lt;strong&gt;HanLP&lt;/strong&gt;对词典的数据结构进行了长期的优化，可以应对绝大多数场景。哪怕&lt;strong&gt;HanLP&lt;/strong&gt;的词典上百兆也无需担心，因为在内存中被精心压缩过。&lt;/li&gt;&lt;li&gt;如果内存非常有限，请使用小词典。&lt;strong&gt;HanLP&lt;/strong&gt;默认使用大词典，同时提供小词典，请参考配置文件章节。&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;写给正在编译&lt;strong&gt;HanLP&lt;/strong&gt;的开发者&lt;ul&gt;&lt;li&gt;如果你正在编译运行从Github检出的&lt;strong&gt;HanLP&lt;/strong&gt;代码，并且没有下载data缓存，那么首次加载词典/模型会发生一个&lt;em&gt;自动缓存&lt;/em&gt;的过程。&lt;/li&gt;&lt;li&gt;&lt;em&gt;自动缓存&lt;/em&gt;的目的是为了加速词典载入速度，在下次载入时，缓存的词典文件会带来毫秒级的加载速度。由于词典体积很大，&lt;em&gt;自动缓存&lt;/em&gt;会耗费一些时间，请耐心等待。&lt;/li&gt;&lt;li&gt;&lt;em&gt;自动缓存&lt;/em&gt;缓存的不是明文词典，而是双数组Trie树、DAWG、AhoCorasickDoubleArrayTrie等数据结构。&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h3&gt;&lt;a aria-hidden="true" class="anchor" href="#2-标准分词" id="user-content-2-标准分词"&gt;&lt;/a&gt;&lt;svg aria-hidden="true" class="octicon octicon-link" height="16" version="1.1" viewBox="0 0 16 16" width="16"&gt;&lt;a aria-hidden="true" class="anchor" href="#2-标准分词" id="user-content-2-标准分词"&gt;&lt;/a&gt;&lt;path d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z" fill-rule="evenodd"&gt;&lt;a aria-hidden="true" class="anchor" href="#2-标准分词" id="user-content-2-标准分词"&gt;&lt;/a&gt;&lt;/path&gt;&lt;/svg&gt;2. 标准分词&lt;/h3&gt;&lt;div class="highlight highlight-source-java"&gt;&lt;pre&gt;&lt;span class="pl-k"&gt;List&amp;lt;&lt;span class="pl-smi"&gt;Term&lt;/span&gt;&amp;gt;&lt;/span&gt;termList&lt;span class="pl-k"&gt;=&lt;/span&gt;&lt;span class="pl-smi"&gt;StandardTokenizer&lt;/span&gt;&lt;span class="pl-k"&gt;.&lt;/span&gt;segment(&lt;span class="pl-s"&gt;&lt;span class="pl-pds"&gt;"&lt;/span&gt;商品和服务&lt;span class="pl-pds"&gt;"&lt;/span&gt;&lt;/span&gt;);&lt;span class="pl-smi"&gt;System&lt;/span&gt;&lt;span class="pl-k"&gt;.&lt;/span&gt;out&lt;span class="pl-k"&gt;.&lt;/span&gt;println(termList);&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;&lt;li&gt;说明&lt;ul&gt;&lt;li&gt;&lt;strong&gt;HanLP&lt;/strong&gt;中有一系列“开箱即用”的静态分词器，以&lt;code&gt;Tokenizer&lt;/code&gt;结尾，在接下来的例子中会继续介绍。&lt;/li&gt;&lt;li&gt;&lt;code&gt;HanLP.segment&lt;/code&gt;其实是对&lt;code&gt;StandardTokenizer.segment&lt;/code&gt;的包装。&lt;/li&gt;&lt;li&gt;分词结果包含词性，每个词性的意思请查阅&lt;a href="http://www.hankcs.com/nlp/part-of-speech-tagging.html#h2-8"&gt;《HanLP词性标注集》&lt;/a&gt;。&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;算法详解&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.hankcs.com/nlp/segment/the-word-graph-is-generated.html"&gt;《词图的生成》&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h3&gt;&lt;a aria-hidden="true" class="anchor" href="#3-nlp分词" id="user-content-3-nlp分词"&gt;&lt;/a&gt;&lt;svg aria-hidden="true" class="octicon octicon-link" height="16" version="1.1" viewBox="0 0 16 16" width="16"&gt;&lt;a aria-hidden="true" class="anchor" href="#3-nlp分词" id="user-content-3-nlp分词"&gt;&lt;/a&gt;&lt;path d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z" fill-rule="evenodd"&gt;&lt;a aria-hidden="true" class="anchor" href="#3-nlp分词" id="user-content-3-nlp分词"&gt;&lt;/a&gt;&lt;/path&gt;&lt;/svg&gt;3. NLP分词&lt;/h3&gt;&lt;div class="highlight highlight-source-java"&gt;&lt;pre&gt;&lt;span class="pl-k"&gt;List&amp;lt;&lt;span class="pl-smi"&gt;Term&lt;/span&gt;&amp;gt;&lt;/span&gt;termList&lt;span class="pl-k"&gt;=&lt;/span&gt;&lt;span class="pl-smi"&gt;NLPTokenizer&lt;/span&gt;&lt;span class="pl-k"&gt;.&lt;/span&gt;segment(&lt;span class="pl-s"&gt;&lt;span class="pl-pds"&gt;"&lt;/span&gt;中国科学院计算技术研究所的宗成庆教授正在教授自然语言处理课程&lt;span class="pl-pds"&gt;"&lt;/span&gt;&lt;/span&gt;);&lt;span class="pl-smi"&gt;System&lt;/span&gt;&lt;span class="pl-k"&gt;.&lt;/span&gt;out&lt;span class="pl-k"&gt;.&lt;/span&gt;println(termList);&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;&lt;li&gt;说明&lt;ul&gt;&lt;li&gt;NLP分词&lt;code&gt;NLPTokenizer&lt;/code&gt;会执行全部命名实体识别和词性标注。&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h3&gt;&lt;a aria-hidden="true" class="anchor" href="#4-索引分词" id="user-content-4-索引分词"&gt;&lt;/a&gt;&lt;svg aria-hidden="true" class="octicon octicon-link" height="16" version="1.1" viewBox="0 0 16 16" width="16"&gt;&lt;a aria-hidden="true" class="anchor" href="#4-索引分词" id="user-content-4-索引分词"&gt;&lt;/a&gt;&lt;path d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z" fill-rule="evenodd"&gt;&lt;a aria-hidden="true" class="anchor" href="#4-索引分词" id="user-content-4-索引分词"&gt;&lt;/a&gt;&lt;/path&gt;&lt;/svg&gt;4. 索引分词&lt;/h3&gt;&lt;div class="highlight highlight-source-java"&gt;&lt;pre&gt;&lt;span class="pl-k"&gt;List&amp;lt;&lt;span class="pl-smi"&gt;Term&lt;/span&gt;&amp;gt;&lt;/span&gt;termList&lt;span class="pl-k"&gt;=&lt;/span&gt;&lt;span class="pl-smi"&gt;IndexTokenizer&lt;/span&gt;&lt;span class="pl-k"&gt;.&lt;/span&gt;segment(&lt;span class="pl-s"&gt;&lt;span class="pl-pds"&gt;"&lt;/span&gt;主副食品&lt;span class="pl-pds"&gt;"&lt;/span&gt;&lt;/span&gt;);&lt;span class="pl-k"&gt;for&lt;/span&gt;(&lt;span class="pl-smi"&gt;Term&lt;/span&gt;term&lt;span class="pl-k"&gt;:&lt;/span&gt;termList)&#xD;
{&lt;span class="pl-smi"&gt;System&lt;/span&gt;&lt;span class="pl-k"&gt;.&lt;/span&gt;out&lt;span class="pl-k"&gt;.&lt;/span&gt;println(term&lt;span class="pl-k"&gt;+&lt;/span&gt;&lt;span class="pl-s"&gt;&lt;span class="pl-pds"&gt;"&lt;/span&gt;[&lt;span class="pl-pds"&gt;"&lt;/span&gt;&lt;/span&gt;&lt;span class="pl-k"&gt;+&lt;/span&gt;term&lt;span class="pl-k"&gt;.&lt;/span&gt;offset&lt;span class="pl-k"&gt;+&lt;/span&gt;&lt;span class="pl-s"&gt;&lt;span class="pl-pds"&gt;"&lt;/span&gt;:&lt;span class="pl-pds"&gt;"&lt;/span&gt;&lt;/span&gt;&lt;span class="pl-k"&gt;+&lt;/span&gt;(term&lt;span class="pl-k"&gt;.&lt;/span&gt;offset&lt;span class="pl-k"&gt;+&lt;/span&gt;term&lt;span class="pl-k"&gt;.&lt;/span&gt;word&lt;span class="pl-k"&gt;.&lt;/span&gt;length())&lt;span class="pl-k"&gt;+&lt;/span&gt;&lt;span class="pl-s"&gt;&lt;span class="pl-pds"&gt;"&lt;/span&gt;]&lt;span class="pl-pds"&gt;"&lt;/span&gt;&lt;/span&gt;);&#xD;
}&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;&lt;li&gt;说明&lt;ul&gt;&lt;li&gt;索引分词&lt;code&gt;IndexTokenizer&lt;/code&gt;是面向搜索引擎的分词器，能够对长词全切分，另外通过&lt;code&gt;term.offset&lt;/code&gt;可以获取单词在文本中的偏移量。&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h3&gt;&lt;a aria-hidden="true" class="anchor" href="#5-n-最短路径分词" id="user-content-5-n-最短路径分词"&gt;&lt;/a&gt;&lt;svg aria-hidden="true" class="octicon octicon-link" height="16" version="1.1" viewBox="0 0 16 16" width="16"&gt;&lt;a aria-hidden="true" class="anchor" href="#5-n-最短路径分词" id="user-content-5-n-最短路径分词"&gt;&lt;/a&gt;&lt;path d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z" fill-rule="evenodd"&gt;&lt;a aria-hidden="true" class="anchor" href="#5-n-最短路径分词" id="user-content-5-n-最短路径分词"&gt;&lt;/a&gt;&lt;/path&gt;&lt;/svg&gt;5. N-最短路径分词&lt;/h3&gt;&lt;div class="highlight highlight-source-java"&gt;&lt;pre&gt;&lt;span class="pl-smi"&gt;Segment&lt;/span&gt;nShortSegment&lt;span class="pl-k"&gt;=&lt;/span&gt;&lt;span class="pl-k"&gt;new&lt;/span&gt;&lt;span class="pl-smi"&gt;NShortSegment&lt;/span&gt;()&lt;span class="pl-k"&gt;.&lt;/span&gt;enableCustomDictionary(&lt;span class="pl-c1"&gt;false&lt;/span&gt;)&lt;span class="pl-k"&gt;.&lt;/span&gt;enablePlaceRecognize(&lt;span class="pl-c1"&gt;true&lt;/span&gt;)&lt;span class="pl-k"&gt;.&lt;/span&gt;enableOrganizationRecognize(&lt;span class="pl-c1"&gt;true&lt;/span&gt;);&lt;span class="pl-smi"&gt;Segment&lt;/span&gt;shortestSegment&lt;span class="pl-k"&gt;=&lt;/span&gt;&lt;span class="pl-k"&gt;new&lt;/span&gt;&lt;span class="pl-smi"&gt;DijkstraSegment&lt;/span&gt;()&lt;span class="pl-k"&gt;.&lt;/span&gt;enableCustomDictionary(&lt;span class="pl-c1"&gt;false&lt;/span&gt;)&lt;span class="pl-k"&gt;.&lt;/span&gt;enablePlaceRecognize(&lt;span class="pl-c1"&gt;true&lt;/span&gt;)&lt;span class="pl-k"&gt;.&lt;/span&gt;enableOrganizationRecognize(&lt;span class="pl-c1"&gt;true&lt;/span&gt;);&lt;span class="pl-k"&gt;String&lt;/span&gt;[] testCase&lt;span class="pl-k"&gt;=&lt;/span&gt;&lt;span class="pl-k"&gt;new&lt;/span&gt;&lt;span class="pl-smi"&gt;String&lt;/span&gt;[]{&lt;span class="pl-s"&gt;&lt;span class="pl-pds"&gt;"&lt;/span&gt;今天，刘志军案的关键人物,山西女商人丁书苗在市二中院出庭受审。&lt;span class="pl-pds"&gt;"&lt;/span&gt;&lt;/span&gt;,&lt;span class="pl-s"&gt;&lt;span class="pl-pds"&gt;"&lt;/span&gt;刘喜杰石国祥会见吴亚琴先进事迹报告团成员&lt;span class="pl-pds"&gt;"&lt;/span&gt;&lt;/span&gt;,&#xD;
        };&lt;span class="pl-k"&gt;for&lt;/span&gt;(&lt;span class="pl-smi"&gt;String&lt;/span&gt;sentence&lt;span class="pl-k"&gt;:&lt;/span&gt;testCase)&#xD;
{&lt;span class="pl-smi"&gt;System&lt;/span&gt;&lt;span class="pl-k"&gt;.&lt;/span&gt;out&lt;span class="pl-k"&gt;.&lt;/span&gt;println(&lt;span class="pl-s"&gt;&lt;span class="pl-pds"&gt;"&lt;/span&gt;N-最短分词：&lt;span class="pl-pds"&gt;"&lt;/span&gt;&lt;/span&gt;&lt;span class="pl-k"&gt;+&lt;/span&gt;nShortSegment&lt;span class="pl-k"&gt;.&lt;/span&gt;seg(sentence)&lt;span class="pl-k"&gt;+&lt;/span&gt;&lt;span class="pl-s"&gt;&lt;span class="pl-pds"&gt;"&lt;/span&gt;&lt;span class="pl-cce"&gt;\n&lt;/span&gt;最短路分词：&lt;span class="pl-pds"&gt;"&lt;/span&gt;&lt;/span&gt;&lt;span class="pl-k"&gt;+&lt;/span&gt;shortestSegment&lt;span class="pl-k"&gt;.&lt;/span&gt;seg(sentence));&#xD;
}&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;&lt;li&gt;说明&lt;ul&gt;&lt;li&gt;N最短路分词器&lt;code&gt;NShortSegment&lt;/code&gt;比最短路分词器慢，但是效果稍微好一些，对命名实体识别能力更强。&lt;/li&gt;&lt;li&gt;一般场景下最短路分词的精度已经足够，而且速度比N最短路分词器快几倍，请酌情选择。&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;算法详解&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.hankcs.com/nlp/segment/n-shortest-path-to-the-java-implementation-and-application-segmentation.html"&gt;《N最短路径的Java实现与分词应用》&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h3&gt;&lt;a aria-hidden="true" class="anchor" href="#6-crf分词" id="user-content-6-crf分词"&gt;&lt;/a&gt;&lt;svg aria-hidden="true" class="octicon octicon-link" height="16" version="1.1" viewBox="0 0 16 16" width="16"&gt;&lt;a aria-hidden="true" class="anchor" href="#6-crf分词" id="user-content-6-crf分词"&gt;&lt;/a&gt;&lt;path d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z" fill-rule="evenodd"&gt;&lt;a aria-hidden="true" class="anchor" href="#6-crf分词" id="user-content-6-crf分词"&gt;&lt;/a&gt;&lt;/path&gt;&lt;/svg&gt;6. CRF分词&lt;/h3&gt;&lt;div class="highlight highlight-source-java"&gt;&lt;pre&gt;&lt;span class="pl-smi"&gt;Segment&lt;/span&gt;segment&lt;span class="pl-k"&gt;=&lt;/span&gt;&lt;span class="pl-k"&gt;new&lt;/span&gt;&lt;span class="pl-smi"&gt;CRFSegment&lt;/span&gt;();&#xD;
segment&lt;span class="pl-k"&gt;.&lt;/span&gt;enablePartOfSpeechTagging(&lt;span class="pl-c1"&gt;true&lt;/span&gt;);&lt;span class="pl-k"&gt;List&amp;lt;&lt;span class="pl-smi"&gt;Term&lt;/span&gt;&amp;gt;&lt;/span&gt;termList&lt;span class="pl-k"&gt;=&lt;/span&gt;segment&lt;span class="pl-k"&gt;.&lt;/span&gt;seg(&lt;span class="pl-s"&gt;&lt;span class="pl-pds"&gt;"&lt;/span&gt;你看过穆赫兰道吗&lt;span class="pl-pds"&gt;"&lt;/span&gt;&lt;/span&gt;);&lt;span class="pl-smi"&gt;System&lt;/span&gt;&lt;span class="pl-k"&gt;.&lt;/span&gt;out&lt;span class="pl-k"&gt;.&lt;/span&gt;println(termList);&lt;span class="pl-k"&gt;for&lt;/span&gt;(&lt;span class="pl-smi"&gt;Term&lt;/span&gt;term&lt;span class="pl-k"&gt;:&lt;/span&gt;termList)&#xD;
{&lt;span class="pl-k"&gt;if&lt;/span&gt;(term&lt;span class="pl-k"&gt;.&lt;/span&gt;nature&lt;span class="pl-k"&gt;==&lt;/span&gt;&lt;span class="pl-c1"&gt;null&lt;/span&gt;)&#xD;
    {&lt;span class="pl-smi"&gt;System&lt;/span&gt;&lt;span class="pl-k"&gt;.&lt;/span&gt;out&lt;span class="pl-k"&gt;.&lt;/span&gt;println(&lt;span class="pl-s"&gt;&lt;span class="pl-pds"&gt;"&lt;/span&gt;识别到新词：&lt;span class="pl-pds"&gt;"&lt;/span&gt;&lt;/span&gt;&lt;span class="pl-k"&gt;+&lt;/span&gt;term&lt;span class="pl-k"&gt;.&lt;/span&gt;word);&#xD;
    }&#xD;
}&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;&lt;li&gt;说明&lt;ul&gt;&lt;li&gt;CRF对新词有很好的识别能力，但是开销较大。&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;算法详解&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.hankcs.com/nlp/segment/crf-segmentation-of-the-pure-java-implementation.html"&gt;《CRF分词的纯Java实现》&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.hankcs.com/nlp/the-crf-model-format-description.html"&gt;《CRF++模型格式说明》&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h3&gt;&lt;a aria-hidden="true" class="anchor" href="#7-极速词典分词" id="user-content-7-极速词典分词"&gt;&lt;/a&gt;&lt;svg aria-hidden="true" class="octicon octicon-link" height="16" version="1.1" viewBox="0 0 16 16" width="16"&gt;&lt;a aria-hidden="true" class="anchor" href="#7-极速词典分词" id="user-content-7-极速词典分词"&gt;&lt;/a&gt;&lt;path d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z" fill-rule="evenodd"&gt;&lt;a aria-hidden="true" class="anchor" href="#7-极速词典分词" id="user-content-7-极速词典分词"&gt;&lt;/a&gt;&lt;/path&gt;&lt;/svg&gt;7. 极速词典分词&lt;/h3&gt;&lt;div class="highlight highlight-source-java"&gt;&lt;pre&gt;&lt;span class="pl-c"&gt;&lt;span class="pl-c"&gt;/*&lt;/span&gt;*&lt;/span&gt;&lt;span class="pl-c"&gt;* 演示极速分词，基于AhoCorasickDoubleArrayTrie实现的词典分词，适用于“高吞吐量”“精度一般”的场合&lt;/span&gt;&lt;span class="pl-c"&gt;* @author hankcs&lt;/span&gt;&lt;span class="pl-c"&gt;&lt;span class="pl-c"&gt;*/&lt;/span&gt;&lt;/span&gt;&lt;span class="pl-k"&gt;public&lt;/span&gt;&lt;span class="pl-k"&gt;class&lt;/span&gt;&lt;span class="pl-en"&gt;DemoHighSpeedSegment&lt;/span&gt;{&lt;span class="pl-k"&gt;public&lt;/span&gt;&lt;span class="pl-k"&gt;static&lt;/span&gt;&lt;span class="pl-k"&gt;void&lt;/span&gt;&lt;span class="pl-en"&gt;main&lt;/span&gt;(&lt;span class="pl-k"&gt;String&lt;/span&gt;[]&lt;span class="pl-v"&gt;args&lt;/span&gt;)&#xD;
    {&lt;span class="pl-smi"&gt;String&lt;/span&gt;text&lt;span class="pl-k"&gt;=&lt;/span&gt;&lt;span class="pl-s"&gt;&lt;span class="pl-pds"&gt;"&lt;/span&gt;江西鄱阳湖干枯，中国最大淡水湖变成大草原&lt;span class="pl-pds"&gt;"&lt;/span&gt;&lt;/span&gt;;&lt;span class="pl-smi"&gt;System&lt;/span&gt;&lt;span class="pl-k"&gt;.&lt;/span&gt;out&lt;span class="pl-k"&gt;.&lt;/span&gt;println(&lt;span class="pl-smi"&gt;SpeedTokenizer&lt;/span&gt;&lt;span class="pl-k"&gt;.&lt;/span&gt;segment(text));&lt;span class="pl-k"&gt;long&lt;/span&gt;start&lt;span class="pl-k"&gt;=&lt;/span&gt;&lt;span class="pl-smi"&gt;System&lt;/span&gt;&lt;span class="pl-k"&gt;.&lt;/span&gt;currentTimeMillis();&lt;span class="pl-k"&gt;int&lt;/span&gt;pressure&lt;span class="pl-k"&gt;=&lt;/span&gt;&lt;span class="pl-c1"&gt;1000000&lt;/span&gt;;&lt;span class="pl-k"&gt;for&lt;/span&gt;(&lt;span class="pl-k"&gt;int&lt;/span&gt;i&lt;span class="pl-k"&gt;=&lt;/span&gt;&lt;span class="pl-c1"&gt;0&lt;/span&gt;; i&lt;span class="pl-k"&gt;&amp;lt;&lt;/span&gt;pressure;&lt;span class="pl-k"&gt;++&lt;/span&gt;i)&#xD;
        {&lt;span class="pl-smi"&gt;SpeedTokenizer&lt;/span&gt;&lt;span class="pl-k"&gt;.&lt;/span&gt;segment(text);&#xD;
        }&lt;span class="pl-k"&gt;double&lt;/span&gt;costTime&lt;span class="pl-k"&gt;=&lt;/span&gt;(&lt;span class="pl-smi"&gt;System&lt;/span&gt;&lt;span class="pl-k"&gt;.&lt;/span&gt;currentTimeMillis()&lt;span class="pl-k"&gt;-&lt;/span&gt;start)&lt;span class="pl-k"&gt;/&lt;/span&gt;(&lt;span class="pl-k"&gt;double&lt;/span&gt;)&lt;span class="pl-c1"&gt;1000&lt;/span&gt;;&lt;span class="pl-smi"&gt;System&lt;/span&gt;&lt;span class="pl-k"&gt;.&lt;/span&gt;out&lt;span class="pl-k"&gt;.&lt;/span&gt;printf(&lt;span class="pl-s"&gt;&lt;span class="pl-pds"&gt;"&lt;/span&gt;分词速度：%.2f字每秒&lt;span class="pl-pds"&gt;"&lt;/span&gt;&lt;/span&gt;, text&lt;span class="pl-k"&gt;.&lt;/span&gt;length()&lt;span class="pl-k"&gt;*&lt;/span&gt;pressure&lt;span class="pl-k"&gt;/&lt;/span&gt;costTime);&#xD;
    }&#xD;
}&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;&lt;li&gt;说明&lt;ul&gt;&lt;li&gt;极速分词是词典最长分词，速度极其快，精度一般。&lt;/li&gt;&lt;li&gt;在i7上跑出了2000万字每秒的速度。&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;算法详解&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.hankcs.com/program/algorithm/aho-corasick-double-array-trie.html"&gt;《Aho Corasick自动机结合DoubleArrayTrie极速多模式匹配》&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h3&gt;&lt;a aria-hidden="true" class="anchor" href="#8-用户自定义词典" id="user-content-8-用户自定义词典"&gt;&lt;/a&gt;&lt;svg aria-hidden="true" class="octicon octicon-link" height="16" version="1.1" viewBox="0 0 16 16" width="16"&gt;&lt;a aria-hidden="true" class="anchor" href="#8-用户自定义词典" id="user-content-8-用户自定义词典"&gt;&lt;/a&gt;&lt;path d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z" fill-rule="evenodd"&gt;&lt;a aria-hidden="true" class="anchor" href="#8-用户自定义词典" id="user-content-8-用户自定义词典"&gt;&lt;/a&gt;&lt;/path&gt;&lt;/svg&gt;8. 用户自定义词典&lt;/h3&gt;&lt;div class="highlight highlight-source-java"&gt;&lt;pre&gt;&lt;span class="pl-c"&gt;&lt;span class="pl-c"&gt;/*&lt;/span&gt;*&lt;/span&gt;&lt;span class="pl-c"&gt;* 演示用户词典的动态增删&lt;/span&gt;&lt;span class="pl-c"&gt;*&lt;/span&gt;&lt;span class="pl-c"&gt;* @author hankcs&lt;/span&gt;&lt;span class="pl-c"&gt;&lt;span class="pl-c"&gt;*/&lt;/span&gt;&lt;/span&gt;&lt;span class="pl-k"&gt;public&lt;/span&gt;&lt;span class="pl-k"&gt;class&lt;/span&gt;&lt;span class="pl-en"&gt;DemoCustomDictionary&lt;/span&gt;{&lt;span class="pl-k"&gt;public&lt;/span&gt;&lt;span class="pl-k"&gt;static&lt;/span&gt;&lt;span class="pl-k"&gt;void&lt;/span&gt;&lt;span class="pl-en"&gt;main&lt;/span&gt;(&lt;span class="pl-k"&gt;String&lt;/span&gt;[]&lt;span class="pl-v"&gt;args&lt;/span&gt;)&#xD;
    {&lt;span class="pl-c"&gt;&lt;span class="pl-c"&gt;//&lt;/span&gt;动态增加&lt;/span&gt;&lt;span class="pl-smi"&gt;CustomDictionary&lt;/span&gt;&lt;span class="pl-k"&gt;.&lt;/span&gt;add(&lt;span class="pl-s"&gt;&lt;span class="pl-pds"&gt;"&lt;/span&gt;攻城狮&lt;span class="pl-pds"&gt;"&lt;/span&gt;&lt;/span&gt;);&lt;span class="pl-c"&gt;&lt;span class="pl-c"&gt;//&lt;/span&gt;强行插入&lt;/span&gt;&lt;span class="pl-smi"&gt;CustomDictionary&lt;/span&gt;&lt;span class="pl-k"&gt;.&lt;/span&gt;insert(&lt;span class="pl-s"&gt;&lt;span class="pl-pds"&gt;"&lt;/span&gt;白富美&lt;span class="pl-pds"&gt;"&lt;/span&gt;&lt;/span&gt;,&lt;span class="pl-s"&gt;&lt;span class="pl-pds"&gt;"&lt;/span&gt;nz 1024&lt;span class="pl-pds"&gt;"&lt;/span&gt;&lt;/span&gt;);&lt;span class="pl-c"&gt;&lt;span class="pl-c"&gt;//&lt;/span&gt;删除词语（注释掉试试）&lt;/span&gt;&lt;span class="pl-c"&gt;&lt;span class="pl-c"&gt;//&lt;/span&gt;CustomDictionary.remove("攻城狮");&lt;/span&gt;&lt;span class="pl-smi"&gt;System&lt;/span&gt;&lt;span class="pl-k"&gt;.&lt;/span&gt;out&lt;span class="pl-k"&gt;.&lt;/span&gt;println(&lt;span class="pl-smi"&gt;CustomDictionary&lt;/span&gt;&lt;span class="pl-k"&gt;.&lt;/span&gt;add(&lt;span class="pl-s"&gt;&lt;span class="pl-pds"&gt;"&lt;/span&gt;单身狗&lt;span class="pl-pds"&gt;"&lt;/span&gt;&lt;/span&gt;,&lt;span class="pl-s"&gt;&lt;span class="pl-pds"&gt;"&lt;/span&gt;nz 1024 n 1&lt;span class="pl-pds"&gt;"&lt;/span&gt;&lt;/span&gt;));&lt;span class="pl-smi"&gt;System&lt;/span&gt;&lt;span class="pl-k"&gt;.&lt;/span&gt;out&lt;span class="pl-k"&gt;.&lt;/span&gt;println(&lt;span class="pl-smi"&gt;CustomDictionary&lt;/span&gt;&lt;span class="pl-k"&gt;.&lt;/span&gt;get(&lt;span class="pl-s"&gt;&lt;span class="pl-pds"&gt;"&lt;/span&gt;单身狗&lt;span class="pl-pds"&gt;"&lt;/span&gt;&lt;/span&gt;));&lt;span class="pl-smi"&gt;String&lt;/span&gt;text&lt;span class="pl-k"&gt;=&lt;/span&gt;&lt;span class="pl-s"&gt;&lt;span class="pl-pds"&gt;"&lt;/span&gt;攻城狮逆袭单身狗，迎娶白富美，走上人生巅峰&lt;span class="pl-pds"&gt;"&lt;/span&gt;&lt;/span&gt;;&lt;span class="pl-c"&gt;&lt;span class="pl-c"&gt;//&lt;/span&gt;怎么可能噗哈哈！&lt;/span&gt;&lt;span class="pl-c"&gt;&lt;span class="pl-c"&gt;//&lt;/span&gt;AhoCorasickDoubleArrayTrie自动机分词&lt;/span&gt;&lt;span class="pl-k"&gt;final&lt;/span&gt;&lt;span class="pl-k"&gt;char&lt;/span&gt;[] charArray&lt;span class="pl-k"&gt;=&lt;/span&gt;text&lt;span class="pl-k"&gt;.&lt;/span&gt;toCharArray();&lt;span class="pl-smi"&gt;CustomDictionary&lt;/span&gt;&lt;span class="pl-k"&gt;.&lt;/span&gt;parseText(charArray,&lt;span class="pl-k"&gt;new&lt;/span&gt;&lt;span class="pl-smi"&gt;AhoCorasickDoubleArrayTrie&lt;/span&gt;.&lt;span class="pl-k"&gt;IHit&amp;lt;&lt;span class="pl-smi"&gt;CoreDictionary&lt;/span&gt;.&lt;/span&gt;&lt;span class="pl-smi"&gt;Attribute&lt;/span&gt;&amp;gt;()&#xD;
        {&lt;span class="pl-k"&gt;@Override&lt;/span&gt;&lt;span class="pl-k"&gt;public&lt;/span&gt;&lt;span class="pl-k"&gt;void&lt;/span&gt;hit(&lt;span class="pl-k"&gt;int&lt;/span&gt;begin,&lt;span class="pl-k"&gt;int&lt;/span&gt;end,&lt;span class="pl-smi"&gt;CoreDictionary&lt;/span&gt;&lt;span class="pl-k"&gt;.&lt;/span&gt;&lt;span class="pl-smi"&gt;Attribute&lt;/span&gt;value)&#xD;
            {&lt;span class="pl-smi"&gt;System&lt;/span&gt;&lt;span class="pl-k"&gt;.&lt;/span&gt;out&lt;span class="pl-k"&gt;.&lt;/span&gt;printf(&lt;span class="pl-s"&gt;&lt;span class="pl-pds"&gt;"&lt;/span&gt;[%d:%d]=%s %s&lt;span class="pl-cce"&gt;\n&lt;/span&gt;&lt;span class="pl-pds"&gt;"&lt;/span&gt;&lt;/span&gt;, begin, end,&lt;span class="pl-k"&gt;new&lt;/span&gt;&lt;span class="pl-smi"&gt;String&lt;/span&gt;(charArray, begin, end&lt;span class="pl-k"&gt;-&lt;/span&gt;begin), value);&#xD;
            }&#xD;
        });&lt;span class="pl-c"&gt;&lt;span class="pl-c"&gt;//&lt;/span&gt;trie树分词&lt;/span&gt;&lt;span class="pl-smi"&gt;BaseSearcher&lt;/span&gt;searcher&lt;span class="pl-k"&gt;=&lt;/span&gt;&lt;span class="pl-smi"&gt;CustomDictionary&lt;/span&gt;&lt;span class="pl-k"&gt;.&lt;/span&gt;getSearcher(text);&lt;span class="pl-smi"&gt;Map&lt;/span&gt;&lt;span class="pl-k"&gt;.&lt;/span&gt;&lt;span class="pl-smi"&gt;Entry&lt;/span&gt;entry;&lt;span class="pl-k"&gt;while&lt;/span&gt;((entry&lt;span class="pl-k"&gt;=&lt;/span&gt;searcher&lt;span class="pl-k"&gt;.&lt;/span&gt;next())&lt;span class="pl-k"&gt;!=&lt;/span&gt;&lt;span class="pl-c1"&gt;null&lt;/span&gt;)&#xD;
        {&lt;span class="pl-smi"&gt;System&lt;/span&gt;&lt;span class="pl-k"&gt;.&lt;/span&gt;out&lt;span class="pl-k"&gt;.&lt;/span&gt;println(entry);&#xD;
        }&lt;span class="pl-c"&gt;&lt;span class="pl-c"&gt;//&lt;/span&gt;标准分词&lt;/span&gt;&lt;span class="pl-smi"&gt;System&lt;/span&gt;&lt;span class="pl-k"&gt;.&lt;/span&gt;out&lt;span class="pl-k"&gt;.&lt;/span&gt;println(&lt;span class="pl-smi"&gt;HanLP&lt;/span&gt;&lt;span class="pl-k"&gt;.&lt;/span&gt;segment(text));&#xD;
    }&#xD;
}&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;&lt;li&gt;说明&lt;ul&gt;&lt;li&gt;&lt;code&gt;CustomDictionary&lt;/code&gt;是一份全局的用户自定义词典，可以随时增删，影响全部分词器。&lt;/li&gt;&lt;li&gt;另外可以在任何分词器中关闭它。通过代码动态增删不会保存到词典文件。&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;追加词典&lt;ul&gt;&lt;li&gt;&lt;code&gt;CustomDictionary&lt;/code&gt;主词典文本路径是&lt;code&gt;data/dictionary/custom/CustomDictionary.txt&lt;/code&gt;，用户可以在此增加自己的词语（不推荐）；也可以单独新建一个文本文件，通过配置文件&lt;code&gt;CustomDictionaryPath=data/dictionary/custom/CustomDictionary.txt; 我的词典.txt;&lt;/code&gt;来追加词典（推荐）。&lt;/li&gt;&lt;li&gt;始终建议将相同词性的词语放到同一个词典文件里，便于维护和分享。&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;词典格式&lt;ul&gt;&lt;li&gt;每一行代表一个单词，格式遵从&lt;code&gt;[单词] [词性A] [A的频次] [词性B] [B的频次] ...&lt;/code&gt;如果不填词性则表示采用词典的默认词性。&lt;/li&gt;&lt;li&gt;词典的默认词性默认是名词n，可以通过配置文件修改：&lt;code&gt;全国地名大全.txt ns;&lt;/code&gt;如果词典路径后面空格紧接着词性，则该词典默认是该词性。&lt;/li&gt;&lt;li&gt;在基于层叠隐马模型的最短路分词中，并不保证自定义词典中的词一定被切分出来。&lt;/li&gt;&lt;li&gt;关于用户词典的更多信息请参考&lt;strong&gt;词典说明&lt;/strong&gt;一章。&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;算法详解&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.hankcs.com/program/java/tire-tree-participle.html"&gt;《Trie树分词》&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.hankcs.com/program/algorithm/aho-corasick-double-array-trie.html"&gt;《Aho Corasick自动机结合DoubleArrayTrie极速多模式匹配》&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h3&gt;&lt;a aria-hidden="true" class="anchor" href="#9-中国人名识别" id="user-content-9-中国人名识别"&gt;&lt;/a&gt;&lt;svg aria-hidden="true" class="octicon octicon-link" height="16" version="1.1" viewBox="0 0 16 16" width="16"&gt;&lt;a aria-hidden="true" class="anchor" href="#9-中国人名识别" id="user-content-9-中国人名识别"&gt;&lt;/a&gt;&lt;path d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z" fill-rule="evenodd"&gt;&lt;a aria-hidden="true" class="anchor" href="#9-中国人名识别" id="user-content-9-中国人名识别"&gt;&lt;/a&gt;&lt;/path&gt;&lt;/svg&gt;9. 中国人名识别&lt;/h3&gt;&lt;div class="highlight highlight-source-java"&gt;&lt;pre&gt;&lt;span class="pl-k"&gt;String&lt;/span&gt;[] testCase&lt;span class="pl-k"&gt;=&lt;/span&gt;&lt;span class="pl-k"&gt;new&lt;/span&gt;&lt;span class="pl-smi"&gt;String&lt;/span&gt;[]{&lt;span class="pl-s"&gt;&lt;span class="pl-pds"&gt;"&lt;/span&gt;签约仪式前，秦光荣、李纪恒、仇和等一同会见了参加签约的企业家。&lt;span class="pl-pds"&gt;"&lt;/span&gt;&lt;/span&gt;,&lt;span class="pl-s"&gt;&lt;span class="pl-pds"&gt;"&lt;/span&gt;王国强、高峰、汪洋、张朝阳光着头、韩寒、小四&lt;span class="pl-pds"&gt;"&lt;/span&gt;&lt;/span&gt;,&lt;span class="pl-s"&gt;&lt;span class="pl-pds"&gt;"&lt;/span&gt;张浩和胡健康复员回家了&lt;span class="pl-pds"&gt;"&lt;/span&gt;&lt;/span&gt;,&lt;span class="pl-s"&gt;&lt;span class="pl-pds"&gt;"&lt;/span&gt;王总和小丽结婚了&lt;span class="pl-pds"&gt;"&lt;/span&gt;&lt;/span&gt;,&lt;span class="pl-s"&gt;&lt;span class="pl-pds"&gt;"&lt;/span&gt;编剧邵钧林和稽道青说&lt;span class="pl-pds"&gt;"&lt;/span&gt;&lt;/span&gt;,&lt;span class="pl-s"&gt;&lt;span class="pl-pds"&gt;"&lt;/span&gt;这里有关天培的有关事迹&lt;span class="pl-pds"&gt;"&lt;/span&gt;&lt;/span&gt;,&lt;span class="pl-s"&gt;&lt;span class="pl-pds"&gt;"&lt;/span&gt;龚学平等领导,邓颖超生前&lt;span class="pl-pds"&gt;"&lt;/span&gt;&lt;/span&gt;,&#xD;
        };&lt;span class="pl-smi"&gt;Segment&lt;/span&gt;segment&lt;span class="pl-k"&gt;=&lt;/span&gt;&lt;span class="pl-smi"&gt;HanLP&lt;/span&gt;&lt;span class="pl-k"&gt;.&lt;/span&gt;newSegment()&lt;span class="pl-k"&gt;.&lt;/span&gt;enableNameRecognize(&lt;span class="pl-c1"&gt;true&lt;/span&gt;);&lt;span class="pl-k"&gt;for&lt;/span&gt;(&lt;span class="pl-smi"&gt;String&lt;/span&gt;sentence&lt;span class="pl-k"&gt;:&lt;/span&gt;testCase)&#xD;
{&lt;span class="pl-k"&gt;List&amp;lt;&lt;span class="pl-smi"&gt;Term&lt;/span&gt;&amp;gt;&lt;/span&gt;termList&lt;span class="pl-k"&gt;=&lt;/span&gt;segment&lt;span class="pl-k"&gt;.&lt;/span&gt;seg(sentence);&lt;span class="pl-smi"&gt;System&lt;/span&gt;&lt;span class="pl-k"&gt;.&lt;/span&gt;out&lt;span class="pl-k"&gt;.&lt;/span&gt;println(termList);&#xD;
}&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;&lt;li&gt;说明&lt;ul&gt;&lt;li&gt;目前分词器基本上都默认开启了中国人名识别，比如&lt;code&gt;HanLP.segment()&lt;/code&gt;接口中使用的分词器等等，用户不必手动开启；上面的代码只是为了强调。&lt;/li&gt;&lt;li&gt;有一定的误命中率，比如误命中&lt;code&gt;关键年&lt;/code&gt;，则可以通过在&lt;code&gt;data/dictionary/person/nr.txt&lt;/code&gt;加入一条&lt;code&gt;关键年 A 1&lt;/code&gt;来排除&lt;code&gt;关键年&lt;/code&gt;作为人名的可能性，也可以将&lt;code&gt;关键年&lt;/code&gt;作为新词登记到自定义词典中。&lt;/li&gt;&lt;li&gt;如果你通过上述办法解决了问题，欢迎向我提交pull request，词典也是宝贵的财富。&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;算法详解&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.hankcs.com/nlp/chinese-name-recognition-in-actual-hmm-viterbi-role-labeling.html"&gt;《实战HMM-Viterbi角色标注中国人名识别》&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h3&gt;&lt;a aria-hidden="true" class="anchor" href="#10-音译人名识别" id="user-content-10-音译人名识别"&gt;&lt;/a&gt;&lt;svg aria-hidden="true" class="octicon octicon-link" height="16" version="1.1" viewBox="0 0 16 16" width="16"&gt;&lt;a aria-hidden="true" class="anchor" href="#10-音译人名识别" id="user-content-10-音译人名识别"&gt;&lt;/a&gt;&lt;path d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z" fill-rule="evenodd"&gt;&lt;a aria-hidden="true" class="anchor" href="#10-音译人名识别" id="user-content-10-音译人名识别"&gt;&lt;/a&gt;&lt;/path&gt;&lt;/svg&gt;10. 音译人名识别&lt;/h3&gt;&lt;div class="highlight highlight-source-java"&gt;&lt;pre&gt;&lt;span class="pl-k"&gt;String&lt;/span&gt;[] testCase&lt;span class="pl-k"&gt;=&lt;/span&gt;&lt;span class="pl-k"&gt;new&lt;/span&gt;&lt;span class="pl-smi"&gt;String&lt;/span&gt;[]{&lt;span class="pl-s"&gt;&lt;span class="pl-pds"&gt;"&lt;/span&gt;一桶冰水当头倒下，微软的比尔盖茨、Facebook的扎克伯格跟桑德博格、亚马逊的贝索斯、苹果的库克全都不惜湿身入镜，这些硅谷的科技人，飞蛾扑火似地牺牲演出，其实全为了慈善。&lt;span class="pl-pds"&gt;"&lt;/span&gt;&lt;/span&gt;,&lt;span class="pl-s"&gt;&lt;span class="pl-pds"&gt;"&lt;/span&gt;世界上最长的姓名是简森·乔伊·亚历山大·比基·卡利斯勒·达夫·埃利奥特·福克斯·伊维鲁莫·马尔尼·梅尔斯·帕特森·汤普森·华莱士·普雷斯顿。&lt;span class="pl-pds"&gt;"&lt;/span&gt;&lt;/span&gt;,&#xD;
        };&lt;span class="pl-smi"&gt;Segment&lt;/span&gt;segment&lt;span class="pl-k"&gt;=&lt;/span&gt;&lt;span class="pl-smi"&gt;HanLP&lt;/span&gt;&lt;span class="pl-k"&gt;.&lt;/span&gt;newSegment()&lt;span class="pl-k"&gt;.&lt;/span&gt;enableTranslatedNameRecognize(&lt;span class="pl-c1"&gt;true&lt;/span&gt;);&lt;span class="pl-k"&gt;for&lt;/span&gt;(&lt;span class="pl-smi"&gt;String&lt;/span&gt;sentence&lt;span class="pl-k"&gt;:&lt;/span&gt;testCase)&#xD;
{&lt;span class="pl-k"&gt;List&amp;lt;&lt;span class="pl-smi"&gt;Term&lt;/span&gt;&amp;gt;&lt;/span&gt;termList&lt;span class="pl-k"&gt;=&lt;/span&gt;segment&lt;span class="pl-k"&gt;.&lt;/span&gt;seg(sentence);&lt;span class="pl-smi"&gt;System&lt;/span&gt;&lt;span class="pl-k"&gt;.&lt;/span&gt;out&lt;span class="pl-k"&gt;.&lt;/span&gt;println(termList);&#xD;
}&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;&lt;li&gt;说明&lt;ul&gt;&lt;li&gt;目前分词器基本上都默认开启了音译人名识别，用户不必手动开启；上面的代码只是为了强调。&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;算法详解&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.hankcs.com/nlp/name-transliteration-cascaded-hidden-markov-model-and-japanese-personal-names-recognition.html"&gt;《层叠隐马模型下的音译人名和日本人名识别》&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h3&gt;&lt;a aria-hidden="true" class="anchor" href="#11-日本人名识别" id="user-content-11-日本人名识别"&gt;&lt;/a&gt;&lt;svg aria-hidden="true" class="octicon octicon-link" height="16" version="1.1" viewBox="0 0 16 16" width="16"&gt;&lt;a aria-hidden="true" class="anchor" href="#11-日本人名识别" id="user-content-11-日本人名识别"&gt;&lt;/a&gt;&lt;path d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z" fill-rule="evenodd"&gt;&lt;a aria-hidden="true" class="anchor" href="#11-日本人名识别" id="user-content-11-日本人名识别"&gt;&lt;/a&gt;&lt;/path&gt;&lt;/svg&gt;11. 日本人名识别&lt;/h3&gt;&lt;div class="highlight highlight-source-java"&gt;&lt;pre&gt;&lt;span class="pl-k"&gt;String&lt;/span&gt;[] testCase&lt;span class="pl-k"&gt;=&lt;/span&gt;&lt;span class="pl-k"&gt;new&lt;/span&gt;&lt;span class="pl-smi"&gt;String&lt;/span&gt;[]{&lt;span class="pl-s"&gt;&lt;span class="pl-pds"&gt;"&lt;/span&gt;北川景子参演了林诣彬导演的《速度与激情3》&lt;span class="pl-pds"&gt;"&lt;/span&gt;&lt;/span&gt;,&lt;span class="pl-s"&gt;&lt;span class="pl-pds"&gt;"&lt;/span&gt;林志玲亮相网友:确定不是波多野结衣？&lt;span class="pl-pds"&gt;"&lt;/span&gt;&lt;/span&gt;,&#xD;
};&lt;span class="pl-smi"&gt;Segment&lt;/span&gt;segment&lt;span class="pl-k"&gt;=&lt;/span&gt;&lt;span class="pl-smi"&gt;HanLP&lt;/span&gt;&lt;span class="pl-k"&gt;.&lt;/span&gt;newSegment()&lt;span class="pl-k"&gt;.&lt;/span&gt;enableJapaneseNameRecognize(&lt;span class="pl-c1"&gt;true&lt;/span&gt;);&lt;span class="pl-k"&gt;for&lt;/span&gt;(&lt;span class="pl-smi"&gt;String&lt;/span&gt;sentence&lt;span class="pl-k"&gt;:&lt;/span&gt;testCase)&#xD;
{&lt;span class="pl-k"&gt;List&amp;lt;&lt;span class="pl-smi"&gt;Term&lt;/span&gt;&amp;gt;&lt;/span&gt;termList&lt;span class="pl-k"&gt;=&lt;/span&gt;segment&lt;span class="pl-k"&gt;.&lt;/span&gt;seg(sentence);&lt;span class="pl-smi"&gt;System&lt;/span&gt;&lt;span class="pl-k"&gt;.&lt;/span&gt;out&lt;span class="pl-k"&gt;.&lt;/span&gt;println(termList);&#xD;
}&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;&lt;li&gt;说明&lt;ul&gt;&lt;li&gt;目前标准分词器默认关闭了日本人名识别，用户需要手动开启；这是因为日本人名的出现频率较低，但是又消耗性能。&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;算法详解&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.hankcs.com/nlp/name-transliteration-cascaded-hidden-markov-model-and-japanese-personal-names-recognition.html"&gt;《层叠隐马模型下的音译人名和日本人名识别》&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h3&gt;&lt;a aria-hidden="true" class="anchor" href="#12-地名识别" id="user-content-12-地名识别"&gt;&lt;/a&gt;&lt;svg aria-hidden="true" class="octicon octicon-link" height="16" version="1.1" viewBox="0 0 16 16" width="16"&gt;&lt;a aria-hidden="true" class="anchor" href="#12-地名识别" id="user-content-12-地名识别"&gt;&lt;/a&gt;&lt;path d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z" fill-rule="evenodd"&gt;&lt;a aria-hidden="true" class="anchor" href="#12-地名识别" id="user-content-12-地名识别"&gt;&lt;/a&gt;&lt;/path&gt;&lt;/svg&gt;12. 地名识别&lt;/h3&gt;&lt;div class="highlight highlight-source-java"&gt;&lt;pre&gt;&lt;span class="pl-k"&gt;String&lt;/span&gt;[] testCase&lt;span class="pl-k"&gt;=&lt;/span&gt;&lt;span class="pl-k"&gt;new&lt;/span&gt;&lt;span class="pl-smi"&gt;String&lt;/span&gt;[]{&lt;span class="pl-s"&gt;&lt;span class="pl-pds"&gt;"&lt;/span&gt;武胜县新学乡政府大楼门前锣鼓喧天&lt;span class="pl-pds"&gt;"&lt;/span&gt;&lt;/span&gt;,&lt;span class="pl-s"&gt;&lt;span class="pl-pds"&gt;"&lt;/span&gt;蓝翔给宁夏固原市彭阳县红河镇黑牛沟村捐赠了挖掘机&lt;span class="pl-pds"&gt;"&lt;/span&gt;&lt;/span&gt;,&#xD;
};&lt;span class="pl-smi"&gt;Segment&lt;/span&gt;segment&lt;span class="pl-k"&gt;=&lt;/span&gt;&lt;span class="pl-smi"&gt;HanLP&lt;/span&gt;&lt;span class="pl-k"&gt;.&lt;/span&gt;newSegment()&lt;span class="pl-k"&gt;.&lt;/span&gt;enablePlaceRecognize(&lt;span class="pl-c1"&gt;true&lt;/span&gt;);&lt;span class="pl-k"&gt;for&lt;/span&gt;(&lt;span class="pl-smi"&gt;String&lt;/span&gt;sentence&lt;span class="pl-k"&gt;:&lt;/span&gt;testCase)&#xD;
{&lt;span class="pl-k"&gt;List&amp;lt;&lt;span class="pl-smi"&gt;Term&lt;/span&gt;&amp;gt;&lt;/span&gt;termList&lt;span class="pl-k"&gt;=&lt;/span&gt;segment&lt;span class="pl-k"&gt;.&lt;/span&gt;seg(sentence);&lt;span class="pl-smi"&gt;System&lt;/span&gt;&lt;span class="pl-k"&gt;.&lt;/span&gt;out&lt;span class="pl-k"&gt;.&lt;/span&gt;println(termList);&#xD;
}&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;&lt;li&gt;说明&lt;ul&gt;&lt;li&gt;目前标准分词器都默认关闭了地名识别，用户需要手动开启；这是因为消耗性能，其实多数地名都收录在核心词典和用户自定义词典中。&lt;/li&gt;&lt;li&gt;在生产环境中，能靠词典解决的问题就靠词典解决，这是最高效稳定的方法。&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;算法详解&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.hankcs.com/nlp/ner/place-names-to-identify-actual-hmm-viterbi-role-labeling.html"&gt;《实战HMM-Viterbi角色标注地名识别》&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h3&gt;&lt;a aria-hidden="true" class="anchor" href="#13-机构名识别" id="user-content-13-机构名识别"&gt;&lt;/a&gt;&lt;svg aria-hidden="true" class="octicon octicon-link" height="16" version="1.1" viewBox="0 0 16 16" width="16"&gt;&lt;a aria-hidden="true" class="anchor" href="#13-机构名识别" id="user-content-13-机构名识别"&gt;&lt;/a&gt;&lt;path d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z" fill-rule="evenodd"&gt;&lt;a aria-hidden="true" class="anchor" href="#13-机构名识别" id="user-content-13-机构名识别"&gt;&lt;/a&gt;&lt;/path&gt;&lt;/svg&gt;13. 机构名识别&lt;/h3&gt;&lt;div class="highlight highlight-source-java"&gt;&lt;pre&gt;&lt;span class="pl-k"&gt;String&lt;/span&gt;[] testCase&lt;span class="pl-k"&gt;=&lt;/span&gt;&lt;span class="pl-k"&gt;new&lt;/span&gt;&lt;span class="pl-smi"&gt;String&lt;/span&gt;[]{&lt;span class="pl-s"&gt;&lt;span class="pl-pds"&gt;"&lt;/span&gt;我在上海林原科技有限公司兼职工作，&lt;span class="pl-pds"&gt;"&lt;/span&gt;&lt;/span&gt;,&lt;span class="pl-s"&gt;&lt;span class="pl-pds"&gt;"&lt;/span&gt;我经常在台川喜宴餐厅吃饭，&lt;span class="pl-pds"&gt;"&lt;/span&gt;&lt;/span&gt;,&lt;span class="pl-s"&gt;&lt;span class="pl-pds"&gt;"&lt;/span&gt;偶尔去地中海影城看电影。&lt;span class="pl-pds"&gt;"&lt;/span&gt;&lt;/span&gt;,&#xD;
};&lt;span class="pl-smi"&gt;Segment&lt;/span&gt;segment&lt;span class="pl-k"&gt;=&lt;/span&gt;&lt;span class="pl-smi"&gt;HanLP&lt;/span&gt;&lt;span class="pl-k"&gt;.&lt;/span&gt;newSegment()&lt;span class="pl-k"&gt;.&lt;/span&gt;enableOrganizationRecognize(&lt;span class="pl-c1"&gt;true&lt;/span&gt;);&lt;span class="pl-k"&gt;for&lt;/span&gt;(&lt;span class="pl-smi"&gt;String&lt;/span&gt;sentence&lt;span class="pl-k"&gt;:&lt;/span&gt;testCase)&#xD;
{&lt;span class="pl-k"&gt;List&amp;lt;&lt;span class="pl-smi"&gt;Term&lt;/span&gt;&amp;gt;&lt;/span&gt;termList&lt;span class="pl-k"&gt;=&lt;/span&gt;segment&lt;span class="pl-k"&gt;.&lt;/span&gt;seg(sentence);&lt;span class="pl-smi"&gt;System&lt;/span&gt;&lt;span class="pl-k"&gt;.&lt;/span&gt;out&lt;span class="pl-k"&gt;.&lt;/span&gt;println(termList);&#xD;
}&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;&lt;li&gt;说明&lt;ul&gt;&lt;li&gt;目前分词器默认关闭了机构名识别，用户需要手动开启；这是因为消耗性能，其实常用机构名都收录在核心词典和用户自定义词典中。&lt;/li&gt;&lt;li&gt;HanLP的目的不是演示动态识别，在生产环境中，能靠词典解决的问题就靠词典解决，这是最高效稳定的方法。&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;算法详解&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.hankcs.com/nlp/ner/place-name-recognition-model-of-the-stacked-hmm-viterbi-role-labeling.html"&gt;《层叠HMM-Viterbi角色标注模型下的机构名识别》&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h3&gt;&lt;a aria-hidden="true" class="anchor" href="#14-关键词提取" id="user-content-14-关键词提取"&gt;&lt;/a&gt;&lt;svg aria-hidden="true" class="octicon octicon-link" height="16" version="1.1" viewBox="0 0 16 16" width="16"&gt;&lt;a aria-hidden="true" class="anchor" href="#14-关键词提取" id="user-content-14-关键词提取"&gt;&lt;/a&gt;&lt;path d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z" fill-rule="evenodd"&gt;&lt;a aria-hidden="true" class="anchor" href="#14-关键词提取" id="user-content-14-关键词提取"&gt;&lt;/a&gt;&lt;/path&gt;&lt;/svg&gt;14. 关键词提取&lt;/h3&gt;&lt;div class="highlight highlight-source-java"&gt;&lt;pre&gt;&lt;span class="pl-smi"&gt;String&lt;/span&gt;content&lt;span class="pl-k"&gt;=&lt;/span&gt;&lt;span class="pl-s"&gt;&lt;span class="pl-pds"&gt;"&lt;/span&gt;程序员(英文Programmer)是从事程序开发、维护的专业人员。一般将程序员分为程序设计人员和程序编码人员，但两者的界限并不非常清楚，特别是在中国。软件从业人员分为初级程序员、高级程序员、系统分析员和项目经理四大类。&lt;span class="pl-pds"&gt;"&lt;/span&gt;&lt;/span&gt;;&lt;span class="pl-k"&gt;List&amp;lt;&lt;span class="pl-smi"&gt;String&lt;/span&gt;&amp;gt;&lt;/span&gt;keywordList&lt;span class="pl-k"&gt;=&lt;/span&gt;&lt;span class="pl-smi"&gt;HanLP&lt;/span&gt;&lt;span class="pl-k"&gt;.&lt;/span&gt;extractKeyword(content,&lt;span class="pl-c1"&gt;5&lt;/span&gt;);&lt;span class="pl-smi"&gt;System&lt;/span&gt;&lt;span class="pl-k"&gt;.&lt;/span&gt;out&lt;span class="pl-k"&gt;.&lt;/span&gt;println(keywordList);&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;&lt;li&gt;说明&lt;ul&gt;&lt;li&gt;内部采用&lt;code&gt;TextRankKeyword&lt;/code&gt;实现，用户可以直接调用&lt;code&gt;TextRankKeyword.getKeywordList(document, size)&lt;/code&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;算法详解&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.hankcs.com/nlp/textrank-algorithm-to-extract-the-keywords-java-implementation.html"&gt;《TextRank算法提取关键词的Java实现》&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h3&gt;&lt;a aria-hidden="true" class="anchor" href="#15-自动摘要" id="user-content-15-自动摘要"&gt;&lt;/a&gt;&lt;svg aria-hidden="true" class="octicon octicon-link" height="16" version="1.1" viewBox="0 0 16 16" width="16"&gt;&lt;a aria-hidden="true" class="anchor" href="#15-自动摘要" id="user-content-15-自动摘要"&gt;&lt;/a&gt;&lt;path d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z" fill-rule="evenodd"&gt;&lt;a aria-hidden="true" class="anchor" href="#15-自动摘要" id="user-content-15-自动摘要"&gt;&lt;/a&gt;&lt;/path&gt;&lt;/svg&gt;15. 自动摘要&lt;/h3&gt;&lt;div class="highlight highlight-source-java"&gt;&lt;pre&gt;&lt;span class="pl-smi"&gt;String&lt;/span&gt;document&lt;span class="pl-k"&gt;=&lt;/span&gt;&lt;span class="pl-s"&gt;&lt;span class="pl-pds"&gt;"&lt;/span&gt;算法可大致分为基本算法、数据结构的算法、数论算法、计算几何的算法、图的算法、动态规划以及数值分析、加密算法、排序算法、检索算法、随机化算法、并行算法、厄米变形模型、随机森林算法。&lt;span class="pl-cce"&gt;\n&lt;/span&gt;&lt;span class="pl-pds"&gt;"&lt;/span&gt;&lt;/span&gt;&lt;span class="pl-k"&gt;+&lt;/span&gt;&lt;span class="pl-s"&gt;&lt;span class="pl-pds"&gt;"&lt;/span&gt;算法可以宽泛的分为三类，&lt;span class="pl-cce"&gt;\n&lt;/span&gt;&lt;span class="pl-pds"&gt;"&lt;/span&gt;&lt;/span&gt;&lt;span class="pl-k"&gt;+&lt;/span&gt;&lt;span class="pl-s"&gt;&lt;span class="pl-pds"&gt;"&lt;/span&gt;一，有限的确定性算法，这类算法在有限的一段时间内终止。他们可能要花很长时间来执行指定的任务，但仍将在一定的时间内终止。这类算法得出的结果常取决于输入值。&lt;span class="pl-cce"&gt;\n&lt;/span&gt;&lt;span class="pl-pds"&gt;"&lt;/span&gt;&lt;/span&gt;&lt;span class="pl-k"&gt;+&lt;/span&gt;&lt;span class="pl-s"&gt;&lt;span class="pl-pds"&gt;"&lt;/span&gt;二，有限的非确定算法，这类算法在有限的时间内终止。然而，对于一个（或一些）给定的数值，算法的结果并不是唯一的或确定的。&lt;span class="pl-cce"&gt;\n&lt;/span&gt;&lt;span class="pl-pds"&gt;"&lt;/span&gt;&lt;/span&gt;&lt;span class="pl-k"&gt;+&lt;/span&gt;&lt;span class="pl-s"&gt;&lt;span class="pl-pds"&gt;"&lt;/span&gt;三，无限的算法，是那些由于没有定义终止定义条件，或定义的条件无法由输入的数据满足而不终止运行的算法。通常，无限算法的产生是由于未能确定的定义终止条件。&lt;span class="pl-pds"&gt;"&lt;/span&gt;&lt;/span&gt;;&lt;span class="pl-k"&gt;List&amp;lt;&lt;span class="pl-smi"&gt;String&lt;/span&gt;&amp;gt;&lt;/span&gt;sentenceList&lt;span class="pl-k"&gt;=&lt;/span&gt;&lt;span class="pl-smi"&gt;HanLP&lt;/span&gt;&lt;span class="pl-k"&gt;.&lt;/span&gt;extractSummary(document,&lt;span class="pl-c1"&gt;3&lt;/span&gt;);&lt;span class="pl-smi"&gt;System&lt;/span&gt;&lt;span class="pl-k"&gt;.&lt;/span&gt;out&lt;span class="pl-k"&gt;.&lt;/span&gt;println(sentenceList);&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;&lt;li&gt;说明&lt;ul&gt;&lt;li&gt;内部采用&lt;code&gt;TextRankSentence&lt;/code&gt;实现，用户可以直接调用&lt;code&gt;TextRankSentence.getTopSentenceList(document, size)&lt;/code&gt;。&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;算法详解&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.hankcs.com/nlp/textrank-algorithm-java-implementation-of-automatic-abstract.html"&gt;《TextRank算法自动摘要的Java实现》&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h3&gt;&lt;a aria-hidden="true" class="anchor" href="#16-短语提取" id="user-content-16-短语提取"&gt;&lt;/a&gt;&lt;svg aria-hidden="true" class="octicon octicon-link" height="16" version="1.1" viewBox="0 0 16 16" width="16"&gt;&lt;a aria-hidden="true" class="anchor" href="#16-短语提取" id="user-content-16-短语提取"&gt;&lt;/a&gt;&lt;path d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z" fill-rule="evenodd"&gt;&lt;a aria-hidden="true" class="anchor" href="#16-短语提取" id="user-content-16-短语提取"&gt;&lt;/a&gt;&lt;/path&gt;&lt;/svg&gt;16. 短语提取&lt;/h3&gt;&lt;div class="highlight highlight-source-java"&gt;&lt;pre&gt;&lt;span class="pl-smi"&gt;String&lt;/span&gt;text&lt;span class="pl-k"&gt;=&lt;/span&gt;&lt;span class="pl-s"&gt;&lt;span class="pl-pds"&gt;"&lt;/span&gt;算法工程师&lt;span class="pl-cce"&gt;\n&lt;/span&gt;&lt;span class="pl-pds"&gt;"&lt;/span&gt;&lt;/span&gt;&lt;span class="pl-k"&gt;+&lt;/span&gt;&lt;span class="pl-s"&gt;&lt;span class="pl-pds"&gt;"&lt;/span&gt;算法（Algorithm）是一系列解决问题的清晰指令，也就是说，能够对一定规范的输入，在有限时间内获得所要求的输出。如果一个算法有缺陷，或不适合于某个问题，执行这个算法将不会解决这个问题。不同的算法可能用不同的时间、空间或效率来完成同样的任务。一个算法的优劣可以用空间复杂度与时间复杂度来衡量。算法工程师就是利用算法处理事物的人。&lt;span class="pl-cce"&gt;\n&lt;/span&gt;&lt;span class="pl-pds"&gt;"&lt;/span&gt;&lt;/span&gt;&lt;span class="pl-k"&gt;+&lt;/span&gt;&lt;span class="pl-s"&gt;&lt;span class="pl-pds"&gt;"&lt;/span&gt;&lt;span class="pl-cce"&gt;\n&lt;/span&gt;&lt;span class="pl-pds"&gt;"&lt;/span&gt;&lt;/span&gt;&lt;span class="pl-k"&gt;+&lt;/span&gt;&lt;span class="pl-s"&gt;&lt;span class="pl-pds"&gt;"&lt;/span&gt;1职位简介&lt;span class="pl-cce"&gt;\n&lt;/span&gt;&lt;span class="pl-pds"&gt;"&lt;/span&gt;&lt;/span&gt;&lt;span class="pl-k"&gt;+&lt;/span&gt;&lt;span class="pl-s"&gt;&lt;span class="pl-pds"&gt;"&lt;/span&gt;算法工程师是一个非常高端的职位；&lt;span class="pl-cce"&gt;\n&lt;/span&gt;&lt;span class="pl-pds"&gt;"&lt;/span&gt;&lt;/span&gt;&lt;span class="pl-k"&gt;+&lt;/span&gt;&lt;span class="pl-s"&gt;&lt;span class="pl-pds"&gt;"&lt;/span&gt;专业要求：计算机、电子、通信、数学等相关专业；&lt;span class="pl-cce"&gt;\n&lt;/span&gt;&lt;span class="pl-pds"&gt;"&lt;/span&gt;&lt;/span&gt;&lt;span class="pl-k"&gt;+&lt;/span&gt;&lt;span class="pl-s"&gt;&lt;span class="pl-pds"&gt;"&lt;/span&gt;学历要求：本科及其以上的学历，大多数是硕士学历及其以上；&lt;span class="pl-cce"&gt;\n&lt;/span&gt;&lt;span class="pl-pds"&gt;"&lt;/span&gt;&lt;/span&gt;&lt;span class="pl-k"&gt;+&lt;/span&gt;&lt;span class="pl-s"&gt;&lt;span class="pl-pds"&gt;"&lt;/span&gt;语言要求：英语要求是熟练，基本上能阅读国外专业书刊；&lt;span class="pl-cce"&gt;\n&lt;/span&gt;&lt;span class="pl-pds"&gt;"&lt;/span&gt;&lt;/span&gt;&lt;span class="pl-k"&gt;+&lt;/span&gt;&lt;span class="pl-s"&gt;&lt;span class="pl-pds"&gt;"&lt;/span&gt;必须掌握计算机相关知识，熟练使用仿真工具MATLAB等，必须会一门编程语言。&lt;span class="pl-cce"&gt;\n&lt;/span&gt;&lt;span class="pl-pds"&gt;"&lt;/span&gt;&lt;/span&gt;&lt;span class="pl-k"&gt;+&lt;/span&gt;&lt;span class="pl-s"&gt;&lt;span class="pl-pds"&gt;"&lt;/span&gt;&lt;span class="pl-cce"&gt;\n&lt;/span&gt;&lt;span class="pl-pds"&gt;"&lt;/span&gt;&lt;/span&gt;&lt;span class="pl-k"&gt;+&lt;/span&gt;&lt;span class="pl-s"&gt;&lt;span class="pl-pds"&gt;"&lt;/span&gt;2研究方向&lt;span class="pl-cce"&gt;\n&lt;/span&gt;&lt;span class="pl-pds"&gt;"&lt;/span&gt;&lt;/span&gt;&lt;span class="pl-k"&gt;+&lt;/span&gt;&lt;span class="pl-s"&gt;&lt;span class="pl-pds"&gt;"&lt;/span&gt;视频算法工程师、图像处理算法工程师、音频算法工程师 通信基带算法工程师&lt;span class="pl-cce"&gt;\n&lt;/span&gt;&lt;span class="pl-pds"&gt;"&lt;/span&gt;&lt;/span&gt;&lt;span class="pl-k"&gt;+&lt;/span&gt;&lt;span class="pl-s"&gt;&lt;span class="pl-pds"&gt;"&lt;/span&gt;&lt;span class="pl-cce"&gt;\n&lt;/span&gt;&lt;span class="pl-pds"&gt;"&lt;/span&gt;&lt;/span&gt;&lt;span class="pl-k"&gt;+&lt;/span&gt;&lt;span class="pl-s"&gt;&lt;span class="pl-pds"&gt;"&lt;/span&gt;3目前国内外状况&lt;span class="pl-cce"&gt;\n&lt;/span&gt;&lt;span class="pl-pds"&gt;"&lt;/span&gt;&lt;/span&gt;&lt;span class="pl-k"&gt;+&lt;/span&gt;&lt;span class="pl-s"&gt;&lt;span class="pl-pds"&gt;"&lt;/span&gt;目前国内从事算法研究的工程师不少，但是高级算法工程师却很少，是一个非常紧缺的专业工程师。算法工程师根据研究领域来分主要有音频/视频算法处理、图像技术方面的二维信息算法处理和通信物理层、雷达信号处理、生物医学信号处理等领域的一维信息算法处理。&lt;span class="pl-cce"&gt;\n&lt;/span&gt;&lt;span class="pl-pds"&gt;"&lt;/span&gt;&lt;/span&gt;&lt;span class="pl-k"&gt;+&lt;/span&gt;&lt;span class="pl-s"&gt;&lt;span class="pl-pds"&gt;"&lt;/span&gt;在计算机音视频和图形图像技术等二维信息算法处理方面目前比较先进的视频处理算法：机器视觉成为此类算法研究的核心；另外还有2D转3D算法(2D-to-3D conversion)，去隔行算法(de-interlacing)，运动估计运动补偿算法(Motion estimation/Motion Compensation)，去噪算法(Noise Reduction)，缩放算法(scaling)，锐化处理算法(Sharpness)，超分辨率算法(Super Resolution),手势识别(gesture recognition),人脸识别(face recognition)。&lt;span class="pl-cce"&gt;\n&lt;/span&gt;&lt;span class="pl-pds"&gt;"&lt;/span&gt;&lt;/span&gt;&lt;span class="pl-k"&gt;+&lt;/span&gt;&lt;span class="pl-s"&gt;&lt;span class="pl-pds"&gt;"&lt;/span&gt;在通信物理层等一维信息领域目前常用的算法：无线领域的RRM、RTT，传送领域的调制解调、信道均衡、信号检测、网络优化、信号分解等。&lt;span class="pl-cce"&gt;\n&lt;/span&gt;&lt;span class="pl-pds"&gt;"&lt;/span&gt;&lt;/span&gt;&lt;span class="pl-k"&gt;+&lt;/span&gt;&lt;span class="pl-s"&gt;&lt;span class="pl-pds"&gt;"&lt;/span&gt;另外数据挖掘、互联网搜索算法也成为当今的热门方向。&lt;span class="pl-cce"&gt;\n&lt;/span&gt;&lt;span class="pl-pds"&gt;"&lt;/span&gt;&lt;/span&gt;&lt;span class="pl-k"&gt;+&lt;/span&gt;&lt;span class="pl-s"&gt;&lt;span class="pl-pds"&gt;"&lt;/span&gt;算法工程师逐渐往人工智能方向发展。&lt;span class="pl-pds"&gt;"&lt;/span&gt;&lt;/span&gt;;&lt;span class="pl-k"&gt;List&amp;lt;&lt;span class="pl-smi"&gt;String&lt;/span&gt;&amp;gt;&lt;/span&gt;phraseList&lt;span class="pl-k"&gt;=&lt;/span&gt;&lt;span class="pl-smi"&gt;HanLP&lt;/span&gt;&lt;span class="pl-k"&gt;.&lt;/span&gt;extractPhrase(text,&lt;span class="pl-c1"&gt;10&lt;/span&gt;);&lt;span class="pl-smi"&gt;System&lt;/span&gt;&lt;span class="pl-k"&gt;.&lt;/span&gt;out&lt;span class="pl-k"&gt;.&lt;/span&gt;println(phraseList);&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;&lt;li&gt;说明&lt;ul&gt;&lt;li&gt;内部采用&lt;code&gt;MutualInformationEntropyPhraseExtractor&lt;/code&gt;实现，用户可以直接调用&lt;code&gt;MutualInformationEntropyPhraseExtractor.extractPhrase(text, size)&lt;/code&gt;。&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;算法详解&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.hankcs.com/nlp/extraction-and-identification-of-mutual-information-about-the-phrase-based-on-information-entropy.html"&gt;《基于互信息和左右信息熵的短语提取识别》&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h3&gt;&lt;a aria-hidden="true" class="anchor" href="#17-拼音转换" id="user-content-17-拼音转换"&gt;&lt;/a&gt;&lt;svg aria-hidden="true" class="octicon octicon-link" height="16" version="1.1" viewBox="0 0 16 16" width="16"&gt;&lt;a aria-hidden="true" class="anchor" href="#17-拼音转换" id="user-content-17-拼音转换"&gt;&lt;/a&gt;&lt;path d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z" fill-rule="evenodd"&gt;&lt;a aria-hidden="true" class="anchor" href="#17-拼音转换" id="user-content-17-拼音转换"&gt;&lt;/a&gt;&lt;/path&gt;&lt;/svg&gt;17. 拼音转换&lt;/h3&gt;&lt;div class="highlight highlight-source-java"&gt;&lt;pre&gt;&lt;span class="pl-c"&gt;&lt;span class="pl-c"&gt;/*&lt;/span&gt;*&lt;/span&gt;&lt;span class="pl-c"&gt;* 汉字转拼音&lt;/span&gt;&lt;span class="pl-c"&gt;* @author hankcs&lt;/span&gt;&lt;span class="pl-c"&gt;&lt;span class="pl-c"&gt;*/&lt;/span&gt;&lt;/span&gt;&lt;span class="pl-k"&gt;public&lt;/span&gt;&lt;span class="pl-k"&gt;class&lt;/span&gt;&lt;span class="pl-en"&gt;DemoPinyin&lt;/span&gt;{&lt;span class="pl-k"&gt;public&lt;/span&gt;&lt;span class="pl-k"&gt;static&lt;/span&gt;&lt;span class="pl-k"&gt;void&lt;/span&gt;&lt;span class="pl-en"&gt;main&lt;/span&gt;(&lt;span class="pl-k"&gt;String&lt;/span&gt;[]&lt;span class="pl-v"&gt;args&lt;/span&gt;)&#xD;
    {&lt;span class="pl-smi"&gt;String&lt;/span&gt;text&lt;span class="pl-k"&gt;=&lt;/span&gt;&lt;span class="pl-s"&gt;&lt;span class="pl-pds"&gt;"&lt;/span&gt;重载不是重任&lt;span class="pl-pds"&gt;"&lt;/span&gt;&lt;/span&gt;;&lt;span class="pl-k"&gt;List&amp;lt;&lt;span class="pl-smi"&gt;Pinyin&lt;/span&gt;&amp;gt;&lt;/span&gt;pinyinList&lt;span class="pl-k"&gt;=&lt;/span&gt;&lt;span class="pl-smi"&gt;HanLP&lt;/span&gt;&lt;span class="pl-k"&gt;.&lt;/span&gt;convertToPinyinList(text);&lt;span class="pl-smi"&gt;System&lt;/span&gt;&lt;span class="pl-k"&gt;.&lt;/span&gt;out&lt;span class="pl-k"&gt;.&lt;/span&gt;print(&lt;span class="pl-s"&gt;&lt;span class="pl-pds"&gt;"&lt;/span&gt;原文,&lt;span class="pl-pds"&gt;"&lt;/span&gt;&lt;/span&gt;);&lt;span class="pl-k"&gt;for&lt;/span&gt;(&lt;span class="pl-k"&gt;char&lt;/span&gt;c&lt;span class="pl-k"&gt;:&lt;/span&gt;text&lt;span class="pl-k"&gt;.&lt;/span&gt;toCharArray())&#xD;
        {&lt;span class="pl-smi"&gt;System&lt;/span&gt;&lt;span class="pl-k"&gt;.&lt;/span&gt;out&lt;span class="pl-k"&gt;.&lt;/span&gt;printf(&lt;span class="pl-s"&gt;&lt;span class="pl-pds"&gt;"&lt;/span&gt;%c,&lt;span class="pl-pds"&gt;"&lt;/span&gt;&lt;/span&gt;, c);&#xD;
        }&lt;span class="pl-smi"&gt;System&lt;/span&gt;&lt;span class="pl-k"&gt;.&lt;/span&gt;out&lt;span class="pl-k"&gt;.&lt;/span&gt;println();&lt;span class="pl-smi"&gt;System&lt;/span&gt;&lt;span class="pl-k"&gt;.&lt;/span&gt;out&lt;span class="pl-k"&gt;.&lt;/span&gt;print(&lt;span class="pl-s"&gt;&lt;span class="pl-pds"&gt;"&lt;/span&gt;拼音（数字音调）,&lt;span class="pl-pds"&gt;"&lt;/span&gt;&lt;/span&gt;);&lt;span class="pl-k"&gt;for&lt;/span&gt;(&lt;span class="pl-smi"&gt;Pinyin&lt;/span&gt;pinyin&lt;span class="pl-k"&gt;:&lt;/span&gt;pinyinList)&#xD;
        {&lt;span class="pl-smi"&gt;System&lt;/span&gt;&lt;span class="pl-k"&gt;.&lt;/span&gt;out&lt;span class="pl-k"&gt;.&lt;/span&gt;printf(&lt;span class="pl-s"&gt;&lt;span class="pl-pds"&gt;"&lt;/span&gt;%s,&lt;span class="pl-pds"&gt;"&lt;/span&gt;&lt;/span&gt;, pinyin);&#xD;
        }&lt;span class="pl-smi"&gt;System&lt;/span&gt;&lt;span class="pl-k"&gt;.&lt;/span&gt;out&lt;span class="pl-k"&gt;.&lt;/span&gt;println();&lt;span class="pl-smi"&gt;System&lt;/span&gt;&lt;span class="pl-k"&gt;.&lt;/span&gt;out&lt;span class="pl-k"&gt;.&lt;/span&gt;print(&lt;span class="pl-s"&gt;&lt;span class="pl-pds"&gt;"&lt;/span&gt;拼音（符号音调）,&lt;span class="pl-pds"&gt;"&lt;/span&gt;&lt;/span&gt;);&lt;span class="pl-k"&gt;for&lt;/span&gt;(&lt;span class="pl-smi"&gt;Pinyin&lt;/span&gt;pinyin&lt;span class="pl-k"&gt;:&lt;/span&gt;pinyinList)&#xD;
        {&lt;span class="pl-smi"&gt;System&lt;/span&gt;&lt;span class="pl-k"&gt;.&lt;/span&gt;out&lt;span class="pl-k"&gt;.&lt;/span&gt;printf(&lt;span class="pl-s"&gt;&lt;span class="pl-pds"&gt;"&lt;/span&gt;%s,&lt;span class="pl-pds"&gt;"&lt;/span&gt;&lt;/span&gt;, pinyin&lt;span class="pl-k"&gt;.&lt;/span&gt;getPinyinWithToneMark());&#xD;
        }&lt;span class="pl-smi"&gt;System&lt;/span&gt;&lt;span class="pl-k"&gt;.&lt;/span&gt;out&lt;span class="pl-k"&gt;.&lt;/span&gt;println();&lt;span class="pl-smi"&gt;System&lt;/span&gt;&lt;span class="pl-k"&gt;.&lt;/span&gt;out&lt;span class="pl-k"&gt;.&lt;/span&gt;print(&lt;span class="pl-s"&gt;&lt;span class="pl-pds"&gt;"&lt;/span&gt;拼音（无音调）,&lt;span class="pl-pds"&gt;"&lt;/span&gt;&lt;/span&gt;);&lt;span class="pl-k"&gt;for&lt;/span&gt;(&lt;span class="pl-smi"&gt;Pinyin&lt;/span&gt;pinyin&lt;span class="pl-k"&gt;:&lt;/span&gt;pinyinList)&#xD;
        {&lt;span class="pl-smi"&gt;System&lt;/span&gt;&lt;span class="pl-k"&gt;.&lt;/span&gt;out&lt;span class="pl-k"&gt;.&lt;/span&gt;printf(&lt;span class="pl-s"&gt;&lt;span class="pl-pds"&gt;"&lt;/span&gt;%s,&lt;span class="pl-pds"&gt;"&lt;/span&gt;&lt;/span&gt;, pinyin&lt;span class="pl-k"&gt;.&lt;/span&gt;getPinyinWithoutTone());&#xD;
        }&lt;span class="pl-smi"&gt;System&lt;/span&gt;&lt;span class="pl-k"&gt;.&lt;/span&gt;out&lt;span class="pl-k"&gt;.&lt;/span&gt;println();&lt;span class="pl-smi"&gt;System&lt;/span&gt;&lt;span class="pl-k"&gt;.&lt;/span&gt;out&lt;span class="pl-k"&gt;.&lt;/span&gt;print(&lt;span class="pl-s"&gt;&lt;span class="pl-pds"&gt;"&lt;/span&gt;声调,&lt;span class="pl-pds"&gt;"&lt;/span&gt;&lt;/span&gt;);&lt;span class="pl-k"&gt;for&lt;/span&gt;(&lt;span class="pl-smi"&gt;Pinyin&lt;/span&gt;pinyin&lt;span class="pl-k"&gt;:&lt;/span&gt;pinyinList)&#xD;
        {&lt;span class="pl-smi"&gt;System&lt;/span&gt;&lt;span class="pl-k"&gt;.&lt;/span&gt;out&lt;span class="pl-k"&gt;.&lt;/span&gt;printf(&lt;span class="pl-s"&gt;&lt;span class="pl-pds"&gt;"&lt;/span&gt;%s,&lt;span class="pl-pds"&gt;"&lt;/span&gt;&lt;/span&gt;, pinyin&lt;span class="pl-k"&gt;.&lt;/span&gt;getTone());&#xD;
        }&lt;span class="pl-smi"&gt;System&lt;/span&gt;&lt;span class="pl-k"&gt;.&lt;/span&gt;out&lt;span class="pl-k"&gt;.&lt;/span&gt;println();&lt;span class="pl-smi"&gt;System&lt;/span&gt;&lt;span class="pl-k"&gt;.&lt;/span&gt;out&lt;span class="pl-k"&gt;.&lt;/span&gt;print(&lt;span class="pl-s"&gt;&lt;span class="pl-pds"&gt;"&lt;/span&gt;声母,&lt;span class="pl-pds"&gt;"&lt;/span&gt;&lt;/span&gt;);&lt;span class="pl-k"&gt;for&lt;/span&gt;(&lt;span class="pl-smi"&gt;Pinyin&lt;/span&gt;pinyin&lt;span class="pl-k"&gt;:&lt;/span&gt;pinyinList)&#xD;
        {&lt;span class="pl-smi"&gt;System&lt;/span&gt;&lt;span class="pl-k"&gt;.&lt;/span&gt;out&lt;span class="pl-k"&gt;.&lt;/span&gt;printf(&lt;span class="pl-s"&gt;&lt;span class="pl-pds"&gt;"&lt;/span&gt;%s,&lt;span class="pl-pds"&gt;"&lt;/span&gt;&lt;/span&gt;, pinyin&lt;span class="pl-k"&gt;.&lt;/span&gt;getShengmu());&#xD;
        }&lt;span class="pl-smi"&gt;System&lt;/span&gt;&lt;span class="pl-k"&gt;.&lt;/span&gt;out&lt;span class="pl-k"&gt;.&lt;/span&gt;println();&lt;span class="pl-smi"&gt;System&lt;/span&gt;&lt;span class="pl-k"&gt;.&lt;/span&gt;out&lt;span class="pl-k"&gt;.&lt;/span&gt;print(&lt;span class="pl-s"&gt;&lt;span class="pl-pds"&gt;"&lt;/span&gt;韵母,&lt;span class="pl-pds"&gt;"&lt;/span&gt;&lt;/span&gt;);&lt;span class="pl-k"&gt;for&lt;/span&gt;(&lt;span class="pl-smi"&gt;Pinyin&lt;/span&gt;pinyin&lt;span class="pl-k"&gt;:&lt;/span&gt;pinyinList)&#xD;
        {&lt;span class="pl-smi"&gt;System&lt;/span&gt;&lt;span class="pl-k"&gt;.&lt;/span&gt;out&lt;span class="pl-k"&gt;.&lt;/span&gt;printf(&lt;span class="pl-s"&gt;&lt;span class="pl-pds"&gt;"&lt;/span&gt;%s,&lt;span class="pl-pds"&gt;"&lt;/span&gt;&lt;/span&gt;, pinyin&lt;span class="pl-k"&gt;.&lt;/span&gt;getYunmu());&#xD;
        }&lt;span class="pl-smi"&gt;System&lt;/span&gt;&lt;span class="pl-k"&gt;.&lt;/span&gt;out&lt;span class="pl-k"&gt;.&lt;/span&gt;println();&lt;span class="pl-smi"&gt;System&lt;/span&gt;&lt;span class="pl-k"&gt;.&lt;/span&gt;out&lt;span class="pl-k"&gt;.&lt;/span&gt;print(&lt;span class="pl-s"&gt;&lt;span class="pl-pds"&gt;"&lt;/span&gt;输入法头,&lt;span class="pl-pds"&gt;"&lt;/span&gt;&lt;/span&gt;);&lt;span class="pl-k"&gt;for&lt;/span&gt;(&lt;span class="pl-smi"&gt;Pinyin&lt;/span&gt;pinyin&lt;span class="pl-k"&gt;:&lt;/span&gt;pinyinList)&#xD;
        {&lt;span class="pl-smi"&gt;System&lt;/span&gt;&lt;span class="pl-k"&gt;.&lt;/span&gt;out&lt;span class="pl-k"&gt;.&lt;/span&gt;printf(&lt;span class="pl-s"&gt;&lt;span class="pl-pds"&gt;"&lt;/span&gt;%s,&lt;span class="pl-pds"&gt;"&lt;/span&gt;&lt;/span&gt;, pinyin&lt;span class="pl-k"&gt;.&lt;/span&gt;getHead());&#xD;
        }&lt;span class="pl-smi"&gt;System&lt;/span&gt;&lt;span class="pl-k"&gt;.&lt;/span&gt;out&lt;span class="pl-k"&gt;.&lt;/span&gt;println();&#xD;
    }&#xD;
}&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;&lt;li&gt;说明&lt;ul&gt;&lt;li&gt;&lt;strong&gt;HanLP&lt;/strong&gt;不仅支持基础的汉字转拼音，还支持声母、韵母、音调、音标和输入法首字母首声母功能。&lt;/li&gt;&lt;li&gt;&lt;strong&gt;HanLP&lt;/strong&gt;能够识别多音字，也能给繁体中文注拼音。&lt;/li&gt;&lt;li&gt;最重要的是，&lt;strong&gt;HanLP&lt;/strong&gt;采用的模式匹配升级到&lt;code&gt;AhoCorasickDoubleArrayTrie&lt;/code&gt;，性能大幅提升，能够提供毫秒级的响应速度！&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;算法详解&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.hankcs.com/nlp/java-chinese-characters-to-pinyin-and-simplified-conversion-realization.html#h2-17"&gt;《汉字转拼音与简繁转换的Java实现》&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h3&gt;&lt;a aria-hidden="true" class="anchor" href="#18-简繁转换" id="user-content-18-简繁转换"&gt;&lt;/a&gt;&lt;svg aria-hidden="true" class="octicon octicon-link" height="16" version="1.1" viewBox="0 0 16 16" width="16"&gt;&lt;a aria-hidden="true" class="anchor" href="#18-简繁转换" id="user-content-18-简繁转换"&gt;&lt;/a&gt;&lt;path d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z" fill-rule="evenodd"&gt;&lt;a aria-hidden="true" class="anchor" href="#18-简繁转换" id="user-content-18-简繁转换"&gt;&lt;/a&gt;&lt;/path&gt;&lt;/svg&gt;18. 简繁转换&lt;/h3&gt;&lt;div class="highlight highlight-source-java"&gt;&lt;pre&gt;&lt;span class="pl-c"&gt;&lt;span class="pl-c"&gt;/*&lt;/span&gt;*&lt;/span&gt;&lt;span class="pl-c"&gt;* 简繁转换&lt;/span&gt;&lt;span class="pl-c"&gt;* @author hankcs&lt;/span&gt;&lt;span class="pl-c"&gt;&lt;span class="pl-c"&gt;*/&lt;/span&gt;&lt;/span&gt;&lt;span class="pl-k"&gt;public&lt;/span&gt;&lt;span class="pl-k"&gt;class&lt;/span&gt;&lt;span class="pl-en"&gt;DemoTraditionalChinese2SimplifiedChinese&lt;/span&gt;{&lt;span class="pl-k"&gt;public&lt;/span&gt;&lt;span class="pl-k"&gt;static&lt;/span&gt;&lt;span class="pl-k"&gt;void&lt;/span&gt;&lt;span class="pl-en"&gt;main&lt;/span&gt;(&lt;span class="pl-k"&gt;String&lt;/span&gt;[]&lt;span class="pl-v"&gt;args&lt;/span&gt;)&#xD;
    {&lt;span class="pl-smi"&gt;System&lt;/span&gt;&lt;span class="pl-k"&gt;.&lt;/span&gt;out&lt;span class="pl-k"&gt;.&lt;/span&gt;println(&lt;span class="pl-smi"&gt;HanLP&lt;/span&gt;&lt;span class="pl-k"&gt;.&lt;/span&gt;convertToTraditionalChinese(&lt;span class="pl-s"&gt;&lt;span class="pl-pds"&gt;"&lt;/span&gt;用笔记本电脑写程序&lt;span class="pl-pds"&gt;"&lt;/span&gt;&lt;/span&gt;));&lt;span class="pl-smi"&gt;System&lt;/span&gt;&lt;span class="pl-k"&gt;.&lt;/span&gt;out&lt;span class="pl-k"&gt;.&lt;/span&gt;println(&lt;span class="pl-smi"&gt;HanLP&lt;/span&gt;&lt;span class="pl-k"&gt;.&lt;/span&gt;convertToSimplifiedChinese(&lt;span class="pl-s"&gt;&lt;span class="pl-pds"&gt;"&lt;/span&gt;「以後等妳當上皇后，就能買士多啤梨慶祝了」&lt;span class="pl-pds"&gt;"&lt;/span&gt;&lt;/span&gt;));&#xD;
    }&#xD;
}&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;&lt;li&gt;说明&lt;ul&gt;&lt;li&gt;&lt;strong&gt;HanLP&lt;/strong&gt;能够识别简繁分歧词，比如&lt;code&gt;打印机=印表機&lt;/code&gt;。许多简繁转换工具不能区分“以后”“皇后”中的两个“后”字，&lt;strong&gt;HanLP&lt;/strong&gt;可以。&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;算法详解&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.hankcs.com/nlp/java-chinese-characters-to-pinyin-and-simplified-conversion-realization.html#h2-17"&gt;《汉字转拼音与简繁转换的Java实现》&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h3&gt;&lt;a aria-hidden="true" class="anchor" href="#19-文本推荐" id="user-content-19-文本推荐"&gt;&lt;/a&gt;&lt;svg aria-hidden="true" class="octicon octicon-link" height="16" version="1.1" viewBox="0 0 16 16" width="16"&gt;&lt;a aria-hidden="true" class="anchor" href="#19-文本推荐" id="user-content-19-文本推荐"&gt;&lt;/a&gt;&lt;path d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z" fill-rule="evenodd"&gt;&lt;a aria-hidden="true" class="anchor" href="#19-文本推荐" id="user-content-19-文本推荐"&gt;&lt;/a&gt;&lt;/path&gt;&lt;/svg&gt;19. 文本推荐&lt;/h3&gt;&lt;div class="highlight highlight-source-java"&gt;&lt;pre&gt;&lt;span class="pl-c"&gt;&lt;span class="pl-c"&gt;/*&lt;/span&gt;*&lt;/span&gt;&lt;span class="pl-c"&gt;* 文本推荐(句子级别，从一系列句子中挑出与输入句子最相似的那一个)&lt;/span&gt;&lt;span class="pl-c"&gt;* @author hankcs&lt;/span&gt;&lt;span class="pl-c"&gt;&lt;span class="pl-c"&gt;*/&lt;/span&gt;&lt;/span&gt;&lt;span class="pl-k"&gt;public&lt;/span&gt;&lt;span class="pl-k"&gt;class&lt;/span&gt;&lt;span class="pl-en"&gt;DemoSuggester&lt;/span&gt;{&lt;span class="pl-k"&gt;public&lt;/span&gt;&lt;span class="pl-k"&gt;static&lt;/span&gt;&lt;span class="pl-k"&gt;void&lt;/span&gt;&lt;span class="pl-en"&gt;main&lt;/span&gt;(&lt;span class="pl-k"&gt;String&lt;/span&gt;[]&lt;span class="pl-v"&gt;args&lt;/span&gt;)&#xD;
    {&lt;span class="pl-smi"&gt;Suggester&lt;/span&gt;suggester&lt;span class="pl-k"&gt;=&lt;/span&gt;&lt;span class="pl-k"&gt;new&lt;/span&gt;&lt;span class="pl-smi"&gt;Suggester&lt;/span&gt;();&lt;span class="pl-k"&gt;String&lt;/span&gt;[] titleArray&lt;span class="pl-k"&gt;=&lt;/span&gt;(&lt;span class="pl-s"&gt;&lt;span class="pl-pds"&gt;"&lt;/span&gt;威廉王子发表演说 呼吁保护野生动物&lt;span class="pl-cce"&gt;\n&lt;/span&gt;&lt;span class="pl-pds"&gt;"&lt;/span&gt;&lt;/span&gt;&lt;span class="pl-k"&gt;+&lt;/span&gt;&lt;span class="pl-s"&gt;&lt;span class="pl-pds"&gt;"&lt;/span&gt;《时代》年度人物最终入围名单出炉 普京马云入选&lt;span class="pl-cce"&gt;\n&lt;/span&gt;&lt;span class="pl-pds"&gt;"&lt;/span&gt;&lt;/span&gt;&lt;span class="pl-k"&gt;+&lt;/span&gt;&lt;span class="pl-s"&gt;&lt;span class="pl-pds"&gt;"&lt;/span&gt;“黑格比”横扫菲：菲吸取“海燕”经验及早疏散&lt;span class="pl-cce"&gt;\n&lt;/span&gt;&lt;span class="pl-pds"&gt;"&lt;/span&gt;&lt;/span&gt;&lt;span class="pl-k"&gt;+&lt;/span&gt;&lt;span class="pl-s"&gt;&lt;span class="pl-pds"&gt;"&lt;/span&gt;日本保密法将正式生效 日媒指其损害国民知情权&lt;span class="pl-cce"&gt;\n&lt;/span&gt;&lt;span class="pl-pds"&gt;"&lt;/span&gt;&lt;/span&gt;&lt;span class="pl-k"&gt;+&lt;/span&gt;&lt;span class="pl-s"&gt;&lt;span class="pl-pds"&gt;"&lt;/span&gt;英报告说空气污染带来“公共健康危机”&lt;span class="pl-pds"&gt;"&lt;/span&gt;&lt;/span&gt;)&lt;span class="pl-k"&gt;.&lt;/span&gt;split(&lt;span class="pl-s"&gt;&lt;span class="pl-pds"&gt;"&lt;/span&gt;&lt;span class="pl-cce"&gt;\\&lt;/span&gt;n&lt;span class="pl-pds"&gt;"&lt;/span&gt;&lt;/span&gt;);&lt;span class="pl-k"&gt;for&lt;/span&gt;(&lt;span class="pl-smi"&gt;String&lt;/span&gt;title&lt;span class="pl-k"&gt;:&lt;/span&gt;titleArray)&#xD;
        {&#xD;
            suggester&lt;span class="pl-k"&gt;.&lt;/span&gt;addSentence(title);&#xD;
        }&lt;span class="pl-smi"&gt;System&lt;/span&gt;&lt;span class="pl-k"&gt;.&lt;/span&gt;out&lt;span class="pl-k"&gt;.&lt;/span&gt;println(suggester&lt;span class="pl-k"&gt;.&lt;/span&gt;suggest(&lt;span class="pl-s"&gt;&lt;span class="pl-pds"&gt;"&lt;/span&gt;发言&lt;span class="pl-pds"&gt;"&lt;/span&gt;&lt;/span&gt;,&lt;span class="pl-c1"&gt;1&lt;/span&gt;));&lt;span class="pl-c"&gt;&lt;span class="pl-c"&gt;//&lt;/span&gt;语义&lt;/span&gt;&lt;span class="pl-smi"&gt;System&lt;/span&gt;&lt;span class="pl-k"&gt;.&lt;/span&gt;out&lt;span class="pl-k"&gt;.&lt;/span&gt;println(suggester&lt;span class="pl-k"&gt;.&lt;/span&gt;suggest(&lt;span class="pl-s"&gt;&lt;span class="pl-pds"&gt;"&lt;/span&gt;危机公共&lt;span class="pl-pds"&gt;"&lt;/span&gt;&lt;/span&gt;,&lt;span class="pl-c1"&gt;1&lt;/span&gt;));&lt;span class="pl-c"&gt;&lt;span class="pl-c"&gt;//&lt;/span&gt;字符&lt;/span&gt;&lt;span class="pl-smi"&gt;System&lt;/span&gt;&lt;span class="pl-k"&gt;.&lt;/span&gt;out&lt;span class="pl-k"&gt;.&lt;/span&gt;println(suggester&lt;span class="pl-k"&gt;.&lt;/span&gt;suggest(&lt;span class="pl-s"&gt;&lt;span class="pl-pds"&gt;"&lt;/span&gt;mayun&lt;span class="pl-pds"&gt;"&lt;/span&gt;&lt;/span&gt;,&lt;span class="pl-c1"&gt;1&lt;/span&gt;));&lt;span class="pl-c"&gt;&lt;span class="pl-c"&gt;//&lt;/span&gt;拼音&lt;/span&gt;}&#xD;
}&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;&lt;li&gt;说明&lt;ul&gt;&lt;li&gt;在搜索引擎的输入框中，用户输入一个词，搜索引擎会联想出最合适的搜索词，&lt;strong&gt;HanLP&lt;/strong&gt;实现了类似的功能。&lt;/li&gt;&lt;li&gt;可以动态调节每种识别器的权重&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h3&gt;&lt;a aria-hidden="true" class="anchor" href="#20-语义距离" id="user-content-20-语义距离"&gt;&lt;/a&gt;&lt;svg aria-hidden="true" class="octicon octicon-link" height="16" version="1.1" viewBox="0 0 16 16" width="16"&gt;&lt;a aria-hidden="true" class="anchor" href="#20-语义距离" id="user-content-20-语义距离"&gt;&lt;/a&gt;&lt;path d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z" fill-rule="evenodd"&gt;&lt;a aria-hidden="true" class="anchor" href="#20-语义距离" id="user-content-20-语义距离"&gt;&lt;/a&gt;&lt;/path&gt;&lt;/svg&gt;20. 语义距离&lt;/h3&gt;&lt;div class="highlight highlight-source-java"&gt;&lt;pre&gt;&lt;span class="pl-c"&gt;&lt;span class="pl-c"&gt;/*&lt;/span&gt;*&lt;/span&gt;&lt;span class="pl-c"&gt;* 语义距离&lt;/span&gt;&lt;span class="pl-c"&gt;* @author hankcs&lt;/span&gt;&lt;span class="pl-c"&gt;&lt;span class="pl-c"&gt;*/&lt;/span&gt;&lt;/span&gt;&lt;span class="pl-k"&gt;public&lt;/span&gt;&lt;span class="pl-k"&gt;class&lt;/span&gt;&lt;span class="pl-en"&gt;DemoWordDistance&lt;/span&gt;{&lt;span class="pl-k"&gt;public&lt;/span&gt;&lt;span class="pl-k"&gt;static&lt;/span&gt;&lt;span class="pl-k"&gt;void&lt;/span&gt;&lt;span class="pl-en"&gt;main&lt;/span&gt;(&lt;span class="pl-k"&gt;String&lt;/span&gt;[]&lt;span class="pl-v"&gt;args&lt;/span&gt;)&#xD;
    {&lt;span class="pl-k"&gt;String&lt;/span&gt;[] wordArray&lt;span class="pl-k"&gt;=&lt;/span&gt;&lt;span class="pl-k"&gt;new&lt;/span&gt;&lt;span class="pl-smi"&gt;String&lt;/span&gt;[]&#xD;
                {&lt;span class="pl-s"&gt;&lt;span class="pl-pds"&gt;"&lt;/span&gt;香蕉&lt;span class="pl-pds"&gt;"&lt;/span&gt;&lt;/span&gt;,&lt;span class="pl-s"&gt;&lt;span class="pl-pds"&gt;"&lt;/span&gt;苹果&lt;span class="pl-pds"&gt;"&lt;/span&gt;&lt;/span&gt;,&lt;span class="pl-s"&gt;&lt;span class="pl-pds"&gt;"&lt;/span&gt;白菜&lt;span class="pl-pds"&gt;"&lt;/span&gt;&lt;/span&gt;,&lt;span class="pl-s"&gt;&lt;span class="pl-pds"&gt;"&lt;/span&gt;水果&lt;span class="pl-pds"&gt;"&lt;/span&gt;&lt;/span&gt;,&lt;span class="pl-s"&gt;&lt;span class="pl-pds"&gt;"&lt;/span&gt;蔬菜&lt;span class="pl-pds"&gt;"&lt;/span&gt;&lt;/span&gt;,&lt;span class="pl-s"&gt;&lt;span class="pl-pds"&gt;"&lt;/span&gt;自行车&lt;span class="pl-pds"&gt;"&lt;/span&gt;&lt;/span&gt;,&lt;span class="pl-s"&gt;&lt;span class="pl-pds"&gt;"&lt;/span&gt;公交车&lt;span class="pl-pds"&gt;"&lt;/span&gt;&lt;/span&gt;,&lt;span class="pl-s"&gt;&lt;span class="pl-pds"&gt;"&lt;/span&gt;飞机&lt;span class="pl-pds"&gt;"&lt;/span&gt;&lt;/span&gt;,&lt;span class="pl-s"&gt;&lt;span class="pl-pds"&gt;"&lt;/span&gt;买&lt;span class="pl-pds"&gt;"&lt;/span&gt;&lt;/span&gt;,&lt;span class="pl-s"&gt;&lt;span class="pl-pds"&gt;"&lt;/span&gt;卖&lt;span class="pl-pds"&gt;"&lt;/span&gt;&lt;/span&gt;,&lt;span class="pl-s"&gt;&lt;span class="pl-pds"&gt;"&lt;/span&gt;购入&lt;span class="pl-pds"&gt;"&lt;/span&gt;&lt;/span&gt;,&lt;span class="pl-s"&gt;&lt;span class="pl-pds"&gt;"&lt;/span&gt;新年&lt;span class="pl-pds"&gt;"&lt;/span&gt;&lt;/span&gt;,&lt;span class="pl-s"&gt;&lt;span class="pl-pds"&gt;"&lt;/span&gt;春节&lt;span class="pl-pds"&gt;"&lt;/span&gt;&lt;/span&gt;,&lt;span class="pl-s"&gt;&lt;span class="pl-pds"&gt;"&lt;/span&gt;丢失&lt;span class="pl-pds"&gt;"&lt;/span&gt;&lt;/span&gt;,&lt;span class="pl-s"&gt;&lt;span class="pl-pds"&gt;"&lt;/span&gt;补办&lt;span class="pl-pds"&gt;"&lt;/span&gt;&lt;/span&gt;,&lt;span class="pl-s"&gt;&lt;span class="pl-pds"&gt;"&lt;/span&gt;办理&lt;span class="pl-pds"&gt;"&lt;/span&gt;&lt;/span&gt;,&lt;span class="pl-s"&gt;&lt;span class="pl-pds"&gt;"&lt;/span&gt;送给&lt;span class="pl-pds"&gt;"&lt;/span&gt;&lt;/span&gt;,&lt;span class="pl-s"&gt;&lt;span class="pl-pds"&gt;"&lt;/span&gt;寻找&lt;span class="pl-pds"&gt;"&lt;/span&gt;&lt;/span&gt;,&lt;span class="pl-s"&gt;&lt;span class="pl-pds"&gt;"&lt;/span&gt;孩子&lt;span class="pl-pds"&gt;"&lt;/span&gt;&lt;/span&gt;,&lt;span class="pl-s"&gt;&lt;span class="pl-pds"&gt;"&lt;/span&gt;教室&lt;span class="pl-pds"&gt;"&lt;/span&gt;&lt;/span&gt;,&lt;span class="pl-s"&gt;&lt;span class="pl-pds"&gt;"&lt;/span&gt;教师&lt;span class="pl-pds"&gt;"&lt;/span&gt;&lt;/span&gt;,&lt;span class="pl-s"&gt;&lt;span class="pl-pds"&gt;"&lt;/span&gt;会计&lt;span class="pl-pds"&gt;"&lt;/span&gt;&lt;/span&gt;,&#xD;
                };&lt;span class="pl-k"&gt;for&lt;/span&gt;(&lt;span class="pl-smi"&gt;String&lt;/span&gt;a&lt;span class="pl-k"&gt;:&lt;/span&gt;wordArray)&#xD;
        {&lt;span class="pl-k"&gt;for&lt;/span&gt;(&lt;span class="pl-smi"&gt;String&lt;/span&gt;b&lt;span class="pl-k"&gt;:&lt;/span&gt;wordArray)&#xD;
            {&lt;span class="pl-smi"&gt;System&lt;/span&gt;&lt;span class="pl-k"&gt;.&lt;/span&gt;out&lt;span class="pl-k"&gt;.&lt;/span&gt;println(a&lt;span class="pl-k"&gt;+&lt;/span&gt;&lt;span class="pl-s"&gt;&lt;span class="pl-pds"&gt;"&lt;/span&gt;&lt;span class="pl-cce"&gt;\t&lt;/span&gt;&lt;span class="pl-pds"&gt;"&lt;/span&gt;&lt;/span&gt;&lt;span class="pl-k"&gt;+&lt;/span&gt;b&lt;span class="pl-k"&gt;+&lt;/span&gt;&lt;span class="pl-s"&gt;&lt;span class="pl-pds"&gt;"&lt;/span&gt;&lt;span class="pl-cce"&gt;\t&lt;/span&gt;之间的距离是&lt;span class="pl-cce"&gt;\t&lt;/span&gt;&lt;span class="pl-pds"&gt;"&lt;/span&gt;&lt;/span&gt;&lt;span class="pl-k"&gt;+&lt;/span&gt;&lt;span class="pl-smi"&gt;CoreSynonymDictionary&lt;/span&gt;&lt;span class="pl-k"&gt;.&lt;/span&gt;distance(a, b));&#xD;
            }&#xD;
        }&#xD;
    }&#xD;
}&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;&lt;li&gt;说明&lt;ul&gt;&lt;li&gt;设想的应用场景是搜索引擎对词义的理解，词与词并不只存在“同义词”与“非同义词”的关系，就算是同义词，它们之间的意义也是有微妙的差别的。&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;算法&lt;ul&gt;&lt;li&gt;为每个词分配一个语义ID，词与词的距离通过语义ID的差得到。语义ID通过《同义词词林扩展版》计算而来。&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h3&gt;&lt;a aria-hidden="true" class="anchor" href="#21-依存句法分析" id="user-content-21-依存句法分析"&gt;&lt;/a&gt;&lt;svg aria-hidden="true" class="octicon octicon-link" height="16" version="1.1" viewBox="0 0 16 16" width="16"&gt;&lt;a aria-hidden="true" class="anchor" href="#21-依存句法分析" id="user-content-21-依存句法分析"&gt;&lt;/a&gt;&lt;path d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z" fill-rule="evenodd"&gt;&lt;a aria-hidden="true" class="anchor" href="#21-依存句法分析" id="user-content-21-依存句法分析"&gt;&lt;/a&gt;&lt;/path&gt;&lt;/svg&gt;21. 依存句法分析&lt;/h3&gt;&lt;div class="highlight highlight-source-java"&gt;&lt;pre&gt;&lt;span class="pl-c"&gt;&lt;span class="pl-c"&gt;/*&lt;/span&gt;*&lt;/span&gt;&lt;span class="pl-c"&gt;* 依存句法分析（CRF句法模型需要-Xms512m -Xmx512m -Xmn256m，MaxEnt和神经网络句法模型需要-Xms1g -Xmx1g -Xmn512m）&lt;/span&gt;&lt;span class="pl-c"&gt;* @author hankcs&lt;/span&gt;&lt;span class="pl-c"&gt;&lt;span class="pl-c"&gt;*/&lt;/span&gt;&lt;/span&gt;&lt;span class="pl-k"&gt;public&lt;/span&gt;&lt;span class="pl-k"&gt;class&lt;/span&gt;&lt;span class="pl-en"&gt;DemoDependencyParser&lt;/span&gt;{&lt;span class="pl-k"&gt;public&lt;/span&gt;&lt;span class="pl-k"&gt;static&lt;/span&gt;&lt;span class="pl-k"&gt;void&lt;/span&gt;&lt;span class="pl-en"&gt;main&lt;/span&gt;(&lt;span class="pl-k"&gt;String&lt;/span&gt;[]&lt;span class="pl-v"&gt;args&lt;/span&gt;)&#xD;
    {&lt;span class="pl-smi"&gt;CoNLLSentence&lt;/span&gt;sentence&lt;span class="pl-k"&gt;=&lt;/span&gt;&lt;span class="pl-smi"&gt;HanLP&lt;/span&gt;&lt;span class="pl-k"&gt;.&lt;/span&gt;parseDependency(&lt;span class="pl-s"&gt;&lt;span class="pl-pds"&gt;"&lt;/span&gt;徐先生还具体帮助他确定了把画雄鹰、松鼠和麻雀作为主攻目标。&lt;span class="pl-pds"&gt;"&lt;/span&gt;&lt;/span&gt;);&lt;span class="pl-smi"&gt;System&lt;/span&gt;&lt;span class="pl-k"&gt;.&lt;/span&gt;out&lt;span class="pl-k"&gt;.&lt;/span&gt;println(sentence);&lt;span class="pl-c"&gt;&lt;span class="pl-c"&gt;//&lt;/span&gt;可以方便地遍历它&lt;/span&gt;&lt;span class="pl-k"&gt;for&lt;/span&gt;(&lt;span class="pl-smi"&gt;CoNLLWord&lt;/span&gt;word&lt;span class="pl-k"&gt;:&lt;/span&gt;sentence)&#xD;
        {&lt;span class="pl-smi"&gt;System&lt;/span&gt;&lt;span class="pl-k"&gt;.&lt;/span&gt;out&lt;span class="pl-k"&gt;.&lt;/span&gt;printf(&lt;span class="pl-s"&gt;&lt;span class="pl-pds"&gt;"&lt;/span&gt;%s --(%s)--&amp;gt; %s&lt;span class="pl-cce"&gt;\n&lt;/span&gt;&lt;span class="pl-pds"&gt;"&lt;/span&gt;&lt;/span&gt;,&lt;span class="pl-smi"&gt;word&lt;span class="pl-k"&gt;.&lt;/span&gt;LEMMA&lt;/span&gt;,&lt;span class="pl-smi"&gt;word&lt;span class="pl-k"&gt;.&lt;/span&gt;DEPREL&lt;/span&gt;,&lt;span class="pl-smi"&gt;word&lt;span class="pl-k"&gt;.&lt;/span&gt;HEAD&lt;/span&gt;&lt;span class="pl-c1"&gt;&lt;span class="pl-k"&gt;.&lt;/span&gt;LEMMA&lt;/span&gt;);&#xD;
        }&lt;span class="pl-c"&gt;&lt;span class="pl-c"&gt;//&lt;/span&gt;也可以直接拿到数组，任意顺序或逆序遍历&lt;/span&gt;&lt;span class="pl-k"&gt;CoNLLWord&lt;/span&gt;[] wordArray&lt;span class="pl-k"&gt;=&lt;/span&gt;sentence&lt;span class="pl-k"&gt;.&lt;/span&gt;getWordArray();&lt;span class="pl-k"&gt;for&lt;/span&gt;(&lt;span class="pl-k"&gt;int&lt;/span&gt;i&lt;span class="pl-k"&gt;=&lt;/span&gt;wordArray&lt;span class="pl-k"&gt;.&lt;/span&gt;length&lt;span class="pl-k"&gt;-&lt;/span&gt;&lt;span class="pl-c1"&gt;1&lt;/span&gt;; i&lt;span class="pl-k"&gt;&amp;gt;=&lt;/span&gt;&lt;span class="pl-c1"&gt;0&lt;/span&gt;; i&lt;span class="pl-k"&gt;--&lt;/span&gt;)&#xD;
        {&lt;span class="pl-smi"&gt;CoNLLWord&lt;/span&gt;word&lt;span class="pl-k"&gt;=&lt;/span&gt;wordArray[i];&lt;span class="pl-smi"&gt;System&lt;/span&gt;&lt;span class="pl-k"&gt;.&lt;/span&gt;out&lt;span class="pl-k"&gt;.&lt;/span&gt;printf(&lt;span class="pl-s"&gt;&lt;span class="pl-pds"&gt;"&lt;/span&gt;%s --(%s)--&amp;gt; %s&lt;span class="pl-cce"&gt;\n&lt;/span&gt;&lt;span class="pl-pds"&gt;"&lt;/span&gt;&lt;/span&gt;,&lt;span class="pl-smi"&gt;word&lt;span class="pl-k"&gt;.&lt;/span&gt;LEMMA&lt;/span&gt;,&lt;span class="pl-smi"&gt;word&lt;span class="pl-k"&gt;.&lt;/span&gt;DEPREL&lt;/span&gt;,&lt;span class="pl-smi"&gt;word&lt;span class="pl-k"&gt;.&lt;/span&gt;HEAD&lt;/span&gt;&lt;span class="pl-c1"&gt;&lt;span class="pl-k"&gt;.&lt;/span&gt;LEMMA&lt;/span&gt;);&#xD;
        }&lt;span class="pl-c"&gt;&lt;span class="pl-c"&gt;//&lt;/span&gt;还可以直接遍历子树，从某棵子树的某个节点一路遍历到虚根&lt;/span&gt;&lt;span class="pl-smi"&gt;CoNLLWord&lt;/span&gt;head&lt;span class="pl-k"&gt;=&lt;/span&gt;wordArray[&lt;span class="pl-c1"&gt;12&lt;/span&gt;];&lt;span class="pl-k"&gt;while&lt;/span&gt;((head&lt;span class="pl-k"&gt;=&lt;/span&gt;&lt;span class="pl-smi"&gt;head&lt;span class="pl-k"&gt;.&lt;/span&gt;HEAD&lt;/span&gt;)&lt;span class="pl-k"&gt;!=&lt;/span&gt;&lt;span class="pl-c1"&gt;null&lt;/span&gt;)&#xD;
        {&lt;span class="pl-k"&gt;if&lt;/span&gt;(head&lt;span class="pl-k"&gt;==&lt;/span&gt;&lt;span class="pl-smi"&gt;CoNLLWord&lt;/span&gt;&lt;span class="pl-c1"&gt;&lt;span class="pl-k"&gt;.&lt;/span&gt;ROOT&lt;/span&gt;)&lt;span class="pl-smi"&gt;System&lt;/span&gt;&lt;span class="pl-k"&gt;.&lt;/span&gt;out&lt;span class="pl-k"&gt;.&lt;/span&gt;println(&lt;span class="pl-smi"&gt;head&lt;span class="pl-k"&gt;.&lt;/span&gt;LEMMA&lt;/span&gt;);&lt;span class="pl-k"&gt;else&lt;/span&gt;&lt;span class="pl-smi"&gt;System&lt;/span&gt;&lt;span class="pl-k"&gt;.&lt;/span&gt;out&lt;span class="pl-k"&gt;.&lt;/span&gt;printf(&lt;span class="pl-s"&gt;&lt;span class="pl-pds"&gt;"&lt;/span&gt;%s --(%s)--&amp;gt;&lt;span class="pl-pds"&gt;"&lt;/span&gt;&lt;/span&gt;,&lt;span class="pl-smi"&gt;head&lt;span class="pl-k"&gt;.&lt;/span&gt;LEMMA&lt;/span&gt;,&lt;span class="pl-smi"&gt;head&lt;span class="pl-k"&gt;.&lt;/span&gt;DEPREL&lt;/span&gt;);&#xD;
        }&#xD;
    }&#xD;
}&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;&lt;li&gt;说明&lt;ul&gt;&lt;li&gt;内部采用&lt;code&gt;NeuralNetworkDependencyParser&lt;/code&gt;实现，用户可以直接调用&lt;code&gt;NeuralNetworkDependencyParser.compute(sentence)&lt;/code&gt;&lt;/li&gt;&lt;li&gt;也可以调用基于最大熵的依存句法分析器&lt;code&gt;MaxEntDependencyParser.compute(sentence)&lt;/code&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;算法详解&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.hankcs.com/nlp/parsing/neural-network-based-dependency-parser.html"&gt;《基于神经网络分类模型与转移系统的判决式依存句法分析器》&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.hankcs.com/nlp/parsing/to-achieve-the-maximum-entropy-of-the-dependency-parser.html"&gt;《最大熵依存句法分析器的实现》&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.hankcs.com/nlp/parsing/crf-sequence-annotation-chinese-dependency-parser-implementation-based-on-java.html"&gt;《基于CRF序列标注的中文依存句法分析器的Java实现》&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h2&gt;&lt;a aria-hidden="true" class="anchor" href="#词典说明" id="user-content-词典说明"&gt;&lt;/a&gt;&lt;svg aria-hidden="true" class="octicon octicon-link" height="16" version="1.1" viewBox="0 0 16 16" width="16"&gt;&lt;a aria-hidden="true" class="anchor" href="#词典说明" id="user-content-词典说明"&gt;&lt;/a&gt;&lt;path d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z" fill-rule="evenodd"&gt;&lt;a aria-hidden="true" class="anchor" href="#词典说明" id="user-content-词典说明"&gt;&lt;/a&gt;&lt;/path&gt;&lt;/svg&gt;词典说明&lt;/h2&gt;&lt;p&gt;本章详细介绍&lt;strong&gt;HanLP&lt;/strong&gt;中的词典格式，满足用户自定义的需要。&lt;strong&gt;HanLP&lt;/strong&gt;中有许多词典，它们的格式都是相似的，形式都是文本文档，随时可以修改。&lt;/p&gt;&lt;h3&gt;&lt;a aria-hidden="true" class="anchor" href="#基本格式" id="user-content-基本格式"&gt;&lt;/a&gt;&lt;svg aria-hidden="true" class="octicon octicon-link" height="16" version="1.1" viewBox="0 0 16 16" width="16"&gt;&lt;a aria-hidden="true" class="anchor" href="#基本格式" id="user-content-基本格式"&gt;&lt;/a&gt;&lt;path d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z" fill-rule="evenodd"&gt;&lt;a aria-hidden="true" class="anchor" href="#基本格式" id="user-content-基本格式"&gt;&lt;/a&gt;&lt;/path&gt;&lt;/svg&gt;基本格式&lt;/h3&gt;&lt;p&gt;词典分为词频词性词典和词频词典。&lt;/p&gt;&lt;ul&gt;&lt;li&gt;词频词性词典（如&lt;code&gt;CoreNatureDictionary.txt&lt;/code&gt;）&lt;ul&gt;&lt;li&gt;每一行代表一个单词，格式遵从&lt;code&gt;[单词] [词性A] [A的频次] [词性B] [B的频次] ...&lt;/code&gt;。&lt;/li&gt;&lt;li&gt;支持省略词性和频次，直接一行一个单词。&lt;/li&gt;&lt;li&gt;&lt;code&gt;.txt&lt;/code&gt;词典文件的分隔符为空格或制表符，所以不支持含有空格的词语。如果需要支持空格，请使用英文逗号&lt;code&gt;,&lt;/code&gt;分割的&lt;strong&gt;纯文本&lt;/strong&gt;&lt;code&gt;.csv&lt;/code&gt;文件。在使用Excel等富文本编辑器时，则请注意保存为&lt;strong&gt;纯文本&lt;/strong&gt;形式。&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;词频词典（如&lt;code&gt;CoreNatureDictionary.ngram.txt&lt;/code&gt;）&lt;ul&gt;&lt;li&gt;每一行代表一个单词或条目，格式遵从&lt;code&gt;[单词] [单词的频次]&lt;/code&gt;。&lt;/li&gt;&lt;li&gt;每一行的分隔符为空格或制表符。&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;少数词典有自己的专用格式，比如同义词词典兼容《同义词词林扩展版》的文本格式，而转移矩阵词典则是一个csv表格。&lt;/p&gt;&lt;p&gt;下文主要介绍通用词典，如不注明，词典特指通用词典。&lt;/p&gt;&lt;h3&gt;&lt;a aria-hidden="true" class="anchor" href="#数据结构" id="user-content-数据结构"&gt;&lt;/a&gt;&lt;svg aria-hidden="true" class="octicon octicon-link" height="16" version="1.1" viewBox="0 0 16 16" width="16"&gt;&lt;a aria-hidden="true" class="anchor" href="#数据结构" id="user-content-数据结构"&gt;&lt;/a&gt;&lt;path d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z" fill-rule="evenodd"&gt;&lt;a aria-hidden="true" class="anchor" href="#数据结构" id="user-content-数据结构"&gt;&lt;/a&gt;&lt;/path&gt;&lt;/svg&gt;数据结构&lt;/h3&gt;&lt;p&gt;Trie树（字典树）是&lt;strong&gt;HanLP&lt;/strong&gt;中使用最多的数据结构，为此，我实现了通用的Trie树，支持泛型、遍历、储存、载入。&lt;/p&gt;&lt;p&gt;用户自定义词典采用AhoCorasickDoubleArrayTrie和二分Trie树储存，其他词典采用基于&lt;a href="http://www.hankcs.com/program/java/%E5%8F%8C%E6%95%B0%E7%BB%84trie%E6%A0%91doublearraytriejava%E5%AE%9E%E7%8E%B0.html"&gt;双数组Trie树(DoubleArrayTrie)&lt;/a&gt;实现的&lt;a href="http://www.hankcs.com/program/algorithm/aho-corasick-double-array-trie.html"&gt;AC自动机AhoCorasickDoubleArrayTrie&lt;/a&gt;。&lt;/p&gt;&lt;h3&gt;&lt;a aria-hidden="true" class="anchor" href="#储存形式" id="user-content-储存形式"&gt;&lt;/a&gt;&lt;svg aria-hidden="true" class="octicon octicon-link" height="16" version="1.1" viewBox="0 0 16 16" width="16"&gt;&lt;a aria-hidden="true" class="anchor" href="#储存形式" id="user-content-储存形式"&gt;&lt;/a&gt;&lt;path d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z" fill-rule="evenodd"&gt;&lt;a aria-hidden="true" class="anchor" href="#储存形式" id="user-content-储存形式"&gt;&lt;/a&gt;&lt;/path&gt;&lt;/svg&gt;储存形式&lt;/h3&gt;&lt;p&gt;词典有两个形态：文本文件(filename.txt)和缓存文件(filename.txt.bin或filename.txt.trie.dat和filename.txt.trie.value)。&lt;/p&gt;&lt;ul&gt;&lt;li&gt;文本文件&lt;ul&gt;&lt;li&gt;采用明文储存，UTF-8编码，CRLF换行符。&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;缓存文件&lt;ul&gt;&lt;li&gt;就是一些二进制文件，通常在文本文件的文件名后面加上.bin表示。有时候是.trie.dat和.trie.value。后者是历史遗留产物，分别代表trie树的数组和值。&lt;/li&gt;&lt;li&gt;如果你修改了任何词典，只有删除缓存才能生效。&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h3&gt;&lt;a aria-hidden="true" class="anchor" href="#修改方法" id="user-content-修改方法"&gt;&lt;/a&gt;&lt;svg aria-hidden="true" class="octicon octicon-link" height="16" version="1.1" viewBox="0 0 16 16" width="16"&gt;&lt;a aria-hidden="true" class="anchor" href="#修改方法" id="user-content-修改方法"&gt;&lt;/a&gt;&lt;path d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z" fill-rule="evenodd"&gt;&lt;a aria-hidden="true" class="anchor" href="#修改方法" id="user-content-修改方法"&gt;&lt;/a&gt;&lt;/path&gt;&lt;/svg&gt;修改方法&lt;/h3&gt;&lt;p&gt;HanLP的核心词典训练自人民日报2014语料，语料不是完美的，总会存在一些错误。这些错误可能会导致分词出现奇怪的结果，这时请打开调试模式排查问题：&lt;/p&gt;&lt;div class="highlight highlight-source-java"&gt;&lt;pre&gt;&lt;span class="pl-smi"&gt;HanLP&lt;/span&gt;&lt;span class="pl-k"&gt;.&lt;/span&gt;&lt;span class="pl-smi"&gt;Config&lt;/span&gt;&lt;span class="pl-k"&gt;.&lt;/span&gt;enableDebug();&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;&lt;li&gt;核心词性词频词典&lt;ul&gt;&lt;li&gt;比如你在&lt;code&gt;data/dictionary/CoreNatureDictionary.txt&lt;/code&gt;中发现了一个不是词的词，或者词性标注得明显不对，那么你可以修改它，然后删除缓存文件使其生效。&lt;/li&gt;&lt;li&gt;目前&lt;code&gt;CoreNatureDictionary.ngram.txt&lt;/code&gt;的缓存依赖于&lt;code&gt;CoreNatureDictionary.txt&lt;/code&gt;的缓存，修改了后者之后必须同步删除前者的缓存，否则可能出错&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;核心二元文法词典&lt;ul&gt;&lt;li&gt;二元文法词典&lt;code&gt;data/dictionary/CoreNatureDictionary.ngram.txt&lt;/code&gt;储存的是两个词的接续，如果你发现不可能存在这种接续时，删掉即可。&lt;/li&gt;&lt;li&gt;你也可以添加你认为合理的接续，但是这两个词必须同时在核心词典中才会生效。&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;命名实体识别词典&lt;ul&gt;&lt;li&gt;基于角色标注的命名实体识别比较依赖词典，所以词典的质量大幅影响识别质量。&lt;/li&gt;&lt;li&gt;这些词典的格式与原理都是类似的，请阅读&lt;a href="http://www.hankcs.com/category/nlp/ner/"&gt;相应的文章&lt;/a&gt;或代码修改它。&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;如果问题解决了，欢迎向我提交一个pull request，这是我在代码库中保留明文词典的原因，众人拾柴火焰高！&lt;/p&gt;&lt;hr&gt;&lt;h2&gt;&lt;a aria-hidden="true" class="anchor" href="#版权" id="user-content-版权"&gt;&lt;/a&gt;&lt;svg aria-hidden="true" class="octicon octicon-link" height="16" version="1.1" viewBox="0 0 16 16" width="16"&gt;&lt;a aria-hidden="true" class="anchor" href="#版权" id="user-content-版权"&gt;&lt;/a&gt;&lt;path d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z" fill-rule="evenodd"&gt;&lt;a aria-hidden="true" class="anchor" href="#版权" id="user-content-版权"&gt;&lt;/a&gt;&lt;/path&gt;&lt;/svg&gt;版权&lt;/h2&gt;&lt;h3&gt;&lt;a aria-hidden="true" class="anchor" href="#上海林原信息科技有限公司" id="user-content-上海林原信息科技有限公司"&gt;&lt;/a&gt;&lt;svg aria-hidden="true" class="octicon octicon-link" height="16" version="1.1" viewBox="0 0 16 16" width="16"&gt;&lt;a aria-hidden="true" class="anchor" href="#上海林原信息科技有限公司" id="user-content-上海林原信息科技有限公司"&gt;&lt;/a&gt;&lt;path d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z" fill-rule="evenodd"&gt;&lt;a aria-hidden="true" class="anchor" href="#上海林原信息科技有限公司" id="user-content-上海林原信息科技有限公司"&gt;&lt;/a&gt;&lt;/path&gt;&lt;/svg&gt;上海林原信息科技有限公司&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;Apache License Version 2.0&lt;/li&gt;&lt;li&gt;HanLP产品初始知识产权归上海林原信息科技有限公司所有，任何人和企业可以无偿使用，可以对产品、源代码进行任何形式的修改，可以打包在其他产品中进行销售。&lt;/li&gt;&lt;li&gt;任何使用了HanLP的全部或部分功能、词典、模型的项目、产品或文章等形式的成果必须显式注明HanLP及此项目主页。&lt;/li&gt;&lt;/ul&gt;&lt;h3&gt;&lt;a aria-hidden="true" class="anchor" href="#鸣谢" id="user-content-鸣谢"&gt;&lt;/a&gt;&lt;svg aria-hidden="true" class="octicon octicon-link" height="16" version="1.1" viewBox="0 0 16 16" width="16"&gt;&lt;a aria-hidden="true" class="anchor" href="#鸣谢" id="user-content-鸣谢"&gt;&lt;/a&gt;&lt;path d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z" fill-rule="evenodd"&gt;&lt;a aria-hidden="true" class="anchor" href="#鸣谢" id="user-content-鸣谢"&gt;&lt;/a&gt;&lt;/path&gt;&lt;/svg&gt;鸣谢&lt;/h3&gt;&lt;p&gt;感谢下列优秀开源项目：&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="https://github.com/hiroshi-manabe/darts-clone-java"&gt;darts-clone-java&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.cnblogs.com/zhenyulu/archive/2007/04/18/718383.html"&gt;SharpICTCLAS&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="https://github.com/isnowfy/snownlp"&gt;snownlp&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="https://github.com/NLPchina/ansj_seg"&gt;ansj_seg&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="https://github.com/NLPchina/nlp-lang"&gt;nlp-lang&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;感谢NLP界各位学者老师的著作：&lt;/p&gt;&lt;ul&gt;&lt;li&gt;《基于角色标注的中国人名自动识别研究》张华平 刘群&lt;/li&gt;&lt;li&gt;《基于层叠隐马尔可夫模型的中文命名实体识别》俞鸿魁 张华平 刘群 吕学强 施水才&lt;/li&gt;&lt;li&gt;《基于角色标注的中文机构名识别》俞鸿魁 张华平 刘群&lt;/li&gt;&lt;li&gt;《基于最大熵的依存句法分析》 辛霄 范士喜 王轩 王晓龙&lt;/li&gt;&lt;li&gt;An Efficient Implementation of Trie Structures, JUN-ICHI AOE AND KATSUSHI MORIMOTO&lt;/li&gt;&lt;li&gt;TextRank: Bringing Order into Texts, Rada Mihalcea and Paul Tarau&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;感谢上海林原信息科技有限公司的刘先生，允许我利用工作时间开发HanLP，提供服务器和域名，并且促成了开源。感谢诸位用户的关注和使用，HanLP并不完善，未来还恳求各位NLP爱好者多多关照，提出宝贵意见。&lt;/p&gt;&lt;p&gt;作者&lt;a href="http://weibo.com/hankcs/"&gt;@hankcs&lt;/a&gt;&lt;/p&gt;&lt;p&gt;2014年12月16日&lt;/p&gt;&lt;/article&gt;&#xD;
    &lt;div&gt; &lt;a href="https://itindex.net/"  title="IT 资讯"&gt;&lt;img src="https://itindex.net/images/iconWarning.gif" title="IT 资讯" border="0"/&gt; &lt;/a&gt;</description>
      <category />
      <guid isPermaLink="true">https://itindex.net/detail/57362-github-hankcs-hanlp</guid>
      <pubDate>Fri, 18 Aug 2017 14:08:17 CST</pubDate>
    </item>
    <item>
      <title>自然语言处理某个pipeline</title>
      <link>https://itindex.net/detail/57306-%E8%87%AA%E7%84%B6%E8%AF%AD%E8%A8%80-pipeline</link>
      <description>&lt;div&gt;
  &lt;p&gt;1、数据源：包括文本、pdf、数据库等不同来源&lt;/p&gt;
  &lt;p&gt;2、使用到的库：jieba gensim sklearn keras &lt;/p&gt;
  &lt;p&gt;3、可以实现的服务：找出相关和相近词（以分词为准）、比较2个分词的相似度、和哪些相关同时和别的不相关（语义上的模糊查找）&lt;/p&gt;
  &lt;p&gt;比如：中国银行：&lt;/p&gt;
  &lt;p&gt;[[&amp;quot;中国工商银行&amp;quot;, 0.7910350561141968], [&amp;quot;601988&amp;quot;, 0.7748256921768188], [&amp;quot;工商银行&amp;quot;, 0.7616539001464844], [&amp;quot;建设银行&amp;quot;, 0.7573339939117432], [&amp;quot;中国建设银行&amp;quot;, 0.7504717707633972], [&amp;quot;中行&amp;quot;, 0.7469172477722168], [&amp;quot;中国农业银行&amp;quot;, 0.7167254686355591], [&amp;quot;交通银行&amp;quot;, 0.7115263938903809], [&amp;quot;农业银行&amp;quot;, 0.7070150375366211], [&amp;quot;中信银行&amp;quot;, 0.6993384957313538], [&amp;quot;建行&amp;quot;, 0.6886808276176453], [&amp;quot;工行&amp;quot;, 0.684762716293335], [&amp;quot;招商银行&amp;quot;, 0.6723880767822266], [&amp;quot;中国民生银行&amp;quot;, 0.6720935106277466], [&amp;quot;兴业银行&amp;quot;, 0.6705615520477295], [&amp;quot;03988&amp;quot;, 0.6682215332984924], [&amp;quot;浦发银行&amp;quot;, 0.6620436310768127], [&amp;quot;光大银行&amp;quot;, 0.6612452268600464], [&amp;quot;交行&amp;quot;, 0.6425610780715942], [&amp;quot;601939&amp;quot;, 0.6396690607070923], [&amp;quot;601398&amp;quot;, 0.6362080574035645], [&amp;quot;汇丰银行&amp;quot;, 0.6354925036430359], [&amp;quot;中国光大银行&amp;quot;, 0.6283385157585144], [&amp;quot;华夏银行&amp;quot;, 0.6261048316955566], [&amp;quot;090601&amp;quot;, 0.6191191077232361], [&amp;quot;农行&amp;quot;, 0.6165546774864197], [&amp;quot;南京银行&amp;quot;, 0.6162608861923218], [&amp;quot;谷裕&amp;quot;, 0.6026109457015991], [&amp;quot;民生银行&amp;quot;, 0.6018795371055603], [&amp;quot;B02776&amp;quot;, 0.6003248691558838], [&amp;quot;北京银行&amp;quot;, 0.5989225506782532], [&amp;quot;00939&amp;quot;, 0.5841124057769775], [&amp;quot;601288&amp;quot;, 0.5798826217651367], [&amp;quot;法国兴业银行&amp;quot;, 0.5750421285629272], [&amp;quot;600036&amp;quot;, 0.5725768804550171], [&amp;quot;中银香港&amp;quot;, 0.5725655555725098], [&amp;quot;渣打银行&amp;quot;, 0.5723541975021362], [&amp;quot;上海银行&amp;quot;, 0.5716006755828857], [&amp;quot;中资银行&amp;quot;, 0.5714462399482727], [&amp;quot;史晨昱&amp;quot;, 0.5713250637054443], [&amp;quot;01398&amp;quot;, 0.5696423053741455], [&amp;quot;01288&amp;quot;, 0.5673946738243103], [&amp;quot;国家开发银行&amp;quot;, 0.5673025846481323], [&amp;quot;该行&amp;quot;, 0.5642573237419128], [&amp;quot;部万钊&amp;quot;, 0.5616151094436646], [&amp;quot;601998&amp;quot;, 0.5594305992126465], [&amp;quot;601328&amp;quot;, 0.5585275292396545], [&amp;quot;中信实业银行&amp;quot;, 0.5555926561355591], [&amp;quot;花旗银行&amp;quot;, 0.5535871386528015], [&amp;quot;宁波银行&amp;quot;, 0.5529069900512695]]&lt;/p&gt;
  &lt;p&gt;中国：&lt;/p&gt;
  &lt;p&gt;[[&amp;quot;世界&amp;quot;, 0.7685298919677734], [&amp;quot;全球&amp;quot;, 0.7626694440841675], [&amp;quot;世界范围内&amp;quot;, 0.7018718123435974], [&amp;quot;我国&amp;quot;, 0.6887967586517334], [&amp;quot;全世界&amp;quot;, 0.681572437286377], [&amp;quot;美国&amp;quot;, 0.6747004985809326], [&amp;quot;亚洲&amp;quot;, 0.6721218824386597], [&amp;quot;中国政府&amp;quot;, 0.6407063007354736], [&amp;quot;国内&amp;quot;, 0.6364794969558716], [&amp;quot;印度&amp;quot;, 0.6236740946769714], [&amp;quot;国际&amp;quot;, 0.6172101497650146], [&amp;quot;大国&amp;quot;, 0.6167921423912048], [&amp;quot;亚洲各国&amp;quot;, 0.6133526563644409], [&amp;quot;亚太地区&amp;quot;, 0.610878586769104], [&amp;quot;全球范围&amp;quot;, 0.6104856729507446], [&amp;quot;在世界上&amp;quot;, 0.6089214086532593], [&amp;quot;东亚地区&amp;quot;, 0.6027672290802002], [&amp;quot;日本&amp;quot;, 0.601786196231842], [&amp;quot;当今世界&amp;quot;, 0.6002479791641235], [&amp;quot;亚洲地区&amp;quot;, 0.5914613604545593], [&amp;quot;全球性&amp;quot;, 0.5876830220222473], [&amp;quot;全球化&amp;quot;, 0.5855609178543091], [&amp;quot;非洲大陆&amp;quot;, 0.5852369070053101], [&amp;quot;世界市场&amp;quot;, 0.5849867463111877], [&amp;quot;欧洲&amp;quot;, 0.5787924528121948], [&amp;quot;第三世界&amp;quot;, 0.5771710872650146], [&amp;quot;全球一体化&amp;quot;, 0.5766278505325317], [&amp;quot;西方&amp;quot;, 0.5766173601150513], [&amp;quot;欧美国家&amp;quot;, 0.5756310224533081], [&amp;quot;拉美&amp;quot;, 0.5752301216125488], [&amp;quot;经济大国&amp;quot;, 0.5745469331741333], [&amp;quot;第一世界&amp;quot;, 0.5730843544006348], [&amp;quot;东亚国家&amp;quot;, 0.5727769136428833], [&amp;quot;强国&amp;quot;, 0.5700076222419739], [&amp;quot;工业界&amp;quot;, 0.5689312219619751], [&amp;quot;韩国&amp;quot;, 0.5672852396965027], [&amp;quot;各国&amp;quot;, 0.5603423118591309], [&amp;quot;新兴国家&amp;quot;, 0.5577350854873657], [&amp;quot;发达国家&amp;quot;, 0.5569929480552673], [&amp;quot;英国&amp;quot;, 0.5562434196472168], [&amp;quot;德国&amp;quot;, 0.5535132884979248], [&amp;quot;当今&amp;quot;, 0.5534329414367676], [&amp;quot;拉美地区&amp;quot;, 0.5512816309928894], [&amp;quot;东亚各国&amp;quot;, 0.5505844354629517], [&amp;quot;中国崛起&amp;quot;, 0.5435972213745117], [&amp;quot;拉美国家&amp;quot;, 0.5431581735610962], [&amp;quot;西半球&amp;quot;, 0.5429360866546631], [&amp;quot;西方国家&amp;quot;, 0.5408912897109985], [&amp;quot;本国&amp;quot;, 0.5392733216285706], [&amp;quot;俄罗斯&amp;quot;, 0.5382996797561646]]&lt;/p&gt;
  &lt;p&gt; &lt;/p&gt;
  &lt;p&gt; &lt;/p&gt;
  &lt;p&gt;万科：&lt;/p&gt;
  &lt;p&gt;[[&amp;quot;金地&amp;quot;, 0.8261025547981262], [&amp;quot;九龙仓&amp;quot;, 0.8132781386375427], [&amp;quot;绿城&amp;quot;, 0.7946393489837646], [&amp;quot;恒大&amp;quot;, 0.7812688946723938], [&amp;quot;碧桂园&amp;quot;, 0.7795591354370117], [&amp;quot;郁亮&amp;quot;, 0.7790281772613525], [&amp;quot;远洋地产&amp;quot;, 0.7744697332382202], [&amp;quot;融创&amp;quot;, 0.7735781669616699], [&amp;quot;恒大地产&amp;quot;, 0.7618383169174194], [&amp;quot;融创中国&amp;quot;, 0.753994345664978], [&amp;quot;招商地产&amp;quot;, 0.7349810600280762], [&amp;quot;合生创展&amp;quot;, 0.7338892221450806], [&amp;quot;华润置地&amp;quot;, 0.7292978167533875], [&amp;quot;龙湖&amp;quot;, 0.7278294563293457], [&amp;quot;旭辉&amp;quot;, 0.7256796956062317], [&amp;quot;龙湖地产&amp;quot;, 0.7223220467567444], [&amp;quot;王石&amp;quot;, 0.7217631936073303], [&amp;quot;宝能&amp;quot;, 0.7196142673492432], [&amp;quot;孙宏斌&amp;quot;, 0.7192676067352295], [&amp;quot;绿城中国&amp;quot;, 0.7135359048843384], [&amp;quot;越秀地产&amp;quot;, 0.7109189629554749], [&amp;quot;保利地产&amp;quot;, 0.7031007409095764], [&amp;quot;世茂&amp;quot;, 0.7004261016845703], [&amp;quot;中国金茂&amp;quot;, 0.6861996650695801], [&amp;quot;合景泰富&amp;quot;, 0.6830298900604248], [&amp;quot;雅居乐&amp;quot;, 0.6811322569847107], [&amp;quot;世茂房地产&amp;quot;, 0.6798348426818848], [&amp;quot;华远地产&amp;quot;, 0.6793832778930664], [&amp;quot;万科A&amp;quot;, 0.677139937877655], [&amp;quot;绿地&amp;quot;, 0.6746823787689209], [&amp;quot;富力&amp;quot;, 0.6702776551246643], [&amp;quot;宝龙地产&amp;quot;, 0.662824809551239], [&amp;quot;富力地产&amp;quot;, 0.660904049873352], [&amp;quot;宝能系&amp;quot;, 0.6577337384223938], [&amp;quot;金科&amp;quot;, 0.6565895676612854], [&amp;quot;阳光城&amp;quot;, 0.6557801961898804], [&amp;quot;方兴&amp;quot;, 0.654536247253418], [&amp;quot;协信&amp;quot;, 0.6533593535423279], [&amp;quot;金地集团&amp;quot;, 0.6524677276611328], [&amp;quot;龙光地产&amp;quot;, 0.644176721572876], [&amp;quot;九龙仓集团&amp;quot;, 0.6433624029159546], [&amp;quot;中国恒大&amp;quot;, 0.6420278549194336], [&amp;quot;华侨城&amp;quot;, 0.6391571760177612], [&amp;quot;许家印&amp;quot;, 0.6391341686248779], [&amp;quot;万通地产&amp;quot;, 0.6383571028709412], [&amp;quot;华远&amp;quot;, 0.6379672288894653], [&amp;quot;宋卫平&amp;quot;, 0.6350336670875549], [&amp;quot;龙头房企&amp;quot;, 0.6337549090385437], [&amp;quot;东原&amp;quot;, 0.6333705186843872], [&amp;quot;新鸿基地产&amp;quot;, 0.6329449415206909]]&lt;/p&gt;
  &lt;p&gt; &lt;/p&gt;
  &lt;p&gt;4、基本步骤：&lt;/p&gt;
  &lt;p&gt;数据源的load-&amp;gt;gensim-&amp;gt;classifier(传统基于词频的/深度学习的 keras)&lt;/p&gt;
  &lt;p&gt;5、model结果的使用 gensim.models.keyedvectors.KeyedVectors&lt;/p&gt;
  &lt;p&gt;wmdistance(document1, document2) # 输入是2个doc的单词集合&lt;/p&gt;
  &lt;p&gt; &lt;/p&gt;
&lt;/div&gt;
          
           &lt;br /&gt; &lt;br /&gt;
          
             &lt;a href="http://eric-weitm.iteye.com/blog/2388094#comments"&gt;已有   &lt;strong&gt;0&lt;/strong&gt; 人发表留言，猛击-&amp;gt;&amp;gt;  &lt;strong&gt;这里&lt;/strong&gt;&amp;lt;&amp;lt;-参与讨论&lt;/a&gt;
          
           &lt;br /&gt; &lt;br /&gt; &lt;br /&gt;
ITeye推荐
 &lt;br /&gt;
 &lt;ul&gt;  &lt;li&gt;   &lt;a href="http://www.iteye.com/clicks/433" target="_blank"&gt;—软件人才免语言低担保 赴美带薪读研！— &lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;
 &lt;br /&gt; &lt;br /&gt; &lt;br /&gt;
          
        &lt;div&gt; &lt;a href="https://itindex.net/"  title="IT 资讯"&gt;&lt;img src="https://itindex.net/images/iconWarning.gif" title="IT 资讯" border="0"/&gt; &lt;/a&gt;</description>
      <category />
      <guid isPermaLink="true">https://itindex.net/detail/57306-%E8%87%AA%E7%84%B6%E8%AF%AD%E8%A8%80-pipeline</guid>
      <pubDate>Wed, 02 Aug 2017 17:34:28 CST</pubDate>
    </item>
    <item>
      <title>如何用深度学习做自然语言处理？这里有份最佳实践清单</title>
      <link>https://itindex.net/detail/57274-%E6%B7%B1%E5%BA%A6%E5%AD%A6%E4%B9%A0-%E8%87%AA%E7%84%B6%E8%AF%AD%E8%A8%80-%E6%9C%80%E4%BD%B3%E5%AE%9E%E8%B7%B5</link>
      <description>&lt;blockquote&gt;&lt;p&gt;&lt;font size="1"&gt;对于如何使用深度学习进行自然语言处理，本文作者&amp;nbsp;Sebastian&amp;nbsp;Ruder&amp;nbsp;给出了一份详细的最佳实践清单，不仅包括与大多数&amp;nbsp;NLP&amp;nbsp;任务相关的最佳实践，还有最常见任务的最佳实践，尤其是分类、序列标注、自然语言生成和神经机器翻译。作者对最佳实践的选择很严格，只有被证明在至少两个独立的群体中有益的实践才会入选，并且每个最佳实践作者至少给出两个参引。作者承认这份清单并不全面，比如其不熟悉的解析、信息提取等就没有涉及。机器之心对该文进行了编译，原文链接请见文末。
&lt;/font&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;h3 style="text-align: center; "&gt;简介
&lt;/h3&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;本文是一系列关于如何使用神经网络进行自然语言处理（NLP）的最佳实践汇集，将随着新观点的出现定期进行更新，从而不断提升我们对用于&amp;nbsp;NLP&amp;nbsp;的深度学习的理解。
&lt;/p&gt;&lt;p&gt;NLP&amp;nbsp;社区中有这样一句说法：带有注意力的&amp;nbsp;LSTM&amp;nbsp;能在所有任务上实现当前最佳的表现。尽管在过去的两年这确实是真的，NLP&amp;nbsp;社区却在慢慢偏离带有注意力的&amp;nbsp;LSTM，而去发现更有趣的模型。
&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;但是，NLP&amp;nbsp;社区并非想再花费两年独立地（重新）发现下一个带有注意力的&amp;nbsp;LSTM。我们不打算重新发明已经奏效的技巧或方法。尽管现存的深度学习库已经从整体上编码了神经网络的最佳实践，比如初始化方案，但是很多其他的细节，尤其是特定任务或特定领域还有待从业者解决。
&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;本文并不打算盘点当前最佳，而是收集与大量任务相关的最佳实践。换言之，本文并不描述某个特定架构，而是旨在收集那些构建成功框架的特征。其中的很多特征对于推动当前最佳是最有用的，因此我希望对于它们的更广泛了解将会带来更强的评估、更有意义的基线对比，以及更多灵感，帮助我们觉察那些可能奏效的方法。
&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;本文假设你对神经网络应用于&amp;nbsp;NLP&amp;nbsp;的情况已经很熟悉（如果不熟悉，我建议你看一下&amp;nbsp;Yoav&amp;nbsp;Goldberg&amp;nbsp;写的A&amp;nbsp;Primer&amp;nbsp;on&amp;nbsp;Neural&amp;nbsp;Network&amp;nbsp;Modelsfor&amp;nbsp;Natural&amp;nbsp;Language&amp;nbsp;Processing： https://www.jair.org/media/4992/live-4992-9623-jair.pdf），并大体上对&amp;nbsp;NLP&amp;nbsp;或某个特定任务感兴趣。本文的主要目标是使你快速掌握相关的最佳实践，从而尽快做出有意义的贡献。我首先会对与绝大多数任务相关的最佳实践做一个概述，接着略述与最常见的任务相关的最佳实践，尤其是分类、序列标注、自然语言生成和神经机器翻译。
&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;免责声明：把某些东西定义为最佳实践极其困难：最佳的标准是什么？如果有更好的实践出现呢？本文基于我的个人理解和经验（肯定不全面）。接下来，我将只讨论被证明在至少两个独立的群体中有益的实践。对于每个最佳实践我将给出至少两个参引。
&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;h3 style="text-align: center; "&gt;最佳实践
&lt;/h3&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;h4&gt;词嵌入
&lt;/h4&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;在最近的&amp;nbsp;NLP&amp;nbsp;发展中，词嵌入无疑是最广为人知的最佳实践，这是因为预训练嵌入的使用对我们十分有帮助&amp;nbsp;(Kim,&amp;nbsp;2014)&amp;nbsp;[12]。词嵌入的最佳维度绝大多数是依赖任务的：一个更小的维度更多在句法任务上工作更好，比如命名实体识别（named&amp;nbsp;entity&amp;nbsp;recognition）(Melamud&amp;nbsp;et&amp;nbsp;al.,&amp;nbsp;2016)&amp;nbsp;[44]，或者词性标注（POS)(Plank&amp;nbsp;et&amp;nbsp;al.,&amp;nbsp;2016)&amp;nbsp;[32]，尽管一个更大的维度对于更多的语义任务来说更有用，比如情感分析&amp;nbsp;(Ruder&amp;nbsp;et&amp;nbsp;al.,&amp;nbsp;2016)&amp;nbsp;[45]。
&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;h4&gt;深度
&lt;/h4&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;虽然短时间内我们还无法达到计算机视觉的深度，但是&amp;nbsp;NLP&amp;nbsp;中的神经网络已经发展地更深了。现在最佳的方法通常使用&amp;nbsp;deep&amp;nbsp;Bi-LSTM，它通常包含&amp;nbsp;3-4&amp;nbsp;层，比如词性标注&amp;nbsp;(Plank&amp;nbsp;et&amp;nbsp;al.,&amp;nbsp;2016)&amp;nbsp;和语义角色标注&amp;nbsp;(He&amp;nbsp;et&amp;nbsp;al.,&amp;nbsp;2017)&amp;nbsp;[33]。一些任务的模型甚至更深。谷歌的&amp;nbsp;NMT&amp;nbsp;模型有&amp;nbsp;8&amp;nbsp;个编码器和&amp;nbsp;8&amp;nbsp;个解码器层，(Wu&amp;nbsp;et&amp;nbsp;al.,&amp;nbsp;2016)&amp;nbsp;[20]。然而，大多数情况下，模型超过&amp;nbsp;2&amp;nbsp;层所带来的性能提升是最小的&amp;nbsp;(Reimers&amp;nbsp;&amp;amp;&amp;nbsp;Gurevych,&amp;nbsp;2017)&amp;nbsp;[46]。
&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;这些观察适用于绝大多数序列标注和结构化预测问题。对于分类，深或者非常深的模型只在字符级的输入中表现良好，并且浅层的字词级模型依然是当前最佳&amp;nbsp;(Zhang&amp;nbsp;et&amp;nbsp;al.,&amp;nbsp;2015;&amp;nbsp;Conneau&amp;nbsp;et&amp;nbsp;al.,&amp;nbsp;2016;&amp;nbsp;Le&amp;nbsp;et&amp;nbsp;al.,&amp;nbsp;2017)&amp;nbsp;[28,&amp;nbsp;29,&amp;nbsp;30]。
&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;h4&gt;层连接
&lt;/h4&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;训练深度神经网络时，可以使用一些核心技巧避免梯度消失问题。不同的层和连接因此被提出来了，这里我们将讨论&amp;nbsp;3&amp;nbsp;点：i)&amp;nbsp;Highway&amp;nbsp;层，ii)&amp;nbsp;残差连接（residual&amp;nbsp;connection），iii)&amp;nbsp;密集型残差连接。
&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;Highway&amp;nbsp;层：它受到&amp;nbsp;LSTM&amp;nbsp;的门控机制所启发&amp;nbsp;(Srivastava&amp;nbsp;et&amp;nbsp;al.,&amp;nbsp;2015)&amp;nbsp;[1]。首先让我们假设一个单层的&amp;nbsp;MLP，它将一个非线性&amp;nbsp;g&amp;nbsp;的仿射变换应用到其输入&amp;nbsp;x：
&lt;/p&gt;&lt;p&gt;&lt;img src="https://image.jiqizhixin.com/uploads/wangeditor/b1ea4bcf-5ba8-4de9-bbf1-a811a6d4caec/94118image (1).png" class=""&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;Highway&amp;nbsp;层接着计算以下函数：
&lt;/p&gt;&lt;p&gt;&lt;img src="https://image.jiqizhixin.com/uploads/wangeditor/b1ea4bcf-5ba8-4de9-bbf1-a811a6d4caec/16945image (2).png"&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;其中&amp;nbsp;t=σ(WTx+bT)&amp;nbsp;被称作变换门（transform&amp;nbsp;gate），(1−t)&amp;nbsp;被称作进位门（carry&amp;nbsp;gate）。我们可以看到，Highway&amp;nbsp;层和&amp;nbsp;LSTM&amp;nbsp;门很相似，因为它们自适应地把输入的一些维度直接传递到输出。
&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;Highway&amp;nbsp;层主要用于语言建模，并取得了当前最佳的结果&amp;nbsp;(Kim&amp;nbsp;et&amp;nbsp;al.,&amp;nbsp;2016;&amp;nbsp;Jozefowicz&amp;nbsp;et&amp;nbsp;al.,&amp;nbsp;2016;&amp;nbsp;Zilly&amp;nbsp;et&amp;nbsp;al.,&amp;nbsp;2017)&amp;nbsp;[2,&amp;nbsp;3,&amp;nbsp;4]，但它同时也用于其他任务，如语音识别&amp;nbsp;(Zhang&amp;nbsp;et&amp;nbsp;al.,&amp;nbsp;2016)&amp;nbsp;[5]。想了解更多相关信息和代码，可查看&amp;nbsp;Sristava&amp;nbsp;的主页（http://people.idsia.ch/~rupesh/very_deep_learning/）。
&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;残差连接：残差连接（He&amp;nbsp;et&amp;nbsp;al.,&amp;nbsp;2016）[6]&amp;nbsp;的首次提出是应用于计算机视觉，也是计算机视觉在&amp;nbsp;ImageNet&amp;nbsp;2016&amp;nbsp;夺冠的最大助力。残差连接甚至比&amp;nbsp;Highway&amp;nbsp;层更直接。我们使用代表当前层的指数&amp;nbsp;L&amp;nbsp;来增加之前的层输出&amp;nbsp;h。然后，残差连接学习以下函数：&lt;/p&gt;&lt;p&gt;&lt;img src="https://image.jiqizhixin.com/uploads/wangeditor/b1ea4bcf-5ba8-4de9-bbf1-a811a6d4caec/47508image (3).png"&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;仅通过一个快捷连接，残差连接即可把之前层的输入添加到当前层。这一简单的更改缓解了梯度消失问题，因为层级不能变得更好，模型可以默认使用恒等函数（identity&amp;nbsp;function）。
&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;密集残差连接：密集残差连接&amp;nbsp;(Huang&amp;nbsp;et&amp;nbsp;al.,&amp;nbsp;2017)&amp;nbsp;[7]&amp;nbsp;(&amp;nbsp;CVPR&amp;nbsp;2017&amp;nbsp;最佳论文奖）从每一个层向所有随后的层添加连接，而不是从每一个层向下一个层添加层：
&lt;/p&gt;&lt;p&gt;&lt;img src="https://image.jiqizhixin.com/uploads/wangeditor/b1ea4bcf-5ba8-4de9-bbf1-a811a6d4caec/02828image (4).png" class=""&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;密集残差连接已成功应用于计算机视觉，也被证明在神经机器翻译方面的表现持续优于残差连接&amp;nbsp;(Britz&amp;nbsp;et&amp;nbsp;al.,&amp;nbsp;2017)&amp;nbsp;[27]。
&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;h4&gt;Dropout
&lt;/h4&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;尽管在计算机视觉领域的多数应用中，批归一化已使其他正则化器变得过时，但是&amp;nbsp;dropout&amp;nbsp;(Srivasta&amp;nbsp;et&amp;nbsp;al.,&amp;nbsp;2014)&amp;nbsp;[8]&amp;nbsp;依然是应用于&amp;nbsp;NLP&amp;nbsp;深度神经网络中的正则化器。0.5&amp;nbsp;的&amp;nbsp;dropout&amp;nbsp;率表明其在绝大多数场景中依然高效&amp;nbsp;(Kim,&amp;nbsp;2014)。近年来，dropout&amp;nbsp;的变体比如适应性&amp;nbsp;dropout（(Ba&amp;nbsp;&amp;amp;&amp;nbsp;Frey,&amp;nbsp;2013)&amp;nbsp;[9]）和进化&amp;nbsp;dropout&amp;nbsp;(Li&amp;nbsp;et&amp;nbsp;al.,&amp;nbsp;2016)&amp;nbsp;[10]&amp;nbsp;已被提出，但没有一个在&amp;nbsp;NLP&amp;nbsp;社区中获得广泛应用。造成这一问题的主要原因是它无法用于循环连接，因为聚集&amp;nbsp;dropout&amp;nbsp;masks&amp;nbsp;将会将嵌入清零。
&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;循环&amp;nbsp;dropout：循环&amp;nbsp;dropout（Gal&amp;nbsp;&amp;amp;&amp;nbsp;Ghahramani,&amp;nbsp;2016）[11]&amp;nbsp;通过在层&amp;nbsp;ll&amp;nbsp;的时间步中应用相同的&amp;nbsp;dropout&amp;nbsp;masks&amp;nbsp;来解决这一问题。这避免了放大序列中的&amp;nbsp;dropout&amp;nbsp;噪音，并为序列模型带来了有效的正则化。循环&amp;nbsp;dropout&amp;nbsp;已在语义角色标注&amp;nbsp;(He&amp;nbsp;et&amp;nbsp;al.,&amp;nbsp;2017)&amp;nbsp;和语言建模&amp;nbsp;(Melis&amp;nbsp;et&amp;nbsp;al.,&amp;nbsp;2017)&amp;nbsp;[34]&amp;nbsp;中取得了当前最佳的结果。
&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;h4&gt;多任务学习
&lt;/h4&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;如果有额外的数据，多任务学习（MTL）通常可用于在目标任务中提升性能。
&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;辅助目标（auxiliary&amp;nbsp;objective）：我们通常能找到对我们所关心的任务有用的辅助目标&amp;nbsp;(Ruder,&amp;nbsp;2017)&amp;nbsp;[13]。当我们已经预测了周围词以预训练词嵌入&amp;nbsp;(Mikolov&amp;nbsp;et&amp;nbsp;al.,&amp;nbsp;2013)&amp;nbsp;时，我们还可以在训练中将其作为辅助目标&amp;nbsp;(Rei,&amp;nbsp;2017)&amp;nbsp;[35]。我们也经常在序列到序列模型中使用相似的目标（Ramachandran&amp;nbsp;et&amp;nbsp;al.,&amp;nbsp;2016）[36]。
&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;特定任务层：尽管把&amp;nbsp;MTL&amp;nbsp;用于&amp;nbsp;NLP&amp;nbsp;的标准方法是硬参数共享，但允许模型学习特定任务层很有意义。这可通过把一项任务的输出层放置在较低级别来完成&amp;nbsp;(Søgaard&amp;nbsp;&amp;amp;&amp;nbsp;Goldberg,&amp;nbsp;2016)&amp;nbsp;[47]。另一方法是诱导私有和共享的子空间&amp;nbsp;(Liu&amp;nbsp;et&amp;nbsp;al.,&amp;nbsp;2017;&amp;nbsp;Ruder&amp;nbsp;et&amp;nbsp;al.,&amp;nbsp;2017)&amp;nbsp;[48,&amp;nbsp;49]。
&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;h4&gt;注意力机制
&lt;/h4&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;注意力机制是在序列到序列模型中用于注意编码器状态的最常用方法，它同时还可用于回顾序列模型的过去状态。使用注意力机制，系统能基于隐藏状态&amp;nbsp;s_1，...，s_m&amp;nbsp;而获得环境向量（context&amp;nbsp;vector）c_i，这些环境向量可以和当前的隐藏状态&amp;nbsp;h_i&amp;nbsp;一起实现预测。环境向量&amp;nbsp;c_i&amp;nbsp;可以由前面状态的加权平均数得出，其中状态所加的权就是注意力权重&amp;nbsp;a_i：
&lt;/p&gt;&lt;p&gt;&lt;img src="https://image.jiqizhixin.com/uploads/wangeditor/b1ea4bcf-5ba8-4de9-bbf1-a811a6d4caec/55070image (5).png"&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;注意力函数&amp;nbsp;f_att(h_i,s_j)&amp;nbsp;计算的是目前的隐藏状态&amp;nbsp;h_i&amp;nbsp;和前面的隐藏状态&amp;nbsp;s_j&amp;nbsp;之间的非归一化分配值。在下文中，我们将讨论四种注意力变体：加性注意力（additive&amp;nbsp;attention）、乘法（点积）注意力（multiplicative&amp;nbsp;attention）、自注意力（self-attention）和关键值注意力（key-value&amp;nbsp;attention）。
&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;加性注意力是最经典的注意力机制&amp;nbsp;(Bahdanau&amp;nbsp;et&amp;nbsp;al.,&amp;nbsp;2015)&amp;nbsp;[15]，它使用了有一个隐藏层的前馈网络来计算注意力的分配：
&lt;/p&gt;&lt;p&gt;&lt;img src="https://image.jiqizhixin.com/uploads/wangeditor/b1ea4bcf-5ba8-4de9-bbf1-a811a6d4caec/79325image (6).png"&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;其中&amp;nbsp;v_a&amp;nbsp;和&amp;nbsp;W_a&amp;nbsp;是所学到的注意力参数，[*&amp;nbsp;;&amp;nbsp;*]&amp;nbsp;代表了级联。类似地，我们同样能使用矩阵&amp;nbsp;W_1&amp;nbsp;和&amp;nbsp;W_2&amp;nbsp;分别为&amp;nbsp;h_i&amp;nbsp;和&amp;nbsp;s_j&amp;nbsp;学习单独的转换，这一过程可以表示为：
&lt;/p&gt;&lt;p&gt;&lt;img src="https://image.jiqizhixin.com/uploads/wangeditor/b1ea4bcf-5ba8-4de9-bbf1-a811a6d4caec/01842image (7).png" class=""&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;乘法注意力（Multiplicative&amp;nbsp;attention）(Luong&amp;nbsp;et&amp;nbsp;al.,&amp;nbsp;2015)&amp;nbsp;[16]&amp;nbsp;通过计算以下函数而简化了注意力操作：
&lt;/p&gt;&lt;p&gt;&lt;img src="https://image.jiqizhixin.com/uploads/wangeditor/b1ea4bcf-5ba8-4de9-bbf1-a811a6d4caec/29937image (8).png"&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;加性注意力和乘法注意力在复杂度上是相似的，但是乘法注意力在实践中往往要更快速、具有更高效的存储，因为它可以使用矩阵操作更高效地实现。两个变体在低维度&amp;nbsp;d_h&amp;nbsp;解码器状态中性能相似，但加性注意力机制在更高的维度上性能更优。缓解这一现象的方法是将&amp;nbsp;f_att(h_i,s_j)&amp;nbsp;缩放到&amp;nbsp;d_h^(-1/2)&amp;nbsp;倍&amp;nbsp;(Vaswani&amp;nbsp;et&amp;nbsp;al.,&amp;nbsp;2017)&amp;nbsp;[17]。
&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;注意力机制不仅能用来处理编码器或前面的隐藏层，它同样还能用来获得其他特征的分布，例如阅读理解任务中作为文本的词嵌入&amp;nbsp;(Kadlec&amp;nbsp;et&amp;nbsp;al.,&amp;nbsp;2017)&amp;nbsp;[37]。然而，注意力机制并不直接适用于分类任务，因为这些任务并不需要情感分析（sentiment&amp;nbsp;analysis）等额外的信息。在这些模型中，通常我们使用&amp;nbsp;LSTM&amp;nbsp;的最终隐藏状态或像最大池化和平均池化那样的累加函数来表征句子。
&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;自注意力机制（Self-attention）通常也不会使用其他额外的信息，但是它能使用自注意力关注本身进而从句子中抽取相关信息&amp;nbsp;(Lin&amp;nbsp;et&amp;nbsp;al.,&amp;nbsp;2017)&amp;nbsp;[18]。自注意力又称作内部注意力，它在很多任务上都有十分出色的表现，比如阅读理解&amp;nbsp;(Cheng&amp;nbsp;et&amp;nbsp;al.,&amp;nbsp;2016)&amp;nbsp;[38]、文本继承&amp;nbsp;(textual&amp;nbsp;entailment/Parikh&amp;nbsp;et&amp;nbsp;al.,&amp;nbsp;2016)&amp;nbsp;[39]、自动文本摘要&amp;nbsp;(Paulus&amp;nbsp;et&amp;nbsp;al.,&amp;nbsp;2017)&amp;nbsp;[40]。
&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;我们能计算每个隐藏状态&amp;nbsp;h_i&amp;nbsp;的非归一化分配值从而简化加性注意力：
&lt;/p&gt;&lt;p&gt;&lt;img src="https://image.jiqizhixin.com/uploads/wangeditor/b1ea4bcf-5ba8-4de9-bbf1-a811a6d4caec/48197image (9).png"&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;在矩阵形式中，对于隐藏状态&amp;nbsp;H=h_1,…,h_n，我们能通过以下形式计算注意力向量&amp;nbsp;a&amp;nbsp;和最后的句子表征&amp;nbsp;c：
&lt;/p&gt;&lt;p&gt;&lt;img src="https://image.jiqizhixin.com/uploads/wangeditor/b1ea4bcf-5ba8-4de9-bbf1-a811a6d4caec/59297image (10).png"&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;我们不仅可以抽取一个向量，同时还能通过将&amp;nbsp;v_a&amp;nbsp;替代为&amp;nbsp;V_a&amp;nbsp;矩阵而执行一些其他注意力特征，这可以令我们抽取注意力矩阵&amp;nbsp;A：
&lt;/p&gt;&lt;p&gt;&lt;img src="https://image.jiqizhixin.com/uploads/wangeditor/b1ea4bcf-5ba8-4de9-bbf1-a811a6d4caec/91484image (11).png"&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;在实践中，我们可以执行以下的正交约束而惩罚计算冗余，并以&amp;nbsp;Frobenius&amp;nbsp;范数平方的形式鼓励注意力向量的多样性：
&lt;/p&gt;&lt;p&gt;&lt;img src="https://image.jiqizhixin.com/uploads/wangeditor/b1ea4bcf-5ba8-4de9-bbf1-a811a6d4caec/16276image (12).png"&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;Vaswani&amp;nbsp;et&amp;nbsp;al.&amp;nbsp;(2017)&amp;nbsp;同样使用了类似的多头注意力（multi-head&amp;nbsp;attention）。
&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;最后，关键值注意力&amp;nbsp;(Daniluk&amp;nbsp;et&amp;nbsp;al.,&amp;nbsp;2017)&amp;nbsp;[19]&amp;nbsp;是最近出现的注意力变体机制，它将形式和函数分开，从而为注意力计算保持分离的向量。它同样在多种文本建模任务&amp;nbsp;(Liu&amp;nbsp;&amp;amp;&amp;nbsp;Lapata,&amp;nbsp;2017)&amp;nbsp;[41]&amp;nbsp;中发挥了很大的作用。具体来说，关键值注意力将每一个隐藏向量&amp;nbsp;h_i&amp;nbsp;分离为一个键值&amp;nbsp;k_i&amp;nbsp;和一个向量&amp;nbsp;v_i：[k_i;v_i]=h_i。键值使用加性注意力来计算注意力分布&amp;nbsp;a_i：
&lt;/p&gt;&lt;p&gt;&lt;img src="https://image.jiqizhixin.com/uploads/wangeditor/b1ea4bcf-5ba8-4de9-bbf1-a811a6d4caec/32058image (13).png"&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;其中&amp;nbsp;L&amp;nbsp;为注意力窗体的长度，I&amp;nbsp;为所有单元为&amp;nbsp;1&amp;nbsp;的向量。然后使用注意力分布值可以求得环境表征&amp;nbsp;c_i：
&lt;/p&gt;&lt;p&gt;&lt;img src="https://image.jiqizhixin.com/uploads/wangeditor/b1ea4bcf-5ba8-4de9-bbf1-a811a6d4caec/48566image (14).png"&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;其中环境向量&amp;nbsp;c_i&amp;nbsp;将联合现阶段的状态值&amp;nbsp;v_i&amp;nbsp;进行预测。
&lt;/p&gt;&lt;h4&gt;&lt;br&gt;最优化
&lt;/h4&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;最优化算法和方案通常是模型的一部分，并且常常被视为黑箱操作。有时算法轻微的变化，如在&amp;nbsp;Adam&amp;nbsp;算法中减少超参数β2&amp;nbsp;的值&amp;nbsp;(Dozat&amp;nbsp;&amp;amp;&amp;nbsp;Manning,&amp;nbsp;2017)&amp;nbsp;[50]&amp;nbsp;将会造成优化行为的巨大改变。
&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;Adam&amp;nbsp;方法&amp;nbsp;(Kingma&amp;nbsp;&amp;amp;&amp;nbsp;Ba,&amp;nbsp;2015)&amp;nbsp;[21]&amp;nbsp;是使用最广泛、最常见的优化算法，它通常也作为&amp;nbsp;NLP&amp;nbsp;研究员的优化器。Adam&amp;nbsp;方法要明显地比&amp;nbsp;vanilla&amp;nbsp;随机梯度下降更优秀，并且其收敛速度也十分迅速。但近来有研究表明通过精调并带动量的梯度下降方法要比&amp;nbsp;Adam&amp;nbsp;方法更优秀&amp;nbsp;(Zhang&amp;nbsp;et&amp;nbsp;al.,&amp;nbsp;2017)&amp;nbsp;[42]。
&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;从优化方案来说，因为&amp;nbsp;Adam&amp;nbsp;方法会适应性地为每一个参数调整学习速率&amp;nbsp;(Ruder,&amp;nbsp;2016)&amp;nbsp;[22]，所以我们可以使用&amp;nbsp;Adam&amp;nbsp;方法精确地执行&amp;nbsp;SGD&amp;nbsp;风格的退火处理。特别是我们可以通过重启（restart）执行学习速率退火处理：即设定一个学习速率并训练模型，直到模型收敛。然后，我们可以平分学习速率，并通过加载前面最好的模型而重启优化过程。在&amp;nbsp;Adam&amp;nbsp;中，这会令优化器忘记预训练参数的学习速率，并且重新开始。Denkowski&amp;nbsp;&amp;amp;&amp;nbsp;Neubig&amp;nbsp;(2017)&amp;nbsp;[23]&amp;nbsp;表示带有两个重启和学习速率退火处理的&amp;nbsp;Adam&amp;nbsp;算法要比带有退火处理的&amp;nbsp;SGD&amp;nbsp;算法更加优秀。
&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;h4&gt;集成方法
&lt;/h4&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;通过平均多个模型的预测将多个模型组合为一个集成模型被证明是提高模型性能的有效策略。尽管在测试时使用集成做预测十分昂贵，最近提取方面的一些进展允许我们把昂贵的集成压缩成更小的模型&amp;nbsp;(Hinton&amp;nbsp;et&amp;nbsp;al.,&amp;nbsp;2015;&amp;nbsp;Kuncoro&amp;nbsp;et&amp;nbsp;al.,&amp;nbsp;2016;&amp;nbsp;Kim&amp;nbsp;&amp;amp;&amp;nbsp;Rush,&amp;nbsp;2016)&amp;nbsp;[24,&amp;nbsp;25,&amp;nbsp;26]。
&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;如果评估模型的多样性增加&amp;nbsp;(Denkowski&amp;nbsp;&amp;amp;&amp;nbsp;Neubig,&amp;nbsp;2017)，集成是确保结果可靠的重要方式。尽管集成一个模型的不同检查点被证明很有效&amp;nbsp;(Jean&amp;nbsp;et&amp;nbsp;al.,&amp;nbsp;2015;&amp;nbsp;Sennrich&amp;nbsp;et&amp;nbsp;al.,&amp;nbsp;2016)&amp;nbsp;[51,&amp;nbsp;52]，但这种方法牺牲了模型的多样性。周期学习率有助于缓解这一影响&amp;nbsp;(Huang&amp;nbsp;et&amp;nbsp;al.,&amp;nbsp;2017)&amp;nbsp;[53]。但是，如果资源可用，我们更喜欢集成多个独立训练的模型以最大化模型多样性。
&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;h4&gt;超参数优化
&lt;/h4&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;我们可以简单地调整模型超参数从而在基线上获得显著提升，而不仅仅只是使用预定义或现有的超参数来训练模型。最近&amp;nbsp;Bayesian&amp;nbsp;Optimization&amp;nbsp;的新进展可以用于在神经网络黑箱训练中优化超参数&amp;nbsp;(Snoek&amp;nbsp;et&amp;nbsp;al.,&amp;nbsp;2012)&amp;nbsp;[56]，这种方法要比广泛使用的网格搜索高效地多。LSTM&amp;nbsp;的自动超参数调整已经在语言建模产生了最佳的性能，远远胜过其他更复杂的模型&amp;nbsp;(Melis&amp;nbsp;et&amp;nbsp;al.,&amp;nbsp;2017)。
&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;h4&gt;LSTM&amp;nbsp;技巧
&lt;/h4&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;学习初始状态：我们通常初始化&amp;nbsp;LSTM&amp;nbsp;状态为零向量。但我们可以将初始状态看作参数进行优化，而不是人为地调整来提升性能。这一方法十分受&amp;nbsp;Hinton&amp;nbsp;的推荐。关于这一技巧的&amp;nbsp;TensorFlow&amp;nbsp;实现，详见：https://r2rt.com/non-zero-initial-states-for-recurrent-neural-networks.html
&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;尝试输入和输出嵌入：适合于输入和输出嵌入在&amp;nbsp;LSTM&amp;nbsp;模型中占了绝大多数参数数量的情况。如果&amp;nbsp;LSTM&amp;nbsp;在语言建模中预测词汇，输入和输出参数可以共享&amp;nbsp;(Inan&amp;nbsp;et&amp;nbsp;al.,&amp;nbsp;2016;&amp;nbsp;Press&amp;nbsp;&amp;amp;&amp;nbsp;Wolf,&amp;nbsp;2017)&amp;nbsp;[54,&amp;nbsp;55]。这一技巧在不允许学习大规模参数的小数据集中十分有用。
&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;梯度范数截断（Gradient&amp;nbsp;norm&amp;nbsp;clipping）：降低梯度消失风险的一个方法是截断其最大值&amp;nbsp;(Mikolov,&amp;nbsp;2012)&amp;nbsp;[57]。但是这并没有持续提升性能（Reimers&amp;nbsp;&amp;amp;&amp;nbsp;Gurevych,&amp;nbsp;2017）。与其独立地截断每个梯度，截断梯度的全局范数&amp;nbsp;(Pascanu&amp;nbsp;et&amp;nbsp;al.,&amp;nbsp;2013)&amp;nbsp;反而会带来更加显著的提升（这里有一个&amp;nbsp;Tensorflow&amp;nbsp;实现：https://stackoverflow.com/questions/36498127/how-to-effectively-apply-gradient-clipping-in-tensor-flow）。
&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;下投影（Down-projection）：为了进一步减少输出参数的数量，LSTM&amp;nbsp;的隐态可以被投影到更小的尺寸。这对带有大量输出的任务尤其有用，比如语言建模（Melis&amp;nbsp;et&amp;nbsp;al.,&amp;nbsp;2017）。
&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;h3 style="text-align: center; "&gt;特定任务的最佳实践
&lt;/h3&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;下面，我们要介绍特定任务的最佳实践。大部分模型在执行特定类型的单项任务时表现很好，部分模型可以应用于其他任务，不过在应用之前需要验证其性能。我们还将讨论以下任务：分类、序列标注、自然语言生成（NLG）和自然语言生成的特殊案例神经机器翻译。
&lt;/p&gt;&lt;h4&gt;&lt;br&gt;分类
&lt;/h4&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;由于卷积操作更加高效，近期&amp;nbsp;CNN&amp;nbsp;应用范围扩大，成为处理&amp;nbsp;NLP&amp;nbsp;中分类任务的通用方法。下面的最佳实践和&amp;nbsp;CNN&amp;nbsp;相关，可选择多个最优超参数（optimal&amp;nbsp;hyperparameter）。
&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;CNN&amp;nbsp;过滤器：使过滤器大小接近最优过滤器大小，如&amp;nbsp;(3,4,5)&amp;nbsp;性能最佳（Kim,&amp;nbsp;2014;&amp;nbsp;Kim&amp;nbsp;et&amp;nbsp;al.,&amp;nbsp;2016）。特征映射的最佳数量范围是&amp;nbsp;50~600（Zhang&amp;nbsp;&amp;amp;&amp;nbsp;Wallace,&amp;nbsp;2015）[59]。&lt;br&gt;&lt;/li&gt;&lt;li&gt;聚合函数（Aggregation&amp;nbsp;function）：1-最大池化优于平均池化和&amp;nbsp;k-最大池化（Zhang&amp;nbsp;&amp;amp;&amp;nbsp;Wallace,&amp;nbsp;2015）。&lt;br&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;/p&gt;&lt;h4&gt;&lt;br&gt;序列标注
&lt;/h4&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;序列标注在&amp;nbsp;NLP&amp;nbsp;中非常普遍。现有的很多最佳实践都是模型架构的一个环节，下列指南主要讨论模型输出和预测阶段。
&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;标注策略（Tagging&amp;nbsp;scheme）：&amp;nbsp;对于将标签分配到文本分隔的任务，不同的标注策略均可采用。比如：BIO，分隔的第一个符号处标注&amp;nbsp;B-tag，其他符号处标注&amp;nbsp;I-tag，分隔外的符号标注&amp;nbsp;O-tag；IOB，和&amp;nbsp;BIO&amp;nbsp;相似，不同之处在于如果前面的符号属于相同的类别，但不属于同一个分隔，则使用&amp;nbsp;B-tag&amp;nbsp;来标注；IOBES，还需要在单个符号实体处标注&amp;nbsp;S-tag，每个分隔的最后一个符号处标注&amp;nbsp;E-tag。IOBES&amp;nbsp;和&amp;nbsp;BIO&amp;nbsp;的性能相似。
&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;条件随机场输出层（CRF&amp;nbsp;output&amp;nbsp;layer）：&amp;nbsp;如果输出之间存在依赖，如在命名实体识别（named&amp;nbsp;entity&amp;nbsp;recognition）中，可以用线性链条件随机场（linear-chain&amp;nbsp;conditional&amp;nbsp;random&amp;nbsp;field）代替最后的&amp;nbsp;softmax&amp;nbsp;层。经证实，这种方法对于要求对约束进行建模的任务有持续改善的效果（Huang&amp;nbsp;et&amp;nbsp;al.,&amp;nbsp;2015;&amp;nbsp;Max&amp;nbsp;&amp;amp;&amp;nbsp;Hovy,&amp;nbsp;2016;&amp;nbsp;Lample&amp;nbsp;et&amp;nbsp;al.,&amp;nbsp;2016）[60,&amp;nbsp;61,&amp;nbsp;62]。
&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;约束解码（Constrained&amp;nbsp;decoding）：&amp;nbsp;除了条件随机场输出层以外，还可用约束解码来排除错误排序，即不产生有效的&amp;nbsp;BIO&amp;nbsp;过渡（BIO&amp;nbsp;transition）（He&amp;nbsp;et&amp;nbsp;al.,&amp;nbsp;2017）。约束解码的优势在于可以执行随意约束（arbitrary&amp;nbsp;constraint），如特定任务约束或句法约束。
&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;h4&gt;自然语言生成
&lt;/h4&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;多数现有最佳实践可用于自然语言生成（NLG）。事实上，目前出现的很多技巧都植根于语言建模方面的进步，语言建模是最典型的&amp;nbsp;NLP&amp;nbsp;任务。
&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;建模覆盖率（Modelling&amp;nbsp;coverage）：&amp;nbsp;重复是&amp;nbsp;NLG&amp;nbsp;任务的一大难题，因为当前的模型无法很好地记忆已经产生的输出结果。在模型中直接设置建模覆盖率是解决该问题的好方法。如果提前知道哪些实体应该出现在输出结果中（就像菜谱中的调料），则需要使用一个检查表（checklist）（Kiddon&amp;nbsp;et&amp;nbsp;al.,&amp;nbsp;2016）[63]。如果使用注意力机制，我们可以追踪覆盖率向量&amp;nbsp;c_i，它是过去的时间步上注意力分布&amp;nbsp;a_t 的总和（Tu&amp;nbsp;et&amp;nbsp;al.,&amp;nbsp;2016;&amp;nbsp;See&amp;nbsp;et&amp;nbsp;al.,&amp;nbsp;2017）[64,&amp;nbsp;65]：
&lt;/p&gt;&lt;p&gt;&lt;img src="https://image.jiqizhixin.com/uploads/wangeditor/b1ea4bcf-5ba8-4de9-bbf1-a811a6d4caec/03992image (15).png"&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;该向量可以捕捉我们在源语言所有单词上使用的注意力。现在我们可以在覆盖率向量上设置加性注意力（additive&amp;nbsp;attention），以鼓励模型不重复关注同样的单词：&lt;/p&gt;&lt;p&gt;&lt;img src="https://image.jiqizhixin.com/uploads/wangeditor/b1ea4bcf-5ba8-4de9-bbf1-a811a6d4caec/26388image (16).png"&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;此外，我们可以添加辅助损失（auxiliary&amp;nbsp;loss），该损失可以捕捉我们想关注的特定任务的注意力行为：我们希望神经机器翻译可以做到一对一对齐（one-to-one&amp;nbsp;alignment）；如果最后的覆盖率向量多于或少于每一个指数上的覆盖率向量，那么模型将被罚分（Tu&amp;nbsp;et&amp;nbsp;al.,&amp;nbsp;2016）。总之，如果模型重复处理同样的位置，我们就会惩罚该模型（See&amp;nbsp;et&amp;nbsp;al.,&amp;nbsp;2017）。
&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;h4&gt;神经机器翻译
&lt;/h4&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;虽然神经机器翻译只是&amp;nbsp;NLG&amp;nbsp;的一个分支，但&amp;nbsp;NMT&amp;nbsp;获得了大量关注，有许多方法专门为该任务开发。相似地，许多最佳实践或超参数选择只能应用到&amp;nbsp;NMT&amp;nbsp;领域。&lt;br&gt;&lt;/li&gt;&lt;li&gt;嵌入维度（Embedding&amp;nbsp;dimensionality）：2048&amp;nbsp;维嵌入的性能最佳，但很少达到该效果。128&amp;nbsp;维嵌入的性能却出乎意料地好，收敛速度几乎达到之前的&amp;nbsp;2&amp;nbsp;倍（Britz&amp;nbsp;et&amp;nbsp;al.,&amp;nbsp;2017）。&lt;br&gt;&lt;/li&gt;&lt;li&gt;编码器和解码器深度：&amp;nbsp;编码器的深度无需超过&amp;nbsp;2−4&amp;nbsp;层。深层模型性能优于浅层模型，但多于&amp;nbsp;4&amp;nbsp;层对解码器来说没有必要（Britz&amp;nbsp;et&amp;nbsp;al.,&amp;nbsp;2017）。&lt;br&gt;&lt;/li&gt;&lt;li&gt;方向性（Directionality）：双向编码器性能稍好于单向编码器。Sutskever&amp;nbsp;et&amp;nbsp;al.（2014）[_67_]&amp;nbsp;提出颠倒源语言的顺序，以减少长期依赖的数量。使用单向编码器颠倒源语言顺序优于未颠倒语序（Britz&amp;nbsp;et&amp;nbsp;al.,&amp;nbsp;2017）。&lt;br&gt;&lt;/li&gt;&lt;li&gt;束搜索策略（Beam&amp;nbsp;search&amp;nbsp;strategy）：大小&amp;nbsp;10、长度归一化罚项为&amp;nbsp;1.0&amp;nbsp;的中型束（Wu&amp;nbsp;et&amp;nbsp;al.,&amp;nbsp;2016）性能最佳（Britz&amp;nbsp;et&amp;nbsp;al.,&amp;nbsp;2017）。&lt;br&gt;&lt;/li&gt;&lt;li&gt;子词翻译（Sub-word&amp;nbsp;translation）：Senrich&amp;nbsp;et&amp;nbsp;al.&amp;nbsp;(2016)&amp;nbsp;[66]&amp;nbsp;提出根据字节对编码（byte-pair&amp;nbsp;encoding／BPE）将单词分隔成子词（sub-word）。BPE&amp;nbsp;迭代合并出现频率高的符号对（symbol&amp;nbsp;pair），最后将出现频率高的&amp;nbsp;n&amp;nbsp;元合并成一个单独的符号，进而有效去除非词表词（out-of-vocabulary-word）。该技术最初用来处理罕见单词，但是子词单元的模型性能全面超过全词系统，32000&amp;nbsp;个子词单元是最高效的单词数量（Denkowski&amp;nbsp;&amp;amp;&amp;nbsp;Neubig,&amp;nbsp;2017）。&lt;br&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;h3 style="text-align: center; "&gt;结语
&lt;/h3&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;我确定这份清单上一定有遗漏的最佳实践。相似地，也有很多我不熟悉的任务，如解析、信息提取，我没办法做出推荐。&lt;span style="font-size: 16px;"&gt;我希望本文对开始学习新的&amp;nbsp;NLP&amp;nbsp;任务有所帮助。即使你对这里列出的大部分内容都很熟悉，我也希望你能够学到一些新的东西或者重新掌握有用的技巧。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 16px;"&gt;&lt;br&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;参考：
&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;1.&amp;nbsp;Srivastava,&amp;nbsp;R.&amp;nbsp;K.,&amp;nbsp;Greff,&amp;nbsp;K.,&amp;nbsp;&amp;amp;&amp;nbsp;Schmidhuber,&amp;nbsp;J.&amp;nbsp;(2015).&amp;nbsp;Training&amp;nbsp;Very&amp;nbsp;Deep&amp;nbsp;Networks.&amp;nbsp;In&amp;nbsp;Advances&amp;nbsp;in&amp;nbsp;Neural&amp;nbsp;Information&amp;nbsp;Processing&amp;nbsp;Systems.&amp;nbsp;
&lt;/p&gt;&lt;p&gt;2.&amp;nbsp;Kim,&amp;nbsp;Y.,&amp;nbsp;Jernite,&amp;nbsp;Y.,&amp;nbsp;Sontag,&amp;nbsp;D.,&amp;nbsp;&amp;amp;&amp;nbsp;Rush,&amp;nbsp;A.&amp;nbsp;M.&amp;nbsp;(2016).&amp;nbsp;Character-Aware&amp;nbsp;Neural&amp;nbsp;Language&amp;nbsp;Models.&amp;nbsp;AAAI.&amp;nbsp;Retrieved&amp;nbsp;from&amp;nbsp;http://arxiv.org/abs/1508.06615&amp;nbsp;
&lt;/p&gt;&lt;p&gt;3.&amp;nbsp;Jozefowicz,&amp;nbsp;R.,&amp;nbsp;Vinyals,&amp;nbsp;O.,&amp;nbsp;Schuster,&amp;nbsp;M.,&amp;nbsp;Shazeer,&amp;nbsp;N.,&amp;nbsp;&amp;amp;&amp;nbsp;Wu,&amp;nbsp;Y.&amp;nbsp;(2016).&amp;nbsp;Exploring&amp;nbsp;the&amp;nbsp;Limits&amp;nbsp;of&amp;nbsp;Language&amp;nbsp;Modeling.&amp;nbsp;arXiv&amp;nbsp;Preprint&amp;nbsp;arXiv:1602.02410.&amp;nbsp;Retrieved&amp;nbsp;from&amp;nbsp;http://arxiv.org/abs/1602.02410&amp;nbsp;
&lt;/p&gt;&lt;p&gt;4.&amp;nbsp;Zilly,&amp;nbsp;J.&amp;nbsp;G.,&amp;nbsp;Srivastava,&amp;nbsp;R.&amp;nbsp;K.,&amp;nbsp;Koutnik,&amp;nbsp;J.,&amp;nbsp;&amp;amp;&amp;nbsp;Schmidhuber,&amp;nbsp;J.&amp;nbsp;(2017).&amp;nbsp;Recurrent&amp;nbsp;Highway&amp;nbsp;Networks.&amp;nbsp;In&amp;nbsp;International&amp;nbsp;Conference&amp;nbsp;on&amp;nbsp;Machine&amp;nbsp;Learning&amp;nbsp;(ICML&amp;nbsp;2017).&amp;nbsp;
&lt;/p&gt;&lt;p&gt;5.&amp;nbsp;Zhang,&amp;nbsp;Y.,&amp;nbsp;Chen,&amp;nbsp;G.,&amp;nbsp;Yu,&amp;nbsp;D.,&amp;nbsp;Yao,&amp;nbsp;K.,&amp;nbsp;Kudanpur,&amp;nbsp;S.,&amp;nbsp;&amp;amp;&amp;nbsp;Glass,&amp;nbsp;J.&amp;nbsp;(2016).&amp;nbsp;Highway&amp;nbsp;Long&amp;nbsp;Short-Term&amp;nbsp;Memory&amp;nbsp;RNNS&amp;nbsp;for&amp;nbsp;Distant&amp;nbsp;Speech&amp;nbsp;Recognition.&amp;nbsp;In&amp;nbsp;2016&amp;nbsp;IEEE&amp;nbsp;International&amp;nbsp;Conference&amp;nbsp;on&amp;nbsp;Acoustics,&amp;nbsp;Speech&amp;nbsp;and&amp;nbsp;Signal&amp;nbsp;Processing&amp;nbsp;(ICASSP).&amp;nbsp;
&lt;/p&gt;&lt;p&gt;6.&amp;nbsp;He,&amp;nbsp;K.,&amp;nbsp;Zhang,&amp;nbsp;X.,&amp;nbsp;Ren,&amp;nbsp;S.,&amp;nbsp;&amp;amp;&amp;nbsp;Sun,&amp;nbsp;J.&amp;nbsp;(2016).&amp;nbsp;Deep&amp;nbsp;Residual&amp;nbsp;Learning&amp;nbsp;for&amp;nbsp;Image&amp;nbsp;Recognition.&amp;nbsp;In&amp;nbsp;CVPR.&amp;nbsp;
&lt;/p&gt;&lt;p&gt;7.&amp;nbsp;Huang,&amp;nbsp;G.,&amp;nbsp;Weinberger,&amp;nbsp;K.&amp;nbsp;Q.,&amp;nbsp;&amp;amp;&amp;nbsp;Maaten,&amp;nbsp;L.&amp;nbsp;Van&amp;nbsp;Der.&amp;nbsp;(2016).&amp;nbsp;Densely&amp;nbsp;Connected&amp;nbsp;Convolutional&amp;nbsp;Networks.&amp;nbsp;CVPR&amp;nbsp;2017.&amp;nbsp;
&lt;/p&gt;&lt;p&gt;8.&amp;nbsp;Srivastava,&amp;nbsp;N.,&amp;nbsp;Hinton,&amp;nbsp;G.,&amp;nbsp;Krizhevsky,&amp;nbsp;A.,&amp;nbsp;Sutskever,&amp;nbsp;I.,&amp;nbsp;&amp;amp;&amp;nbsp;Salakhutdinov,&amp;nbsp;R.&amp;nbsp;(2014).&amp;nbsp;Dropout:&amp;nbsp;A&amp;nbsp;Simple&amp;nbsp;Way&amp;nbsp;to&amp;nbsp;Prevent&amp;nbsp;Neural&amp;nbsp;Networks&amp;nbsp;from&amp;nbsp;Overfitting.&amp;nbsp;Journal&amp;nbsp;of&amp;nbsp;Machine&amp;nbsp;Learning&amp;nbsp;Research,&amp;nbsp;15,&amp;nbsp;1929–1958.&amp;nbsp;https://doi.org/10.1214/12-AOS1000&amp;nbsp;
&lt;/p&gt;&lt;p&gt;9.&amp;nbsp;Ba,&amp;nbsp;J.,&amp;nbsp;&amp;amp;&amp;nbsp;Frey,&amp;nbsp;B.&amp;nbsp;(2013).&amp;nbsp;Adaptive&amp;nbsp;dropout&amp;nbsp;for&amp;nbsp;training&amp;nbsp;deep&amp;nbsp;neural&amp;nbsp;networks.&amp;nbsp;In&amp;nbsp;Advances&amp;nbsp;in&amp;nbsp;Neural&amp;nbsp;Information&amp;nbsp;Processing&amp;nbsp;Systems.&amp;nbsp;Retrieved&amp;nbsp;from&amp;nbsp;file:///Files/A5/A51D0755-5CEF-4772-942D-C5B8157FBE5E.pdf&amp;nbsp;
&lt;/p&gt;&lt;p&gt;10.&amp;nbsp;Li,&amp;nbsp;Z.,&amp;nbsp;Gong,&amp;nbsp;B.,&amp;nbsp;&amp;amp;&amp;nbsp;Yang,&amp;nbsp;T.&amp;nbsp;(2016).&amp;nbsp;Improved&amp;nbsp;Dropout&amp;nbsp;for&amp;nbsp;Shallow&amp;nbsp;and&amp;nbsp;Deep&amp;nbsp;Learning.&amp;nbsp;In&amp;nbsp;Advances&amp;nbsp;in&amp;nbsp;Neural&amp;nbsp;Information&amp;nbsp;Processing&amp;nbsp;Systems&amp;nbsp;29&amp;nbsp;(NIPS&amp;nbsp;2016).&amp;nbsp;Retrieved&amp;nbsp;from&amp;nbsp;http://arxiv.org/abs/1602.02220&amp;nbsp;
&lt;/p&gt;&lt;p&gt;11.&amp;nbsp;Gal,&amp;nbsp;Y.,&amp;nbsp;&amp;amp;&amp;nbsp;Ghahramani,&amp;nbsp;Z.&amp;nbsp;(2016).&amp;nbsp;A&amp;nbsp;Theoretically&amp;nbsp;Grounded&amp;nbsp;Application&amp;nbsp;of&amp;nbsp;Dropout&amp;nbsp;in&amp;nbsp;Recurrent&amp;nbsp;Neural&amp;nbsp;Networks.&amp;nbsp;In&amp;nbsp;Advances&amp;nbsp;in&amp;nbsp;Neural&amp;nbsp;Information&amp;nbsp;Processing&amp;nbsp;Systems.&amp;nbsp;Retrieved&amp;nbsp;from&amp;nbsp;http://arxiv.org/abs/1512.05287&amp;nbsp;
&lt;/p&gt;&lt;p&gt;12.&amp;nbsp;Kim,&amp;nbsp;Y.&amp;nbsp;(2014).&amp;nbsp;Convolutional&amp;nbsp;Neural&amp;nbsp;Networks&amp;nbsp;for&amp;nbsp;Sentence&amp;nbsp;Classification.&amp;nbsp;Proceedings&amp;nbsp;of&amp;nbsp;the&amp;nbsp;Conference&amp;nbsp;on&amp;nbsp;Empirical&amp;nbsp;Methods&amp;nbsp;in&amp;nbsp;Natural&amp;nbsp;Language&amp;nbsp;Processing,&amp;nbsp;1746–1751.&amp;nbsp;Retrieved&amp;nbsp;from&amp;nbsp;http://arxiv.org/abs/1408.5882&amp;nbsp;
&lt;/p&gt;&lt;p&gt;13.&amp;nbsp;Ruder,&amp;nbsp;S.&amp;nbsp;(2017).&amp;nbsp;An&amp;nbsp;Overview&amp;nbsp;of&amp;nbsp;Multi-Task&amp;nbsp;Learning&amp;nbsp;in&amp;nbsp;Deep&amp;nbsp;Neural&amp;nbsp;Networks.&amp;nbsp;In&amp;nbsp;arXiv&amp;nbsp;preprint&amp;nbsp;arXiv:1706.05098.&amp;nbsp;
&lt;/p&gt;&lt;p&gt;14.&amp;nbsp;Semi-supervised&amp;nbsp;Multitask&amp;nbsp;Learning&amp;nbsp;for&amp;nbsp;Sequence&amp;nbsp;Labeling.&amp;nbsp;In&amp;nbsp;Proceedings&amp;nbsp;of&amp;nbsp;ACL&amp;nbsp;2017.&amp;nbsp;
&lt;/p&gt;&lt;p&gt;15.&amp;nbsp;Bahdanau,&amp;nbsp;D.,&amp;nbsp;Cho,&amp;nbsp;K.,&amp;nbsp;&amp;amp;&amp;nbsp;Bengio,&amp;nbsp;Y..&amp;nbsp;Neural&amp;nbsp;Machine&amp;nbsp;Translation&amp;nbsp;by&amp;nbsp;Jointly&amp;nbsp;Learning&amp;nbsp;to&amp;nbsp;Align&amp;nbsp;and&amp;nbsp;Translate.&amp;nbsp;ICLR&amp;nbsp;2015.&amp;nbsp;https://doi.org/10.1146/annurev.neuro.26.041002.131047&amp;nbsp;
&lt;/p&gt;&lt;p&gt;16.&amp;nbsp;Luong,&amp;nbsp;M.-T.,&amp;nbsp;Pham,&amp;nbsp;H.,&amp;nbsp;&amp;amp;&amp;nbsp;Manning,&amp;nbsp;C.&amp;nbsp;D.&amp;nbsp;(2015).&amp;nbsp;Effective&amp;nbsp;Approaches&amp;nbsp;to&amp;nbsp;Attention-based&amp;nbsp;Neural&amp;nbsp;Machine&amp;nbsp;Translation.&amp;nbsp;EMNLP&amp;nbsp;2015.&amp;nbsp;Retrieved&amp;nbsp;from&amp;nbsp;http://arxiv.org/abs/1508.04025&amp;nbsp;
&lt;/p&gt;&lt;p&gt;17.&amp;nbsp;Vaswani,&amp;nbsp;A.,&amp;nbsp;Shazeer,&amp;nbsp;N.,&amp;nbsp;Parmar,&amp;nbsp;N.,&amp;nbsp;Uszkoreit,&amp;nbsp;J.,&amp;nbsp;Jones,&amp;nbsp;L.,&amp;nbsp;Gomez,&amp;nbsp;A.&amp;nbsp;N.,&amp;nbsp;…&amp;nbsp;Polosukhin,&amp;nbsp;I.&amp;nbsp;(2017).&amp;nbsp;Attention&amp;nbsp;Is&amp;nbsp;All&amp;nbsp;You&amp;nbsp;Need.&amp;nbsp;arXiv&amp;nbsp;Preprint&amp;nbsp;arXiv:1706.03762.&amp;nbsp;
&lt;/p&gt;&lt;p&gt;18.&amp;nbsp;Lin,&amp;nbsp;Z.,&amp;nbsp;Feng,&amp;nbsp;M.,&amp;nbsp;Santos,&amp;nbsp;C.&amp;nbsp;N.&amp;nbsp;dos,&amp;nbsp;Yu,&amp;nbsp;M.,&amp;nbsp;Xiang,&amp;nbsp;B.,&amp;nbsp;Zhou,&amp;nbsp;B.,&amp;nbsp;&amp;amp;&amp;nbsp;Bengio,&amp;nbsp;Y.&amp;nbsp;(2017).&amp;nbsp;A&amp;nbsp;Structured&amp;nbsp;Self-Attentive&amp;nbsp;Sentence&amp;nbsp;Embedding.&amp;nbsp;In&amp;nbsp;ICLR&amp;nbsp;2017.&amp;nbsp;
&lt;/p&gt;&lt;p&gt;19.&amp;nbsp;Daniluk,&amp;nbsp;M.,&amp;nbsp;Rockt,&amp;nbsp;T.,&amp;nbsp;Welbl,&amp;nbsp;J.,&amp;nbsp;&amp;amp;&amp;nbsp;Riedel,&amp;nbsp;S.&amp;nbsp;(2017).&amp;nbsp;Frustratingly&amp;nbsp;Short&amp;nbsp;Attention&amp;nbsp;Spans&amp;nbsp;in&amp;nbsp;Neural&amp;nbsp;Language&amp;nbsp;Modeling.&amp;nbsp;In&amp;nbsp;ICLR&amp;nbsp;2017.&amp;nbsp;
&lt;/p&gt;&lt;p&gt;20.&amp;nbsp;Wu,&amp;nbsp;Y.,&amp;nbsp;Schuster,&amp;nbsp;M.,&amp;nbsp;Chen,&amp;nbsp;Z.,&amp;nbsp;Le,&amp;nbsp;Q.&amp;nbsp;V,&amp;nbsp;Norouzi,&amp;nbsp;M.,&amp;nbsp;Macherey,&amp;nbsp;W.,&amp;nbsp;…&amp;nbsp;Dean,&amp;nbsp;J.&amp;nbsp;(2016).&amp;nbsp;Google』s&amp;nbsp;Neural&amp;nbsp;Machine&amp;nbsp;Translation&amp;nbsp;System:&amp;nbsp;Bridging&amp;nbsp;the&amp;nbsp;Gap&amp;nbsp;between&amp;nbsp;Human&amp;nbsp;and&amp;nbsp;Machine&amp;nbsp;Translation.&amp;nbsp;arXiv&amp;nbsp;Preprint&amp;nbsp;arXiv:1609.08144.&amp;nbsp;
&lt;/p&gt;&lt;p&gt;21.&amp;nbsp;Kingma,&amp;nbsp;D.&amp;nbsp;P.,&amp;nbsp;&amp;amp;&amp;nbsp;Ba,&amp;nbsp;J.&amp;nbsp;L.&amp;nbsp;(2015).&amp;nbsp;Adam:&amp;nbsp;a&amp;nbsp;Method&amp;nbsp;for&amp;nbsp;Stochastic&amp;nbsp;Optimization.&amp;nbsp;International&amp;nbsp;Conference&amp;nbsp;on&amp;nbsp;Learning&amp;nbsp;Representations.&amp;nbsp;
&lt;/p&gt;&lt;p&gt;22.&amp;nbsp;Ruder,&amp;nbsp;S.&amp;nbsp;(2016).&amp;nbsp;An&amp;nbsp;overview&amp;nbsp;of&amp;nbsp;gradient&amp;nbsp;descent&amp;nbsp;optimization.&amp;nbsp;arXiv&amp;nbsp;Preprint&amp;nbsp;arXiv:1609.04747.&amp;nbsp;
&lt;/p&gt;&lt;p&gt;23.&amp;nbsp;Denkowski,&amp;nbsp;M.,&amp;nbsp;&amp;amp;&amp;nbsp;Neubig,&amp;nbsp;G.&amp;nbsp;(2017).&amp;nbsp;Stronger&amp;nbsp;Baselines&amp;nbsp;for&amp;nbsp;Trustable&amp;nbsp;Results&amp;nbsp;in&amp;nbsp;Neural&amp;nbsp;Machine&amp;nbsp;Translation.&amp;nbsp;
&lt;/p&gt;&lt;p&gt;24.&amp;nbsp;Hinton,&amp;nbsp;G.,&amp;nbsp;Vinyals,&amp;nbsp;O.,&amp;nbsp;&amp;amp;&amp;nbsp;Dean,&amp;nbsp;J.&amp;nbsp;(2015).&amp;nbsp;Distilling&amp;nbsp;the&amp;nbsp;Knowledge&amp;nbsp;in&amp;nbsp;a&amp;nbsp;Neural&amp;nbsp;Network.&amp;nbsp;arXiv&amp;nbsp;Preprint&amp;nbsp;arXiv:1503.02531.&amp;nbsp;https://doi.org/10.1063/1.4931082&amp;nbsp;
&lt;/p&gt;&lt;p&gt;25.&amp;nbsp;Kuncoro,&amp;nbsp;A.,&amp;nbsp;Ballesteros,&amp;nbsp;M.,&amp;nbsp;Kong,&amp;nbsp;L.,&amp;nbsp;Dyer,&amp;nbsp;C.,&amp;nbsp;&amp;amp;&amp;nbsp;Smith,&amp;nbsp;N.&amp;nbsp;A.&amp;nbsp;(2016).&amp;nbsp;Distilling&amp;nbsp;an&amp;nbsp;Ensemble&amp;nbsp;of&amp;nbsp;Greedy&amp;nbsp;Dependency&amp;nbsp;Parsers&amp;nbsp;into&amp;nbsp;One&amp;nbsp;MST&amp;nbsp;Parser.&amp;nbsp;Empirical&amp;nbsp;Methods&amp;nbsp;in&amp;nbsp;Natural&amp;nbsp;Language&amp;nbsp;Processing.&amp;nbsp;
&lt;/p&gt;&lt;p&gt;26.&amp;nbsp;Kim,&amp;nbsp;Y.,&amp;nbsp;&amp;amp;&amp;nbsp;Rush,&amp;nbsp;A.&amp;nbsp;M.&amp;nbsp;(2016).&amp;nbsp;Sequence-Level&amp;nbsp;Knowledge&amp;nbsp;Distillation.&amp;nbsp;Proceedings&amp;nbsp;of&amp;nbsp;the&amp;nbsp;2016&amp;nbsp;Conference&amp;nbsp;on&amp;nbsp;Empirical&amp;nbsp;Methods&amp;nbsp;in&amp;nbsp;Natural&amp;nbsp;Language&amp;nbsp;Processing&amp;nbsp;(EMNLP-16).&amp;nbsp;
&lt;/p&gt;&lt;p&gt;27.&amp;nbsp;Britz,&amp;nbsp;D.,&amp;nbsp;Goldie,&amp;nbsp;A.,&amp;nbsp;Luong,&amp;nbsp;T.,&amp;nbsp;&amp;amp;&amp;nbsp;Le,&amp;nbsp;Q.&amp;nbsp;(2017).&amp;nbsp;Massive&amp;nbsp;Exploration&amp;nbsp;of&amp;nbsp;Neural&amp;nbsp;Machine&amp;nbsp;Translation&amp;nbsp;Architectures.&amp;nbsp;In&amp;nbsp;arXiv&amp;nbsp;preprint&amp;nbsp;arXiv:1703.03906.&amp;nbsp;
&lt;/p&gt;&lt;p&gt;28.&amp;nbsp;Zhang,&amp;nbsp;X.,&amp;nbsp;Zhao,&amp;nbsp;J.,&amp;nbsp;&amp;amp;&amp;nbsp;LeCun,&amp;nbsp;Y.&amp;nbsp;(2015).&amp;nbsp;Character-level&amp;nbsp;Convolutional&amp;nbsp;Networks&amp;nbsp;for&amp;nbsp;Text&amp;nbsp;Classification.&amp;nbsp;Advances&amp;nbsp;in&amp;nbsp;Neural&amp;nbsp;Information&amp;nbsp;Processing&amp;nbsp;Systems,&amp;nbsp;649–657.&amp;nbsp;Retrieved&amp;nbsp;from&amp;nbsp;http://arxiv.org/abs/1509.01626&amp;nbsp;
&lt;/p&gt;&lt;p&gt;29.&amp;nbsp;Conneau,&amp;nbsp;A.,&amp;nbsp;Schwenk,&amp;nbsp;H.,&amp;nbsp;Barrault,&amp;nbsp;L.,&amp;nbsp;&amp;amp;&amp;nbsp;Lecun,&amp;nbsp;Y.&amp;nbsp;(2016).&amp;nbsp;Very&amp;nbsp;Deep&amp;nbsp;Convolutional&amp;nbsp;Networks&amp;nbsp;for&amp;nbsp;Natural&amp;nbsp;Language&amp;nbsp;Processing.&amp;nbsp;arXiv&amp;nbsp;Preprint&amp;nbsp;arXiv:1606.01781.&amp;nbsp;Retrieved&amp;nbsp;from&amp;nbsp;http://arxiv.org/abs/1606.01781&amp;nbsp;
&lt;/p&gt;&lt;p&gt;30.&amp;nbsp;Le,&amp;nbsp;H.&amp;nbsp;T.,&amp;nbsp;Cerisara,&amp;nbsp;C.,&amp;nbsp;&amp;amp;&amp;nbsp;Denis,&amp;nbsp;A.&amp;nbsp;(2017).&amp;nbsp;Do&amp;nbsp;Convolutional&amp;nbsp;Networks&amp;nbsp;need&amp;nbsp;to&amp;nbsp;be&amp;nbsp;Deep&amp;nbsp;for&amp;nbsp;Text&amp;nbsp;Classification&amp;nbsp;?&amp;nbsp;In&amp;nbsp;arXiv&amp;nbsp;preprint&amp;nbsp;arXiv:1707.04108.&amp;nbsp;
&lt;/p&gt;&lt;p&gt;31.&amp;nbsp;Wu,&amp;nbsp;Y.,&amp;nbsp;Schuster,&amp;nbsp;M.,&amp;nbsp;Chen,&amp;nbsp;Z.,&amp;nbsp;Le,&amp;nbsp;Q.&amp;nbsp;V,&amp;nbsp;Norouzi,&amp;nbsp;M.,&amp;nbsp;Macherey,&amp;nbsp;W.,&amp;nbsp;…&amp;nbsp;Dean,&amp;nbsp;J.&amp;nbsp;(2016).&amp;nbsp;Google』s&amp;nbsp;Neural&amp;nbsp;Machine&amp;nbsp;Translation&amp;nbsp;System:&amp;nbsp;Bridging&amp;nbsp;the&amp;nbsp;Gap&amp;nbsp;between&amp;nbsp;Human&amp;nbsp;and&amp;nbsp;Machine&amp;nbsp;Translation.&amp;nbsp;arXiv&amp;nbsp;Preprint&amp;nbsp;arXiv:1609.08144.&amp;nbsp;
&lt;/p&gt;&lt;p&gt;32.&amp;nbsp;Plank,&amp;nbsp;B.,&amp;nbsp;Søgaard,&amp;nbsp;A.,&amp;nbsp;&amp;amp;&amp;nbsp;Goldberg,&amp;nbsp;Y.&amp;nbsp;(2016).&amp;nbsp;Multilingual&amp;nbsp;Part-of-Speech&amp;nbsp;Tagging&amp;nbsp;with&amp;nbsp;Bidirectional&amp;nbsp;Long&amp;nbsp;Short-Term&amp;nbsp;Memory&amp;nbsp;Models&amp;nbsp;and&amp;nbsp;Auxiliary&amp;nbsp;Loss.&amp;nbsp;In&amp;nbsp;Proceedings&amp;nbsp;of&amp;nbsp;the&amp;nbsp;54th&amp;nbsp;Annual&amp;nbsp;Meeting&amp;nbsp;of&amp;nbsp;the&amp;nbsp;Association&amp;nbsp;for&amp;nbsp;Computational&amp;nbsp;Linguistics.&amp;nbsp;
&lt;/p&gt;&lt;p&gt;33.&amp;nbsp;He,&amp;nbsp;L.,&amp;nbsp;Lee,&amp;nbsp;K.,&amp;nbsp;Lewis,&amp;nbsp;M.,&amp;nbsp;&amp;amp;&amp;nbsp;Zettlemoyer,&amp;nbsp;L.&amp;nbsp;(2017).&amp;nbsp;Deep&amp;nbsp;Semantic&amp;nbsp;Role&amp;nbsp;Labeling:&amp;nbsp;What&amp;nbsp;Works&amp;nbsp;and&amp;nbsp;What』s&amp;nbsp;Next.&amp;nbsp;ACL.&amp;nbsp;
&lt;/p&gt;&lt;p&gt;34.&amp;nbsp;Melis,&amp;nbsp;G.,&amp;nbsp;Dyer,&amp;nbsp;C.,&amp;nbsp;&amp;amp;&amp;nbsp;Blunsom,&amp;nbsp;P.&amp;nbsp;(2017).&amp;nbsp;On&amp;nbsp;the&amp;nbsp;State&amp;nbsp;of&amp;nbsp;the&amp;nbsp;Art&amp;nbsp;of&amp;nbsp;Evaluation&amp;nbsp;in&amp;nbsp;Neural&amp;nbsp;Language&amp;nbsp;Models.&amp;nbsp;
&lt;/p&gt;&lt;p&gt;35.&amp;nbsp;Rei,&amp;nbsp;M.&amp;nbsp;(2017).&amp;nbsp;Semi-supervised&amp;nbsp;Multitask&amp;nbsp;Learning&amp;nbsp;for&amp;nbsp;Sequence&amp;nbsp;Labeling.&amp;nbsp;In&amp;nbsp;Proceedings&amp;nbsp;of&amp;nbsp;ACL&amp;nbsp;2017.&amp;nbsp;
&lt;/p&gt;&lt;p&gt;36.&amp;nbsp;Ramachandran,&amp;nbsp;P.,&amp;nbsp;Liu,&amp;nbsp;P.&amp;nbsp;J.,&amp;nbsp;&amp;amp;&amp;nbsp;Le,&amp;nbsp;Q.&amp;nbsp;V.&amp;nbsp;(2016).&amp;nbsp;Unsupervised&amp;nbsp;Pretrainig&amp;nbsp;for&amp;nbsp;Sequence&amp;nbsp;to&amp;nbsp;Sequence&amp;nbsp;Learning.&amp;nbsp;arXiv&amp;nbsp;Preprint&amp;nbsp;arXiv:1611.02683.&amp;nbsp;
&lt;/p&gt;&lt;p&gt;37.&amp;nbsp;Kadlec,&amp;nbsp;R.,&amp;nbsp;Schmid,&amp;nbsp;M.,&amp;nbsp;Bajgar,&amp;nbsp;O.,&amp;nbsp;&amp;amp;&amp;nbsp;Kleindienst,&amp;nbsp;J.&amp;nbsp;(2016).&amp;nbsp;Text&amp;nbsp;Understanding&amp;nbsp;with&amp;nbsp;the&amp;nbsp;Attention&amp;nbsp;Sum&amp;nbsp;Reader&amp;nbsp;Network.&amp;nbsp;In&amp;nbsp;Proceedings&amp;nbsp;of&amp;nbsp;the&amp;nbsp;54th&amp;nbsp;Annual&amp;nbsp;Meeting&amp;nbsp;of&amp;nbsp;the&amp;nbsp;Association&amp;nbsp;for&amp;nbsp;Computational&amp;nbsp;Linguistics.&amp;nbsp;
&lt;/p&gt;&lt;p&gt;38.&amp;nbsp;Cheng,&amp;nbsp;J.,&amp;nbsp;Dong,&amp;nbsp;L.,&amp;nbsp;&amp;amp;&amp;nbsp;Lapata,&amp;nbsp;M.&amp;nbsp;(2016).&amp;nbsp;Long&amp;nbsp;Short-Term&amp;nbsp;Memory-Networks&amp;nbsp;for&amp;nbsp;Machine&amp;nbsp;Reading.&amp;nbsp;arXiv&amp;nbsp;Preprint&amp;nbsp;arXiv:1601.06733.&amp;nbsp;Retrieved&amp;nbsp;from&amp;nbsp;http://arxiv.org/abs/1601.06733&amp;nbsp;
&lt;/p&gt;&lt;p&gt;39.&amp;nbsp;Parikh,&amp;nbsp;A.&amp;nbsp;P.,&amp;nbsp;Täckström,&amp;nbsp;O.,&amp;nbsp;Das,&amp;nbsp;D.,&amp;nbsp;&amp;amp;&amp;nbsp;Uszkoreit,&amp;nbsp;J.&amp;nbsp;(2016).&amp;nbsp;A&amp;nbsp;Decomposable&amp;nbsp;Attention&amp;nbsp;Model&amp;nbsp;for&amp;nbsp;Natural&amp;nbsp;Language&amp;nbsp;Inference.&amp;nbsp;In&amp;nbsp;Proceedings&amp;nbsp;of&amp;nbsp;the&amp;nbsp;2016&amp;nbsp;Conference&amp;nbsp;on&amp;nbsp;Empirical&amp;nbsp;Methods&amp;nbsp;in&amp;nbsp;Natural&amp;nbsp;Language&amp;nbsp;Processing.&amp;nbsp;Retrieved&amp;nbsp;from&amp;nbsp;http://arxiv.org/abs/1606.01933&amp;nbsp;
&lt;/p&gt;&lt;p&gt;40.&amp;nbsp;Paulus,&amp;nbsp;R.,&amp;nbsp;Xiong,&amp;nbsp;C.,&amp;nbsp;&amp;amp;&amp;nbsp;Socher,&amp;nbsp;R.&amp;nbsp;(2017).&amp;nbsp;A&amp;nbsp;Deep&amp;nbsp;Reinforced&amp;nbsp;Model&amp;nbsp;for&amp;nbsp;Abstractive&amp;nbsp;Summarization.&amp;nbsp;In&amp;nbsp;arXiv&amp;nbsp;preprint&amp;nbsp;arXiv:1705.04304,.&amp;nbsp;Retrieved&amp;nbsp;from&amp;nbsp;http://arxiv.org/abs/1705.04304&amp;nbsp;
&lt;/p&gt;&lt;p&gt;41.&amp;nbsp;Liu,&amp;nbsp;Y.,&amp;nbsp;&amp;amp;&amp;nbsp;Lapata,&amp;nbsp;M.&amp;nbsp;(2017).&amp;nbsp;Learning&amp;nbsp;Structured&amp;nbsp;Text&amp;nbsp;Representations.&amp;nbsp;In&amp;nbsp;arXiv&amp;nbsp;preprint&amp;nbsp;arXiv:1705.09207.&amp;nbsp;Retrieved&amp;nbsp;from&amp;nbsp;http://arxiv.org/abs/1705.09207&amp;nbsp;
&lt;/p&gt;&lt;p&gt;42.&amp;nbsp;Zhang,&amp;nbsp;J.,&amp;nbsp;Mitliagkas,&amp;nbsp;I.,&amp;nbsp;&amp;amp;&amp;nbsp;Ré,&amp;nbsp;C.&amp;nbsp;(2017).&amp;nbsp;YellowFin&amp;nbsp;and&amp;nbsp;the&amp;nbsp;Art&amp;nbsp;of&amp;nbsp;Momentum&amp;nbsp;Tuning.&amp;nbsp;arXiv&amp;nbsp;preprint&amp;nbsp;arXiv:1706.03471.&amp;nbsp;
&lt;/p&gt;&lt;p&gt;43.&amp;nbsp;Goldberg,&amp;nbsp;Y.&amp;nbsp;(2016).&amp;nbsp;A&amp;nbsp;Primer&amp;nbsp;on&amp;nbsp;Neural&amp;nbsp;Network&amp;nbsp;Models&amp;nbsp;for&amp;nbsp;Natural&amp;nbsp;Language&amp;nbsp;Processing.&amp;nbsp;Journal&amp;nbsp;of&amp;nbsp;Artificial&amp;nbsp;Intelligence&amp;nbsp;Research,&amp;nbsp;57,&amp;nbsp;345–420.&amp;nbsp;https://doi.org/10.1613/jair.4992&amp;nbsp;
&lt;/p&gt;&lt;p&gt;44.&amp;nbsp;Melamud,&amp;nbsp;O.,&amp;nbsp;McClosky,&amp;nbsp;D.,&amp;nbsp;Patwardhan,&amp;nbsp;S.,&amp;nbsp;&amp;amp;&amp;nbsp;Bansal,&amp;nbsp;M.&amp;nbsp;(2016).&amp;nbsp;The&amp;nbsp;Role&amp;nbsp;of&amp;nbsp;Context&amp;nbsp;Types&amp;nbsp;and&amp;nbsp;Dimensionality&amp;nbsp;in&amp;nbsp;Learning&amp;nbsp;Word&amp;nbsp;Embeddings.&amp;nbsp;In&amp;nbsp;Proceedings&amp;nbsp;of&amp;nbsp;NAACL-HLT&amp;nbsp;2016&amp;nbsp;(pp.&amp;nbsp;1030–1040).&amp;nbsp;Retrieved&amp;nbsp;from&amp;nbsp;http://arxiv.org/abs/1601.00893&amp;nbsp;
&lt;/p&gt;&lt;p&gt;45.&amp;nbsp;Ruder,&amp;nbsp;S.,&amp;nbsp;Ghaffari,&amp;nbsp;P.,&amp;nbsp;&amp;amp;&amp;nbsp;Breslin,&amp;nbsp;J.&amp;nbsp;G.&amp;nbsp;(2016).&amp;nbsp;A&amp;nbsp;Hierarchical&amp;nbsp;Model&amp;nbsp;of&amp;nbsp;Reviews&amp;nbsp;for&amp;nbsp;Aspect-based&amp;nbsp;Sentiment&amp;nbsp;Analysis.&amp;nbsp;Proceedings&amp;nbsp;of&amp;nbsp;the&amp;nbsp;2016&amp;nbsp;Conference&amp;nbsp;on&amp;nbsp;Empirical&amp;nbsp;Methods&amp;nbsp;in&amp;nbsp;Natural&amp;nbsp;Language&amp;nbsp;Processing&amp;nbsp;(EMNLP-16),&amp;nbsp;999–1005.&amp;nbsp;Retrieved&amp;nbsp;from&amp;nbsp;http://arxiv.org/abs/1609.02745&amp;nbsp;
&lt;/p&gt;&lt;p&gt;46.&amp;nbsp;Reimers,&amp;nbsp;N.,&amp;nbsp;&amp;amp;&amp;nbsp;Gurevych,&amp;nbsp;I.&amp;nbsp;(2017).&amp;nbsp;Optimal&amp;nbsp;Hyperparameters&amp;nbsp;for&amp;nbsp;Deep&amp;nbsp;LSTM-Networks&amp;nbsp;for&amp;nbsp;Sequence&amp;nbsp;Labeling&amp;nbsp;Tasks.&amp;nbsp;In&amp;nbsp;arXiv&amp;nbsp;preprint&amp;nbsp;arXiv:1707.06799:&amp;nbsp;Retrieved&amp;nbsp;from&amp;nbsp;https://arxiv.org/pdf/1707.06799.pdf&amp;nbsp;
&lt;/p&gt;&lt;p&gt;47.&amp;nbsp;Søgaard,&amp;nbsp;A.,&amp;nbsp;&amp;amp;&amp;nbsp;Goldberg,&amp;nbsp;Y.&amp;nbsp;(2016).&amp;nbsp;Deep&amp;nbsp;multi-task&amp;nbsp;learning&amp;nbsp;with&amp;nbsp;low&amp;nbsp;level&amp;nbsp;tasks&amp;nbsp;supervised&amp;nbsp;at&amp;nbsp;lower&amp;nbsp;layers.&amp;nbsp;Proceedings&amp;nbsp;of&amp;nbsp;the&amp;nbsp;54th&amp;nbsp;Annual&amp;nbsp;Meeting&amp;nbsp;of&amp;nbsp;the&amp;nbsp;Association&amp;nbsp;for&amp;nbsp;Computational&amp;nbsp;Linguistics,&amp;nbsp;231–235.&amp;nbsp;
&lt;/p&gt;&lt;p&gt;48.&amp;nbsp;Liu,&amp;nbsp;P.,&amp;nbsp;Qiu,&amp;nbsp;X.,&amp;nbsp;&amp;amp;&amp;nbsp;Huang,&amp;nbsp;X.&amp;nbsp;(2017).&amp;nbsp;Adversarial&amp;nbsp;Multi-task&amp;nbsp;Learning&amp;nbsp;for&amp;nbsp;Text&amp;nbsp;Classification.&amp;nbsp;In&amp;nbsp;ACL&amp;nbsp;2017.&amp;nbsp;Retrieved&amp;nbsp;from&amp;nbsp;http://arxiv.org/abs/1704.05742&amp;nbsp;
&lt;/p&gt;&lt;p&gt;49.&amp;nbsp;Ruder,&amp;nbsp;S.,&amp;nbsp;Bingel,&amp;nbsp;J.,&amp;nbsp;Augenstein,&amp;nbsp;I.,&amp;nbsp;&amp;amp;&amp;nbsp;Søgaard,&amp;nbsp;A.&amp;nbsp;(2017).&amp;nbsp;Sluice&amp;nbsp;networks:&amp;nbsp;Learning&amp;nbsp;what&amp;nbsp;to&amp;nbsp;share&amp;nbsp;between&amp;nbsp;loosely&amp;nbsp;related&amp;nbsp;tasks.&amp;nbsp;arXiv&amp;nbsp;Preprint&amp;nbsp;arXiv:1705.08142.&amp;nbsp;Retrieved&amp;nbsp;from&amp;nbsp;http://arxiv.org/abs/1705.08142&amp;nbsp;
&lt;/p&gt;&lt;p&gt;50.&amp;nbsp;Dozat,&amp;nbsp;T.,&amp;nbsp;&amp;amp;&amp;nbsp;Manning,&amp;nbsp;C.&amp;nbsp;D.&amp;nbsp;(2017).&amp;nbsp;Deep&amp;nbsp;Biaffine&amp;nbsp;Attention&amp;nbsp;for&amp;nbsp;Neural&amp;nbsp;Dependency&amp;nbsp;Parsing.&amp;nbsp;In&amp;nbsp;ICLR&amp;nbsp;2017.&amp;nbsp;Retrieved&amp;nbsp;from&amp;nbsp;http://arxiv.org/abs/1611.01734&amp;nbsp;
&lt;/p&gt;&lt;p&gt;51.&amp;nbsp;Jean,&amp;nbsp;S.,&amp;nbsp;Cho,&amp;nbsp;K.,&amp;nbsp;Memisevic,&amp;nbsp;R.,&amp;nbsp;&amp;amp;&amp;nbsp;Bengio,&amp;nbsp;Y.&amp;nbsp;(2015).&amp;nbsp;On&amp;nbsp;Using&amp;nbsp;Very&amp;nbsp;Large&amp;nbsp;Target&amp;nbsp;Vocabulary&amp;nbsp;for&amp;nbsp;Neural&amp;nbsp;Machine&amp;nbsp;Translation.&amp;nbsp;Proceedings&amp;nbsp;of&amp;nbsp;the&amp;nbsp;53rd&amp;nbsp;Annual&amp;nbsp;Meeting&amp;nbsp;of&amp;nbsp;the&amp;nbsp;Association&amp;nbsp;for&amp;nbsp;Computational&amp;nbsp;Linguistics&amp;nbsp;and&amp;nbsp;the&amp;nbsp;7th&amp;nbsp;International&amp;nbsp;Joint&amp;nbsp;Conference&amp;nbsp;on&amp;nbsp;Natural&amp;nbsp;Language&amp;nbsp;Processing&amp;nbsp;(Volume&amp;nbsp;1:&amp;nbsp;Long&amp;nbsp;Papers),&amp;nbsp;1–10.&amp;nbsp;Retrieved&amp;nbsp;from&amp;nbsp;http://www.aclweb.org/anthology/P15-1001&amp;nbsp;
&lt;/p&gt;&lt;p&gt;52.&amp;nbsp;Sennrich,&amp;nbsp;R.,&amp;nbsp;Haddow,&amp;nbsp;B.,&amp;nbsp;&amp;amp;&amp;nbsp;Birch,&amp;nbsp;A.&amp;nbsp;(2016).&amp;nbsp;Edinburgh&amp;nbsp;Neural&amp;nbsp;Machine&amp;nbsp;Translation&amp;nbsp;Systems&amp;nbsp;for&amp;nbsp;WMT&amp;nbsp;16.&amp;nbsp;In&amp;nbsp;Proceedings&amp;nbsp;of&amp;nbsp;the&amp;nbsp;First&amp;nbsp;Conference&amp;nbsp;on&amp;nbsp;Machine&amp;nbsp;Translation&amp;nbsp;(WMT&amp;nbsp;2016).&amp;nbsp;Retrieved&amp;nbsp;from&amp;nbsp;http://arxiv.org/abs/1606.02891&amp;nbsp;
&lt;/p&gt;&lt;p&gt;53.&amp;nbsp;Huang,&amp;nbsp;G.,&amp;nbsp;Li,&amp;nbsp;Y.,&amp;nbsp;Pleiss,&amp;nbsp;G.,&amp;nbsp;Liu,&amp;nbsp;Z.,&amp;nbsp;Hopcroft,&amp;nbsp;J.&amp;nbsp;E.,&amp;nbsp;&amp;amp;&amp;nbsp;Weinberger,&amp;nbsp;K.&amp;nbsp;Q.&amp;nbsp;(2017).&amp;nbsp;Snapshot&amp;nbsp;Ensembles:&amp;nbsp;Train&amp;nbsp;1,&amp;nbsp;get&amp;nbsp;M&amp;nbsp;for&amp;nbsp;free.&amp;nbsp;In&amp;nbsp;ICLR&amp;nbsp;2017.&amp;nbsp;
&lt;/p&gt;&lt;p&gt;54.&amp;nbsp;Inan,&amp;nbsp;H.,&amp;nbsp;Khosravi,&amp;nbsp;K.,&amp;nbsp;&amp;amp;&amp;nbsp;Socher,&amp;nbsp;R.&amp;nbsp;(2016).&amp;nbsp;Tying&amp;nbsp;Word&amp;nbsp;Vectors&amp;nbsp;and&amp;nbsp;Word&amp;nbsp;Classifiers:&amp;nbsp;A&amp;nbsp;Loss&amp;nbsp;Framework&amp;nbsp;for&amp;nbsp;Language&amp;nbsp;Modeling.&amp;nbsp;arXiv&amp;nbsp;Preprint&amp;nbsp;arXiv:1611.01462.&amp;nbsp;
&lt;/p&gt;&lt;p&gt;55.&amp;nbsp;Press,&amp;nbsp;O.,&amp;nbsp;&amp;amp;&amp;nbsp;Wolf,&amp;nbsp;L.&amp;nbsp;(2017).&amp;nbsp;Using&amp;nbsp;the&amp;nbsp;Output&amp;nbsp;Embedding&amp;nbsp;to&amp;nbsp;Improve&amp;nbsp;Language&amp;nbsp;Models.&amp;nbsp;Proceedings&amp;nbsp;of&amp;nbsp;the&amp;nbsp;15th&amp;nbsp;Conference&amp;nbsp;of&amp;nbsp;the&amp;nbsp;European&amp;nbsp;Chapter&amp;nbsp;of&amp;nbsp;the&amp;nbsp;Association&amp;nbsp;for&amp;nbsp;Computational&amp;nbsp;Linguistics:&amp;nbsp;Volume&amp;nbsp;2,&amp;nbsp;Short&amp;nbsp;Papers,&amp;nbsp;2,&amp;nbsp;157--163.&amp;nbsp;
&lt;/p&gt;&lt;p&gt;56.&amp;nbsp;Snoek,&amp;nbsp;J.,&amp;nbsp;Larochelle,&amp;nbsp;H.,&amp;nbsp;&amp;amp;&amp;nbsp;Adams,&amp;nbsp;R.&amp;nbsp;P.&amp;nbsp;(2012).&amp;nbsp;Practical&amp;nbsp;Bayesian&amp;nbsp;Optimization&amp;nbsp;of&amp;nbsp;Machine&amp;nbsp;Learning&amp;nbsp;Algorithms.&amp;nbsp;Neural&amp;nbsp;Information&amp;nbsp;Processing&amp;nbsp;Systems&amp;nbsp;Conference&amp;nbsp;(NIPS&amp;nbsp;2012).&amp;nbsp;https://doi.org/2012arXiv1206.2944S&amp;nbsp;
&lt;/p&gt;&lt;p&gt;57.&amp;nbsp;Mikolov,&amp;nbsp;T.&amp;nbsp;(2012).&amp;nbsp;Statistical&amp;nbsp;language&amp;nbsp;models&amp;nbsp;based&amp;nbsp;on&amp;nbsp;neural&amp;nbsp;networks&amp;nbsp;(Doctoral&amp;nbsp;dissertation,&amp;nbsp;PhD&amp;nbsp;thesis,&amp;nbsp;Brno&amp;nbsp;University&amp;nbsp;of&amp;nbsp;Technology).&amp;nbsp;
&lt;/p&gt;&lt;p&gt;58.&amp;nbsp;Pascanu,&amp;nbsp;R.,&amp;nbsp;Mikolov,&amp;nbsp;T.,&amp;nbsp;&amp;amp;&amp;nbsp;Bengio,&amp;nbsp;Y.&amp;nbsp;(2013).&amp;nbsp;On&amp;nbsp;the&amp;nbsp;difficulty&amp;nbsp;of&amp;nbsp;training&amp;nbsp;recurrent&amp;nbsp;neural&amp;nbsp;networks.&amp;nbsp;International&amp;nbsp;Conference&amp;nbsp;on&amp;nbsp;Machine&amp;nbsp;Learning,&amp;nbsp;(2),&amp;nbsp;1310–1318.&amp;nbsp;https://doi.org/10.1109/72.279181&amp;nbsp;
&lt;/p&gt;&lt;p&gt;59.&amp;nbsp;Zhang,&amp;nbsp;Y.,&amp;nbsp;&amp;amp;&amp;nbsp;Wallace,&amp;nbsp;B.&amp;nbsp;(2015).&amp;nbsp;A&amp;nbsp;Sensitivity&amp;nbsp;Analysis&amp;nbsp;of&amp;nbsp;(and&amp;nbsp;Practitioners』&amp;nbsp;Guide&amp;nbsp;to)&amp;nbsp;Convolutional&amp;nbsp;Neural&amp;nbsp;Networks&amp;nbsp;for&amp;nbsp;Sentence&amp;nbsp;Classification.&amp;nbsp;arXiv&amp;nbsp;Preprint&amp;nbsp;arXiv:1510.03820,&amp;nbsp;(1).&amp;nbsp;Retrieved&amp;nbsp;from&amp;nbsp;http://arxiv.org/abs/1510.03820&amp;nbsp;
&lt;/p&gt;&lt;p&gt;60.&amp;nbsp;Huang,&amp;nbsp;Z.,&amp;nbsp;Xu,&amp;nbsp;W.,&amp;nbsp;&amp;amp;&amp;nbsp;Yu,&amp;nbsp;K.&amp;nbsp;(2015).&amp;nbsp;Bidirectional&amp;nbsp;LSTM-CRF&amp;nbsp;Models&amp;nbsp;for&amp;nbsp;Sequence&amp;nbsp;Tagging.&amp;nbsp;arXiv&amp;nbsp;preprint&amp;nbsp;arXiv:1508.01991.&amp;nbsp;
&lt;/p&gt;&lt;p&gt;61.&amp;nbsp;Ma,&amp;nbsp;X.,&amp;nbsp;&amp;amp;&amp;nbsp;Hovy,&amp;nbsp;E.&amp;nbsp;(2016).&amp;nbsp;End-to-end&amp;nbsp;Sequence&amp;nbsp;Labeling&amp;nbsp;via&amp;nbsp;Bi-directional&amp;nbsp;LSTM-CNNs-CRF.&amp;nbsp;arXiv&amp;nbsp;Preprint&amp;nbsp;arXiv:1603.01354.&amp;nbsp;
&lt;/p&gt;&lt;p&gt;62.&amp;nbsp;Lample,&amp;nbsp;G.,&amp;nbsp;Ballesteros,&amp;nbsp;M.,&amp;nbsp;Subramanian,&amp;nbsp;S.,&amp;nbsp;Kawakami,&amp;nbsp;K.,&amp;nbsp;&amp;amp;&amp;nbsp;Dyer,&amp;nbsp;C.&amp;nbsp;(2016).&amp;nbsp;Neural&amp;nbsp;Architectures&amp;nbsp;for&amp;nbsp;Named&amp;nbsp;Entity&amp;nbsp;Recognition.&amp;nbsp;NAACL-HLT&amp;nbsp;2016.&amp;nbsp;
&lt;/p&gt;&lt;p&gt;63.&amp;nbsp;Kiddon,&amp;nbsp;C.,&amp;nbsp;Zettlemoyer,&amp;nbsp;L.,&amp;nbsp;&amp;amp;&amp;nbsp;Choi,&amp;nbsp;Y.&amp;nbsp;(2016).&amp;nbsp;Globally&amp;nbsp;Coherent&amp;nbsp;Text&amp;nbsp;Generation&amp;nbsp;with&amp;nbsp;Neural&amp;nbsp;Checklist&amp;nbsp;Models.&amp;nbsp;Proceedings&amp;nbsp;of&amp;nbsp;the&amp;nbsp;2016&amp;nbsp;Conference&amp;nbsp;on&amp;nbsp;Empirical&amp;nbsp;Methods&amp;nbsp;in&amp;nbsp;Natural&amp;nbsp;Language&amp;nbsp;Processing&amp;nbsp;(EMNLP2016),&amp;nbsp;329–339.&amp;nbsp;
&lt;/p&gt;&lt;p&gt;64.&amp;nbsp;Tu,&amp;nbsp;Z.,&amp;nbsp;Lu,&amp;nbsp;Z.,&amp;nbsp;Liu,&amp;nbsp;Y.,&amp;nbsp;Liu,&amp;nbsp;X.,&amp;nbsp;&amp;amp;&amp;nbsp;Li,&amp;nbsp;H.&amp;nbsp;(2016).&amp;nbsp;Modeling&amp;nbsp;Coverage&amp;nbsp;for&amp;nbsp;Neural&amp;nbsp;Machine&amp;nbsp;Translation.&amp;nbsp;Proceedings&amp;nbsp;of&amp;nbsp;the&amp;nbsp;54th&amp;nbsp;Annual&amp;nbsp;Meeting&amp;nbsp;of&amp;nbsp;the&amp;nbsp;Association&amp;nbsp;for&amp;nbsp;Computational&amp;nbsp;Linguistics.&amp;nbsp;https://doi.org/10.1145/2856767.2856776&amp;nbsp;
&lt;/p&gt;&lt;p&gt;65.&amp;nbsp;See,&amp;nbsp;A.,&amp;nbsp;Liu,&amp;nbsp;P.&amp;nbsp;J.,&amp;nbsp;&amp;amp;&amp;nbsp;Manning,&amp;nbsp;C.&amp;nbsp;D.&amp;nbsp;(2017).&amp;nbsp;Get&amp;nbsp;To&amp;nbsp;The&amp;nbsp;Point:&amp;nbsp;Summarization&amp;nbsp;with&amp;nbsp;Pointer-Generator&amp;nbsp;Networks.&amp;nbsp;In&amp;nbsp;ACL&amp;nbsp;2017.&amp;nbsp;
&lt;/p&gt;&lt;p&gt;66.&amp;nbsp;Sennrich,&amp;nbsp;R.,&amp;nbsp;Haddow,&amp;nbsp;B.,&amp;nbsp;&amp;amp;&amp;nbsp;Birch,&amp;nbsp;A.&amp;nbsp;(2016).&amp;nbsp;Neural&amp;nbsp;Machine&amp;nbsp;Translation&amp;nbsp;of&amp;nbsp;Rare&amp;nbsp;Words&amp;nbsp;with&amp;nbsp;Subword&amp;nbsp;Units.&amp;nbsp;In&amp;nbsp;Proceedings&amp;nbsp;of&amp;nbsp;the&amp;nbsp;54th&amp;nbsp;Annual&amp;nbsp;Meeting&amp;nbsp;of&amp;nbsp;the&amp;nbsp;Association&amp;nbsp;for&amp;nbsp;Computational&amp;nbsp;Linguistics&amp;nbsp;(ACL&amp;nbsp;2016).&amp;nbsp;Retrieved&amp;nbsp;from&amp;nbsp;http://arxiv.org/abs/1508.07909&amp;nbsp;
&lt;/p&gt;&lt;p&gt;67.&amp;nbsp;Sutskever,&amp;nbsp;I.,&amp;nbsp;Vinyals,&amp;nbsp;O.,&amp;nbsp;&amp;amp;&amp;nbsp;Le,&amp;nbsp;Q.&amp;nbsp;V.&amp;nbsp;(2014).&amp;nbsp;Sequence&amp;nbsp;to&amp;nbsp;sequence&amp;nbsp;learning&amp;nbsp;with&amp;nbsp;neural&amp;nbsp;networks.&amp;nbsp;Advances&amp;nbsp;in&amp;nbsp;Neural&amp;nbsp;Information&amp;nbsp;Processing&amp;nbsp;Systems,&amp;nbsp;9.&amp;nbsp;Retrieved&amp;nbsp;from&amp;nbsp;http://arxiv.org/abs/1409.3215%5Cnhttp://papers.nips.cc/paper/5346-sequence-to-sequence-learning-with-neural-networks&amp;nbsp;
&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;原文链接：&lt;a href="http://ruder.io/deep-learning-nlp-best-practices/index.html#introduction" target="_blank"&gt;http://ruder.io/deep-learning-nlp-best-practices/index.html#introduction
&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;div&gt; &lt;a href="https://itindex.net/"  title="IT 资讯"&gt;&lt;img src="https://itindex.net/images/iconWarning.gif" title="IT 资讯" border="0"/&gt; &lt;/a&gt;</description>
      <category />
      <guid isPermaLink="true">https://itindex.net/detail/57274-%E6%B7%B1%E5%BA%A6%E5%AD%A6%E4%B9%A0-%E8%87%AA%E7%84%B6%E8%AF%AD%E8%A8%80-%E6%9C%80%E4%BD%B3%E5%AE%9E%E8%B7%B5</guid>
      <pubDate>Wed, 26 Jul 2017 14:16:38 CST</pubDate>
    </item>
    <item>
      <title>自然语言处理概览</title>
      <link>https://itindex.net/detail/57173-%E8%87%AA%E7%84%B6%E8%AF%AD%E8%A8%80</link>
      <description>&lt;div&gt;
  &lt;p&gt;自然语言处理研究的是词、句、文档等几个层次的内容。&lt;/p&gt;
  &lt;p&gt;一、发展历史（前两个是理论、后一个是经验）&lt;/p&gt;
  &lt;p&gt;1、形式语法（复杂特征集）&lt;/p&gt;
  &lt;p&gt;2、词汇主义方法（WordNet、ConceptNet、FrameNet）， 人工总结和整理概念、层次、结构等 &lt;/p&gt;
  &lt;p&gt;3、统计语言模型（语言有统计规律性，让机器去自己学习规律）&lt;/p&gt;
  &lt;p&gt;词汇向量化表示 CBOW skip-gram word2vec （Gensim来训练）&lt;/p&gt;
  &lt;p&gt;语句描述为词向量的序列构成的向量&lt;/p&gt;
  &lt;p&gt;抽象含义？言外之意？推理规则？&lt;/p&gt;
  &lt;p&gt; &lt;/p&gt;
  &lt;p&gt;二、预处理&lt;/p&gt;
  &lt;p&gt;1、去除html tag &lt;/p&gt;
  &lt;p&gt;2、编码 &lt;/p&gt;
  &lt;p&gt;3、doc --》句子--》单词（词性tag等）&lt;/p&gt;
  &lt;p&gt;4、去掉标点、太短的单词&lt;/p&gt;
  &lt;p&gt;5、去掉停用词 &lt;/p&gt;
  &lt;p&gt;6、抽取词干（stemming ）分词，原型，过去式，近义词 统一成一个&lt;/p&gt;
  &lt;p&gt; &lt;/p&gt;
  &lt;p&gt;二、分析(拆分，之后汇总理解)：&lt;/p&gt;
  &lt;p&gt;1、分词、标注、统计词频等&lt;/p&gt;
  &lt;p&gt;2、信息提取（识别短语+识别entity+提取关系），非结构化-&amp;gt;结构化（知识表达）&lt;/p&gt;
  &lt;p&gt;3、自动抽取 关键词、摘要；相似度比较（文档层面）&lt;/p&gt;
  &lt;p&gt;4、主题抽取（单文档）&lt;/p&gt;
  &lt;p&gt;5、分类、聚类（多文档）&lt;/p&gt;
  &lt;p&gt;6、情感分析&lt;/p&gt;
  &lt;p&gt;7、消除歧义&lt;/p&gt;
  &lt;p&gt;8、句法分析（谓词逻辑（sql）-》 问答和翻译）&lt;/p&gt;
  &lt;p&gt; &lt;/p&gt;
  &lt;p&gt;概括：摘要、主题、情感、知识表达&lt;/p&gt;
  &lt;p&gt; &lt;/p&gt;
  &lt;p&gt;三、应用&lt;/p&gt;
  &lt;p&gt;推荐系统&lt;/p&gt;
  &lt;p&gt;问答系统&lt;/p&gt;
  &lt;p&gt;对话系统&lt;/p&gt;
  &lt;p&gt;机器翻译&lt;/p&gt;
  &lt;p&gt; &lt;/p&gt;
  &lt;p&gt;四、基本概念&lt;/p&gt;
  &lt;p&gt;1、TF（词频）：某个单词在整个文档中出现的频率&lt;/p&gt;
  &lt;p&gt;2、IDF（逆向文件频率）：总文件数目除以包含该词语之文件的数目，之后取对数，（描述是否在比较少的文件中存在）&lt;/p&gt;
  &lt;p&gt;TF-IDF（term frequency–inverse document frequency）：TF与IDF的乘积，可以作为文件的特征。TFIDF的主要思想是：如果某个词或短语在一篇文章中出现的频率TF高，并且在其他文章中很少出现，则认为此词或者短语具有很好的类别区分能力，适合用来分类。&lt;/p&gt;
  &lt;p&gt;3、命名实体识别（Named Entity Recognition，简称NER），又称作“专名识别”，是指识别文本中具有特定意义的实体，主要包括人名、地名、机构名、专有名词等。三大类（实体类、时间类和数字类）、七小类（人名、机构名、地名、时间、日期、货币和百分比）命名实体。&lt;/p&gt;
  &lt;p&gt;4、n-gram 搜索n个词的上下文来确定词性和含义，即下一个词与前面的n-1个词有关系&lt;/p&gt;
  &lt;p&gt;5、wordnet 近义词典&lt;/p&gt;
  &lt;p&gt;五、相关库&lt;/p&gt;
  &lt;p&gt;snownlp&lt;/p&gt;
  &lt;p&gt;NLTK &lt;/p&gt;
  &lt;p&gt;Word2Vec（词这个级别）&lt;/p&gt;
  &lt;p&gt;LDA（文章的这个级别）&lt;/p&gt;
  &lt;p&gt;全文和文章元数据抽取开源Python库：newspaper&lt;/p&gt;
  &lt;p&gt;https://github.com/rockingdingo/deepnlp/tree/master/deepnlp/textsum&lt;/p&gt;
  &lt;p&gt; &lt;/p&gt;
&lt;/div&gt;
          
           &lt;br /&gt; &lt;br /&gt;
          
             &lt;a href="http://eric-weitm.iteye.com/blog/2382795#comments"&gt;已有   &lt;strong&gt;0&lt;/strong&gt; 人发表留言，猛击-&amp;gt;&amp;gt;  &lt;strong&gt;这里&lt;/strong&gt;&amp;lt;&amp;lt;-参与讨论&lt;/a&gt;
          
           &lt;br /&gt; &lt;br /&gt; &lt;br /&gt;
ITeye推荐
 &lt;br /&gt;
 &lt;ul&gt;  &lt;li&gt;   &lt;a href="http://www.iteye.com/clicks/433" target="_blank"&gt;—软件人才免语言低担保 赴美带薪读研！— &lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;
 &lt;br /&gt; &lt;br /&gt; &lt;br /&gt;
          
        &lt;div&gt; &lt;a href="https://itindex.net/"  title="IT 资讯"&gt;&lt;img src="https://itindex.net/images/iconWarning.gif" title="IT 资讯" border="0"/&gt; &lt;/a&gt;</description>
      <category />
      <guid isPermaLink="true">https://itindex.net/detail/57173-%E8%87%AA%E7%84%B6%E8%AF%AD%E8%A8%80</guid>
      <pubDate>Tue, 04 Jul 2017 18:10:34 CST</pubDate>
    </item>
    <item>
      <title>自然语言处理技术（NLP）在推荐系统中的应用</title>
      <link>https://itindex.net/detail/57141-%E8%87%AA%E7%84%B6%E8%AF%AD%E8%A8%80-%E6%8A%80%E6%9C%AF-nlp</link>
      <description>&lt;div&gt;  &lt;div&gt;&lt;/div&gt;  &lt;blockquote&gt;   &lt;p&gt;    &lt;strong&gt;作者：&lt;/strong&gt;张相於，58集团算法架构师，转转搜索推荐部负责人，负责搜索、推荐以及算法相关工作。多年来主要从事推荐系统以及机器学习，也做过计算广告、反作弊等相关工作，并热衷于探索大数据和机器学习技术在其他领域的应用实践。    &lt;br /&gt;    &lt;strong&gt;责编：&lt;/strong&gt;何永灿（heyc@csdn.net）    &lt;br /&gt;    &lt;strong&gt;本文为     &lt;a href="http://special.csdncms.csdn.net/programmer-covers/"&gt;《程序员》&lt;/a&gt;原创文章，更多精彩文章请     &lt;a href="http://dingyue.programmer.com.cn"&gt;订阅《程序员》&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;&lt;/blockquote&gt;  &lt;h3&gt;概述&lt;/h3&gt;  &lt;p&gt;个性化推荐是大数据时代不可或缺的技术，在电商、信息分发、计算广告、互联网金融等领域都起着重要的作用。具体来讲，个性化推荐在流量高效利用、信息高效分发、提升用户体验、长尾物品挖掘等方面均起着核心作用。在推荐系统中经常需要处理各种文本类数据，例如商品描述、新闻资讯、用户留言等等。具体来讲，我们需要使用文本数据完成以下任务：&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;    &lt;strong&gt;候选商品召回。&lt;/strong&gt;候选商品召回是推荐流程的第一步，用来生成待推荐的物品集合。这部分的核心操作是根据各种不同的推荐算法来获取到对应的物品集合。而文本类数据就是很重要的一类召回算法，具有不依赖用户行为、多样性丰富等优势，在文本信息丰富或者用户信息缺乏的场合中具有非常重要的作用。&lt;/li&gt;   &lt;li&gt;    &lt;strong&gt;相关性计算。&lt;/strong&gt;相关性计算充斥着推荐系统流程的各个步骤，例如召回算法中的各种文本相似度算法以及用户画像计算时用到的一些相关性计算等。&lt;/li&gt;   &lt;li&gt;    &lt;strong&gt;作为特征参与模型排序（CTR/CVR）。&lt;/strong&gt;在候选集召回之后的排序层，文本类特征常常可以提供很多的信息，从而成为重要的排序特征。&lt;/li&gt;&lt;/ul&gt;  &lt;p&gt;但是相比结构化信息（例如商品的属性等），文本信息在具体使用时具有一些先天缺点。&lt;/p&gt;  &lt;p&gt;   &lt;strong&gt;首先，文本数据中的结构信息量少。&lt;/strong&gt;严格来说，文本数据通常是没有什么结构的，一般能够有的结构可能只是“标题”、“正文”、“评论”这样区分文本来源的结构，除此以外一般就没有更多的结构信息了。为什么我们要在意结构信息呢？因为结构代表着信息量，无论是使用算法还是业务规则，都可以根据结构化信息来制定推荐策略，例如“召回所有颜色为蓝色的长款羽绒服”这样一个策略里就用到了“颜色”和“款式”这两个结构化信息。但是如果商品的描述数据库中没有这样的结构化信息，只有一句“该羽绒服为蓝色长款羽绒服”的自由文本，那么就无法利用结构信息制定策略了。&lt;/p&gt;  &lt;p&gt;   &lt;strong&gt;其次，文本内容的信息量不确定。&lt;/strong&gt;与无结构化相伴随的，是文本数据在内容的不确定性，这种不确定性体现在内容和数量上，例如不同用户对同一件二手商品的描述可能差异非常大，具体可能在用词、描述、文本长短等方面都具有较大差异。同样的两个物品，在一个物品的描述中出现的内容在另外一个物品中并不一定会出现。这种差异性的存在使得文本数据往往难以作为一种稳定可靠的数据源来使用，尤其是在UGC化明显的场景下更是如此。&lt;/p&gt;  &lt;p&gt;   &lt;strong&gt;再次，自由文本中的歧义问题较多。&lt;/strong&gt;歧义理解是自然语言处理中的重要研究课题，同时歧义也影响着我们在推荐系统中对文本数据的使用。例如用户在描述自己的二手手机时可能会写“出售iPhone6一部，打算凑钱买iPhone7”这样的话，这样一句对人来说意思很明确的话，却对机器造成了很大困扰：这个手机究竟是iPhone6还是iPhone7？在这样的背景下如何保证推荐系统的准确率便成为了一个挑战。&lt;/p&gt;  &lt;p&gt;但是   &lt;strong&gt;文本数据也不是一无是处，有缺点的同时也具有一些结构化数据所不具有的优点：&lt;/strong&gt;&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;    &lt;strong&gt;数据量大。&lt;/strong&gt;无结构化的文本数据一般来说是非常容易获得的，例如各种UGC渠道，以及网络爬取等方法，都可穿获得大量文本数据。&lt;/li&gt;   &lt;li&gt;    &lt;strong&gt;多样性丰富。&lt;/strong&gt;无结构化是一把双刃剑，不好的一面已经分析过，好的一面就是由于其开放性，导致具有丰富的多样性，会包含一些结构规定以外的数据。&lt;/li&gt;   &lt;li&gt;    &lt;strong&gt;信息及时。&lt;/strong&gt;在一些新名词，新事物出现之后，微博、朋友圈常常是最先能够反应出变化的地方，而这些都是纯文本的数据，对这些数据的合理分析，能够最快得到结构化、预定义数据所无法得到的信息，这也是文本数据的优势。&lt;/li&gt;&lt;/ul&gt;  &lt;p&gt;综上所述，   &lt;strong&gt;文本数据是一类量大、复杂、丰富的数据，对推荐系统起着重要的作用，本文将针对上面提到的几个方面，对推荐系统中常见的文本处理方法进行介绍。&lt;/strong&gt;&lt;/p&gt;  &lt;h3&gt;从这里出发：词袋模型&lt;/h3&gt;  &lt;p&gt;词袋模型（Bag of Words，简称BOW模型）是最简单的文本处理方法，其核心假设非常简单，就是认为一篇文档是由文档中的词组成的多重集合（多重集合与普通集合的不同在于考虑了集合中元素的出现次数）构成的。这是一种最简单的假设，没有考虑文档中诸如语法、词序等其他重要因素，只考虑了词的出现次数。这样简单的假设显然丢掉了很多信息，但是带来的好处是使用和计算都比较简单，同时也具有较大的灵活性。&lt;/p&gt;  &lt;p&gt;在推荐系统中，如果将一个物品看作一个词袋，我们可以根据袋中的词来召回相关物品，例如用户浏览了一个包含“羽绒服”关键词的商品，我们可以召回包含“羽绒服”的其他商品作为该次推荐的候选商品，并且可以根据这个词在词袋中出现的次数（词频）对召回商品进行排序。&lt;/p&gt;  &lt;p&gt;这种简单的做法显然存在着很多问题：&lt;/p&gt;  &lt;p&gt;首先，将文本进行分词后得到的词里面，并不是每个词都可以用来做召回和排序，例如“的地得你我他”这样的“停用词”就该去掉，此外，一些出现频率特别高或者特别低的词也需要做特殊处理，否则会导致召回结果相关性低或召回结果过少等问题。&lt;/p&gt;  &lt;p&gt;其次，使用词频来度量重要性也显得合理性不足。以上面的“羽绒服”召回为例，如果在羽绒服的类别里使用“羽绒服”这个词在商品描述中的出现频率来衡量商品的相关性，会导致所有的羽绒服都具有类似的相关性，因为在描述中大家都会使用类似数量的该词汇。所以我们需要一种更为科学合理的方法来度量文本之间的相关性。&lt;/p&gt;  &lt;p&gt;除了上面的用法，我们还可以将词袋中的每个词作为一维特征加入到排序模型中。例如，在一个以LR为模型的CTR排序模型中，如果这一维特征的权重为w，则可解释为“包含这个词的样本相比不包含这个词的样本在点击率的   &lt;a href="https://en.wikipedia.org/wiki/Logit"&gt;log odds&lt;/a&gt;上要高出w”。在排序模型中使用词特征的时候，为了增强特征的区分能力，我们常常会使用简单词袋模型的一种升级版——N-gram词袋模型。&lt;/p&gt;  &lt;p&gt;N-gram指的就是把N个连续的词作为一个单位进行处理，例如：“John likes to watch movies.Mary likes movies too.”这句话处理为简单词袋模型后的结果为：&lt;/p&gt;  &lt;pre&gt;   &lt;code&gt;[&amp;quot;John&amp;quot;:1,&amp;quot;likes&amp;quot;:2,&amp;quot;to&amp;quot;:1,&amp;quot;watch&amp;quot;:1,&amp;quot;movies&amp;quot;:2,&amp;quot;Mary&amp;quot;:1,&amp;quot;too&amp;quot;:1]&lt;/code&gt;&lt;/pre&gt;  &lt;p&gt;而处理为bigram（2-gram）后的结果为：&lt;/p&gt;  &lt;pre&gt;   &lt;code&gt;[&amp;quot;John likes&amp;quot;:1,&amp;quot;likes to&amp;quot;:1,&amp;quot;to watch&amp;quot;:1,&amp;quot;watch movies&amp;quot;:1,&amp;quot;Mary likes&amp;quot;:1,&amp;quot;likes movies&amp;quot;:1,&amp;quot;movies too&amp;quot;:1]&lt;/code&gt;&lt;/pre&gt;  &lt;p&gt;做这样的处理有什么好处呢？如果将bigram作为排序模型的特征或者相似度计算的特征，最明显的好处就是增强了特征的区分能力，简单来讲就是：两个有N个bigram重合的物品，其相关性要大于有N个词重合的物品。从根本上来讲，是因为bigram的重合几率要低于1-gram（也就是普通词）的重合几率。那么是不是N-gram中的N越大就越好呢？N的增大虽然增强了特征的区分能力，但是同时也加大了数据的稀疏性，从极端情况来讲，假设N取到100，那么几乎不会有两个文档有重合的100-gram了，那这样的特征也就失去了意义。一般在实际应用中，bigram和trigram（3-gram）能够在区分性和稀疏性之间取到比较好的平衡，N如果继续增大，稀疏性会有明显增加，但是效果却不会有明显提升，甚至还会有降低。&lt;/p&gt;  &lt;p&gt;综合来看，虽然词袋模型存在着明显的弊端，但是只需要对文本做简单处理就可以使用，所以不失为一种对文本数据进行快速处理的使用方法，并且在预处理（常用的预处理包括停用词的去除，高频/低频词的去除或降权等重要性处理方法，也可以借助外部高质量数据对自由文本数据进行过滤和限定，以求获得质量更高的原始数据）充分的情况下，也常常能够得到很好的效果。&lt;/p&gt;  &lt;h3&gt;统一度量衡：权重计算和向量空间模型&lt;/h3&gt;  &lt;p&gt;从上文我们看到简单的词袋模型在经过适当预处理之后，可以用来在推荐系统中召回候选物品。但是在计算物品和关键词的相关性，以及物品之间的相关性时，仅仅使用简单的词频作为排序因素显然是不合理的。为了解决这个问题，我们可以引入表达能力更强的基于TF-IDF的权重计算方法。在TF-IDF方法中，一个词t在文档d中权重的计算方法为：&lt;/p&gt;  &lt;p&gt;   &lt;img alt="&amp;#22270;&amp;#29255;&amp;#25551;&amp;#36848;" src="http://img.blog.csdn.net/20170628175855229" title=""&gt;&lt;/img&gt;&lt;/p&gt;  &lt;p&gt;其中tf   &lt;sub&gt;t,d&lt;/sub&gt;代表t在d中出现的频次，而df   &lt;sub&gt;t&lt;/sub&gt;指的是包含t的文档数目，N代表全部文档的数目。&lt;/p&gt;  &lt;p&gt;TF-IDF以及其各种改进和变种（关于TF-IDF变种和改进的详细介绍，可参考《Introduction to Information Retrieval》的第六章。）相比简单的TF方法，核心改进在于对一个词的重要性度量，例如：&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;原始TF-IDF在TF的基础上加入了对IDF的考虑，从而降低了出现频率高而导致无区分能力的词的重要性，典型的如停用词。&lt;/li&gt;   &lt;li&gt;因为词在文档中的重要性和出现次数并不是完全线性相关，非线性TF缩放对TF进行log缩放，从而降低出现频率特别高的词所占的权重。&lt;/li&gt;   &lt;li&gt;词在文档中出现的频率除了和重要性相关，还可能和文档的长短相关，为了消除这种差异，可以使用最大TF对所有的TF进行归一化。&lt;/li&gt;&lt;/ul&gt;  &lt;p&gt;这些方法的目的都是使对词在文档中重要性的度量更加合理，在此基础之上，我们可以对基于词频的方法进行改进，例如，可以将之前使用词频来对物品进行排序的方法，改进为根据TF-IDF得分来进行排序。&lt;/p&gt;  &lt;p&gt;但是除此以外，我们还需要一套统一的方法来度量关键词和文档，以及文档和文档之间的相关性，这套方法就是向量空间模型（Vector Space Model，简称VSM）。&lt;/p&gt;  &lt;p&gt;VSM的核心思想是将一篇文档表达为一个向量，向量的每一维可以代表一个词，在此基础上，可以使用向量运算的方法对文档间相似度进行统一计算，而这其中最为核心的计算，就是向量的余弦相似度计算：&lt;/p&gt;  &lt;p&gt;   &lt;img alt="&amp;#22270;&amp;#29255;&amp;#25551;&amp;#36848;" src="http://img.blog.csdn.net/20170628180343185" title=""&gt;&lt;/img&gt;&lt;/p&gt;  &lt;p&gt;其中V(d   &lt;sub&gt;1&lt;/sub&gt;)和V(d   &lt;sub&gt;2&lt;/sub&gt;)分别为两个文档的向量表示。这样一个看似简单的计算公式其实有着非常重要的意义。首先，它给出了一种相关性计算的通用思路，那就是只要能将两个物品用向量进行表示，就可以使用该公式进行相关性计算。其次，它对向量的具体表示内容没有任何限制——基于用户行为的协同过滤使用的也是同样的计算公式，而在文本相关性计算方面，我们可以使用TFIDF填充向量，同时也可以用N-gram，以及后面会介绍的文本主题的概率分布、各种词向量等其他表示形式。只要对该公式的内涵有了深刻理解，就可以根据需求构造合理的向量表示。再次，该公式具有较强的可解释性，它将整体的相关性拆解为多个分量的相关性的叠加，并且这个叠加方式可以通过公式进行调节，这样一套方法很容易解释，即使对非技术人员，也是比较容易理解的，这对于和产品、运营等非技术人员解释算法思路有很重要的意义。最后，这个公式在实际计算中可以进行一些很高效的工程优化，使其能够从容应对大数据环境下的海量数据，这一点是其他相关性计算方法很难匹敌的。&lt;/p&gt;  &lt;p&gt;VSM是一种“重剑无锋，大巧不工”的方法，形态简单而又变化多端，领会其精髓之后，可以发挥出极大的能量。&lt;/p&gt;  &lt;h3&gt;透过现象看本质：隐语义模型&lt;/h3&gt;  &lt;p&gt;前面介绍了文本数据的一些“显式”使用方法，所谓显式，是指我们将可读可理解的文本本身作为了相关性计算、物品召回以及模型排序的特征。这样做的好处是简单直观，能够清晰地看到起作用的是什么，但是其弊端是无法捕捉到隐藏在文本表面之下的深层次信息。例如，“羽绒服”和“棉衣”指的是类似的东西，“羽绒服”和“棉鞋”具有很强的相关性，类似这样的深层次信息，是显式的文本处理所无法捕捉的，因此我们需要一些更复杂的方法来捕捉，而隐语义模型（Latent Semantic Analysis，简称LSA）便是这类方法的鼻祖之一。&lt;/p&gt;  &lt;p&gt;隐语义模型中的“隐”指的是隐含的主题，这个模型的核心假设，是认为虽然一个文档由很多的词组成，但是这些词背后的主题并不是很多。换句话说，词不过是由背后的主题产生的，这背后的主题才是更为核心的信息。这种从词下沉到主题的思路，贯穿着我们后面要介绍到的其他模型，也是各种不同文本主体模型（Topic Model）的共同中心思想，因此理解这种思路非常的重要。&lt;/p&gt;  &lt;p&gt;在对文档做LSA分解之前，我们需要构造文档和词之间的关系，一个由5个文档和5个词组成的简单例子如下：&lt;/p&gt;  &lt;p&gt;   &lt;img alt="&amp;#22270;&amp;#29255;&amp;#25551;&amp;#36848;" src="http://img.blog.csdn.net/20170628180719497" title=""&gt;&lt;/img&gt;&lt;/p&gt;  &lt;p&gt;LSA的做法是将这个原始矩阵C进行如下形式的SVD分解：&lt;/p&gt;  &lt;p&gt;   &lt;img alt="&amp;#22270;&amp;#29255;&amp;#25551;&amp;#36848;" src="http://img.blog.csdn.net/20170628180810610" title=""&gt;&lt;/img&gt;&lt;/p&gt;  &lt;p&gt;其中U是矩阵CC   &lt;sup&gt;T&lt;/sup&gt;的正交特征向量矩阵，V是矩阵C   &lt;sup&gt;T&lt;/sup&gt;C的正交特征向量矩阵，∑   &lt;sub&gt;k&lt;/sub&gt;是包含前k个奇异值的对角矩阵，k是事先选定的一个降维参数。&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;得到原始数据的一个低维表示，降低后的维度包含了更多的信息，可以认为每个维度代表了一个主题。&lt;/li&gt;   &lt;li&gt;降维后的每个维度包含了更丰富的信息，例如可以识别近义词和一词多义。&lt;/li&gt;   &lt;li&gt;可以将不在训练文档中的文档d通过    &lt;img alt="&amp;#22270;&amp;#29255;&amp;#25551;&amp;#36848;" src="http://img.blog.csdn.net/20170628181619531" title=""&gt;&lt;/img&gt;变换为新向量空间内的一个向量（这样的变换无法捕捉到新文档中的信息，例如词的共现，以及新词的出现等等，所以该模型需要定期进行全量训练。），从而可以在降维后的空间里计算文档间相似度。由于新的向量空间包含了同义词等更深层的信息，这样的变换会提高相似度计算的准确率和召回率。&lt;/li&gt;&lt;/ul&gt;  &lt;p&gt;为什么LSA能具有这样的能力？我们可以从这样一个角度来看待：CC   &lt;sup&gt;T&lt;/sup&gt;中每个元素CC   &lt;sup&gt;T&lt;/sup&gt;   &lt;sub&gt;i,j&lt;/sub&gt;代表同时包含词i和词j的文档数量，而C   &lt;sup&gt;T&lt;/sup&gt;C中每个元素C   &lt;sup&gt;T&lt;/sup&gt;C   &lt;sub&gt;i,j&lt;/sub&gt;代表文档i和文档j共享的词的数量。所以这两个矩阵中包含了不同词的共同出现情况，以及文档对词的共享情况，通过分解这些信息得到了类似主题一样比关键词信息量更高的低维度数据。&lt;/p&gt;  &lt;p&gt;从另外一个角度来看，LSA相当于是对文档进行了一次软聚类，降维后的每个维度可看做是一个类，而文档在这个维度上的取值则代表了文档对于这个聚类的归属程度。&lt;/p&gt;  &lt;p&gt;LSA处理之后的数据推荐中能做什么用呢？首先，我们可以将分解后的新维度（主题维度）作为索引的单位对物品进行索引，来替代传统的以词为单位的索引，再将用户对物品的行为映射为对新维度的行为。这两个数据准备好之后，就可以使用新的数据维度对候选商品进行召回，召回之后可以使用VSM进行相似度计算，如前文所述，降维后的计算会带来更高的准确率和召回率，同时也能够减少噪音词的干扰，典型的，即使两个文档没有任何共享的词，它们之间仍然会存在相关性，而这正是LSA带来的核心优势之一。此外，还可以将其作为排序模型的排序特征。&lt;/p&gt;  &lt;p&gt;简单来讲，我们能在普通关键词上面使用的方法，在LSA上面仍然全部可用，因为LSA的本质就是对原始数据进行了语义的降维，只需将其看作是信息量更丰富的关键词即可。&lt;/p&gt;  &lt;p&gt;可以看到LSA相比关键词来说前进了一大步，主要体现在信息量的提升，维度的降低，以及对近义词和多义词的理解。但是LSA同时也具有一些缺点，例如：&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;训练复杂度高。LSA的训练时通过SVD进行的，而SVD本身的复杂度是很高的，在海量文档和海量词汇的场景下难以计算，虽然有一些优化方法可降低计算的复杂度，但该问题仍然没有得到根本解决。&lt;/li&gt;   &lt;li&gt;检索（召回）复杂度高。如上文所述，使用LSA做召回需要先将文档或者查询关键词映射到LSA的向量空间中，这显然也是一个耗时的操作。&lt;/li&gt;   &lt;li&gt;LSA中每个主题下词的值没有概率含义，甚至可能出现负值，只能反应数值大小关系。这让我们难以从概率角度来解释和理解主题和词的关系，从而限制了我们对其结果更丰富的使用。&lt;/li&gt;&lt;/ul&gt;  &lt;h3&gt;概率的魔力：概率隐语义模型&lt;/h3&gt;  &lt;p&gt;为了进一步发扬隐语义模型的威力，并尽力克服LSA模型的问题，Thomas Hofmann在1999年提出了概率隐语义模型（probabilistic Latent Semantic Analysis，简称pLSA)。从前面LSA的介绍可以看出，虽然具体的优化方法使用的是矩阵分解，但是从另一个角度来讲，我们可以认为分解后的U和V两个矩阵中的向量，分别代表文档和词在隐语义空间中的表示，例如一个文档的隐向量表示为(1,2,0)   &lt;sup&gt;T&lt;/sup&gt;， 代表其在第一维隐向量上取值为1，第二维上取值为2，第三维上取值为0。如果这些取值能够构成一个概率分布，那么不仅模型的结果更利于理解，同时还会带来很多优良的性质，这正是pLSA思想的核心：将文档和词的关系看作概率分布，然后试图找出这个概率分布来，有了文档和词的概率分布，我们就可以得到一切我们想要得到的东西了。&lt;/p&gt;  &lt;p&gt;在pLSA的基本假设中，文档d和词w的生成过程如下：&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;以 P(d) 的概率选择文档d。&lt;/li&gt;   &lt;li&gt;以 P(z|d) 的概率选择隐类z。&lt;/li&gt;   &lt;li&gt;以 P(w|z) 的概率从z生成w。&lt;/li&gt;   &lt;li&gt;P(z|d)和P(w|z) 均为多项式分布。&lt;/li&gt;&lt;/ul&gt;  &lt;p&gt;将这个过程用联合概率进行表达得到：&lt;/p&gt;  &lt;p&gt;   &lt;img alt="&amp;#22270;&amp;#29255;&amp;#25551;&amp;#36848;" src="http://img.blog.csdn.net/20170628182443834" title=""&gt;&lt;/img&gt;&lt;/p&gt;  &lt;p&gt;   &lt;img alt="&amp;#22270;&amp;#29255;&amp;#25551;&amp;#36848;" src="http://img.blog.csdn.net/20170628182603674" title=""&gt;&lt;/img&gt;   &lt;br /&gt;&lt;/p&gt;  &lt;center&gt;图1 pLSA的生成过程&lt;/center&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;可以看到，我们将隐变量z作为中间桥梁，将文档和词连接了起来，形成了一个定义良好、环环相扣的概率生成链条（如图1所示）。虽然pLSA的核心是一种概率模型，但是同样可以用类似LSI的矩阵分解形式进行表达。为此，我们将LSI中等号右边的三个矩阵进行重新定义：&lt;/p&gt;  &lt;p&gt;   &lt;img alt="&amp;#22270;&amp;#29255;&amp;#25551;&amp;#36848;" src="http://img.blog.csdn.net/20170628182654074" title=""&gt;&lt;/img&gt;&lt;/p&gt;  &lt;p&gt;在这样的定义下，原始的矩阵C仍然可以表述为C=U∑V   &lt;sup&gt;T&lt;/sup&gt;。这样的对应关系让我们更加清晰地看到了前面提到的pLSA在概率方面的良好定义和清晰含义，同时也揭示了隐语义概率模型和矩阵分解之间的密切关系（关于概率模型和矩阵分解的密切关系可参考这篇文档：   &lt;a href="http://www.cs.cmu.edu/~epxing/Class/10708-15/slides/LDA_SC.pdf"&gt;http://www.cs.cmu.edu/~epxing/Class/10708-15/slides/LDA_SC.pdf&lt;/a&gt;）。在这样的定义，隐变量z所代表的主题含义更加明显，也就是说，我们可以明确的把一个z看作一个主题，主题里的词和文档中的主题都有着明确的概率含义。也正是由于这样良好的性质，再加上优化方法的便捷性，使得从pLSA开始，文本主题开始在各种大数据应用中占据重要地位。&lt;/p&gt;  &lt;p&gt;从矩阵的角度来看，LSA和pLSA看上去非常像，但是它们的内涵却有着本质的不同，这其中最为重要的一点就是两者的优化目标是完全不同的：LSA本质上是在优化SVD分解后的矩阵和原始矩阵之间的平方误差，而pLSA本质上是在优化似然函数，是一种标准的机器学习优化套路。也正是由于这一点本质的不同，导致了两者在优化结果和解释能力方面的不同。&lt;/p&gt;  &lt;p&gt;至此我们看到，pLSA将LSA的思想从概率分布的角度进行了一大步扩展，得到了一个性质更加优良的结果，但是pLSA仍然存在一些问题，主要包括：&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;由于pLSA为每个文档生成一组文档级参数，模型中参数的数量随着与文档数成正比，因此在文档数较多的情况下容易过拟合。&lt;/li&gt;   &lt;li&gt;pLSA将每个文档d表示为一组主题的混合，然而具体的混合比例却没有对应的生成概率模型，换句话说，对于不在训练集中的新文档，pLSA无法给予一个很好的主题分布。简言之，pLSA并非完全的生成式模型。&lt;/li&gt;&lt;/ul&gt;  &lt;p&gt;而LDA的出现，就是为了解决这些问题。&lt;/p&gt;  &lt;h3&gt;概率的概率：生成式概率模型&lt;/h3&gt;  &lt;p&gt;为了解决上面提到的pLSA存在的问题，David Blei等人在2003年提出了一个新模型，名为“隐狄利克雷分配”（Latent Dirichlet Allocation，简称LDA），这个名字念起来颇为隐晦，而且从名字上似乎也看不出究竟是个什么模型，在这里我们试着做一种可能的解读：&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Latent：这个词不用多说，是说这个模型仍然是个隐语义模型。&lt;/li&gt;   &lt;li&gt;Dirichlet：这个词是在说该模型涉及到的主要概率分布式狄利克雷分布。&lt;/li&gt;   &lt;li&gt;Allocation：这个词是在说这个模型的生成过程就是在使用狄利克雷分布不断地分配主题和词。&lt;/li&gt;&lt;/ul&gt;  &lt;p&gt;上面并非官方解释，但希望能对理解这个模型能起到一些帮助作用。&lt;/p&gt;  &lt;p&gt;LDA的中心思想就是在pLSA外面又包了一层先验，使得文档中的主题分布和主题下的词分布都有了生成概率，从而解决了上面pLSA存在的“非生成式”的问题，顺便也减少了模型中的参数，从而解决了pLSA的另外一个问题。在LDA中为一篇文档d   &lt;sub&gt;i&lt;/sub&gt;生成词的过程如下：&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;从泊松分布中抽样一个数字N作为文档的长度（这一步并非必须，也不影响后面的过程）。&lt;/li&gt;   &lt;li&gt;从狄利克雷分布Dir(α)中抽样一个样本θ    &lt;sub&gt;i&lt;/sub&gt;，代表该篇文档下主题的分布。&lt;/li&gt;   &lt;li&gt;从狄利克雷分布Dir(β)中抽样一组样本Φ    &lt;sub&gt;k&lt;/sub&gt;，代表每个主题下词的分布。&lt;/li&gt;   &lt;li&gt;对于1到N的每个词w    &lt;sub&gt;n&lt;/sub&gt;：    &lt;br /&gt;    &lt;ul&gt;     &lt;li&gt;从多项式分布Multinomial(θ      &lt;sub&gt;i&lt;/sub&gt;) 中抽样一个主题c      &lt;sub&gt;i,j&lt;/sub&gt;。&lt;/li&gt;     &lt;li&gt;从多项式分布Multinomial(Φ      &lt;sub&gt;i&lt;/sub&gt;) 中抽样一个词w      &lt;sub&gt;i,j&lt;/sub&gt;。&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ul&gt;  &lt;p&gt;   &lt;img alt="&amp;#22270;&amp;#29255;&amp;#25551;&amp;#36848;" src="http://img.blog.csdn.net/20170628184057972" title=""&gt;&lt;/img&gt;   &lt;br /&gt;&lt;/p&gt;  &lt;center&gt;图2 LDA的生成过程&lt;/center&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;忽略掉最开始选择文档长度的步骤，我们发现LDA的生成过程相比pLSA来讲，在文档到主题的分布和主题到词的分布上面都加了一层概率，使得这两者都加上了一层不确定性，从而能够很自然地容纳训练文档中没有出现过的文档和词，这使得LDA具有了比pLSA更好的概率性质。&lt;/p&gt;  &lt;h4&gt;LDA的应用&lt;/h4&gt;  &lt;p&gt;这部分我们介绍LDA在用作相似度计算和排序特征时需要注意的一些地方，然后介绍以LDA为代表的文本主题在推荐系统中更多不同角度的应用。&lt;/p&gt;  &lt;p&gt;   &lt;strong&gt;相似度计算&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;上面提到LSA可以直接套用到VSM中进行相似度计算，在LDA中也可以做类似的计算，具体方法是把文档的主题分布值向量化然后用余弦公式进行计算。但是把余弦相似度替换为   &lt;a href="https://en.wikipedia.org/wiki/Kullback-Leibler_divergence"&gt;KL divergence&lt;/a&gt;或   &lt;a href="https://en.wikipedia.org/wiki/Jensen-Shannon_divergence"&gt;Jensen–Shannon divergence&lt;/a&gt;效果更好，原因是LDA给出的主题分布是含义明确的概率值，用度量概率之间相似度的方法来进行度量更为合理。&lt;/p&gt;  &lt;p&gt;   &lt;strong&gt;排序特征&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;将物品的LDA主题作为排序模型的特征是一种很自然的使用方法，但并不是所有的主题都有用。物品上的主题分布一般有两种情况：&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;有少数主题（三个或更少）占据了比较大的概率，剩余的主题概率加起来比较小。&lt;/li&gt;   &lt;li&gt;所有主题的概率值都差不多，都比较小。&lt;/li&gt;&lt;/ul&gt;  &lt;p&gt;在第一种情况下，只有前面几个概率比较大的主题是有用的，而在第二种情况下，基本上所有的主题都没有用。那么该如何识别这两种情况呢？第一种方法，可以根据主题的概率值对主题做一个简单的K-Means聚类，K选为2，如果是第一种情况，那么两个类中的主题数量会相差较大——一个类中包含少量有用主题，另一个类包含其他无用主题；而第二种情况下主题数量则相差不大，可以用这种方法来识别主题的重要性。第二种方法，可以计算主题分布的信息熵，第一种情况对应的信息熵会比较小，而第二种情况会比较大，选取合适的阈值也可以区分这两种情况。&lt;/p&gt;  &lt;p&gt;   &lt;strong&gt;物品打标签&amp;amp;用户打标签&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;为物品计算出其对应的主题，以及主题下面对应的词分布之后，我们可以选取概率最大的几个主题，然后从这几个主题下选取概率最大的几个词，作为这个物品的标签。在此基础上，如果用户对该物品发生了行为，则可以将这些标签传播到用户身上。&lt;/p&gt;  &lt;p&gt;这种方法打出的标签，具有非常直观的解释，在适当场景下可以充当推荐解释的理由。例如我们在做移动端个性化推送时，可供展示文案的空间非常小，可以通过上面的方式先为物品打上标签，然后再根据用户把标签传播到用户身上，在推送时将这些标签词同时作为召回源和推荐理由，让用户明白为什么给他做出这样的推荐。&lt;/p&gt;  &lt;p&gt;   &lt;strong&gt;主题&amp;amp;词的重要性度量&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;LDA训练生成的主题中，虽然都有着同等的位置，但是其重要性却是各不相同的，有的主题包含了重要的信息，有的则不然。例如，一个主题可能包含“教育、读书、学校”等词，和这样主题相关的文档，一般来说是和教育相关的主题，那么这就是一个信息量高的主题；相反，有的主题可能会包含“第一册、第二册、第三册……”等词（如果在一个图书销售网站的所有图书上训练LDA，就有可能得到这样的主题，因为有很多套装图书都包含这样的信息），和这样主题相关的文档却有可能是任何主题，这样的主题就是信息量低的主题。&lt;/p&gt;  &lt;p&gt;如何区分主题是否重要呢？从上面的例子中我们可以得到启发：重要的主题不会到处出现，只会出现在小部分与之相关的文档中，而不重要的主题则可能在各种文章中都出现。基于这样的思想，我们可以使用信息熵的方法来衡量一个主题中的信息量。通过对LDA输出信息做适当的变换，我们可以得到主题θ   &lt;sub&gt;i&lt;/sub&gt;在不同文档中的概率分布，然后我们对这个概率分布计算其信息熵，通俗来讲信息熵衡量了一个概率分布中概率值分散程度，越分散熵越大，越集中熵越小。所以在我们的问题中，信息熵越小的主题，说明该主题所对应的文档越少，主题的重要性越高。&lt;/p&gt;  &lt;p&gt;使用类似的方法，我们还可以计算词的重要性，在此不再赘述。&lt;/p&gt;  &lt;h4&gt;更多应用&lt;/h4&gt;  &lt;p&gt;除了上面提到的，LDA还有很多其他应用，甚至在文本领域以外的图像等领域也存在着广泛应用。LSA/pLSA/LDA这些主题模型的核心基础是词在文档中的共现，在此基础上才有了各种概率分布，把握住这个核心基础，就可以找到文本主体模型的更多应用。例如，协同过滤问题中，基础数据也是用户对物品的共同行为，这也构成了文本主题模型的基础，因此也可以使用LDA对用户对物品的行为进行建模，得到用户行为的主题，以及主题下对应的物品，然后进行物品/用户的推荐。&lt;/p&gt;  &lt;h3&gt;捕捉上下文信息：神经概率语言模型&lt;/h3&gt;  &lt;p&gt;以LDA为代表的文本主题模型通过对词的共现信息的分解处理，得到了很多有用的信息，但是pLSA/LDA有一个很重要的假设，那就是文档集合中的文档，以及一篇文档中的词在选定了主题分布的情况下都是相互独立，可交换的，换句话说，模型中没有考虑词的顺序以及词和词之间的关系，这种假设隐含了两个含义：&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;在生成词的过程中，之前生成的词对接下来生成的词是没有影响的。&lt;/li&gt;   &lt;li&gt;两篇文档如果包含同样的词，但是词的出现顺序不同，那么在LDA看来他们是完全相同的。&lt;/li&gt;&lt;/ul&gt;  &lt;p&gt;这样的假设使得LDA会丢失一些重要的信息，而近年来得到关注越来越多的以word2vec为代表的神经概率语言模型恰好在这方面和LDA形成了一定程度的互补关系，从而可以捕捉到LDA所无法捕捉到的信息。&lt;/p&gt;  &lt;p&gt;word2vector的中心思想用一句话来讲就是：A word is characterized by the company it keeps（一个词的特征由它周围的词所决定）。&lt;/p&gt;  &lt;p&gt;这是一句颇有哲理的话，很像是成语中的“物以类聚人以群分”。具体来讲，词向量模型使用“周围的词=&amp;gt;当前词”或“当前词=&amp;gt;周围的词”这样的方式构造训练样本，然后使用神经网络来训练模型，训练完成之后，输入词的输入向量表示便成为了该词的向量表示，如图3所示。&lt;/p&gt;  &lt;p&gt;   &lt;img alt="&amp;#22270;&amp;#29255;&amp;#25551;&amp;#36848;" src="http://img.blog.csdn.net/20170628185653467" title=""&gt;&lt;/img&gt;&lt;/p&gt;  &lt;p&gt;这样的训练方式，本质上是在说，如果两个词具有类似的上下文（上下文由周围的词组成），那么这两个词就会具有类似的向量表示。有了词的向量表示之后，我们可以做很多事情，最常见的是将这一层向量表示作为更深层次模型的一个嵌入层。除了在深度学习中的使用以外，在推荐系统中还可以做很多其他的事情，其中之一就是做词的聚类，以及寻找相似词。我们知道LDA天然就可以做到词的聚类和相似词的计算，那么使用word2vec计算出来的结果和LDA有什么不同呢？它们之间的不同具体体现在两点：第一是聚类的粒度不同，LDA关注的主题级别的粒度，层次更高，而词向量关注的是更低层次的语法语义级别的含义。例如“苹果”，“小米”和“三星”这三个词，在LDA方法中很可能会被聚类在一个主题中，但是在词向量的角度来看，“苹果”和“小米”可能会具有更高的相似度，就像“乔布斯”和“雷军”在词向量下的关系一样，所以在词向量中可能会有：“vector（小米）- vector（苹果）+vector（乔布斯）= vector（雷军）”这样的结果。&lt;/p&gt;  &lt;p&gt;除此以外，由于word2vec有着“根据上下文预测当前内容”的能力，将其做适当修改之后，还可以用来对用户行为喜好做出预测。首先我们将用户的行为日志进行收集，进行session划分，得到类似文本语料的训练数据，在这个数据上训练word2vec模型，可以得到一个“根据上下文行为预测当前行为”的模型。但是原始的行为数据中行为的对象常常是id级的，例如商品、视频的id等等，如果直接放到模型中训练，会造成训练速度慢、泛化能力差等问题，因此需要对原始行为做降维，具体来说可以将行为映射到搜索词、LDA Topic、类别等等低维度特征上，然后再进行训练。例如，我们可以对用户的搜索词训练一个word2vec模型，然后就可以根据用户的历史搜索行为预测他的下一步搜索行为，并在此基础上进行推荐。这种方法考虑到了上下文，但是对前后关系并没有做最恰当的处理，因为word2vec的思想是“根据上下文预测当前内容”，但我们希望得到的模型是“根据历史行为预测下一步行为”，这两者之间有着微妙的差别。例如用户的行为序列为“ABCDE”，每个字母代表对一个物品（或关键词）的行为，标准的word2vec算法可能会构造出下面这些样本：AC→B, BD→C, CE→D… 但是我们希望的形式其实是这样的：AB→C, BC→D,CD→E…因此，需要对word2vec生成样本的逻辑进行修改，使其只包含我们需要的单方向的样本，方可在最终模型中得到我们真正期望的结果。&lt;/p&gt;  &lt;p&gt;下面是按照该方法生成的一些预测例子：&lt;/p&gt;  &lt;p&gt;   &lt;img alt="&amp;#22270;&amp;#29255;&amp;#25551;&amp;#36848;" src="http://img.blog.csdn.net/20170628185615492" title=""&gt;&lt;/img&gt;&lt;/p&gt;  &lt;p&gt;可以看出，预测搜索词都与历史搜索词有着紧密的关系，是对历史搜索词的延伸（例如学生书桌和烤肠机的例子）或者细化（例如小龟王和西铁城手表的例子），具有比较好的预测属性，是非常好的推荐策略来源。沿着这样的思路，我们还可以对word2vec作进一步修改，得到对时序关系更为敏感的模型，以及尝试使用RNN、LSTM等纯时序模型来得到更好的预测结果，但由于篇幅所限，在此不做展开。&lt;/p&gt;  &lt;h3&gt;行业应用现状&lt;/h3&gt;  &lt;p&gt;文本主题模型在被提出之后，由于其良好的概率性质，以及对文本数据有意义的聚类抽象能力，在互联网的各个行业中都取得了广泛的应用。搜索巨头Google在其系统的各个方面都在广泛使用文本主题模型，并为此开发了大规模文本主题系统Rephil。例如在为用户搜索产生广告的过程中，就使用了文本主题来计算网页内容和广告之间的匹配度，是其广告产品成功的重要因素之一。此外，在匹配用户搜索词和网页间关系的时候，文本主题也可用来提高匹配召回率和准确性。Yahoo！也在其搜索排序模型中大量使用了   &lt;a href="http://www.kdd.org/kdd2016/papers/files/adf0361-yinA.pdf"&gt;LDA主题特征&lt;/a&gt;，还为此开源了著名的   &lt;a href="https://github.com/sudar/Yahoo_LDA"&gt;Yahoo!LDA工具&lt;/a&gt;。&lt;/p&gt;  &lt;p&gt;在国内，文本主题最著名的系统当属腾讯开发的   &lt;a href="http://www.flickering.cn/nlp/2015/03/peacock"&gt;Peacock系统&lt;/a&gt;，该系统可以捕捉百万级别的文本主题，在腾讯的广告分类、网页分类、精准广告定向、QQ群分类等重要业务上均起着重要的作用。该系统使用的HDP（Hierarchical Dirichlet Process）模型是LDA模型的一个扩展，可智能选择数据中主题的数量，还具有   &lt;a href="https://arxiv.org/abs/1405.4402"&gt;捕捉长尾主题的能力&lt;/a&gt;。除了腾讯以外，文本主题模型在各公司的推荐、搜索等业务中也已经在广泛使用，使用方法根据各自业务有所不同。&lt;/p&gt;  &lt;p&gt;以word2vec为代表的神经网络模型近年来的使用也比较广泛，典型的应用如词的聚类、近义词的发现、quer y的扩展、推荐兴趣的扩展等。Facebook开发了一种word2vec的替代方案   &lt;a href="https://research.fb.com/projects/fasttext/"&gt;FastText&lt;/a&gt;，该方案在传统词向量的基础上，考虑子词（subword）的概念，取得了比word2vec更好的   &lt;a href="https://arxiv.org/abs/1607.04606"&gt;效果&lt;/a&gt;。&lt;/p&gt;  &lt;h3&gt;总结和展望&lt;/h3&gt;  &lt;p&gt;我们从简单的文本关键词出发，沿着结构化、降维、聚类、概率、时序的思路，结合推荐系统中候选集召回、相关性计算、排序模型特征等具体应用，介绍了推荐系统中一些常用的自然语言处理技术和具体应用方法。自然语言处理技术借着深度学习的东风，近年来取得了长足的进步，而其与推荐系统的紧密关系，也意味着推荐系统在这方面仍然有着巨大的提升空间，让我们拭目以待。&lt;/p&gt;  &lt;hr&gt;&lt;/hr&gt;  &lt;blockquote&gt;   &lt;p&gt;7月22-23日，本年度中国人工智能技术会议最强音——    &lt;a href="http://ccai.caai.cn/"&gt;     &lt;strong&gt;2017 中国人工智能大会（CCAI 2017）&lt;/strong&gt;&lt;/a&gt;即将在杭州国际会议中心拉开序幕。汇集超过40位学术带头人、8场权威专家主题报告、4场开放式专题研讨会、超过2000位人工智能专业人士将参与本次会议，欢迎扫描下方二维码或直接登录【    &lt;a href="http://ccai.caai.cn/"&gt;大会官网&lt;/a&gt;】购票。    &lt;br /&gt;    &lt;a href="http://ccai.caai.cn/"&gt;     &lt;img alt="&amp;#22270;&amp;#29255;&amp;#25551;&amp;#36848;" src="http://img.blog.csdn.net/20170621140919067" title=""&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;/div&gt;&lt;div&gt; &lt;a href="https://itindex.net/"  title="IT 资讯"&gt;&lt;img src="https://itindex.net/images/iconWarning.gif" title="IT 资讯" border="0"/&gt; &lt;/a&gt;</description>
      <category>geek</category>
      <guid isPermaLink="true">https://itindex.net/detail/57141-%E8%87%AA%E7%84%B6%E8%AF%AD%E8%A8%80-%E6%8A%80%E6%9C%AF-nlp</guid>
      <pubDate>Wed, 28 Jun 2017 08:00:00 CST</pubDate>
    </item>
    <item>
      <title>自然语言处理第一番之文本分类器</title>
      <link>https://itindex.net/detail/57060-%E8%87%AA%E7%84%B6%E8%AF%AD%E8%A8%80-%E6%96%87%E6%9C%AC-%E5%88%86%E7%B1%BB</link>
      <description>&lt;h1&gt;前言&lt;/h1&gt;
 &lt;p&gt;文本分类应该是自然语言处理中最普遍的一个应用，例如文章自动分类、邮件自动分类、垃圾邮件识别、用户情感分类等等，在生活中有很多例子，这篇文章主要从传统和深度学习两块来解释下我们如何做一个文本分类器。&lt;/p&gt;
 &lt;h1&gt;文本分类方法&lt;/h1&gt;
 &lt;p&gt;传统的文本方法的主要流程是人工设计一些特征，从原始文档中提取特征，然后指定分类器如LR、SVM，训练模型对文章进行分类，比较经典的特征提取方法如频次法、tf-idf、互信息方法、N-Gram。  &lt;br /&gt;
深度学习火了之后，也有很多人开始使用一些经典的模型如CNN、LSTM这类方法来做特征的提取， 这篇文章会比较粗地描述下，在文本分类的一些实验&lt;/p&gt;
 &lt;h2&gt;传统文本分类方法&lt;/h2&gt;
 &lt;p&gt;这里主要描述两种特征提取方法：频次法、tf-idf、互信息、N-Gram。&lt;/p&gt;
 &lt;h3&gt;频次法&lt;/h3&gt;
 &lt;p&gt;频次法，顾名思义，十分简单，记录每篇文章的次数分布，然后将分布输入机器学习模型，训练一个合适的分类模型，对这类数据进行分类，需要指出的时，在统计次数分布时，可合理提出假设，频次比较小的词对文章分类的影响比较小，因此我们可合理地假设阈值，滤除频次小于阈值的词，减少特征空间维度。&lt;/p&gt;
 &lt;h3&gt;TF-IDF&lt;/h3&gt;
 &lt;p&gt;TF-IDF相对于频次法，有更进一步的考量，词出现的次数能从一定程度反应文章的特点，即TF，而TF-IDF，增加了所谓的反文档频率，如果一个词在某个类别上出现的次数多，而在全部文本上出现的次数相对比较少，我们认为这个词有更强大的文档区分能力，TF-IDF就是综合考虑了频次和反文档频率两个因素。&lt;/p&gt;
 &lt;h3&gt;互信息方法&lt;/h3&gt;
 &lt;p&gt;互信息方法也是一种基于统计的方法，计算文档中出现词和文档类别的相关程度，即互信息&lt;/p&gt;
 &lt;h3&gt;N-Gram&lt;/h3&gt;
 &lt;p&gt;基于N-Gram的方法是把文章序列，通过大小为N的窗口，形成一个个Group，然后对这些Group做统计，滤除出现频次较低的Group，把这些Group组成特征空间，传入分类器，进行分类。&lt;/p&gt;
 &lt;h2&gt;深度学习方法&lt;/h2&gt;
 &lt;h3&gt;基于CNN的文本分类方法&lt;/h3&gt;
 &lt;ul&gt;
  &lt;li&gt;
   &lt;p&gt;最普通的基于CNN的方法就是Keras上的example做情感分析，接Conv1D，指定大小的window size来遍历文章，加上一个maxpool，如此多接入几个，得到特征表示，然后加上FC，进行最终的分类输出。&lt;/p&gt;
&lt;/li&gt;
  &lt;li&gt;
   &lt;p&gt;基于CNN的文本分类方法，最出名的应该是2014 Emnlp的     &lt;a href="http://www.aclweb.org/anthology/D14-1181"&gt;Convolutional Neural Networks for Sentence Classiﬁcation&lt;/a&gt;，使用不同filter的cnn网络，然后加入maxpool， 然后concat到一起。    &lt;br /&gt;
    &lt;img alt="text_classifier_cnn_00" src="http://images.duanshishi.com/mac_blogs_text_classifier_cnn_00.png"&gt;&lt;/img&gt;&lt;/p&gt;
&lt;/li&gt;
  &lt;li&gt;
   &lt;p&gt;这类CNN的方法，通过设计不同的window size来建模不同尺度的关系，但是很明显，丢失了大部分的上下文关系，    &lt;a href="http://www.nlpr.ia.ac.cn/cip/~liukang/liukangPageFile/Recurrent%20Convolutional%20Neural%20Networks%20for%20Text%20Classification.pdf"&gt;Recurrent Convolutional Neural Networks for Text Classification&lt;/a&gt;,将每一个词形成向量化表示时，加上上文和下文的信息，每一个词的表示如下：    &lt;br /&gt;
    &lt;img alt="text_classifier_cnn_01" src="http://images.duanshishi.com/mac_blogs_text_classifier_cnn_01.png"&gt;&lt;/img&gt;    &lt;br /&gt;
整个结构框架如下：    &lt;br /&gt;
    &lt;img alt="text_classifier_cnn_02" src="http://images.duanshishi.com/mac_blogs_text_classifier_cnn_02.png"&gt;&lt;/img&gt;    &lt;br /&gt;
如针对这句话”A sunset stroll along the South Bank affords an array of stunning vantage points”，stroll的表示包括c_l(stroll),pre_word2vec(stroll),c_r(stroll), c_l(stroll)编码A sunset的语义，而c_r(stroll)编码along the South Bank affords an array of stunning vantage points的信息，每一个词都如此处理，因此会避免普通cnn方法的上下文缺失的信息。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
 &lt;h3&gt;基于LSTM的方法&lt;/h3&gt;
 &lt;ul&gt;
  &lt;li&gt;和基于CNN的方法中第一种类似，直接暴力地在embedding之后加入LSTM，然后输出到一个FC进行分类，基于LSTM的方法，我觉得这也是一种特征提取方式，可能比较偏向建模时序的特征；&lt;/li&gt;
  &lt;li&gt;在暴力的方法之上，   &lt;a href="https://arxiv.org/abs/1511.08630"&gt;A C-LSTM Neural Network for Text Classification&lt;/a&gt;，将embedding输出不直接接入LSTM，而是接入到cnn，通过cnn得到一些序列，然后吧这些序列再接入到LSTM，文章说这么做会提高最后分类的准去率。&lt;/li&gt;
&lt;/ul&gt;
 &lt;h1&gt;代码实践&lt;/h1&gt;
 &lt;h2&gt;语料及任务介绍&lt;/h2&gt;
 &lt;p&gt;训练的语料来自于大概31个新闻类别的新闻语料，但是其中有一些新闻数目比较少，所以取了数量比较多的前20个新闻类比的新闻语料，每篇新闻稿字数从几百到几千不等，任务就是训练合适的分类器然后将新闻分为不同类别:  &lt;br /&gt;
  &lt;img alt="" src="http://images.duanshishi.com/mac_blogs_text_classifier_sample.png"&gt;&lt;/img&gt;&lt;/p&gt;
 &lt;h2&gt;Bow&lt;/h2&gt;
 &lt;p&gt;Bow对语料处理，得到tokens set：&lt;/p&gt;
 &lt;pre&gt;  &lt;code&gt;def __get_all_tokens(self):
    &amp;quot;&amp;quot;&amp;quot; get all tokens of the corpus
    &amp;quot;&amp;quot;&amp;quot;
    fwrite = open(self.data_path.replace(&amp;quot;all.csv&amp;quot;,&amp;quot;all_token.csv&amp;quot;), &amp;apos;w&amp;apos;)
    with open(self.data_path, &amp;quot;r&amp;quot;) as fread:
        i = 0
        # while True:
        for line in fread.readlines():
            try:
                line_list = line.strip().split(&amp;quot;\t&amp;quot;)
                label = line_list[0]
                self.labels.append(label)
                text = line_list[1]
                text_tokens = self.cut_doc_obj.run(text)
                self.corpus.append(&amp;apos; &amp;apos;.join(text_tokens))
                self.dictionary.add_documents([text_tokens])
                fwrite.write(label+&amp;quot;\t&amp;quot;+&amp;quot;\\&amp;quot;.join(text_tokens)+&amp;quot;\n&amp;quot;)
                i+=1
            except BaseException as e:
                msg = traceback.format_exc()
                print msg
                print &amp;quot;=====&amp;gt;Read Done&amp;lt;======&amp;quot;
                break
    self.token_len = self.dictionary.__len__()
    print &amp;quot;all token len &amp;quot;+ str(self.token_len)
    self.num_data = i
    fwrite.close()
&lt;/code&gt;&lt;/pre&gt;
 &lt;p&gt;然后，tokens set 以频率阈值进行滤除，然后对每篇文章做处理来进行向量化：&lt;/p&gt;
 &lt;pre&gt;  &lt;code&gt;def __filter_tokens(self, threshold_num=10):
    small_freq_ids = [tokenid for tokenid, docfreq in self.dictionary.dfs.items() if docfreq &amp;lt; threshold_num ]
    self.dictionary.filter_tokens(small_freq_ids)
    self.dictionary.compactify()

def vec(self):
    &amp;quot;&amp;quot;&amp;quot; vec: get a vec representation of bow
    &amp;quot;&amp;quot;&amp;quot;
    self.__get_all_tokens()
    print &amp;quot;before filter, the tokens len: {0}&amp;quot;.format(self.dictionary.__len__())
    self.__filter_tokens()
    print &amp;quot;After filter, the tokens len: {0}&amp;quot;.format(self.dictionary.__len__())
    self.bow = []
    for file_token in self.corpus:
        file_bow = self.dictionary.doc2bow(file_token)
        self.bow.append(file_bow)
    # write the bow vec into a file
    bow_vec_file = open(self.data_path.replace(&amp;quot;all.csv&amp;quot;,&amp;quot;bow_vec.pl&amp;quot;), &amp;apos;wb&amp;apos;)
    pickle.dump(self.bow,bow_vec_file)
    bow_vec_file.close()
    bow_label_file = open(self.data_path.replace(&amp;quot;all.csv&amp;quot;,&amp;quot;bow_label.pl&amp;quot;), &amp;apos;wb&amp;apos;)
    pickle.dump(self.labels,bow_label_file)
    bow_label_file.close()
&lt;/code&gt;&lt;/pre&gt;
 &lt;p&gt;最终就得到每篇文章的bow的向量，由于这块的代码是在我的笔记本上运行的，直接跑占用内存太大，因为每一篇文章在token set中的表示是极其稀疏的，因此我们可以选择将其转为csr表示，然后进行模型训练，转为csr并保存中间结果代码如下：&lt;/p&gt;
 &lt;pre&gt;  &lt;code&gt;def to_csr(self):
    self.bow = pickle.load(open(self.data_path.replace(&amp;quot;all.csv&amp;quot;,&amp;quot;bow_vec.pl&amp;quot;), &amp;apos;rb&amp;apos;))
    self.labels = pickle.load(open(self.data_path.replace(&amp;quot;all.csv&amp;quot;,&amp;quot;bow_label.pl&amp;quot;), &amp;apos;rb&amp;apos;))
    data = []
    rows = []
    cols = []
    line_count = 0
    for line in self.bow:
        for elem in line:
            rows.append(line_count)
            cols.append(elem[0])
            data.append(elem[1])
        line_count += 1
    print &amp;quot;dictionary shape ({0},{1})&amp;quot;.format(line_count, self.dictionary.__len__())
    bow_sparse_matrix = csr_matrix((data,(rows,cols)), shape=[line_count, self.dictionary.__len__()])
    print &amp;quot;bow_sparse matrix shape: &amp;quot;
    print bow_sparse_matrix.shape
    # rarray=np.random.random(size=line_count)
    self.train_set, self.test_set, self.train_tag, self.test_tag = train_test_split(bow_sparse_matrix, self.labels, test_size=0.2)
    print &amp;quot;train set shape: &amp;quot;
    print self.train_set.shape
    train_set_file = open(self.data_path.replace(&amp;quot;all.csv&amp;quot;,&amp;quot;bow_train_set.pl&amp;quot;), &amp;apos;wb&amp;apos;)
    pickle.dump(self.train_set,train_set_file)
    train_tag_file = open(self.data_path.replace(&amp;quot;all.csv&amp;quot;,&amp;quot;bow_train_tag.pl&amp;quot;), &amp;apos;wb&amp;apos;)
    pickle.dump(self.train_tag,train_tag_file)
    test_set_file = open(self.data_path.replace(&amp;quot;all.csv&amp;quot;,&amp;quot;bow_test_set.pl&amp;quot;), &amp;apos;wb&amp;apos;)
    pickle.dump(self.test_set,test_set_file)
    test_tag_file = open(self.data_path.replace(&amp;quot;all.csv&amp;quot;,&amp;quot;bow_test_tag.pl&amp;quot;), &amp;apos;wb&amp;apos;)
    pickle.dump(self.test_tag,test_tag_file)
&lt;/code&gt;&lt;/pre&gt;
 &lt;p&gt;最后训练模型代码如下：&lt;/p&gt;
 &lt;pre&gt;  &lt;code&gt;def train(self):
    print &amp;quot;Beigin to Train the model&amp;quot;
    lr_model = LogisticRegression()
    lr_model.fit(self.train_set, self.train_tag)
    print &amp;quot;End Now, and evalution the model with test dataset&amp;quot;
    # print &amp;quot;mean accuracy: {0}&amp;quot;.format(lr_model.score(self.test_set, self.test_tag))
    y_pred = lr_model.predict(self.test_set)
    print classification_report(self.test_tag, y_pred)
    print confusion_matrix(self.test_tag, y_pred)
    print &amp;quot;save the trained model to lr_model.pl&amp;quot;
    joblib.dump(lr_model, self.data_path.replace(&amp;quot;all.csv&amp;quot;,&amp;quot;bow_lr_model.pl&amp;quot;)) 
&lt;/code&gt;&lt;/pre&gt;
 &lt;h2&gt;TF-IDF&lt;/h2&gt;
 &lt;p&gt;TF-IDF和Bow的操作十分类似，只是在向量化使使用tf-idf的方法：&lt;/p&gt;
 &lt;pre&gt;  &lt;code&gt;def vec(self):
    &amp;quot;&amp;quot;&amp;quot; vec: get a vec representation of bow
    &amp;quot;&amp;quot;&amp;quot;
    self.__get_all_tokens()
    print &amp;quot;before filter, the tokens len: {0}&amp;quot;.format(self.dictionary.__len__())
    vectorizer = CountVectorizer(min_df=1e-5)
    transformer = TfidfTransformer()
    # sparse matrix
    self.tfidf = transformer.fit_transform(vectorizer.fit_transform(self.corpus))
    words = vectorizer.get_feature_names()
    print &amp;quot;word len: {0}&amp;quot;.format(len(words))
    # print self.tfidf[0]
    print &amp;quot;tfidf shape ({0},{1})&amp;quot;.format(self.tfidf.shape[0], self.tfidf.shape[1])

    # write the tfidf vec into a file
    tfidf_vec_file = open(self.data_path.replace(&amp;quot;all.csv&amp;quot;,&amp;quot;tfidf_vec.pl&amp;quot;), &amp;apos;wb&amp;apos;)
    pickle.dump(self.tfidf,tfidf_vec_file)
    tfidf_vec_file.close()
    tfidf_label_file = open(self.data_path.replace(&amp;quot;all.csv&amp;quot;,&amp;quot;tfidf_label.pl&amp;quot;), &amp;apos;wb&amp;apos;)
    pickle.dump(self.labels,tfidf_label_file)
    tfidf_label_file.close()
&lt;/code&gt;&lt;/pre&gt;
 &lt;p&gt;这两类方法效果都不错，都能达到98+%的准确率。&lt;/p&gt;
 &lt;h2&gt;CNN&lt;/h2&gt;
 &lt;p&gt;语料处理的方法和传统的差不多，分词之后，使用pretrain 的word2vec，这里我遇到一个坑，我开始对我的分词太自信了，最后模型一直不能收敛，后来向我们组博士请教，极有可能是由于分词的词序列中很多在pretrained word2vec里面是不存在的，而我这部分直接丢弃了，所有可能存在问题，分词添加了词典，然后，对于pre-trained word2vec不存在的词做了一个随机初始化，然后就能收敛了，学习了！！！&lt;/p&gt;
 &lt;p&gt;载入word2vec模型和构建cnn网络代码如下（增加了一些bn和dropout的手段）：&lt;/p&gt;
 &lt;pre&gt;  &lt;code&gt;def gen_embedding_matrix(self, load4file=True):
    &amp;quot;&amp;quot;&amp;quot; gen_embedding_matrix: generate the embedding matrix
    &amp;quot;&amp;quot;&amp;quot;
    if load4file:
        self.__get_all_tokens_v2()
    else:
        self.__get_all_tokens()
    print &amp;quot;before filter, the tokens len: {0}&amp;quot;.format(
        self.dictionary.__len__())
    self.__filter_tokens()
    print &amp;quot;after filter, the tokens len: {0}&amp;quot;.format(
        self.dictionary.__len__())
    self.sequence = []
    for file_token in self.corpus:
        temp_sequence = [x for x, y in self.dictionary.doc2bow(file_token)]
        print temp_sequence
        self.sequence.append(temp_sequence)

    self.corpus_size = len(self.dictionary.token2id)
    self.embedding_matrix = np.zeros((self.corpus_size, EMBEDDING_DIM))
    print &amp;quot;corpus size: {0}&amp;quot;.format(len(self.dictionary.token2id))
    for key, v in self.dictionary.token2id.items():
        key_vec = self.w2vec.get(key)
        if key_vec is not None:
            self.embedding_matrix[v] = key_vec
        else:
            self.embedding_matrix[v] = np.random.rand(EMBEDDING_DIM) - 0.5
    print &amp;quot;embedding_matrix len {0}&amp;quot;.format(len(self.embedding_matrix))

def __build_network(self):
    embedding_layer = Embedding(
        self.corpus_size,
        EMBEDDING_DIM,
        weights=[self.embedding_matrix],
        input_length=MAX_SEQUENCE_LENGTH,
        trainable=False)
    # train a 1D convnet with global maxpooling
    sequence_input = Input(shape=(MAX_SEQUENCE_LENGTH, ), dtype=&amp;apos;int32&amp;apos;)
    embedded_sequences = embedding_layer(sequence_input)
    x = Convolution1D(128, 5)(embedded_sequences)
    x = BatchNormalization()(x)
    x = Activation(&amp;apos;relu&amp;apos;)(x)
    x = MaxPooling1D(5)(x)
    x = Convolution1D(128, 5)(x)
    x = BatchNormalization()(x)
    x = Activation(&amp;apos;relu&amp;apos;)(x)
    x = MaxPooling1D(5)(x)
    print &amp;quot;before 256&amp;quot;, x.get_shape()
    x = Convolution1D(128, 5)(x)
    x = BatchNormalization()(x)
    x = Activation(&amp;apos;relu&amp;apos;)(x)
    x = MaxPooling1D(15)(x)
    x = Flatten()(x)

    x = Dense(128)(x)
    x = BatchNormalization()(x)
    x = Activation(&amp;apos;relu&amp;apos;)(x)
    x = Dropout(0.5)(x)
    print x.get_shape()
    preds = Dense(self.class_num, activation=&amp;apos;softmax&amp;apos;)(x)
    print preds.get_shape()
    adam = Adam(lr=0.0001)
    self.model = Model(sequence_input, preds)
    self.model.compile(
        loss=&amp;apos;categorical_crossentropy&amp;apos;, optimizer=adam, metrics=[&amp;apos;acc&amp;apos;])
&lt;/code&gt;&lt;/pre&gt;
 &lt;p&gt;另外一种网络结构，韩国人那篇文章，网络构造如下：&lt;/p&gt;
 &lt;pre&gt;  &lt;code&gt;def __build_network(self):
    embedding_layer = Embedding(
        self.corpus_size,
        EMBEDDING_DIM,
        weights=[self.embedding_matrix],
        input_length=MAX_SEQUENCE_LENGTH,
        trainable=False)
    # train a 1D convnet with global maxpooling
    sequence_input = Input(shape=(MAX_SEQUENCE_LENGTH, ), dtype=&amp;apos;int32&amp;apos;)
    embedded_sequences = embedding_layer(sequence_input)
    conv_blocks = []
    for sz in self.filter_sizes:
        conv = Convolution1D(
            self.num_filters,
            sz,
            activation=&amp;quot;relu&amp;quot;,
            padding=&amp;apos;valid&amp;apos;,
            strides=1)(embedded_sequences)
        conv = MaxPooling1D(2)(conv)
        conv = Flatten()(conv)
        conv_blocks.append(conv)
    z = Merge(
        conv_blocks,
        mode=&amp;apos;concat&amp;apos;) if len(conv_blocks) &amp;gt; 1 else conv_blocks[0]
    z = Dropout(0.5)(z)
    z = Dense(self.hidden_dims, activation=&amp;quot;relu&amp;quot;)(z)
    preds = Dense(self.class_num, activation=&amp;quot;softmax&amp;quot;)(z)
    rmsprop = RMSprop(lr=0.001)
    self.model = Model(sequence_input, preds)
    self.model.compile(
        loss=&amp;apos;categorical_crossentropy&amp;apos;,
        optimizer=rmsprop,
        metrics=[&amp;apos;acc&amp;apos;])
&lt;/code&gt;&lt;/pre&gt;
 &lt;h2&gt;LSTM&lt;/h2&gt;
 &lt;p&gt;由于我这边的task是对文章进行分类，序列太长，直接接LSTM后直接爆内存，所以我在文章序列直接，接了两层Conv1D+MaxPool1D来提取维度较低的向量表示然后接入LSTM，网络结构代码如下：&lt;/p&gt;
 &lt;pre&gt;  &lt;code&gt;def __build_network(self):
    embedding_layer = Embedding(
        self.corpus_size,
        EMBEDDING_DIM,
        weights=[self.embedding_matrix],
        input_length=MAX_SEQUENCE_LENGTH,
        trainable=False)
    # train a 1D convnet with global maxpooling
    sequence_input = Input(shape=(MAX_SEQUENCE_LENGTH, ), dtype=&amp;apos;int32&amp;apos;)
    embedded_sequences = embedding_layer(sequence_input)
    x = Convolution1D(
        self.num_filters, 5, activation=&amp;quot;relu&amp;quot;)(embedded_sequences)
    x = MaxPooling1D(5)(x)
    x = Convolution1D(self.num_filters, 5, activation=&amp;quot;relu&amp;quot;)(x)
    x = MaxPooling1D(5)(x)
    x = LSTM(64, dropout_W=0.2, dropout_U=0.2)(x)
    preds = Dense(self.class_num, activation=&amp;apos;softmax&amp;apos;)(x)
    print preds.get_shape()
    rmsprop = RMSprop(lr=0.01)
    self.model = Model(sequence_input, preds)
    self.model.compile(
        loss=&amp;apos;categorical_crossentropy&amp;apos;,
        optimizer=rmsprop,
        metrics=[&amp;apos;acc&amp;apos;])
&lt;/code&gt;&lt;/pre&gt;
 &lt;p&gt;CNN 结果：  &lt;br /&gt;
  &lt;img alt="text_classifier_cnn03.png" src="http://images.duanshishi.com/mac_blogs_text_classifier_cnn_result01.png"&gt;&lt;/img&gt;  &lt;br /&gt;
C-LSTM 结果：  &lt;br /&gt;
  &lt;img alt="text_classifier_cnn03.png" src="http://images.duanshishi.com/mac_blogs_text_classifier_cnn_result02.png"&gt;&lt;/img&gt;&lt;/p&gt;
 &lt;p&gt;整个实验的结果由于深度学习这部分都是在公司资源上跑的，没有真正意义上地去做一些trick来调参来提高性能，这里所有的代码的网络配置包括参数都仅做参考，更深地工作需要耗费更多的时间来做参数的优化。&lt;/p&gt;
 &lt;p&gt;PS: 这里发现了一个keras 1.2.2的bug， 在写回调函数  &lt;code&gt;TensorBoard&lt;/code&gt;，当histogram_freq=1时，显卡占用明显增多，M40的24g不够用，个人感觉应该是一个bug，但是考虑到1.2.2而非2.0，可能后面2.0都优化了。&lt;/p&gt;
 &lt;p&gt;所有的代码都在github上:  &lt;a href="https://github.com/burness/tensorflow-101/tree/master/nlp/text_classifier/scripts"&gt;tensorflow-101/nlp/text_classifier/scripts&lt;/a&gt;&lt;/p&gt;
 &lt;h2&gt;总结和展望&lt;/h2&gt;
 &lt;p&gt;在本文的实验效果中，虽然基于深度学习的方法和传统方法相比没有什么优势，可能原因有几个方面：&lt;/p&gt;
 &lt;ul&gt;
  &lt;li&gt;Pretrained Word2vec Model并没有覆盖新闻中切分出来的词，而且比例还挺高，如果能用网络新闻语料训练出一个比较精准的Pretrained Word2vec，效果应该会有很大的提升；&lt;/li&gt;
  &lt;li&gt;可以增加模型训练收敛的trick以及优化器，看看是否有准确率的提升；&lt;/li&gt;
  &lt;li&gt;网络模型参数到现在为止，没有做过深的优化。&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt; &lt;a href="https://itindex.net/"  title="IT 资讯"&gt;&lt;img src="https://itindex.net/images/iconWarning.gif" title="IT 资讯" border="0"/&gt; &lt;/a&gt;</description>
      <category>机器学习 NLP 深度学习 machine learning tensorflow</category>
      <guid isPermaLink="true">https://itindex.net/detail/57060-%E8%87%AA%E7%84%B6%E8%AF%AD%E8%A8%80-%E6%96%87%E6%9C%AC-%E5%88%86%E7%B1%BB</guid>
      <pubDate>Sun, 18 Jun 2017 14:05:03 CST</pubDate>
    </item>
    <item>
      <title>周明：未来5-10年，自然语言处理将走向成熟</title>
      <link>https://itindex.net/detail/57020-%E6%9C%AA%E6%9D%A5-%E8%87%AA%E7%84%B6%E8%AF%AD%E8%A8%80-%E6%88%90%E7%86%9F</link>
      <description>&lt;p&gt;  &lt;br /&gt;&lt;/p&gt;
 &lt;p&gt;  &lt;img alt="&amp;#21608;&amp;#26126; &amp;#24494;&amp;#36719;&amp;#20122;&amp;#27954;&amp;#30740;&amp;#31350;&amp;#38498;&amp;#21103;&amp;#38498;&amp;#38271;" src="https://wx4.sinaimg.cn/large/4caedc7agy1fgku0af0oij21kw11ykjn.jpg"&gt;&lt;/img&gt;&lt;/p&gt;
 &lt;p&gt;​&lt;/p&gt;
 &lt;p&gt;
近日，微软亚洲研究院副院长周明在「自然语言处理前沿技术分享会」上，与大家讲解了自然语言处理（NLP）的最新进展，以及未来的研究方向，以下内容由CSDN记者根据周明博士的演讲内容编写，略有删减。 &lt;/p&gt;
 &lt;p&gt;
周明博士于1999年加入微软亚洲研究院，不久开始负责自然语言研究组。近年来，周明博士领导研究团队与微软产品组合作开发了微软小冰（中国）、Rinna（日本）、Zo（美国）等聊天机器人系统。周明博士发表了120余篇重要会议和期刊论文（包括50篇以上的ACL文章），拥有国际发明专利40余项。&lt;/p&gt;
 &lt;p&gt;  &lt;br /&gt;&lt;/p&gt;
 &lt;h1&gt;微软亚洲研究院在机器翻译、中国文化、聊天机器人和阅读理解的最新进展&lt;/h1&gt;
 &lt;p&gt;  &lt;br /&gt;&lt;/p&gt;
 &lt;h2&gt;机器翻译&lt;/h2&gt;
 &lt;p&gt;  &lt;br /&gt;&lt;/p&gt;
 &lt;p&gt;今年微软首先在语音翻译上全面采用了神经网络机器翻译，并拓展了新的翻译功能，我们叫做Microsoft Translator
Live Feature（现场翻译功能），在演讲和开会时，实时自动在手机端或桌面端，把演讲者的话翻译成多种语言。&lt;/p&gt;
 &lt;p&gt;  &lt;img alt="&amp;#22270;1 &amp;#31070;&amp;#32463;&amp;#32593;&amp;#32476;&amp;#26426;&amp;#22120;&amp;#32763;&amp;#35793;" src="http://r.sinaimg.cn/large/tc/mmbiz_qlogo_cn/569bb819f631c5d17d822784f2cf783a.jpg"&gt;&lt;/img&gt;&lt;/p&gt;
 &lt;p&gt;
图1概括了神经网络机器翻译，简要的说，就是对源语言的句子进行编码，一般都是用长短时记忆（LSTM）进行编码。编码的结果就是有很多隐节点，每个隐节点代表从句首到当前词汇为止，与句子的语义信息。基于这些隐节点，通过一个注意力的模型来体现不同隐节点对于翻译目标词的作用。通过这样的一个模式对目标语言可以逐词进行生成，直到生成句尾。中间在某一阶段可能会有多个翻译，我们会保留最佳的翻译，从左到右持续。  &lt;br /&gt;
&lt;/p&gt;
 &lt;p&gt;
这里最重要的技术是对于源语言的编码，还有体现不同词汇翻译的，不同作用的注意力模型。我们又持续做了一些工作，引入了语言知识。因为在编码的时候是仅把源语言和目标语言看成字符串，没有体会内在的词汇和词汇之间的修饰关系。我们把句法知识引入到神经网络编码、解码之中，这是传统的长短时记忆LSTM，这是模型，我们引入了句法，得到了更佳的翻译，这使大家看到的指标有了很大程度的提升。&lt;/p&gt;
 &lt;p&gt;  &lt;img alt="&amp;#22270;2 &amp;#23558;&amp;#30693;&amp;#35782;&amp;#22270;&amp;#35889;&amp;#32435;&amp;#20837;&amp;#20256;&amp;#32479;&amp;#30340;&amp;#31070;&amp;#32463;&amp;#32593;&amp;#32476;&amp;#26426;&amp;#22120;&amp;#32763;&amp;#35793;&amp;#20013;" src="http://r.sinaimg.cn/large/tc/mmbiz_qlogo_cn/1e89e25b41ce19b9bedd75ebe87656c6.jpg"&gt;&lt;/img&gt;&lt;/p&gt;
 &lt;p&gt;
此外，我们还考虑到在很多领域是有知识图谱的，我们想把知识图谱纳入到传统的神经网络机器翻译当中，来规划语言理解的过程。我们的一个假设就是虽然大家的语言可能不一样，但是体现在知识图谱的领域上可能是一致的，就用知识图谱增强编码、解码。具体来讲，就是对于输入句子，先映射到知识图谱，然后再基于知识图谱增强解码过程，使得译文得到进一步改善。  &lt;br /&gt;
&lt;/p&gt;
 &lt;p&gt;  &lt;br /&gt;&lt;/p&gt;
 &lt;p&gt;以上两个工作都发表在本领域最重要的会议ACL上，得到很多学者的好评。&lt;/p&gt;
 &lt;p&gt;  &lt;img alt="&amp;#22270;3 Microsoft Translator Live Feature&amp;#24037;&amp;#20316;&amp;#22330;&amp;#26223;" src="http://r.sinaimg.cn/large/tc/mmbiz_qlogo_cn/df39c9244bc186ed697c3788d84b912b.jpg"&gt;&lt;/img&gt;&lt;/p&gt;
 &lt;h2&gt;中国文化&lt;/h2&gt;
 &lt;p&gt;  &lt;br /&gt;&lt;/p&gt;
 &lt;p&gt;
大家会说，中国文化和人工智能有什么关系？中国文化最有代表性的是对联、诗歌、猜谜语等等，它怎么能够用人工智能体现呢？好多人一想这件事就觉得不靠谱，没法做。但是我们微软亚洲研究院就利用然语言处理的技术，尤其是机器翻译的经验，果断进军到中国文化里，这个在全世界独树一帜。&lt;/p&gt;
 &lt;p&gt;
在2004年的时候，当时我们的沈向洋院长领导我们做了一个微软对联：用户输入上联，电脑自动对出下联，语句非常工整，甚至更进一步把横批对出来。这个系统在当时跟新浪进行了合作，做成了一个手机游戏，用户可以通过发短信的方式，将上联发过去，然后通过短信接收下联。当时大家都觉得很有意思。微软对联也是世界上第一次采用机器翻译的技术来模拟对联全过程。过去也有人做对联游戏，都是用规则的方法写很多很多的语言学规则，确保什么样的词跟什么样的词对，并符合对仗、平仄一堆语言学的规则，但是实际效果不好，也没有人使用。&lt;/p&gt;
 &lt;p&gt;
我们把机器翻译技术巧妙用在中国文化上，解决了这个问题。在微软对联的基础上，我们继续去尝试其他的中国文化，其中有一个特色就是字谜。&lt;/p&gt;
 &lt;p&gt;
我们小时候都爱猜字谜，领奖品。字谜是给你谜面让你猜谜底。当然也可以反过来，给定一个谜底，让你出谜面。现在，已经可以用电脑来模拟整个猜字谜和出字谜的过程了，我们也把这个功能放在了微软对联的网站上。&lt;/p&gt;
 &lt;p&gt;
往后，更进一步，我们还会用人工智能技术来发展中国最经典的文化，包括绝句和律诗等。例如宋词有长短句，我们也可以用同样的技术来创作律诗、绝句和宋词。&lt;/p&gt;
 &lt;p&gt;
最近，微软亚洲研究院的主管研究员宋睿华博士就在用这种神经网络的技术来进行诗歌的创作。这件事非常有创意：用户提交一个照片，让系统进行，然后变成一首诗，自由体的诗。写诗是很不容易的，因为要体现意境。你说这是山，这是水，这不叫诗；诗歌必须要升华、凝练，用诗的语言来体现此时的情或者景，由景入情，由情入景，这才是诗。&lt;/p&gt;
 &lt;p&gt;
不久前，微软小冰发布了微软小冰写诗的技能，引起了很多人的关注。我们也在此基础上展示其他的中国文化，把人工智能和中国文化巧妙结合起来，弘扬中国文化。&lt;/p&gt;
 &lt;p&gt;  &lt;br /&gt;&lt;/p&gt;
 &lt;h2&gt;对话即平台&lt;/h2&gt;
 &lt;p&gt;  &lt;br /&gt;&lt;/p&gt;
 &lt;p&gt;“对话即平台”英文叫做“Conversation as a Platform
（CaaP）”。2016年，微软首席执行官萨提亚在大会上提出了CaaP这个概念，他认为继图形界面的下一代就是对话，它会对整个人工智能、计算机设备带来一场新的革命。  &lt;br /&gt;
&lt;/p&gt;
 &lt;p&gt;  &lt;br /&gt;&lt;/p&gt;
 &lt;p&gt;  &lt;img alt="&amp;#22270;4 &amp;#36890;&amp;#29992;&amp;#23545;&amp;#35805;&amp;#24341;&amp;#25806;&amp;#26550;&amp;#26500;" src="http://r.sinaimg.cn/large/tc/mmbiz_qlogo_cn/a90ef54aaec127fee6423701c3387819.jpg"&gt;&lt;/img&gt;&lt;/p&gt;
 &lt;p&gt;  &lt;br /&gt;&lt;/p&gt;
 &lt;h2&gt;为什么要提到CaaP这个概念呢？我个人认为，有两个原因。&lt;/h2&gt;
 &lt;p&gt;  &lt;br /&gt;&lt;/p&gt;
 &lt;p&gt;
● 源于大家都已经习惯用社交手段，如微信、Facebook与他人聊天的过程。我们希望将这种通过自然的语言交流的过程呈现在当今的人机交互中，而语音交流的背后就是对话平台。&lt;/p&gt;
 &lt;p&gt;
● 现在大家面对的设备有的屏幕很小，有的甚至没有屏幕，所以通过语音的交互，更为自然直观的。因此，我们是需要对话式的自然语言交流的，通过语音助手来帮忙完成。&lt;/p&gt;
 &lt;p&gt;
而语音助手又可以调用很多Bot，来完成一些具体的功能，比如说定杯咖啡，买一个车票等等。芸芸众生，有很多很多需求，每个需求都有可能是一个小Bot，必须有人去做这个Bot。而于微软而言，我们作为一个平台公司，希望把自己的能力释放出来，让全世界的开发者，甚至普通的学生就能开发出自己喜欢的Bot，形成一个生态的平台，生态的环境。&lt;/p&gt;
 &lt;p&gt;如何从人出发，通过智能助理，再通过Bot体现这一生态呢？微软在做CaaP的时候，实际上有两个主要的产品策略。&lt;/p&gt;
 &lt;p&gt;
第一个是小娜，通过手机和智能设备介入，让人与电脑进行交流：人发布命令，小娜理解并执行任务。同时，小娜作为你的贴身处理，也理解你的性格特点、喜好、习惯，然后主动给你一些贴心提示。比如，你过去经常路过某个地方买牛奶，在你下次路过的时候，她就会提醒你，问你要不要买。她从过去的被动到现在的主动，由原来的手机，到微软所有的产品，比如Xbox和Windows，都得到了应用。现在，小娜已经拥有超过1.4亿活跃用户，在数以十亿级计的设备上与人们进行交流。现在，小娜覆盖的语言已经有十几种语言，包括中文。小娜还在不断发展，这背后有很多自然语言技术来自微软研究院，包括微软亚洲研究院。&lt;/p&gt;
 &lt;p&gt;
第二个就是小冰。它是一种新的理念，很多人一开始不理解。人们跟小冰一起的这种闲聊有什么意思？其实闲聊也是人工智能的一部分，我们人与人见面的时候，寒喧、问候、甚至瞎扯，天南海北地聊，这个没有智能是完成不了的，实际上除了语言方面的智能，还得有知识智能，必须得懂某一个领域的知识才能聊起来。所以，小冰是试图把各个语言的知识融汇贯通，实现一个开放语言自由的聊天过程。这件事，在全球都是比较创新的。现在，小冰已经覆盖了三种语言：中文、日文、英文，累积了上亿用户。很多人跟它聊天乐此不疲，而平均聊天的回数多达23轮。这是在所有聊天机器人里面遥遥领先的。而平时聊天时长大概是25分钟左右。小冰背后三种语言的聊天机器人也都来自于微软亚洲研究院。&lt;/p&gt;
 &lt;p&gt;无论是小冰这种闲聊，还是小娜这种注重任务执行的技术，其实背后单元处理引擎无外乎就三层技术：&lt;/p&gt;
 &lt;p&gt;● 通用聊天，需要掌握沟通技巧、通用聊天数据、主题聊天数据，还要知道用户画像，投其所好。&lt;/p&gt;
 &lt;p&gt;
● 信息服务和问答，需要搜索的能力，问答的能力，还需要对常见问题表进行收集、整理和搜索，从知识图表、文档和图表中找出相应信息，并且回答问题，我们统称为Info
Bot。&lt;/p&gt;
 &lt;p&gt;
● 面向特定任务的对话能力，例如定咖啡、定花、买火车票，这个任务是固定的，状态也是固定的，状态转移也是清晰的，那么就可以用Bot一个一个实现。你有一个调度系统，你知道用户的意图就调用相应的Bot
执行相应的任务。它用到的技术就是对用户意图的理解，对话的管理，领域知识，对话图谱等等。&lt;/p&gt;
 &lt;p&gt;
实际上，人类拥有这全部三个智能，而且人知道什么时候用什么智能，就是因为最上头，还有一个调度系统。你跟我闲聊的时候，我就会跟你闲聊；你跟我严肃地问问题，那么我就会回答你的问题。通过一个调度系统，可以想象，我们在做人机对话的时候，其实是在根据用户的提问调用不同的引擎，再根据不同的意图调用不同的Bot。这样整体来实现一个所谓的人机交互全过程。这背后的技术由不同的研究员分别去进行实施，然后再整体通过跟产品组合作体现一个完美的产品流程。&lt;/p&gt;
 &lt;p&gt;
微软想把有关的能力释放给全世界，让每个人都能够体验人工智能的好处，让开发者开发自己的Bot。但是开发者的机器不懂自然语言，怎么办呢？我们就通过一个叫Bot
Framework的工具、平台来实现。&lt;/p&gt;
 &lt;p&gt;
任何一个开发者只用几行代码就可以完成自己所需要的Bot。这里有一个简单的例子，这个人想做一个披萨的Bot，他用Bot的框架，这几行语句填入相应的知识，相应的数据，就可以实现一个简单的定披萨的Bot。你可以想象很多小业主，没有这种开发能力，但是就是可以简单操作几下，就可以做一个小Bot吸引来很多客户。&lt;/p&gt;
 &lt;p&gt;这里面有很多关键技术。微软有一个叫做LUIS（Language Understanding Intelligent
Service）的平台，提供了用户的意图理解能力、实体识别能力、对话的管理能力等等。比如说这句话“read me the
headlines”，我们识别的结果是他想做朗读，内容就是今天的头条新闻。再比如说“Pause for 5
minutes”，我们理解它的意思是暂停，暂停多长时间？有一个参数：5分钟。所以，通过LUIS，我们可以把意图和重要的信息抽取出来，让后面Bot来读取。&lt;/p&gt;
 &lt;p&gt;  &lt;img alt="&amp;#22270;5 &amp;#24494;&amp;#36719;&amp;#35821;&amp;#35328;&amp;#29702;&amp;#35299;&amp;#26381;&amp;#21153;" src="http://r.sinaimg.cn/large/tc/mmbiz_qlogo_cn/82e12043420bbc901da617124df397d3.jpg"&gt;&lt;/img&gt;&lt;/p&gt;
 &lt;p&gt;
微软的聊天对话技术也在与很多企业合作，赋能这些企业。比如，我们跟敦煌研究院合作。敦煌研究院提供出数据，我们则把我们的引擎加上去，很快就建立了一个敦煌研究院的客服系统，借助敦煌研究院公众号，可以让用户和它聊与敦煌有关的事。用户也可以问问题，例如敦煌研究院什么时候开门、有什么好吃的，他可以把聊天、对话都集成在一个平台上，发挥人工智能在公众号上的作用。  &lt;br /&gt;
&lt;/p&gt;
 &lt;p&gt;  &lt;img alt="&amp;#22270;6 &amp;#25958;&amp;#29004;&amp;#20844;&amp;#20247;&amp;#21495;&amp;#23458;&amp;#26381;&amp;#31995;&amp;#32479;" src="http://r.sinaimg.cn/large/tc/mmbiz_qlogo_cn/89f89258bee74bc3d544ec34a5c82c23.jpg"&gt;&lt;/img&gt;&lt;/p&gt;
 &lt;h2&gt;阅读理解&lt;/h2&gt;
 &lt;p&gt;  &lt;br /&gt;&lt;/p&gt;
 &lt;p&gt;
阅读理解顾名思义就是给你一篇文章，看你理解到什么程度。人都有智能，而且是非常高的智能。除了累积知识，还要懂一些常识。具体测试你的阅读能力、理解能力的手段，一般都是给一篇文章，再你一些问题。你能来就说明你理解了，答不上来就说明你不理解。对电脑的测试也是这样。&lt;/p&gt;
 &lt;p&gt;  &lt;img alt="&amp;#22270;7 &amp;#33713;&amp;#33589;&amp;#27827;&amp;#20171;&amp;#32461;" src="http://r.sinaimg.cn/large/tc/mmbiz_qlogo_cn/7e99ad5d9530365737f7225675643a53.jpg"&gt;&lt;/img&gt;&lt;/p&gt;
 &lt;p&gt;
我给大家举个例子，说明一下阅读理解。图7中，这一段话的大意是在介绍莱茵河，它流经哪些国家，最终在哪里注入大海。莱茵河畔最大的城市是德国科隆。它是中欧和西欧区域的第二长河流，仅次于多瑙河之后，约1230公里。然后，我们问的问题是，什么河比莱茵河长？当你读完了这段话，你就要推断，“after”在这里是什么意思，从而才能得出正确答案是多瑙河。电脑要做这道题，实际上要仔细解析很多问题，最终才能作出回答。  &lt;br /&gt;
&lt;/p&gt;
 &lt;p&gt;  &lt;br /&gt;&lt;/p&gt;
 &lt;h2&gt;未来5-10年，NLP将走向成熟&lt;/h2&gt;
 &lt;p&gt;  &lt;br /&gt;&lt;/p&gt;
 &lt;p&gt;最后，再介绍一下我对自然语言处理目前存在的问题以及未来的研究方向的一些考虑，供大家参考。&lt;/p&gt;
 &lt;p&gt;
● 随着大数据、深度学习、云计算这三大要素推动，所谓认知智能，尤其是语言智能跟感知智能一样会有长足的发展。你也可以说，自然语言处理迎来了60余年发展历史上最好的一个时期，进步最快的一个时期，从初步的应用到搜索、聊天机器人上，到通过对上下文的理解，知识的把握，它的处理能力得到长足的进步。具体来讲，我认为，口语机器翻译肯定会完全普及，将来我认为它就是手机上的标配。任何人出国，无论到了哪个国家，拿起电话来你说你的母语，跟当地人交流不会有太大的问题，而且是非常自如的过程，就跟你打电话一样。所以，我认为口语机器翻译会完全普及。虽然这不意味着同声翻译能彻底颠覆，也不意味着这种专业领域的文献的翻译可以彻底解决；但我认为还是会有很大的进展。&lt;/p&gt;
 &lt;p&gt;
● 自然语言的会话、聊天、问答、对话达到实用程度。这是什么意思？这意味着在常见的场景下，通过人机对话的过程完成某项任务。这个是可以完全实现，或者跟某个智能设备进行交流，比如说关灯、打开电脑、打开纱窗这种一点问题都没有，包括带口音的说话都可以完全听懂。但是同样，这也不代表任何话题、任何任务、用任何变种的语言去说都可以达到。目前离那个目标还很远，我们也在努力。&lt;/p&gt;
 &lt;p&gt;
● 智能客服加上人工客服完美的结合，一定会大大提高客服的效率。我认为很多重复的客服工作，比如说问答，还有简单的任务，基本上人工智能都可以解决。但是复杂的情况下仍然不能解决。所以，它实际上是人工智能跟人类智能完美结合来提高一个很好的生产力，这个是没有问题的。&lt;/p&gt;
 &lt;p&gt;
● 自动写对联、写诗、写新闻稿和歌曲等等，今天可能还是一个新鲜的事物，但是5到10年一定都会流行起来，甚至都会用起来。比如说写新闻稿，给你一些数据，这个新闻稿草稿马上就写出来，你要做的就是纠正，供不同的媒体使用等。&lt;/p&gt;
 &lt;p&gt;● NLP将推动语音助手、物联网、智能硬件、智能家居的普及。&lt;/p&gt;
 &lt;p&gt;● NLP与其他AI技术一起在金融、法律、教育、医疗等垂直领域将得到广泛应用。&lt;/p&gt;
 &lt;p&gt;但是，我们也清醒地看到，虽然有一些很好的预期，但是自然语言处理还有很多很多没有解决的问题。以下几个我认为比较重要的。&lt;/p&gt;
 &lt;p&gt;
1.通过用户画像实现个性化服务。现在自然语言处理基本上用户画像用得非常非常少。人与人的对话，其实是对不同的人说不同的话，因为我们知道对话的人的性格、特点、知识层次，我了解了这个用户，知道用户的画像，那么在对话的时候就会有所调整。目前来讲，我们还远远不能做到这一点。&lt;/p&gt;
 &lt;p&gt;
2.通过可解释的学习洞察人工智能机理。现在自然语言处理跟其他的人工智能一样，都是通过一个端对端的训练，而其实里面是一个黑箱，你也不知道发生了什么，哪个东西起作用，哪个东西没有起作用。我们也在思考，有没有一种可解释的人工智能，帮助我们知道哪些地方发挥了作用，哪些地方是错的，然后进行修正，快速调整我们的系统。目前还没有针对这个问题很好的解决方案，尽管有一些视觉化的工作，但是都比较粗浅，还没有达到最精准的判定和跟踪。&lt;/p&gt;
 &lt;p&gt;
3.通过知识与深度学习的结合提升效率。所谓知识和深度学习的结合，有可能很多情况下是需要有人类知识的。比如说客服，是有一些常见处理过程的。那么出现问题我该怎么解决？这些知识如何跟数据巧妙结合，从而加快学习的过程、提高学习的质量，这也是比较令人关注的。&lt;/p&gt;
 &lt;p&gt;
4.通过迁移学习实现领域自适应。如果们想翻某一个专业领域，比如说计算机领域，可能现有的翻译工具翻得不好。所以大家都在研究，有没有一种办法，能够帮助机器进行迁移学习，能够更好的运用到语音自适应上。&lt;/p&gt;
 &lt;p&gt;
5.通过强化学习实现自我演化。这就是说我们自然语言系统上线之后有很多人用，得到了有很多人的反馈，包括显示的反馈、隐式的反馈，然后通过强化学习不断的提升系统。这就是系统的自我演化。&lt;/p&gt;
 &lt;p&gt;
6.最后，我认为也是非常关键的，通过无监督学习充分利用未标注数据。现在都依赖于带标注的数据，没有带标注的数据没有办法利用。但是很多场景下，标注数据不够，你找人工标注代价又极大。那么如何用这些没有标注的数据呢？这就要通过一个所谓无监督的学习过程，或者半监督的学习过程增强整体的学习过程。这里也是目前研究上非常令人关注的。&lt;/p&gt;
 &lt;p&gt;  &lt;br /&gt;&lt;/p&gt;
 &lt;p&gt;本文由CSDN根据周明博士的演讲内容编写，已获授权转载&lt;/p&gt; &lt;br /&gt; &lt;img src="http://simg.sinajs.cn/blog7style/images/special/1265.gif"&gt;&lt;/img&gt; &lt;div&gt; &lt;a href="https://itindex.net/"  title="IT 资讯"&gt;&lt;img src="https://itindex.net/images/iconWarning.gif" title="IT 资讯" border="0"/&gt; &lt;/a&gt;</description>
      <category />
      <guid isPermaLink="true">https://itindex.net/detail/57020-%E6%9C%AA%E6%9D%A5-%E8%87%AA%E7%84%B6%E8%AF%AD%E8%A8%80-%E6%88%90%E7%86%9F</guid>
      <pubDate>Wed, 14 Jun 2017 17:58:36 CST</pubDate>
    </item>
    <item>
      <title>为什么说Python是伟大的入门语言</title>
      <link>https://itindex.net/detail/56961-python-%E8%AF%AD%E8%A8%80</link>
      <description>&lt;p&gt;  &lt;img alt="&amp;#22823;&amp;#25968;&amp;#25454;" height="432" src="http://www.36dsj.com/wp-content/uploads/2017/05/big_data_151466624_rafal_olechowski1.jpg" width="640"&gt;&lt;/img&gt;&lt;/p&gt; &lt;p&gt;作者：Elliott Hauser&lt;/p&gt; &lt;p&gt;翻译：黑色巧克力&lt;/p&gt; &lt;p&gt;本文作者列举了一些Python特性，并认为Python是最适合入门的编程语言，一起来看一下。&lt;/p&gt; &lt;p&gt;最近发表了三篇关于我的艺术史背景是如何影响我教学的文章。现在要分享一篇，为什么Python对于青少年和成年人是入门语言的最佳选择。&lt;/p&gt; &lt;p&gt;伟大的入门编程语言有什么特征呢？或者换一种方式问，“当我们教他们编程时，应该给予他们什么？”对于成年人和青少年学生，我认为以下五点非常重要。&lt;/p&gt; &lt;p&gt;  &lt;strong&gt;学生从入门语言获得的五样东西&lt;/strong&gt;&lt;/p&gt; &lt;ul&gt;  &lt;li&gt;非常棒的首次体验，就像一本书的第一页，首先需要“入迷”，学习新知识不可避免的会遇到挫折，但要有持续的热情和好奇心，这对于那些从未接触过编码的年轻人来说是至关重要的；&lt;/li&gt;  &lt;li&gt;Web编程的能力，对于职业发展和程序工艺来说，Web编程越来越重要，学生有机会就应当掌握一定的Web架构基础；&lt;/li&gt;  &lt;li&gt;桌面编程能力，尽管将来趋势将更多的转移到Web应用上，但没什么能比开发和运行一个本地程序来的直接；&lt;/li&gt;  &lt;li&gt;有市场的职业技能，尽管在学术和业余编程中已经非常出色，但教授学生的技能在职业环境中也应该能派上用场；&lt;/li&gt;  &lt;li&gt;社区支持和轻松的语言环境，这里再一次强调，对于那些从未接触过编码的年轻人来说是至关重要的。&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;一些老师或者学生可能不同意这些作为入门语言的必要条件。但我的观点和经验是，没有任何一门语言能像Python一样做到以下五点。&lt;/p&gt; &lt;p&gt;  &lt;strong&gt;1.非常棒的入门体验&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;按照惯例，用户写的第一个程序是打印“Hello World”。在所有实现“helHello World”程序的语言中，Python可以说是最简单的。只需要在Python编译器中简单的输入以下这些，然后按下回车。&lt;/p&gt; &lt;pre&gt;Interactive Python Console&amp;gt;&amp;gt;&amp;gt; print(&amp;quot;Hello World&amp;quot;)
Hello World&amp;gt;&amp;gt;&amp;gt;&lt;/pre&gt; &lt;p&gt;这个互动示例值得尝试！&lt;/p&gt; &lt;p&gt;Python代码的可读性使它成为入门语言的最佳选择，尤其是当它与语法冗长明显的Java语言对比时：&lt;/p&gt; &lt;pre&gt;publicclassHelloWorld{publicstaticvoidmain(String[] args){
        System.out.println(&amp;quot;Hello, World&amp;quot;);
    }

}&lt;/pre&gt; &lt;p&gt;编写以上Java代码后，还需要进行编译，然后在命令行运行。这些不可避免的流程让学生觉得编程困难。而那些输入 print(“Hello World”) 然后按下回车就能实现的学生，会有机会和信心学习更多。&lt;/p&gt; &lt;p&gt;  &lt;strong&gt;2.Web编程&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;Web上Python广为熟悉，不同于C.Frameworks这样的低级语言，而像Django，Pyramid和Flask，可以让学生创造出真正的Web应用程序，这类应用程序与他们每天使用的网站一样强大。Flask是我个人非常喜欢传播的语言，因为它与免费的Heroku账号组合，能让学生在一个小时之内部署他们自己的简易博客。添加一条web应用的响应路径也是如此简单。&lt;/p&gt; &lt;pre&gt;@app.route(&amp;quot;/about&amp;quot;)defabout():returnrender_template(&amp;quot;about.html&amp;quot;, now=datetime.datetime.now())&lt;/pre&gt; &lt;p&gt;这几行代码并不简单，但几次课程之后学生便可以自己理解。在信心和好奇的驱使下，学会以最基本的方式响应Web应用请求，也是巨大的进步。&lt;/p&gt; &lt;p&gt;  &lt;strong&gt;3.桌面应用&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;专为Web设计的PHP和JavaScript语言限制了学生对Web的开发，然而Python在本地计算机开发同样广为熟悉。Pygame，wxPython和其他为桌面程序使用的开发库，让学生勇于建立和运行他们自己的桌面应用。Katie Cunningham写了一本我认为是  &lt;a href="http://therealkatie.net/blog/tags/pygame/" rel="nofollow,noindex noopener noreferrer" target="_blank"&gt;关于Pygame教学的权威指南&lt;/a&gt;的书。我使用Pygame教青少年和毕业生开发桌面应用，乐趣多多。下面是一款被称为Starpusher的游戏，强烈推荐教学开发。&lt;/p&gt; &lt;p&gt;  &lt;img alt="&amp;#22823;&amp;#25968;&amp;#25454;" height="497" src="http://www.36dsj.com/wp-content/uploads/2017/05/847e15e9-242b-3b16-9d83-2eb80e340f20.png" width="640"&gt;&lt;/img&gt;&lt;/p&gt; &lt;p&gt;这款游戏可以从 pygame.org  &lt;a href="http://pygame.org/project-Star+Pusher+%28Sokoban+clone%29-1900-.html" rel="nofollow,noindex noopener noreferrer" target="_blank"&gt;下载&lt;/a&gt;，或者从我Github的仓库  &lt;a href="https://github.com/silshack/starpusher" rel="nofollow,noindex noopener noreferrer" target="_blank"&gt;获取&lt;/a&gt;，它也可以在Raspberry Pis平台上预装。&lt;/p&gt; &lt;p&gt;  &lt;strong&gt;4.专业技能&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;不同于Scratch或者Logo语言教学，Python在专业和学术界有更广泛的用途。它是一门可以伴随学生开始和成长的语言。如果学习低级语言会发现Python与C紧密融合，而探索如Ruby的更高级语言会发现也能平滑过渡。如果想对Web应用程序进行更紧凑的控制将发现Javascript技术能与Python Web框架很好地结合在一起。倘若要探索像函数式编程的范例，会发现可以在不学习一门新语言的情况下实现。&lt;/p&gt; &lt;p&gt;然而最重要的是，开始编程时有更好体验的学生，会有足够的意愿和好奇心去发展最符合自己目标的专业技能。&lt;/p&gt; &lt;p&gt;  &lt;strong&gt;5.社区支持&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;我之前写过如何让代码有内涵。学生参加社区交流会就是再明显不过的方法，我也常去参加（更多信息  &lt;a href="http://blog.trinket.io/art-history-programming-meetups/" rel="nofollow,noindex noopener noreferrer" target="_blank"&gt;点击这里&lt;/a&gt;）。Python社区交流会必然最受欢迎，因为那是开始探索事物真相和接触未来挑战的绝佳场所。&lt;/p&gt; &lt;p&gt;样例实际发挥作用的部分是内置于Python的Turtle组件，它提供了简单有效的方式去教授抽象的Python基础知识。Turtle组件第一次被MIT’s Seymour Papert采用，后来到了1960年在设计Logo语言中得到进一步推广。  &lt;a href="http://blip.tv/file/1947495" rel="nofollow,noindex noopener noreferrer" target="_blank"&gt;这里&lt;/a&gt;可以看到2009年关于组件的最新特征介绍。Trinket使得Turtle组件更易使用和学习。更多信息可以查看  &lt;a href="https://trinket.io/" rel="nofollow,noindex noopener noreferrer" target="_blank"&gt;我们主页&lt;/a&gt;上的交互示例。&lt;/p&gt; &lt;p&gt;  &lt;strong&gt;使用Python教学吧！&lt;/strong&gt;&lt;/p&gt; &lt;ul&gt;  &lt;li&gt;我的下一篇文章会写关于Python教学的最好互动资源。同时我在下面列了一份清单，包括为初学者提供帮助的社区资源，以及其他讨论为什么Python是一门伟大的入门语言的文章，希望对你有所帮助！&lt;/li&gt;  &lt;li&gt;Python软件基金会维护的   &lt;a href="https://wiki.python.org/moin/BeginnersGuide" rel="nofollow,noindex noopener noreferrer" target="_blank"&gt;新手教程&lt;/a&gt;和   &lt;a href="https://docs.python.org/2/tutorial/index.html#tutorial-index" rel="nofollow,noindex noopener noreferrer" target="_blank"&gt;指南&lt;/a&gt;，它们都有对新语言支持的特征。&lt;/li&gt;  &lt;li&gt;   &lt;a href="https://www.python.org/community/sigs/current/edu-sig/" rel="nofollow,noindex noopener noreferrer" target="_blank"&gt;Python教育的特殊兴趣组&lt;/a&gt;。&lt;/li&gt;  &lt;li&gt;公开于   &lt;a href="https://www.python.org/doc/av/" rel="nofollow,noindex noopener noreferrer" target="_blank"&gt;Python.org&lt;/a&gt;的系列优秀视听资源链接。&lt;/li&gt;  &lt;li&gt;   &lt;a href="http://dl.acm.org/citation.cfm?id=1409847" rel="nofollow,noindex noopener noreferrer" target="_blank"&gt;从Java转向Python&lt;/a&gt;的大学研究论文。非常感谢北卡罗来纳州州立大学研究生Michael Head的贡献。&lt;/li&gt;  &lt;li&gt;   &lt;a href="http://lifehacker.com/five-best-programming-languages-for-first-time-learners-1494256243/1497409477" rel="nofollow,noindex noopener noreferrer" target="_blank"&gt;生活骇客文章&lt;/a&gt;写到Python在关于最好的入门语言读者投票中获得了第一。&lt;/li&gt;  &lt;li&gt;Jessica McKellar最近在   &lt;a href="http://web.mit.edu/jesstess/www/pytennessee_keynote.pdf" rel="nofollow,noindex noopener noreferrer" target="_blank"&gt;PyTennessee报告&lt;/a&gt;中陈述了Python教育在学校的情况，并指出我们可以采取一些具体行动步骤表示支持。&lt;/li&gt;  &lt;li&gt;   &lt;a href="http://www.thehelloworldprogram.com/python/why-python-should-be-the-first-programming-language-you-learn/" rel="nofollow,noindex noopener noreferrer" target="_blank"&gt;你好世界程序&lt;/a&gt;讲述为什么Python是伟大的入门语言。&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;End.&lt;/p&gt; &lt;p&gt;转载请注明来自36大数据（36dsj.com)：  &lt;a href="http://www.36dsj.com"&gt;36大数据&lt;/a&gt;»  &lt;a href="http://www.36dsj.com/archives/84100"&gt;为什么说Python是伟大的入门语言&lt;/a&gt;&lt;/p&gt;&lt;div&gt; &lt;a href="https://itindex.net/"  title="IT 资讯"&gt;&lt;img src="https://itindex.net/images/iconWarning.gif" title="IT 资讯" border="0"/&gt; &lt;/a&gt;</description>
      <category>bigdata</category>
      <guid isPermaLink="true">https://itindex.net/detail/56961-python-%E8%AF%AD%E8%A8%80</guid>
      <pubDate>Wed, 24 May 2017 08:00:00 CST</pubDate>
    </item>
    <item>
      <title>自然语言处理之词性标注集</title>
      <link>https://itindex.net/detail/56121-%E8%87%AA%E7%84%B6%E8%AF%AD%E8%A8%80-%E8%AF%8D%E6%80%A7</link>
      <description>&lt;p&gt;词性标注（Part-of-Speech tagging 或POS tagging)，又称词类标注或者简称标注，是指为  &lt;a href="http://www.biaodianfu.com/chinese-segmenter.html"&gt;分词&lt;/a&gt;结果中的每个单词标注一个正确的词性的程序，也即确定每个词是名词、动词、形容词或其他词性的过程。词主要可以分为以下2类：&lt;/p&gt;
 &lt;ul&gt;
  &lt;li&gt;实词：名词、动词、形容词、状态词、区别词、数词、量词、代词&lt;/li&gt;
  &lt;li&gt;虚词：副词、介词、连词、助词、拟声词、叹词。&lt;/li&gt;
&lt;/ul&gt;
 &lt;p&gt;这篇文章梳理的不是如何进行词性标注，而是介绍一些常用的词性标注集。&lt;/p&gt;
 &lt;h2&gt;《PFR人民日报标注语料库》词性编码表&lt;/h2&gt;
 &lt;p&gt;PFR语料库是对人民日报1998年上半年的纯文本语料进行了词语切分和词性标注制作而成的，严格按照人民日报的日期、版序、文章顺序编排的。文章中的每个词语都带有词性标记。目前的标记集里有26个基本词类标记（名词n、时间词t、处所词s、方位词f、数词m、量词q、区别词b、代词r、动词v、形容词a、状态词z、副词d、介词p、连词c、助词u、语气词y、叹词e、拟声词o、成语i、习惯用语l、简称j、前接成分h、后接成分k、语素g、非语素字x、标点符号w）外，从语料库应用的角度，增加了专有名词（人名nr、地名ns、机构名称nt、其他专有名词nz）；从语言学角度也增加了一些标记，总共使用了40多个个标记。&lt;/p&gt;
 &lt;table&gt;

  &lt;tr&gt;
   &lt;td width="49"&gt;代码&lt;/td&gt;
   &lt;td width="86"&gt;名称&lt;/td&gt;
   &lt;td width="502"&gt;举例&lt;/td&gt;
&lt;/tr&gt;
  &lt;tr&gt;
   &lt;td width="49"&gt;a&lt;/td&gt;
   &lt;td width="86"&gt;形容词&lt;/td&gt;
   &lt;td width="502"&gt;最/d 大/a 的/u&lt;/td&gt;
&lt;/tr&gt;
  &lt;tr&gt;
   &lt;td width="49"&gt;ad&lt;/td&gt;
   &lt;td width="86"&gt;副形词&lt;/td&gt;
   &lt;td width="502"&gt;一定/d 能够/v 顺利/ad 实现/v 。/w&lt;/td&gt;
&lt;/tr&gt;
  &lt;tr&gt;
   &lt;td width="49"&gt;ag&lt;/td&gt;
   &lt;td width="86"&gt;形语素&lt;/td&gt;
   &lt;td width="502"&gt;喜/v 煞/ag 人/n&lt;/td&gt;
&lt;/tr&gt;
  &lt;tr&gt;
   &lt;td width="49"&gt;an&lt;/td&gt;
   &lt;td width="86"&gt;名形词&lt;/td&gt;
   &lt;td width="502"&gt;人民/n 的/u 根本/a 利益/n 和/c 国家/n 的/u 安稳/an 。/w&lt;/td&gt;
&lt;/tr&gt;
  &lt;tr&gt;
   &lt;td width="49"&gt;b&lt;/td&gt;
   &lt;td width="86"&gt;区别词&lt;/td&gt;
   &lt;td width="502"&gt;副/b 书记/n 王/nr 思齐/nr&lt;/td&gt;
&lt;/tr&gt;
  &lt;tr&gt;
   &lt;td width="49"&gt;c&lt;/td&gt;
   &lt;td width="86"&gt;连词&lt;/td&gt;
   &lt;td width="502"&gt;全军/n 和/c 武警/n 先进/a 典型/n 代表/n&lt;/td&gt;
&lt;/tr&gt;
  &lt;tr&gt;
   &lt;td width="49"&gt;d&lt;/td&gt;
   &lt;td width="86"&gt;副词&lt;/td&gt;
   &lt;td width="502"&gt;两侧/f 台柱/n 上/ 分别/d 雄踞/v 着/u&lt;/td&gt;
&lt;/tr&gt;
  &lt;tr&gt;
   &lt;td width="49"&gt;dg&lt;/td&gt;
   &lt;td width="86"&gt;副语素&lt;/td&gt;
   &lt;td width="502"&gt;用/v 不/d 甚/dg 流利/a 的/u 中文/nz 主持/v 节目/n 。/w&lt;/td&gt;
&lt;/tr&gt;
  &lt;tr&gt;
   &lt;td width="49"&gt;e&lt;/td&gt;
   &lt;td width="86"&gt;叹词&lt;/td&gt;
   &lt;td width="502"&gt;嗬/e ！/w&lt;/td&gt;
&lt;/tr&gt;
  &lt;tr&gt;
   &lt;td width="49"&gt;f&lt;/td&gt;
   &lt;td width="86"&gt;方位词&lt;/td&gt;
   &lt;td width="502"&gt;从/p 一/m 大/a 堆/q 档案/n 中/f 发现/v 了/u&lt;/td&gt;
&lt;/tr&gt;
  &lt;tr&gt;
   &lt;td width="49"&gt;g&lt;/td&gt;
   &lt;td width="86"&gt;语素&lt;/td&gt;
   &lt;td width="502"&gt;例如dg 或ag&lt;/td&gt;
&lt;/tr&gt;
  &lt;tr&gt;
   &lt;td width="49"&gt;h&lt;/td&gt;
   &lt;td width="86"&gt;前接成分&lt;/td&gt;
   &lt;td width="502"&gt;目前/t 各种/r 非/h 合作制/n 的/u 农产品/n&lt;/td&gt;
&lt;/tr&gt;
  &lt;tr&gt;
   &lt;td width="49"&gt;i&lt;/td&gt;
   &lt;td width="86"&gt;成语&lt;/td&gt;
   &lt;td width="502"&gt;提高/v 农民/n 讨价还价/i 的/u 能力/n 。/w&lt;/td&gt;
&lt;/tr&gt;
  &lt;tr&gt;
   &lt;td width="49"&gt;j&lt;/td&gt;
   &lt;td width="86"&gt;简称略语&lt;/td&gt;
   &lt;td width="502"&gt;民主/ad 选举/v 村委会/j 的/u 工作/vn&lt;/td&gt;
&lt;/tr&gt;
  &lt;tr&gt;
   &lt;td width="49"&gt;k&lt;/td&gt;
   &lt;td width="86"&gt;后接成分&lt;/td&gt;
   &lt;td width="502"&gt;权责/n 明确/a 的/u 逐级/d 授权/v 制/k&lt;/td&gt;
&lt;/tr&gt;
  &lt;tr&gt;
   &lt;td width="49"&gt;l&lt;/td&gt;
   &lt;td width="86"&gt;习用语&lt;/td&gt;
   &lt;td width="502"&gt;是/v 建立/v 社会主义/n 市场经济/n 体制/n 的/u 重要/a 组成部分/l 。/w&lt;/td&gt;
&lt;/tr&gt;
  &lt;tr&gt;
   &lt;td width="49"&gt;m&lt;/td&gt;
   &lt;td width="86"&gt;数词&lt;/td&gt;
   &lt;td width="502"&gt;科学技术/n 是/v 第一/m 生产力/n&lt;/td&gt;
&lt;/tr&gt;
  &lt;tr&gt;
   &lt;td width="49"&gt;n&lt;/td&gt;
   &lt;td width="86"&gt;名词&lt;/td&gt;
   &lt;td width="502"&gt;希望/v 双方/n 在/p 市政/n 规划/vn&lt;/td&gt;
&lt;/tr&gt;
  &lt;tr&gt;
   &lt;td width="49"&gt;ng&lt;/td&gt;
   &lt;td width="86"&gt;名语素&lt;/td&gt;
   &lt;td width="502"&gt;就此/d 分析/v 时/Ng 认为/v&lt;/td&gt;
&lt;/tr&gt;
  &lt;tr&gt;
   &lt;td width="49"&gt;nr&lt;/td&gt;
   &lt;td width="86"&gt;人名&lt;/td&gt;
   &lt;td width="502"&gt;建设部/nt 部长/n 侯/nr 捷/nr&lt;/td&gt;
&lt;/tr&gt;
  &lt;tr&gt;
   &lt;td width="49"&gt;ns&lt;/td&gt;
   &lt;td width="86"&gt;地名&lt;/td&gt;
   &lt;td width="502"&gt;北京/ns 经济/n 运行/vn 态势/n 喜人/a&lt;/td&gt;
&lt;/tr&gt;
  &lt;tr&gt;
   &lt;td width="49"&gt;nt&lt;/td&gt;
   &lt;td width="86"&gt;机构团体&lt;/td&gt;
   &lt;td width="502"&gt;[冶金/n 工业部/n 洛阳/ns 耐火材料/l 研究院/n]nt&lt;/td&gt;
&lt;/tr&gt;
  &lt;tr&gt;
   &lt;td width="49"&gt;nx&lt;/td&gt;
   &lt;td width="86"&gt;字母专名&lt;/td&gt;
   &lt;td width="502"&gt;ＡＴＭ/nx 交换机/n&lt;/td&gt;
&lt;/tr&gt;
  &lt;tr&gt;
   &lt;td width="49"&gt;nz&lt;/td&gt;
   &lt;td width="86"&gt;其他专名&lt;/td&gt;
   &lt;td width="502"&gt;德士古/nz 公司/n&lt;/td&gt;
&lt;/tr&gt;
  &lt;tr&gt;
   &lt;td width="49"&gt;o&lt;/td&gt;
   &lt;td width="86"&gt;拟声词&lt;/td&gt;
   &lt;td width="502"&gt;汩汩/o 地/u 流/v 出来/v&lt;/td&gt;
&lt;/tr&gt;
  &lt;tr&gt;
   &lt;td width="49"&gt;p&lt;/td&gt;
   &lt;td width="86"&gt;介词&lt;/td&gt;
   &lt;td width="502"&gt;往/p 基层/n 跑/v 。/w&lt;/td&gt;
&lt;/tr&gt;
  &lt;tr&gt;
   &lt;td width="49"&gt;q&lt;/td&gt;
   &lt;td width="86"&gt;量词&lt;/td&gt;
   &lt;td width="502"&gt;不止/v 一/m 次/q 地/u 听到/v ，/w&lt;/td&gt;
&lt;/tr&gt;
  &lt;tr&gt;
   &lt;td width="49"&gt;r&lt;/td&gt;
   &lt;td width="86"&gt;代词&lt;/td&gt;
   &lt;td width="502"&gt;有些/r 部门/n&lt;/td&gt;
&lt;/tr&gt;
  &lt;tr&gt;
   &lt;td width="49"&gt;s&lt;/td&gt;
   &lt;td width="86"&gt;处所词&lt;/td&gt;
   &lt;td width="502"&gt;移居/v 海外/s 。/w&lt;/td&gt;
&lt;/tr&gt;
  &lt;tr&gt;
   &lt;td width="49"&gt;t&lt;/td&gt;
   &lt;td width="86"&gt;时间词&lt;/td&gt;
   &lt;td width="502"&gt;当前/t 经济/n 社会/n 情况/n&lt;/td&gt;
&lt;/tr&gt;
  &lt;tr&gt;
   &lt;td width="49"&gt;tg&lt;/td&gt;
   &lt;td width="86"&gt;时语素&lt;/td&gt;
   &lt;td width="502"&gt;秋/Tg 冬/tg 连/d 旱/a&lt;/td&gt;
&lt;/tr&gt;
  &lt;tr&gt;
   &lt;td width="49"&gt;u&lt;/td&gt;
   &lt;td width="86"&gt;助词&lt;/td&gt;
   &lt;td width="502"&gt;工作/vn 的/u 政策/n&lt;/td&gt;
&lt;/tr&gt;
  &lt;tr&gt;
   &lt;td width="49"&gt;ud&lt;/td&gt;
   &lt;td width="86"&gt;结构助词&lt;/td&gt;
   &lt;td width="502"&gt;有/v 心/n 栽/v 得/ud 梧桐树/n&lt;/td&gt;
&lt;/tr&gt;
  &lt;tr&gt;
   &lt;td width="49"&gt;ug&lt;/td&gt;
   &lt;td width="86"&gt;时态助词&lt;/td&gt;
   &lt;td width="502"&gt;你/r 想/v 过/ug 没有/v&lt;/td&gt;
&lt;/tr&gt;
  &lt;tr&gt;
   &lt;td width="49"&gt;uj&lt;/td&gt;
   &lt;td width="86"&gt;结构助词的&lt;/td&gt;
   &lt;td width="502"&gt;迈向/v 充满/v 希望/n 的/uj 新/a 世纪/n&lt;/td&gt;
&lt;/tr&gt;
  &lt;tr&gt;
   &lt;td width="49"&gt;ul&lt;/td&gt;
   &lt;td width="86"&gt;时态助词了&lt;/td&gt;
   &lt;td width="502"&gt;完成/v 了/ ul&lt;/td&gt;
&lt;/tr&gt;
  &lt;tr&gt;
   &lt;td width="49"&gt;uv&lt;/td&gt;
   &lt;td width="86"&gt;结构助词地&lt;/td&gt;
   &lt;td width="502"&gt;满怀信心/l 地/uv 开创/v 新/a 的/u 业绩/n&lt;/td&gt;
&lt;/tr&gt;
  &lt;tr&gt;
   &lt;td width="49"&gt;uz&lt;/td&gt;
   &lt;td width="86"&gt;时态助词着&lt;/td&gt;
   &lt;td width="502"&gt;眼看/v 着/uz&lt;/td&gt;
&lt;/tr&gt;
  &lt;tr&gt;
   &lt;td width="49"&gt;v&lt;/td&gt;
   &lt;td width="86"&gt;动词&lt;/td&gt;
   &lt;td width="502"&gt;举行/v 老/a 干部/n 迎春/vn 团拜会/n&lt;/td&gt;
&lt;/tr&gt;
  &lt;tr&gt;
   &lt;td width="49"&gt;vd&lt;/td&gt;
   &lt;td width="86"&gt;副动词&lt;/td&gt;
   &lt;td width="502"&gt;强调/vd 指出/v&lt;/td&gt;
&lt;/tr&gt;
  &lt;tr&gt;
   &lt;td width="49"&gt;vg&lt;/td&gt;
   &lt;td width="86"&gt;动语素&lt;/td&gt;
   &lt;td width="502"&gt;做好/v 尊/vg 干/j 爱/v 兵/n 工作/vn&lt;/td&gt;
&lt;/tr&gt;
  &lt;tr&gt;
   &lt;td width="49"&gt;vn&lt;/td&gt;
   &lt;td width="86"&gt;名动词&lt;/td&gt;
   &lt;td width="502"&gt;股份制/n 这种/r 企业/n 组织/vn 形式/n ，/w&lt;/td&gt;
&lt;/tr&gt;
  &lt;tr&gt;
   &lt;td width="49"&gt;w&lt;/td&gt;
   &lt;td width="86"&gt;标点符号&lt;/td&gt;
   &lt;td width="502"&gt;生产/v 的/u ５Ｇ/nx 、/w ８Ｇ/nx 型/k 燃气/n 热水器/n&lt;/td&gt;
&lt;/tr&gt;
  &lt;tr&gt;
   &lt;td width="49"&gt;x&lt;/td&gt;
   &lt;td width="86"&gt;非语素字&lt;/td&gt;
   &lt;td width="502"&gt;&lt;/td&gt;
&lt;/tr&gt;
  &lt;tr&gt;
   &lt;td width="49"&gt;y&lt;/td&gt;
   &lt;td width="86"&gt;语气词&lt;/td&gt;
   &lt;td width="502"&gt;已经/d ３０/m 多/m 年/q 了/y 。/w&lt;/td&gt;
&lt;/tr&gt;
  &lt;tr&gt;
   &lt;td width="49"&gt;z&lt;/td&gt;
   &lt;td width="86"&gt;状态词&lt;/td&gt;
   &lt;td width="502"&gt;势头/n 依然/z 强劲/a ；/w&lt;/td&gt;
&lt;/tr&gt;

&lt;/table&gt;
 &lt;h2&gt;《现代汉语语料库加工规范——词语切分与词性标注》词性标记&lt;/h2&gt;
 &lt;table width="1311"&gt;

  &lt;tr&gt;
   &lt;td width="71"&gt;代码&lt;/td&gt;
   &lt;td width="219"&gt;代码名称&lt;/td&gt;
   &lt;td width="390"&gt;帮助记忆的诠释&lt;/td&gt;
   &lt;td width="631"&gt;例子 及 注解&lt;/td&gt;
&lt;/tr&gt;
  &lt;tr&gt;
   &lt;td width="71"&gt;Ag&lt;/td&gt;
   &lt;td width="219"&gt;形语素&lt;/td&gt;
   &lt;td width="390"&gt;形容词性语素。形容词代码为a，语素代码ｇ前面置以A。&lt;/td&gt;
   &lt;td width="631"&gt;绿色/n  似/d  锦/Ag ，&lt;/td&gt;
&lt;/tr&gt;
  &lt;tr&gt;
   &lt;td width="71"&gt;a&lt;/td&gt;
   &lt;td width="219"&gt;形容词&lt;/td&gt;
   &lt;td width="390"&gt;取英语形容词adjective的第1个字母&lt;/td&gt;
   &lt;td width="631"&gt;[重要/a  步伐/n]NP  ，    &lt;p&gt;&lt;/p&gt;
    &lt;p&gt;美丽/a  ，&lt;/p&gt;
    &lt;p&gt;看似/v  抽象/a  ，&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
  &lt;tr&gt;
   &lt;td width="71"&gt;ad&lt;/td&gt;
   &lt;td width="219"&gt;副形词&lt;/td&gt;
   &lt;td width="390"&gt;直接作状语的形容词。形容词代码a和副词代码d并在一起。&lt;/td&gt;
   &lt;td width="631"&gt;[积极/ad  谋求/v]V-ZZ  ，    &lt;p&gt;&lt;/p&gt;
    &lt;p&gt;幻象/n  易/ad  逝/Vg  ，&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
  &lt;tr&gt;
   &lt;td width="71"&gt;an&lt;/td&gt;
   &lt;td width="219"&gt;名形词&lt;/td&gt;
   &lt;td width="390"&gt;具有名词功能的形容词。形容词代码a和名词代码n并在一起。&lt;/td&gt;
   &lt;td width="631"&gt;[外交/n  和/c  安全/an]NP-BL  ，&lt;/td&gt;
&lt;/tr&gt;
  &lt;tr&gt;
   &lt;td width="71"&gt;Bg&lt;/td&gt;
   &lt;td width="219"&gt;区别语素&lt;/td&gt;
   &lt;td width="390"&gt;区别词性语素。区别词代码为b，语素代码ｇ前面置以B。&lt;/td&gt;
   &lt;td width="631"&gt;赤/Ag  橙/Bg  黄/a  绿/a  青/a  蓝/a  紫/a  ，&lt;/td&gt;
&lt;/tr&gt;
  &lt;tr&gt;
   &lt;td width="71"&gt;b&lt;/td&gt;
   &lt;td width="219"&gt;区别词&lt;/td&gt;
   &lt;td width="390"&gt;取汉字“别”的声母。&lt;/td&gt;
   &lt;td width="631"&gt;女/b 司机/n，  金/b 手镯/n，  慢性/b 胃炎/n， 古/b 钱币/n,                 副/b 主任/n，  总/b 公司/n    &lt;p&gt;&lt;/p&gt;
    &lt;p&gt;单音节区别词和单音节名词或名语素组合，作为一个词，并标以名词词性n。&lt;/p&gt;
    &lt;p&gt;雄鸡/n， 雌象/n， 女魔/n， 古币/n&lt;/p&gt;
    &lt;p&gt;少数“单音节区别词+双音节词”的结构作为一个词。&lt;/p&gt;
    &lt;p&gt;总书记/n ，&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
  &lt;tr&gt;
   &lt;td width="71"&gt;c&lt;/td&gt;
   &lt;td width="219"&gt;连词&lt;/td&gt;
   &lt;td width="390"&gt;取英语连词conjunction的第1个字母。&lt;/td&gt;
   &lt;td width="631"&gt;合作/vn  与/c  伙伴/n&lt;/td&gt;
&lt;/tr&gt;
  &lt;tr&gt;
   &lt;td width="71"&gt;Dg&lt;/td&gt;
   &lt;td width="219"&gt;副语素&lt;/td&gt;
   &lt;td width="390"&gt;副词性语素。副词代码为d，语素代码ｇ前面置以D。&lt;/td&gt;
   &lt;td width="631"&gt;了解/v  甚/Dg  深/a  ，    &lt;p&gt;&lt;/p&gt;
    &lt;p&gt;煞/Dg  是/v  喜人/a  ，&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
  &lt;tr&gt;
   &lt;td width="71"&gt;d&lt;/td&gt;
   &lt;td width="219"&gt;副词&lt;/td&gt;
   &lt;td width="390"&gt;取adverb的第2个字母，因其第1个字母已用于形容词。&lt;/td&gt;
   &lt;td width="631"&gt;进一步/d  发展/v  ，&lt;/td&gt;
&lt;/tr&gt;
  &lt;tr&gt;
   &lt;td width="71"&gt;e&lt;/td&gt;
   &lt;td width="219"&gt;叹词&lt;/td&gt;
   &lt;td width="390"&gt;取英语叹词exclamation的第1个字母。&lt;/td&gt;
   &lt;td width="631"&gt;啊/e  ，/w  那/r  金灿灿/z  的/u  麦穗/n  ，&lt;/td&gt;
&lt;/tr&gt;
  &lt;tr&gt;
   &lt;td width="71"&gt;f&lt;/td&gt;
   &lt;td width="219"&gt;方位词&lt;/td&gt;
   &lt;td width="390"&gt;取汉字“方”。&lt;/td&gt;
   &lt;td width="631"&gt;军人/n  的/u  眼睛/n  里/f  不/d  是/v  没有/v  风景/n  ，&lt;/td&gt;
&lt;/tr&gt;
  &lt;tr&gt;
   &lt;td width="71"&gt;h&lt;/td&gt;
   &lt;td width="219"&gt;前接成分&lt;/td&gt;
   &lt;td width="390"&gt;取英语head的第1个字母。&lt;/td&gt;
   &lt;td width="631"&gt;许多/m  非/h  主角/n  人物/n  ,    &lt;p&gt;&lt;/p&gt;
    &lt;p&gt;办事处/n  的/u  “/w  准/h  政府/n  ”/w  功能/n  不断/d  加强/v  ,&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
  &lt;tr&gt;
   &lt;td width="71"&gt;i&lt;/td&gt;
   &lt;td width="219"&gt;成语&lt;/td&gt;
   &lt;td width="390"&gt;取英语成语idiom的第1个字母。&lt;/td&gt;
   &lt;td width="631"&gt;一言一行/i  ,    &lt;p&gt;&lt;/p&gt;
    &lt;p&gt;义无反顾/i  ,&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
  &lt;tr&gt;
   &lt;td width="71"&gt;j&lt;/td&gt;
   &lt;td width="219"&gt;简称略语&lt;/td&gt;
   &lt;td width="390"&gt;取汉字“简”的声母。&lt;/td&gt;
   &lt;td width="631"&gt;[德/j  外长/n]NP  ,    &lt;p&gt;&lt;/p&gt;
    &lt;p&gt;文教/j  ,&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
  &lt;tr&gt;
   &lt;td width="71"&gt;k&lt;/td&gt;
   &lt;td width="219"&gt;后接成分&lt;/td&gt;
   &lt;td width="390"&gt;后接成分。&lt;/td&gt;
   &lt;td width="631"&gt;少年儿童/l  朋友/n  们/k  ,    &lt;p&gt;&lt;/p&gt;
    &lt;p&gt;身体/n  健康/a  者/k  ,&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
  &lt;tr&gt;
   &lt;td width="71"&gt;l&lt;/td&gt;
   &lt;td width="219"&gt;习用语&lt;/td&gt;
   &lt;td width="390"&gt;习用语尚未成为成语，有点“临时性”，取“临”的声母。&lt;/td&gt;
   &lt;td width="631"&gt;少年儿童/l  朋友/n  们/k  ,    &lt;p&gt;&lt;/p&gt;
    &lt;p&gt;落到实处/l  ,&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
  &lt;tr&gt;
   &lt;td width="71"&gt;Mg&lt;/td&gt;
   &lt;td width="219"&gt;数语素&lt;/td&gt;
   &lt;td width="390"&gt;数词性语素。数词代码为m，语素代码ｇ前面置以M。&lt;/td&gt;
   &lt;td width="631"&gt;甲/Mg  减下/v  的/u  人/n  让/v  乙/Mg  背上/v  ,    &lt;p&gt;&lt;/p&gt;
    &lt;p&gt;凡/d  “/w  寅/Mg  年/n  ”/w  中/f  出生/v  的/u  人/n  生肖/n  都/d  属/v  虎/n  ,&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
  &lt;tr&gt;
   &lt;td width="71"&gt;m&lt;/td&gt;
   &lt;td width="219"&gt;数词&lt;/td&gt;
   &lt;td width="390"&gt;取英语numeral的第3个字母，n，u已有他用。&lt;/td&gt;
   &lt;td width="631"&gt;1．数量词组应切分为数词和量词。       三/m 个/q,    10/m  公斤/q,    一/m  盒/q  点心/n  ,    &lt;p&gt;&lt;/p&gt;
    &lt;p&gt;但少数数量词已是词典的登录单位，则不再切分。&lt;/p&gt;
    &lt;p&gt;一个/m  ,   一些/m  ,&lt;/p&gt;
    &lt;p&gt;2. 基数、序数、小数、分数、百分数一律不予切分，为一个切分单位，标注为 m 。&lt;/p&gt;
    &lt;p&gt;一百二十三/m，20万/m，  123.54/m,  一个/m,   第一/m， 第三十五/m，   20%/m，  三分之二/m， 千分之三十/m,  几十/m 人/n， 十几万/m 元/q，  第一百零一/m 个/q  ,&lt;/p&gt;
    &lt;p&gt;3. 约数，前加副词、形容词或后加“来、多、左右”等助数词的应予分开。&lt;/p&gt;
    &lt;p&gt;约/d 一百/m 多/m 万/m，仅/d 一百/m 个/q， 四十/m 来/m 个/q，二十/m 余/m 只/q， 十几/m 个/q，三十/m 左右/m  ，&lt;/p&gt;
    &lt;p&gt;两个数词相连的及“成百”、“上千”等则不予切分。&lt;/p&gt;
    &lt;p&gt;五六/m 年/q， 七八/m 天/q，十七八/m  岁/q，  成百/m 学生/n，上千/m  人/n，&lt;/p&gt;
    &lt;p&gt;4．表序关系的“数＋名”结构，应予切分。&lt;/p&gt;
    &lt;p&gt;二/m  连/n ，　三/m  部/n  ,&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
  &lt;tr&gt;
   &lt;td width="71"&gt;Ng&lt;/td&gt;
   &lt;td width="219"&gt;名语素&lt;/td&gt;
   &lt;td width="390"&gt;名词性语素。名词代码为n，语素代码ｇ前面置以N。&lt;/td&gt;
   &lt;td width="631"&gt;出/v 过/u 两/m 天/q 差/Ng,    &lt;p&gt;&lt;/p&gt;
    &lt;p&gt;理/v 了/u 一/m 次/q 发/Ng,&lt;/p&gt;
    &lt;p&gt; &lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
  &lt;tr&gt;
   &lt;td width="71"&gt;n&lt;/td&gt;
   &lt;td width="219"&gt;名词&lt;/td&gt;
   &lt;td width="390"&gt;取英语名词noun的第1个字母。&lt;/td&gt;
   &lt;td width="631"&gt;（参见 动词–v）    &lt;p&gt;&lt;/p&gt;
    &lt;p&gt;岗位/n  ,  城市/n  ,  机会/n  ,&lt;/p&gt;
    &lt;p&gt;她/r  是/v  责任/n  编辑/n  ,     &lt;br /&gt;
( 编辑/v  科技/n  文献/n )&lt;/p&gt;
    &lt;p&gt; &lt;/p&gt;
    &lt;p&gt; &lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
  &lt;tr&gt;
   &lt;td width="71"&gt;nr&lt;/td&gt;
   &lt;td width="219"&gt;人名&lt;/td&gt;
   &lt;td width="390"&gt;名词代码n和“人(ren)”的声母并在一起。&lt;/td&gt;
   &lt;td width="631"&gt;1. 汉族人及与汉族起名方式相同的非汉族人的姓和名单独切分，并分别标注为nr。    &lt;p&gt;&lt;/p&gt;
    &lt;p&gt;张/nr 仁伟/nr，  欧阳/nr 修/nr，  阮/nr 志雄/nr，  朴/nr 贞爱/nr&lt;/p&gt;
    &lt;p&gt;汉族人除有单姓和复姓外，还有双姓，即有的女子出嫁后，在原来的姓上加上丈夫的姓。如：陈方安生。这种情况切分、标注为：陈/nr  方/nr  安生/nr；唐姜氏，切分、标注为：唐/nr  姜氏/nr。&lt;/p&gt;
    &lt;p&gt;2. 姓名后的职务、职称或称呼要分开。&lt;/p&gt;
    &lt;p&gt;江/nr 主席/n，  小平/nr 同志/n，   江/nr 总书记/n，张/nr 教授/n，   王/nr 部长/n，     陈/nr 老总/n，               李/nr 大娘/n，   刘/nr 阿姨/n，    龙/nr 姑姑/n&lt;/p&gt;
    &lt;p&gt;3. 对人的简称、尊称等若为两个字，则合为一个切分单位，并标以nr。&lt;/p&gt;
    &lt;p&gt;老张/nr， 大李/nr， 小郝/nr,   郭老/nr，  陈总/nr&lt;/p&gt;
    &lt;p&gt;4. 明显带排行的亲属称谓要切分开，分不清楚的则不切开。&lt;/p&gt;
    &lt;p&gt;三/m 哥/n，   大婶/n，    大/a 女儿/n，  大哥/n,  小弟/n,   老爸/n&lt;/p&gt;
    &lt;p&gt;5. 一些著名作者的或不易区分姓和名的笔名通常作为一个切分单位。&lt;/p&gt;
    &lt;p&gt;鲁迅/nr，  茅盾/nr，  巴金/nr， 三毛/nr，  琼瑶/nr，  白桦/nr&lt;/p&gt;
    &lt;p&gt;6. 外国人或少数民族的译名（包括日本人的姓名）不予切分，标注为nr。&lt;/p&gt;
    &lt;p&gt;克林顿/nr，  叶利钦/nr， 才旦卓玛/nr， 小林多喜二/nr， 北研二/nr,&lt;/p&gt;
    &lt;p&gt;华盛顿/nr，  爱因斯坦/nr&lt;/p&gt;
    &lt;p&gt;有些西方人的姓名中有小圆点，也不分开。&lt;/p&gt;
    &lt;p&gt;卡尔·马克思/nr&lt;/p&gt;
    &lt;p&gt; &lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
  &lt;tr&gt;
   &lt;td width="71"&gt;ns&lt;/td&gt;
   &lt;td width="219"&gt;地名&lt;/td&gt;
   &lt;td width="390"&gt;名词代码n和处所词代码s并在一起。&lt;/td&gt;
   &lt;td width="631"&gt;（参见2。短语标记说明–NS）    &lt;p&gt;&lt;/p&gt;
    &lt;p&gt;安徽/ns，深圳/ns，杭州/ns，拉萨/ns，哈尔滨/ns，  呼和浩特/ns，          乌鲁木齐/ns，长江/ns，黄海/ns，太平洋/ns， 泰山/ns， 华山/ns，亚洲/ns,    海南岛/ns，太湖/ns，白洋淀/ns,  俄罗斯/ns，哈萨克斯坦/ns，彼得堡/ns，   伏尔加格勒/ns&lt;/p&gt;
    &lt;p&gt; &lt;/p&gt;
    &lt;p&gt;1. 国名不论长短，作为一个切分单位。&lt;/p&gt;
    &lt;p&gt;中国/ns， 中华人民共和国/ns， 日本国/ns，  美利坚合众国/ns， 美国/ns&lt;/p&gt;
    &lt;p&gt;2. 地名后有“省”、“市”、“县”、“区”、“乡”、“镇”、“村”、“旗”、“州”、“都”、“府”、“道”等单字的行政区划名称时，不切分开，作为一个切分单位。&lt;/p&gt;
    &lt;p&gt;四川省/ns， 天津市/ns，景德镇/ns沙市市/ns， 牡丹江市/ns，正定县/ns，海淀区/ns,  通州区/ns，东升乡/ns，  双桥镇/ns  南化村/ns，华盛顿州/ns，俄亥俄州/ns，东京都/ns， 大阪府/ns，北海道/ns， 长野县/ns，开封府/ns，宣城县/ns&lt;/p&gt;
    &lt;p&gt;3. 地名后的行政区划有两个以上的汉字，则将地名同行政区划名称切开，不过要将地名同行政区划名称用方括号括起来，并标以短语NS。&lt;/p&gt;
    &lt;p&gt;[芜湖/ns 专区/n] NS，&lt;/p&gt;
    &lt;p&gt;[宣城/ns 地区/n]ns，&lt;/p&gt;
    &lt;p&gt;[内蒙古/ns 自治区/n]NS，&lt;/p&gt;
    &lt;p&gt;[深圳/ns 特区/n]NS，&lt;/p&gt;
    &lt;p&gt;[厦门/ns 经济/n 特区/n]NS，&lt;/p&gt;
    &lt;p&gt;[香港/ns 特别/a  行政区/n]NS，&lt;/p&gt;
    &lt;p&gt;[香港/ns 特区/n]NS，&lt;/p&gt;
    &lt;p&gt;[华盛顿/ns  特区/n]NS,&lt;/p&gt;
    &lt;p&gt;4. 地名后有表示地形地貌的一个字的普通名词，如“江、河、山、洋、海、岛、峰、湖”等，不予切分。&lt;/p&gt;
    &lt;p&gt;鸭绿江/ns，亚马逊河/ns, 喜马拉雅山/ns, 珠穆朗玛峰/ns，地中海/ns，大西洋/ns，洞庭湖/ns， 塞普路斯岛/ns&lt;/p&gt;
    &lt;p&gt;5. 地名后接的表示地形地貌的普通名词若有两个以上汉字，则应切开。然后将地名同该普通名词标成短语NS。&lt;/p&gt;
    &lt;p&gt;[台湾/ns 海峡/n]NS，[华北/ns 平原/n]NS，[帕米尔/ns 高原/n]NS，           [南沙/ns 群岛/n]NS，[京东/ns 大/a 峡谷/n]NS  [横断/b 山脉/n]NS&lt;/p&gt;
    &lt;p&gt;6．地名后有表示自然区划的一个字的普通名词，如“ 街，路，道，巷，里，町，庄，村，弄，堡”等，不予切分。&lt;/p&gt;
    &lt;p&gt;中关村/ns，长安街/ns，学院路/ns，  景德镇/ns, 吴家堡/ns, 庞各庄/ns，  三元里/ns，彼得堡/ns, 北菜市巷/ns,&lt;/p&gt;
    &lt;p&gt;7．地名后接的表示自然区划的普通名词若有两个以上汉字，则应切开。然后将地名同自然区划名词标成短语NS。&lt;/p&gt;
    &lt;p&gt;[米市/ns 大街/n]NS, [蒋家/nz 胡同/n]NS  , [陶然亭/ns 公园/n]NS  ,&lt;/p&gt;
    &lt;p&gt;8． 大小地名相连时的标注方式为：&lt;/p&gt;
    &lt;p&gt;北京市/ns 海淀区/ns 海淀镇/ns [南/f 大街/n]NS [蒋家/nz 胡同/n]NS 24/m 号/q  ,&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
  &lt;tr&gt;
   &lt;td width="71"&gt;nt&lt;/td&gt;
   &lt;td width="219"&gt;机构团体&lt;/td&gt;
   &lt;td width="390"&gt;“团”的声母为t，名词代码n和t并在一起。&lt;/td&gt;
   &lt;td width="631"&gt;（参见2。短语标记说明–NT）    &lt;p&gt;&lt;/p&gt;
    &lt;p&gt;联合国/nt，中共中央/nt，国务院/nt，  北京大学/nt&lt;/p&gt;
    &lt;p&gt;1．大多数团体、机构、组织的专有名称一般是短语型的，较长，且含有地名或人名等专名，再组合，标注为短语NT。&lt;/p&gt;
    &lt;p&gt;[中国/ns 计算机/n 学会/n]NT，&lt;/p&gt;
    &lt;p&gt;[香港/ns 钟表业/n 总会/n]NT,&lt;/p&gt;
    &lt;p&gt;[烟台/ns 大学/n]NT,&lt;/p&gt;
    &lt;p&gt;[香港/ns  理工大学/n]NT,&lt;/p&gt;
    &lt;p&gt;[华东/ns  理工大学/n]NT,&lt;/p&gt;
    &lt;p&gt;[合肥/ns 师范/n 学院/n]NT，&lt;/p&gt;
    &lt;p&gt;[北京/ns 图书馆/n]NT,&lt;/p&gt;
    &lt;p&gt;[富士通/nz 株式会社/n]NT,&lt;/p&gt;
    &lt;p&gt;[香山/ns 植物园/n]NT,&lt;/p&gt;
    &lt;p&gt;[安娜/nz 美容院/n]NT，&lt;/p&gt;
    &lt;p&gt;[上海/ns 手表/n 厂/n]NT，&lt;/p&gt;
    &lt;p&gt;[永和/nz 烧饼铺/n]NT，&lt;/p&gt;
    &lt;p&gt;[北京/ns 国安/nz 队/n]NT,&lt;/p&gt;
    &lt;p&gt;2. 对于在国际或中国范围内的知名的唯一的团体、机构、组织的名称即使前面没有专名，也标为nt或NT。&lt;/p&gt;
    &lt;p&gt;联合国/nt,国务院/nt，外交部/nt，  财政部/nt，教育部/nt, 国防部/nt，&lt;/p&gt;
    &lt;p&gt;[世界/n 贸易/n 组织/n]NT，&lt;/p&gt;
    &lt;p&gt;[国家/n 教育/vn 委员会/n]NT，&lt;/p&gt;
    &lt;p&gt;[信息/n 产业/n 部/n]NT，&lt;/p&gt;
    &lt;p&gt;[全国/n 信息/n 技术/n 标准化/vn 委员会/n]NT，&lt;/p&gt;
    &lt;p&gt;[全国/n 总/b 工会/n]NT，&lt;/p&gt;
    &lt;p&gt;[全国/n 人民/n 代表/n 大会/n]NT，&lt;/p&gt;
    &lt;p&gt;美国的“国务院”，其他国家的“外交部、财政部、教育部”，必须在其所属国的国名之后出现时，才联合标注为NT。&lt;/p&gt;
    &lt;p&gt;[美国/ns 国务院/n]NT，&lt;/p&gt;
    &lt;p&gt;[法国/ns 外交部/n]NT，&lt;/p&gt;
    &lt;p&gt;[美/j 国会/n]NT，&lt;/p&gt;
    &lt;p&gt;日本有些政府机构名称很特别，无论是否出现在“日本”国名之后都标为nt。&lt;/p&gt;
    &lt;p&gt;[日本/ns 外务省/nt]NT，&lt;/p&gt;
    &lt;p&gt;[日/j 通产省/nt]NT&lt;/p&gt;
    &lt;p&gt;通产省/nt&lt;/p&gt;
    &lt;p&gt;3. 前后相连有上下位关系的团体机构组织名称的处理方式如下:&lt;/p&gt;
    &lt;p&gt;[联合国/nt  教科文/j  组织/n]NT， [中国/ns  银行/n  北京/ns  分行/n]NT，&lt;/p&gt;
    &lt;p&gt;[河北省/ns  正定县/ns  西平乐乡/ns  南化村/ns  党支部/n]NT，&lt;/p&gt;
    &lt;p&gt;当下位名称含有专名（如“北京/ns 分行/n”、“南化村/ns 党支部/n”、“昌平/ns 分校/n”）时，也可脱离前面的上位名称单独标注为NT。&lt;/p&gt;
    &lt;p&gt;[中国/ns 银行/n]NT  [北京/ns 分行/n]NT，&lt;/p&gt;
    &lt;p&gt;北京大学/nt  [昌平/ns  分校/n]NT，4. 团体、机构、组织名称中用圆括号加注简称时:&lt;/p&gt;
    &lt;p&gt;[宝山/ns  钢铁/n （/w 宝钢/j ）/w  总/b  公司/n]NT，&lt;/p&gt;
    &lt;p&gt;[宝山/ns  钢铁/n  总/b  公司/n]NT，（/w 宝钢/j ）/w&lt;/p&gt;
    &lt;p&gt; &lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
  &lt;tr&gt;
   &lt;td width="71"&gt;nx&lt;/td&gt;
   &lt;td width="219"&gt;外文字符&lt;/td&gt;
   &lt;td width="390"&gt;外文字符。&lt;/td&gt;
   &lt;td width="631"&gt;A/nx  公司/n ，B/nx  先生/n  ，X/nx  君/Ng  ,    &lt;p&gt;&lt;/p&gt;
    &lt;p&gt;24/m  K/nx  镀金/n ,&lt;/p&gt;
    &lt;p&gt;C/nx  是/v  光速/n ,&lt;/p&gt;
    &lt;p&gt;Windows98/nx ,&lt;/p&gt;
    &lt;p&gt;PentiumIV/nx ,&lt;/p&gt;
    &lt;p&gt;I LOVE THIS GAME/nx  ,&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
  &lt;tr&gt;
   &lt;td width="71"&gt;nz&lt;/td&gt;
   &lt;td width="219"&gt;其他专名&lt;/td&gt;
   &lt;td width="390"&gt;“专”的声母的第1个字母为z，名词代码n和z并在一起。&lt;/td&gt;
   &lt;td width="631"&gt;（参见2。短语标记说明–NZ）    &lt;p&gt;&lt;/p&gt;
    &lt;p&gt;除人名、国名、地名、团体、机构、组织以外的其他专有名词都标以nz。&lt;/p&gt;
    &lt;p&gt;满族/nz，俄罗斯族/nz，汉语/nz，罗马利亚语/nz， 捷克语/nz，中文/nz,  英文/nz， 满人/nz， 哈萨克人/nz， 诺贝尔奖/nz， 茅盾奖/nz,&lt;/p&gt;
    &lt;p&gt;1.包含专有名称（或简称）的交通线，标以nz；短语型的，标为NZ。&lt;/p&gt;
    &lt;p&gt;津浦路/nz， 石太线/nz，&lt;/p&gt;
    &lt;p&gt;[京/j  九/j  铁路/n]NZ,&lt;/p&gt;
    &lt;p&gt;[京/j  津/j  高速/b  公路/n]NZ，&lt;/p&gt;
    &lt;p&gt;2. 历史上重要事件、运动等专有名称一般是短语型的，按短语型专有名称处理，标以NZ。&lt;/p&gt;
    &lt;p&gt;[卢沟桥/ns  事件/n]NZ, [西安/ns  事变/n]NZ，[五四/t  运动/n]NZ,  [明治/nz  维新/n]NZ，[甲午/t  战争/n]NZ,&lt;/p&gt;
    &lt;p&gt;3.专有名称后接多音节的名词，如“语言”、“文学”、“文化”、“方式”、“精神”等，失去专指性，则应分开。&lt;/p&gt;
    &lt;p&gt;欧洲/ns  语言/n，  法国/ns  文学/n，  西方/ns  文化/n， 贝多芬/nr  交响乐/n,  雷锋/nr  精神/n,  美国/ns  方式/n，日本/ns  料理/n，  宋朝/t  古董/n&lt;/p&gt;
    &lt;p&gt;4. 商标（包括专名及后接的“牌”、“型”等）是专指的，标以nz，但其后所接的商品仍标以普通名词n。&lt;/p&gt;
    &lt;p&gt;康师傅/nr  方便面/n,  中华牌/nz 香烟/n,  牡丹III型/nz  电视机/n,  联想/nz  电脑/n,  鳄鱼/nz  衬衣/n，  耐克/nz  鞋/n&lt;/p&gt;
    &lt;p&gt;5. 以序号命名的名称一般不认为是专有名称。&lt;/p&gt;
    &lt;p&gt;2/m  号/q  国道/n ，十一/m  届/q  三中全会/j&lt;/p&gt;
    &lt;p&gt;如果前面有专名，合起来作为短语型专名。&lt;/p&gt;
    &lt;p&gt;[中国/ns  101/m  国道/n]NZ, [中共/j  十一/m  届/q  三中全会/j]NZ,&lt;/p&gt;
    &lt;p&gt;6. 书、报、杂志、文档、报告、协议、合同等的名称通常有书名号加以标识，不作为专有名词。由于这些名字往往较长，名字本身按常规处理。&lt;/p&gt;
    &lt;p&gt;《/w  宁波/ns  日报/n  》/w ，《/w  鲁迅/nr  全集/n  》/w,&lt;/p&gt;
    &lt;p&gt;中华/nz  读书/vn  报/n,       杜甫/nr  诗选/n，&lt;/p&gt;
    &lt;p&gt;少数书名、报刊名等专有名称，则不切分。红楼梦/nz， 人民日报/nz，儒林外史/nz&lt;/p&gt;
    &lt;p&gt;7. 当有些专名无法分辨它们是人名还是地名或机构名时，暂标以nz。&lt;/p&gt;
    &lt;p&gt;[巴黎/ns  贝尔希/nz   体育馆/n]NT,&lt;/p&gt;
    &lt;p&gt;其中“贝尔希”只好暂标为nz。&lt;/p&gt;
    &lt;p&gt; &lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
  &lt;tr&gt;
   &lt;td width="71"&gt;o&lt;/td&gt;
   &lt;td width="219"&gt;拟声词&lt;/td&gt;
   &lt;td width="390"&gt;取英语拟声词onomatopoeia的第1个字母。&lt;/td&gt;
   &lt;td width="631"&gt;哈哈/o  一/m  笑/v ,    &lt;p&gt;&lt;/p&gt;
    &lt;p&gt;装载机/n  隆隆/o  推进/v  ,&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
  &lt;tr&gt;
   &lt;td width="71"&gt;p&lt;/td&gt;
   &lt;td width="219"&gt;介词&lt;/td&gt;
   &lt;td width="390"&gt;取英语介词prepositional的第1个字母。&lt;/td&gt;
   &lt;td width="631"&gt;对/p  子孙后代/n  负责/v  ,    &lt;p&gt;&lt;/p&gt;
    &lt;p&gt;以/p  煤/n  养/v  农/Ng  ,&lt;/p&gt;
    &lt;p&gt;为/p  治理/v  荒山/n  服务/v  ,&lt;/p&gt;
    &lt;p&gt;把/p  青年/n  推/v  上/v  了/u  领导/vn  岗位/n ,&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
  &lt;tr&gt;
   &lt;td width="71"&gt;q&lt;/td&gt;
   &lt;td width="219"&gt;量词&lt;/td&gt;
   &lt;td width="390"&gt;取英语quantity的第1个字母。&lt;/td&gt;
   &lt;td width="631"&gt;（参见数词m）    &lt;p&gt;&lt;/p&gt;
    &lt;p&gt;首/m  批/q  ,&lt;/p&gt;
    &lt;p&gt;一/m  年/q  ,&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
  &lt;tr&gt;
   &lt;td width="71"&gt;Rg&lt;/td&gt;
   &lt;td width="219"&gt;代语素&lt;/td&gt;
   &lt;td width="390"&gt;代词性语素。代词代码为r,在语素的代码g前面置以R。&lt;/td&gt;
   &lt;td width="631"&gt;读者/n  就/d  是/v  这/r  两/m  棵/q  小树/n  扎根/v  于/p  斯/Rg  、/w  成长/v  于/p  斯/Rg  的/u  肥田/n  沃土/n  ,&lt;/td&gt;
&lt;/tr&gt;
  &lt;tr&gt;
   &lt;td width="71"&gt;r&lt;/td&gt;
   &lt;td width="219"&gt;代词&lt;/td&gt;
   &lt;td width="390"&gt;取英语代词pronoun的第2个字母,因p已用于介词。&lt;/td&gt;
   &lt;td width="631"&gt;单音节代词“本”、“每”、“各”、“诸”后接单音节名词时，和后接的单音节名词合为代词；当后接双音节名词时，应予切分。    &lt;p&gt;&lt;/p&gt;
    &lt;p&gt;本报/r，  每人/r，  本社/r，&lt;/p&gt;
    &lt;p&gt;本/r 地区/n，&lt;/p&gt;
    &lt;p&gt;各/r 部门/n&lt;/p&gt;
    &lt;p&gt; &lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
  &lt;tr&gt;
   &lt;td width="71"&gt;s&lt;/td&gt;
   &lt;td width="219"&gt;处所词&lt;/td&gt;
   &lt;td width="390"&gt;取英语space的第1个字母。&lt;/td&gt;
   &lt;td width="631"&gt;家里/s  的/u  电脑/n  都/d  联通/v  了/u  国际/n  互联网/n  ,    &lt;p&gt;&lt;/p&gt;
    &lt;p&gt;西部/s  交通/n  咽喉/n  ,&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
  &lt;tr&gt;
   &lt;td width="71"&gt;Tg&lt;/td&gt;
   &lt;td width="219"&gt;时语素&lt;/td&gt;
   &lt;td width="390"&gt;时间词性语素。时间词代码为t,在语素的代码g前面置以T。&lt;/td&gt;
   &lt;td width="631"&gt;３日/t  晚/Tg  在/p  总统府/n  发表/v  声明/n  ,    &lt;p&gt;&lt;/p&gt;
    &lt;p&gt;尊重/v  现/Tg  执政/vn  当局/n  的/u  权威/n  ,&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
  &lt;tr&gt;
   &lt;td width="71"&gt;t&lt;/td&gt;
   &lt;td width="219"&gt;时间词&lt;/td&gt;
   &lt;td width="390"&gt;取英语time的第1个字母。&lt;/td&gt;
   &lt;td width="631"&gt;1. 年月日时分秒，按年、月、日、时、分、秒切分，标注为t 。    &lt;p&gt;&lt;/p&gt;
    &lt;p&gt;1997年/t  3月/t  19日/t  下午/t  2时/t  18分/t&lt;/p&gt;
    &lt;p&gt;若数字后无表示时间的“年、月、日、时、分、秒”等的标为数词m。&lt;/p&gt;
    &lt;p&gt;1998/m  中文/n  信息/n  处理/vn  国际/n  会议/n&lt;/p&gt;
    &lt;p&gt;2. 历史朝代的名称虽然有专有名词的性质，仍标注为t。&lt;/p&gt;
    &lt;p&gt;西周/t，  秦朝/t， 东汉/t，  南北朝/t，  清代/t&lt;/p&gt;
    &lt;p&gt;“牛年、虎年”等一律不予切分，标注为：&lt;/p&gt;
    &lt;p&gt;牛年/t, 虎年/t,  甲午年/t，  甲午/t 战争/n，  庚子/t  赔款/n,   戊戌/t 变法/n&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
  &lt;tr&gt;
   &lt;td width="71"&gt;u&lt;/td&gt;
   &lt;td width="219"&gt;助词&lt;/td&gt;
   &lt;td width="390"&gt;取英语助词auxiliary。&lt;/td&gt;
   &lt;td width="631"&gt;[[俄罗斯/ns  和/c  北约/j]NP-BL  之间/f  [战略/n  伙伴/n  关系/n]NP  的/u  建立/vn]NP  填平/v  了/u  [[欧洲/ns  安全/a  政治/n]NP  的/u  鸿沟/n]NP&lt;/td&gt;
&lt;/tr&gt;
  &lt;tr&gt;
   &lt;td width="71"&gt;Vg&lt;/td&gt;
   &lt;td width="219"&gt;动语素&lt;/td&gt;
   &lt;td width="390"&gt;动词性语素。动词代码为v。在语素的代码g前面置以V。&lt;/td&gt;
   &lt;td width="631"&gt;洗/v 了/u 一个/m 舒舒服服/z 的/u 澡/Vg    &lt;p&gt;&lt;/p&gt;
    &lt;p&gt; &lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
  &lt;tr&gt;
   &lt;td width="71"&gt;v&lt;/td&gt;
   &lt;td width="219"&gt;动词&lt;/td&gt;
   &lt;td width="390"&gt;取英语动词verb的第一个字母。&lt;/td&gt;
   &lt;td width="631"&gt;（参见 名词–n）    &lt;p&gt;&lt;/p&gt;
    &lt;p&gt;[[[欧盟/j  扩大/v]S  的/u  [历史性/n  决定/n]NP]NP  和/c  [北约/j  开放/v]S]NP-BL  [为/p  [创建/v  [一/m  种/q  新/a  的/u  欧洲/ns  安全/a  格局/n]NP]VP-SBI]PP-MD  [奠定/v  了/u  基础/n]V-SBI  ,&lt;/p&gt;
    &lt;p&gt;,     &lt;br /&gt;
编辑/v  科技/n  文献/n , (她/r  是/v  责任/n  编辑/n  )&lt;/p&gt;
    &lt;p&gt; &lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
  &lt;tr&gt;
   &lt;td width="71"&gt;vd&lt;/td&gt;
   &lt;td width="219"&gt;副动词&lt;/td&gt;
   &lt;td width="390"&gt;直接作状语的动词。动词和副词的代码并在一起。&lt;/td&gt;
   &lt;td width="631"&gt;形势/n  会/v  持续/vd  好转/v  ,    &lt;p&gt;&lt;/p&gt;
    &lt;p&gt;认为/v  是/v  电话局/n  收/v  错/vd  了/u  费/n  ,&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
  &lt;tr&gt;
   &lt;td width="71"&gt;vn&lt;/td&gt;
   &lt;td width="219"&gt;名动词&lt;/td&gt;
   &lt;td width="390"&gt;指具有名词功能的动词。动词和名词的代码并在一起。&lt;/td&gt;
   &lt;td width="631"&gt;引起/v  人们/n  的/u  关注/vn  和/c  思考/vn  ,    &lt;p&gt;&lt;/p&gt;
    &lt;p&gt;收费/vn  电话/n  的/u  号码/n  ,&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
  &lt;tr&gt;
   &lt;td width="71"&gt;w&lt;/td&gt;
   &lt;td width="219"&gt;标点符号&lt;/td&gt;
   &lt;td width="390"&gt;&lt;/td&gt;
   &lt;td width="631"&gt;”/w    &lt;p&gt;&lt;/p&gt;
    &lt;p&gt;：/w&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
  &lt;tr&gt;
   &lt;td width="71"&gt;x&lt;/td&gt;
   &lt;td width="219"&gt;非语素字&lt;/td&gt;
   &lt;td width="390"&gt;非语素字只是一个符号，字母x通常用于代表未知数、符号。&lt;/td&gt;
   &lt;td width="631"&gt;&lt;/td&gt;
&lt;/tr&gt;
  &lt;tr&gt;
   &lt;td width="71"&gt;Yg&lt;/td&gt;
   &lt;td width="219"&gt;语气语素&lt;/td&gt;
   &lt;td width="390"&gt;语气词性语素。语气词代码为y。在语素的代码g前面置以Y。&lt;/td&gt;
   &lt;td width="631"&gt;唯/d  大力/d  者/k  能/v  致/v  之/u  耳/Yg&lt;/td&gt;
&lt;/tr&gt;
  &lt;tr&gt;
   &lt;td width="71"&gt;y&lt;/td&gt;
   &lt;td width="219"&gt;语气词&lt;/td&gt;
   &lt;td width="390"&gt;取汉字“语”的声母。&lt;/td&gt;
   &lt;td width="631"&gt;会/v  泄露/v  用户/n  隐私/n  吗/y  ,    &lt;p&gt;&lt;/p&gt;
    &lt;p&gt;又/d  何在/v  呢/y  ？&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
  &lt;tr&gt;
   &lt;td width="71"&gt;z&lt;/td&gt;
   &lt;td width="219"&gt;状态词&lt;/td&gt;
   &lt;td width="390"&gt;取汉字“状”的声母的前一个字母。&lt;/td&gt;
   &lt;td width="631"&gt;取得/v  扎扎实实/z  的/u  突破性/n  进展/vn  ,    &lt;p&gt;&lt;/p&gt;
    &lt;p&gt;四季/n  常青/z  的/u  热带/n  树木/n  ,&lt;/p&gt;
    &lt;p&gt;短短/z  几/m  年/q  间,&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;

&lt;/table&gt;
 &lt;h2&gt;计算所 ICTCLAS 3.0汉语词性标记集&lt;/h2&gt;
 &lt;p&gt;计算所汉语词性标记集（共计99个，22个一类，66个二类，11个三类）主要参考了以下词性标记集：&lt;/p&gt;
 &lt;ul&gt;
  &lt;li&gt;北大《人民日报》语料库词性标记集&lt;/li&gt;
  &lt;li&gt;北大2002新版词性标记集（草稿）&lt;/li&gt;
  &lt;li&gt;清华大学汉语树库词性标记集&lt;/li&gt;
  &lt;li&gt;教育部语用所词性标记集（国家推荐标准草案2002版）&lt;/li&gt;
  &lt;li&gt;美国宾州大学中文树库（Chinese Penn Tree Bank）词性标记集&lt;/li&gt;
&lt;/ul&gt;
 &lt;p&gt;由于中科院计算所的汉语词法分析器主要采用北大《人民日报》语料库进行参数训练，因此本词性标记集主要以北大《人民日报》语料库的词性标记集为蓝本，并参考了北大《汉语语法信息词典》中给出的汉语词的语法信息。&lt;/p&gt;
 &lt;p&gt;  &lt;strong&gt;形容词(1个一类，4个二类)&lt;/strong&gt;&lt;/p&gt;
 &lt;ul&gt;
  &lt;li&gt;a 形容词
   &lt;ul&gt;
    &lt;li&gt;ad 副形词&lt;/li&gt;
    &lt;li&gt;an 名形词&lt;/li&gt;
    &lt;li&gt;ag 形容词性语素&lt;/li&gt;
    &lt;li&gt;al 形容词性惯用语&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
 &lt;p&gt;  &lt;strong&gt;区别词(1个一类，2个二类)&lt;/strong&gt;&lt;/p&gt;
 &lt;ul&gt;
  &lt;li&gt;b 区别词
   &lt;ul&gt;
    &lt;li&gt;bl 区别词性惯用语&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
 &lt;p&gt;  &lt;strong&gt;连词(1个一类，1个二类)&lt;/strong&gt;&lt;/p&gt;
 &lt;ul&gt;
  &lt;li&gt;c 连词
   &lt;ul&gt;
    &lt;li&gt;cc 并列连词&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
 &lt;p&gt;  &lt;strong&gt;副词(1个一类)&lt;/strong&gt;&lt;/p&gt;
 &lt;ul&gt;
  &lt;li&gt;d 副词&lt;/li&gt;
&lt;/ul&gt;
 &lt;p&gt;  &lt;strong&gt;叹词(1个一类)&lt;/strong&gt;&lt;/p&gt;
 &lt;ul&gt;
  &lt;li&gt;e 叹词&lt;/li&gt;
&lt;/ul&gt;
 &lt;p&gt;  &lt;strong&gt;方位词(1个一类)&lt;/strong&gt;&lt;/p&gt;
 &lt;ul&gt;
  &lt;li&gt;f 方位词&lt;/li&gt;
&lt;/ul&gt;
 &lt;p&gt;  &lt;strong&gt;前缀(1个一类)&lt;/strong&gt;&lt;/p&gt;
 &lt;ul&gt;
  &lt;li&gt;h 前缀&lt;/li&gt;
&lt;/ul&gt;
 &lt;p&gt;  &lt;strong&gt;后缀(1个一类)&lt;/strong&gt;&lt;/p&gt;
 &lt;ul&gt;
  &lt;li&gt;k 后缀&lt;/li&gt;
&lt;/ul&gt;
 &lt;p&gt;  &lt;strong&gt;数词(1个一类，1个二类)&lt;/strong&gt;&lt;/p&gt;
 &lt;ul&gt;
  &lt;li&gt;m 数词
   &lt;ul&gt;
    &lt;li&gt;mq 数量词&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
 &lt;p&gt;  &lt;strong&gt;名词 (1个一类，7个二类，5个三类)&lt;/strong&gt;&lt;/p&gt;
 &lt;p&gt;名词分为以下子类：&lt;/p&gt;
 &lt;ul&gt;
  &lt;li&gt;n 名词
   &lt;ul&gt;
    &lt;li&gt;nr 人名
     &lt;ul&gt;
      &lt;li&gt;nr1 汉语姓氏&lt;/li&gt;
      &lt;li&gt;nr2 汉语名字&lt;/li&gt;
      &lt;li&gt;nrj 日语人名&lt;/li&gt;
      &lt;li&gt;nrf 音译人名&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
    &lt;li&gt;ns 地名
     &lt;ul&gt;
      &lt;li&gt;nsf 音译地名&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
    &lt;li&gt;nt 机构团体名&lt;/li&gt;
    &lt;li&gt;nz 其它专名&lt;/li&gt;
    &lt;li&gt;nl 名词性惯用语&lt;/li&gt;
    &lt;li&gt;ng 名词性语素&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
 &lt;p&gt;  &lt;strong&gt;拟声词(1个一类)&lt;/strong&gt;&lt;/p&gt;
 &lt;ul&gt;
  &lt;li&gt;o 拟声词&lt;/li&gt;
&lt;/ul&gt;
 &lt;p&gt;  &lt;strong&gt;介词(1个一类，2个二类)&lt;/strong&gt;&lt;/p&gt;
 &lt;ul&gt;
  &lt;li&gt;p 介词
   &lt;ul&gt;
    &lt;li&gt;pba 介词“把”&lt;/li&gt;
    &lt;li&gt;pbei 介词“被”&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
 &lt;p&gt;  &lt;strong&gt;量词(1个一类，2个二类)&lt;/strong&gt;&lt;/p&gt;
 &lt;ul&gt;
  &lt;li&gt;q 量词
   &lt;ul&gt;
    &lt;li&gt;qv 动量词&lt;/li&gt;
    &lt;li&gt;qt 时量词&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
 &lt;p&gt;  &lt;strong&gt;代词(1个一类，4个二类，6个三类)&lt;/strong&gt;&lt;/p&gt;
 &lt;ul&gt;
  &lt;li&gt;r 代词
   &lt;ul&gt;
    &lt;li&gt;rr 人称代词&lt;/li&gt;
    &lt;li&gt;rz 指示代词
     &lt;ul&gt;
      &lt;li&gt;rzt 时间指示代词&lt;/li&gt;
      &lt;li&gt;rzs 处所指示代词&lt;/li&gt;
      &lt;li&gt;rzv 谓词性指示代词&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
    &lt;li&gt;ry 疑问代词
     &lt;ul&gt;
      &lt;li&gt;ryt 时间疑问代词&lt;/li&gt;
      &lt;li&gt;rys 处所疑问代词&lt;/li&gt;
      &lt;li&gt;ryv 谓词性疑问代词&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
    &lt;li&gt;rg 代词性语素&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
 &lt;p&gt;  &lt;strong&gt;处所词(1个一类)&lt;/strong&gt;&lt;/p&gt;
 &lt;ul&gt;
  &lt;li&gt;s 处所词&lt;/li&gt;
&lt;/ul&gt;
 &lt;p&gt;  &lt;strong&gt;时间词(1个一类，1个二类)&lt;/strong&gt;&lt;/p&gt;
 &lt;ul&gt;
  &lt;li&gt;t 时间词
   &lt;ul&gt;
    &lt;li&gt;tg 时间词性语素&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
 &lt;p&gt;  &lt;strong&gt;助词(1个一类，15个二类)&lt;/strong&gt;&lt;/p&gt;
 &lt;ul&gt;
  &lt;li&gt;u 助词
   &lt;ul&gt;
    &lt;li&gt;uzhe 着&lt;/li&gt;
    &lt;li&gt;ule 了 喽&lt;/li&gt;
    &lt;li&gt;uguo 过&lt;/li&gt;
    &lt;li&gt;ude1 的 底&lt;/li&gt;
    &lt;li&gt;ude2 地&lt;/li&gt;
    &lt;li&gt;ude3 得&lt;/li&gt;
    &lt;li&gt;usuo 所&lt;/li&gt;
    &lt;li&gt;udeng 等 等等 云云&lt;/li&gt;
    &lt;li&gt;uyy 一样 一般 似的 般&lt;/li&gt;
    &lt;li&gt;udh 的话&lt;/li&gt;
    &lt;li&gt;uls 来讲 来说 而言 说来&lt;/li&gt;
    &lt;li&gt;uzhi 之&lt;/li&gt;
    &lt;li&gt;ulian 连 （“连小学生都会”）&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
 &lt;p&gt;  &lt;strong&gt;动词(1个一类，9个二类)&lt;/strong&gt;&lt;/p&gt;
 &lt;ul&gt;
  &lt;li&gt;v 动词
   &lt;ul&gt;
    &lt;li&gt;vd 副动词&lt;/li&gt;
    &lt;li&gt;vn 名动词&lt;/li&gt;
    &lt;li&gt;vshi 动词“是”&lt;/li&gt;
    &lt;li&gt;vyou 动词“有”&lt;/li&gt;
    &lt;li&gt;vf 趋向动词&lt;/li&gt;
    &lt;li&gt;vx 形式动词&lt;/li&gt;
    &lt;li&gt;vi 不及物动词（内动词）&lt;/li&gt;
    &lt;li&gt;vl 动词性惯用语&lt;/li&gt;
    &lt;li&gt;vg 动词性语素&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
 &lt;p&gt;  &lt;strong&gt;标点符号(1个一类，16个二类)&lt;/strong&gt;&lt;/p&gt;
 &lt;ul&gt;
  &lt;li&gt;w 标点符号
   &lt;ul&gt;
    &lt;li&gt;wkz 左括号，全角：（ 〔 ［  ｛  《 【  〖 〈   半角：( [ { &amp;lt;&lt;/li&gt;
    &lt;li&gt;wky 右括号，全角：） 〕 ］ ｝ 》  】 〗 〉 半角： ) ] { &amp;gt;&lt;/li&gt;
    &lt;li&gt;wyz 左引号，全角：“ ‘ 『&lt;/li&gt;
    &lt;li&gt;wyy 右引号，全角：” ’ 』&lt;/li&gt;
    &lt;li&gt;wj 句号，全角：。&lt;/li&gt;
    &lt;li&gt;ww 问号，全角：？ 半角：?&lt;/li&gt;
    &lt;li&gt;wt 叹号，全角：！ 半角：!&lt;/li&gt;
    &lt;li&gt;wd 逗号，全角：， 半角：,&lt;/li&gt;
    &lt;li&gt;wf 分号，全角：； 半角： ;&lt;/li&gt;
    &lt;li&gt;wn 顿号，全角：、&lt;/li&gt;
    &lt;li&gt;wm 冒号，全角：： 半角： :&lt;/li&gt;
    &lt;li&gt;ws 省略号，全角：…… …&lt;/li&gt;
    &lt;li&gt;wp 破折号，全角：—— －－   ——－   半角：—  —-&lt;/li&gt;
    &lt;li&gt;wb 百分号千分号，全角：％ ‰ 半角：%&lt;/li&gt;
    &lt;li&gt;wh 单位符号，全角：￥ ＄ ￡ °  ℃  半角：$&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
 &lt;p&gt;  &lt;strong&gt;字符串(1个一类，2个二类)&lt;/strong&gt;&lt;/p&gt;
 &lt;ul&gt;
  &lt;li&gt;x 字符串
   &lt;ul&gt;
    &lt;li&gt;xx 非语素字&lt;/li&gt;
    &lt;li&gt;xu 网址URL&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
 &lt;p&gt;  &lt;strong&gt;语气词(1个一类)&lt;/strong&gt;&lt;/p&gt;
 &lt;ul&gt;
  &lt;li&gt;y 语气词(delete yg)&lt;/li&gt;
&lt;/ul&gt;
 &lt;p&gt;  &lt;strong&gt;状态词(1个一类)&lt;/strong&gt;&lt;/p&gt;
 &lt;ul&gt;
  &lt;li&gt;z 状态词&lt;/li&gt;
&lt;/ul&gt;
 &lt;h2&gt;HanLP词性标注集&lt;/h2&gt;
 &lt;p&gt;HanLP使用的HMM词性标注模型训练自2014年人民日报切分语料，随后增加了少量98年人民日报中独有的词语。所以，HanLP词性标注集兼容《ICTPOS3.0汉语词性标记集》，并且兼容《现代汉语语料库加工规范——词语切分与词性标注》。&lt;/p&gt;
 &lt;ul&gt;
  &lt;li&gt;a 形容词
   &lt;ul&gt;
    &lt;li&gt;ad 副形词&lt;/li&gt;
    &lt;li&gt;ag 形容词性语素&lt;/li&gt;
    &lt;li&gt;al 形容词性惯用语&lt;/li&gt;
    &lt;li&gt;an名形词&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
  &lt;li&gt;b区别词
   &lt;ul&gt;
    &lt;li&gt;begin 仅用于始##始&lt;/li&gt;
    &lt;li&gt;bg 区别语素&lt;/li&gt;
    &lt;li&gt;bl 区别词性惯用语&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
  &lt;li&gt;c 连词
   &lt;ul&gt;
    &lt;li&gt;cc 并列连词&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
  &lt;li&gt;d 副词
   &lt;ul&gt;
    &lt;li&gt;dg 辄,俱,复之类的副词&lt;/li&gt;
    &lt;li&gt;dl 连语&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
  &lt;li&gt;e 叹词
   &lt;ul&gt;
    &lt;li&gt;end 仅用于终##终&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
  &lt;li&gt;f 方位词&lt;/li&gt;
  &lt;li&gt;g 学术词汇
   &lt;ul&gt;
    &lt;li&gt;gb 生物相关词汇
     &lt;ul&gt;
      &lt;li&gt;gbc 生物类别&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
    &lt;li&gt;gc 化学相关词汇&lt;/li&gt;
    &lt;li&gt;gg 地理地质相关词汇&lt;/li&gt;
    &lt;li&gt;gi 计算机相关词汇&lt;/li&gt;
    &lt;li&gt;gm 数学相关词汇&lt;/li&gt;
    &lt;li&gt;gp 物理相关词汇&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
  &lt;li&gt;h 前缀&lt;/li&gt;
  &lt;li&gt;i 成语&lt;/li&gt;
  &lt;li&gt;j 简称略语&lt;/li&gt;
  &lt;li&gt;k 后缀&lt;/li&gt;
  &lt;li&gt;l 习用语&lt;/li&gt;
  &lt;li&gt;m 数词
   &lt;ul&gt;
    &lt;li&gt;mg 数语素，Mg 甲乙丙丁之类的数词&lt;/li&gt;
    &lt;li&gt;mq数量词&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
  &lt;li&gt;n 名词
   &lt;ul&gt;
    &lt;li&gt;nb 生物名
     &lt;ul&gt;
      &lt;li&gt;nba 动物名&lt;/li&gt;
      &lt;li&gt;nbc 动物纲目&lt;/li&gt;
      &lt;li&gt;nbp 植物名&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
    &lt;li&gt;nf 食品，比如“薯片”&lt;/li&gt;
    &lt;li&gt;ng 名词性语素&lt;/li&gt;
    &lt;li&gt;nh 医药疾病等健康相关名词
     &lt;ul&gt;
      &lt;li&gt;nhd 疾病&lt;/li&gt;
      &lt;li&gt;nhm 药品&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
    &lt;li&gt;ni 机构相关（不是独立机构名）
     &lt;ul&gt;
      &lt;li&gt;nic 下属机构&lt;/li&gt;
      &lt;li&gt;nis 机构后缀&lt;/li&gt;
      &lt;li&gt;nit 教育相关机构&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
    &lt;li&gt;nl 名词性惯用语&lt;/li&gt;
    &lt;li&gt;nm 物品名
     &lt;ul&gt;
      &lt;li&gt;nmc 化学品名&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
    &lt;li&gt;nn 工作相关名词
     &lt;ul&gt;
      &lt;li&gt;nnd 职业&lt;/li&gt;
      &lt;li&gt;nnt 职务职称&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
    &lt;li&gt;nr人名
     &lt;ul&gt;
      &lt;li&gt;nr1 复姓&lt;/li&gt;
      &lt;li&gt;nr2 蒙古姓名&lt;/li&gt;
      &lt;li&gt;nrf 音译人名&lt;/li&gt;
      &lt;li&gt;nrj 日语人名&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
    &lt;li&gt;ns 地名
     &lt;ul&gt;
      &lt;li&gt;nsf 音译地名&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
    &lt;li&gt;nt 机构团体名
     &lt;ul&gt;
      &lt;li&gt;ntc公司名&lt;/li&gt;
      &lt;li&gt;ntcb 银行&lt;/li&gt;
      &lt;li&gt;ntcf 工厂&lt;/li&gt;
      &lt;li&gt;ntch 酒店宾馆&lt;/li&gt;
      &lt;li&gt;nth 医院&lt;/li&gt;
      &lt;li&gt;nto 政府机构&lt;/li&gt;
      &lt;li&gt;nts 中小学&lt;/li&gt;
      &lt;li&gt;ntu大学&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
    &lt;li&gt;nx 字母专名&lt;/li&gt;
    &lt;li&gt;nz 其他专名&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
  &lt;li&gt;o 拟声词&lt;/li&gt;
  &lt;li&gt;p 介词
   &lt;ul&gt;
    &lt;li&gt;pba 介词“把”&lt;/li&gt;
    &lt;li&gt;pbei 介词“被”&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
  &lt;li&gt;q 量词
   &lt;ul&gt;
    &lt;li&gt;qg 量词语素&lt;/li&gt;
    &lt;li&gt;qt 时量词&lt;/li&gt;
    &lt;li&gt;qv 动量词&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
  &lt;li&gt;r 代词
   &lt;ul&gt;
    &lt;li&gt;rg 代词性语素&lt;/li&gt;
    &lt;li&gt;Rg 古汉语代词性语素&lt;/li&gt;
    &lt;li&gt;rr 人称代词&lt;/li&gt;
    &lt;li&gt;ry 疑问代词
     &lt;ul&gt;
      &lt;li&gt;rys 处所疑问代词&lt;/li&gt;
      &lt;li&gt;ryt 时间疑问代词&lt;/li&gt;
      &lt;li&gt;ryv 谓词性疑问代词&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
    &lt;li&gt;rz 指示代词
     &lt;ul&gt;
      &lt;li&gt;rzs 处所指示代词&lt;/li&gt;
      &lt;li&gt;rzt 时间指示代词&lt;/li&gt;
      &lt;li&gt;rzv 谓词性指示代词&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
    &lt;li&gt;s 处所词&lt;/li&gt;
    &lt;li&gt;t 时间词
     &lt;ul&gt;
      &lt;li&gt;tg 时间词性语素&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
    &lt;li&gt;u 助词
     &lt;ul&gt;
      &lt;li&gt;ud 助词
       &lt;ul&gt;
        &lt;li&gt;ude1 的 底&lt;/li&gt;
        &lt;li&gt;ude2 地&lt;/li&gt;
        &lt;li&gt;ude3 得&lt;/li&gt;
        &lt;li&gt;udeng 等 等等 云云&lt;/li&gt;
        &lt;li&gt;udh 的话&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
      &lt;li&gt;ug 过
       &lt;ul&gt;
        &lt;li&gt;uguo 过&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
      &lt;li&gt;uj 助词&lt;/li&gt;
      &lt;li&gt;ul 连词
       &lt;ul&gt;
        &lt;li&gt;ule 了 喽&lt;/li&gt;
        &lt;li&gt;ulian 连 （“连小学生都会”）&lt;/li&gt;
        &lt;li&gt;uls 来讲 来说 而言 说来&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
      &lt;li&gt;usuo 所&lt;/li&gt;
      &lt;li&gt;uv 连词&lt;/li&gt;
      &lt;li&gt;uyy 一样 一般 似的 般&lt;/li&gt;
      &lt;li&gt;uz 着
       &lt;ul&gt;
        &lt;li&gt;uzhe 着&lt;/li&gt;
        &lt;li&gt;uzhi 之&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
      &lt;li&gt;v 动词
       &lt;ul&gt;
        &lt;li&gt;vd 副动词&lt;/li&gt;
        &lt;li&gt;vf 趋向动词&lt;/li&gt;
        &lt;li&gt;vg 动词性语素&lt;/li&gt;
        &lt;li&gt;vi 不及物动词（内动词）&lt;/li&gt;
        &lt;li&gt;vl 动词性惯用语&lt;/li&gt;
        &lt;li&gt;vn 名动词&lt;/li&gt;
        &lt;li&gt;vshi 动词“是”&lt;/li&gt;
        &lt;li&gt;vx 形式动词&lt;/li&gt;
        &lt;li&gt;vyou 动词“有”&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
      &lt;li&gt;w 标点符号
       &lt;ul&gt;
        &lt;li&gt;wb 百分号千分号，全角：％ ‰ 半角：%&lt;/li&gt;
        &lt;li&gt;wd 逗号，全角：， 半角：,&lt;/li&gt;
        &lt;li&gt;wf 分号，全角：； 半角： ;&lt;/li&gt;
        &lt;li&gt;wh 单位符号，全角：￥ ＄ ￡ °  ℃  半角：$&lt;/li&gt;
        &lt;li&gt;wj 句号，全角：。&lt;/li&gt;
        &lt;li&gt;wky 右括号，全角：） 〕 ］ ｝ 》  】 〗 〉 半角： ) ] { &amp;gt;&lt;/li&gt;
        &lt;li&gt;wkz 左括号，全角：（ 〔 ［  ｛  《 【  〖 〈   半角：( [ { &amp;lt;&lt;/li&gt;
        &lt;li&gt;wm 冒号，全角：： 半角： :&lt;/li&gt;
        &lt;li&gt;wn 顿号，全角：、&lt;/li&gt;
        &lt;li&gt;wp 破折号，全角：—— －－   ——－   半角：—  —-&lt;/li&gt;
        &lt;li&gt;ws 省略号，全角：…… …&lt;/li&gt;
        &lt;li&gt;wt 叹号，全角：！&lt;/li&gt;
        &lt;li&gt;ww 问号，全角：？&lt;/li&gt;
        &lt;li&gt;wyy 右引号，全角：” ’ 』&lt;/li&gt;
        &lt;li&gt;wyz 左引号，全角：“ ‘ 『&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
      &lt;li&gt;x 字符串
       &lt;ul&gt;
        &lt;li&gt;xu 网址URL&lt;/li&gt;
        &lt;li&gt;xx 非语素字&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
      &lt;li&gt;y 语气词(delete yg)
       &lt;ul&gt;
        &lt;li&gt;yg 语气语素&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
      &lt;li&gt;z 状态词
       &lt;ul&gt;
        &lt;li&gt;zg 状态词&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
 &lt;h2&gt;BosonNLP词性标注&lt;/h2&gt;
 &lt;p&gt;BosonNLP词性标注集是基于《北京大学现代汉语语料库基本加工规范》和《计算所汉语词性标记集》修改得到的。 与最初《北京大学现代汉语语料库基本加工规范》相比，主要修改有：&lt;/p&gt;
 &lt;ul&gt;
  &lt;li&gt;姓名和起来标”nr”，只有姓单独出现的时候标”nr1”，如“张/nr1 教授/n”&lt;/li&gt;
  &lt;li&gt;短语型的地名、团体机构名称及其他专有名称只进行最小粒度的划分，不需要再合并标注。&lt;/li&gt;
  &lt;li&gt;去掉了各种语素，“Ng”，“Ag”等都标回“n”，“a”等。&lt;/li&gt;
  &lt;li&gt;去掉“i”（成语俗语）和“l”（惯用语）标签，改成“nl”、“al”、“bl”等各种词性的惯用语标签&lt;/li&gt;
  &lt;li&gt;去掉标签“j”（缩略词），将其标回原来的词性&lt;/li&gt;
  &lt;li&gt;依据《计算所汉语词性标记集》的标准对一些标签进行细分&lt;/li&gt;
  &lt;li&gt;增加标签“vi”（不及物动词）&lt;/li&gt;
&lt;/ul&gt;
 &lt;p&gt;共22个大类，70个标签&lt;/p&gt;
 &lt;p&gt;名词&lt;/p&gt;
 &lt;ul&gt;
  &lt;li&gt;n 名词
   &lt;ul&gt;
    &lt;li&gt;nr 人名（包括”@XXX”），姓名整体标注，如“李某某”、“李××”也标为nr
     &lt;ul&gt;
      &lt;li&gt;nr1 中文姓氏，如果单出现姓氏，标为nr1，姓名一起出现的，合起来标nr&lt;/li&gt;
      &lt;li&gt;nrf 音译人名，如“奥巴马”，“布拉德・皮特”&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
    &lt;li&gt;ns 地名，如“中国”，“上海市”，“江浙”&lt;/li&gt;
    &lt;li&gt;nt 组织机构名，如“中国队”，“央行”&lt;/li&gt;
    &lt;li&gt;nz 其它专有名词，如“银联”，“腾讯”&lt;/li&gt;
    &lt;li&gt;nl 名词性惯用语，如“豪言壮语”，“亲朋好友”&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
 &lt;p&gt;时间词&lt;/p&gt;
 &lt;ul&gt;
  &lt;li&gt;t 时间词，如“1988年”,”3月”&lt;/li&gt;
&lt;/ul&gt;
 &lt;p&gt;处所词&lt;/p&gt;
 &lt;ul&gt;
  &lt;li&gt;s 处所词，如“国内”，“市区”&lt;/li&gt;
&lt;/ul&gt;
 &lt;p&gt;方位词&lt;/p&gt;
 &lt;ul&gt;
  &lt;li&gt;f 方位词，如“上”，“下”，“前面”，“后面”&lt;/li&gt;
&lt;/ul&gt;
 &lt;p&gt;动词&lt;/p&gt;
 &lt;ul&gt;
  &lt;li&gt;v 动词
   &lt;ul&gt;
    &lt;li&gt;vd 副动词，如“持续/vd 提供/v”，“优先/vd 安排/v”&lt;/li&gt;
    &lt;li&gt;vshi 动词“是”&lt;/li&gt;
    &lt;li&gt;vyou 动词“有”&lt;/li&gt;
    &lt;li&gt;vi 不及物动词，如“运营”，“点球”&lt;/li&gt;
    &lt;li&gt;vl 动词性惯用语，如“远走高飞”，“相依为命”&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
 &lt;p&gt;形容词&lt;/p&gt;
 &lt;ul&gt;
  &lt;li&gt;a 形容词
   &lt;ul&gt;
    &lt;li&gt;ad 副形词，如“经过/p 谨慎/ad 筛选/v”&lt;/li&gt;
    &lt;li&gt;an 名形词，如“虽然/c 困难/an 很多/m”&lt;/li&gt;
    &lt;li&gt;al 形容词性惯用语，如“拥挤不堪”，“难能可贵”&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
 &lt;p&gt;区别词&lt;/p&gt;
 &lt;ul&gt;
  &lt;li&gt;b 区别词，如“原来”，“所有”
   &lt;ul&gt;
    &lt;li&gt;bl 区别词性惯用语，如“至关重要”，“光天化日”&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
 &lt;p&gt;状态词&lt;/p&gt;
 &lt;ul&gt;
  &lt;li&gt;z 状态词，如“依旧”，“一头雾水”&lt;/li&gt;
&lt;/ul&gt;
 &lt;p&gt;代词&lt;/p&gt;
 &lt;ul&gt;
  &lt;li&gt;r 代词，“我”，“这”，“谁”&lt;/li&gt;
&lt;/ul&gt;
 &lt;p&gt;数字&lt;/p&gt;
 &lt;ul&gt;
  &lt;li&gt;m 数词&lt;/li&gt;
&lt;/ul&gt;
 &lt;p&gt;量词&lt;/p&gt;
 &lt;ul&gt;
  &lt;li&gt;q 量词&lt;/li&gt;
&lt;/ul&gt;
 &lt;p&gt;副词&lt;/p&gt;
 &lt;ul&gt;
  &lt;li&gt;d 副词，如“更”，“非常”
   &lt;ul&gt;
    &lt;li&gt;dl 副词性惯用语，如“对了”，“万万”&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
 &lt;p&gt;介词&lt;/p&gt;
 &lt;ul&gt;
  &lt;li&gt;p 介词
   &lt;ul&gt;
    &lt;li&gt;pba 介词“把”&lt;/li&gt;
    &lt;li&gt;pbei 介词“被”&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
 &lt;p&gt;连词&lt;/p&gt;
 &lt;ul&gt;
  &lt;li&gt;c 连词，如“和”，“与”，“及”&lt;/li&gt;
&lt;/ul&gt;
 &lt;p&gt;助词&lt;/p&gt;
 &lt;ul&gt;
  &lt;li&gt;u 助词
   &lt;ul&gt;
    &lt;li&gt;uzhe 助词“着”&lt;/li&gt;
    &lt;li&gt;ule 助词“了”&lt;/li&gt;
    &lt;li&gt;uguo 助词“过”&lt;/li&gt;
    &lt;li&gt;ude 助词“的”、“地”、“得”&lt;/li&gt;
    &lt;li&gt;usuo 助词“所”&lt;/li&gt;
    &lt;li&gt;udeng 助词“等”、“等等”&lt;/li&gt;
    &lt;li&gt;uyy 助词“一样”、“似的”&lt;/li&gt;
    &lt;li&gt;udh 助词“的话”&lt;/li&gt;
    &lt;li&gt;uzhi 助词“之”&lt;/li&gt;
    &lt;li&gt;ulian 助词“连”&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
 &lt;p&gt;语气词&lt;/p&gt;
 &lt;ul&gt;
  &lt;li&gt;y 语气词，将原来的叹词也合并到语气词里面&lt;/li&gt;
&lt;/ul&gt;
 &lt;p&gt;拟声词&lt;/p&gt;
 &lt;ul&gt;
  &lt;li&gt;o 拟声词&lt;/li&gt;
&lt;/ul&gt;
 &lt;p&gt;前缀&lt;/p&gt;
 &lt;ul&gt;
  &lt;li&gt;h 前缀，如“非/h 正常/a”&lt;/li&gt;
&lt;/ul&gt;
 &lt;p&gt;19 后缀&lt;/p&gt;
 &lt;ul&gt;
  &lt;li&gt;k 后缀，如“孩子/n 们/k”，“隐藏/v 式/k”&lt;/li&gt;
&lt;/ul&gt;
 &lt;p&gt;字符串&lt;/p&gt;
 &lt;ul&gt;
  &lt;li&gt;nx 字符串，url和其他特殊字符除外&lt;/li&gt;
&lt;/ul&gt;
 &lt;p&gt;标点符号&lt;/p&gt;
 &lt;ul&gt;
  &lt;li&gt;w 标点符号
   &lt;ul&gt;
    &lt;li&gt;wkz 左括号，全角：（ 〔 ［ ｛ 《 【 〖 〈 半角：( [ { &amp;lt;&lt;/li&gt;
    &lt;li&gt;wky 右括号，全角：） 〕 ］ ｝ 》 】 〗 〉 半角： ) ] { &amp;gt;&lt;/li&gt;
    &lt;li&gt;wyz 左引号，全角：“ ‘ 『&lt;/li&gt;
    &lt;li&gt;wyy 右引号，全角：” ’ 』&lt;/li&gt;
    &lt;li&gt;wj 句号，全角：。 半角：.&lt;/li&gt;
    &lt;li&gt;ww 问号，全角：？ 半角：?&lt;/li&gt;
    &lt;li&gt;wt 叹号，全角：！ 半角：!&lt;/li&gt;
    &lt;li&gt;wd 逗号，全角：， 半角：,&lt;/li&gt;
    &lt;li&gt;wf 分号，全角：； 半角： ;&lt;/li&gt;
    &lt;li&gt;wn 顿号，全角：、&lt;/li&gt;
    &lt;li&gt;wm 冒号，全角：： 半角： :&lt;/li&gt;
    &lt;li&gt;ws 省略号，全角：…… …&lt;/li&gt;
    &lt;li&gt;wp 破折号，全角：—— －－ ——－ 半角：— —-&lt;/li&gt;
    &lt;li&gt;wb 百分号千分号，全角：％ ‰ 半角：%&lt;/li&gt;
    &lt;li&gt;wh 单位符号，全角：￥ ＄ ￡ ° ℃ 半角：$&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
 &lt;p&gt;其它&lt;/p&gt;
 &lt;ul&gt;
  &lt;li&gt;email 电子邮件地址 ，如“jane.li@bosondata.com.cn”&lt;/li&gt;
  &lt;li&gt;tel 电话号码，如：“13818636693”&lt;/li&gt;
  &lt;li&gt;id 身份证号&lt;/li&gt;
  &lt;li&gt;ip ip地址，如“127.0.0.1”&lt;/li&gt;
  &lt;li&gt;url 网页链接，如“http://bosonnlp.com/”&lt;/li&gt;
&lt;/ul&gt;
 &lt;h2&gt;结巴分词中出现的类型&lt;/h2&gt;
 &lt;ul&gt;
  &lt;li&gt;a 形容词
   &lt;ul&gt;
    &lt;li&gt;ad 副形词&lt;/li&gt;
    &lt;li&gt;ag形语素&lt;/li&gt;
    &lt;li&gt;an副形词&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
  &lt;li&gt;b区别词&lt;/li&gt;
  &lt;li&gt;c连词&lt;/li&gt;
  &lt;li&gt;d副词
   &lt;ul&gt;
    &lt;li&gt;df&lt;/li&gt;
    &lt;li&gt;dg副语素&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
  &lt;li&gt;e叹词&lt;/li&gt;
  &lt;li&gt;f方位词&lt;/li&gt;
  &lt;li&gt;g语素&lt;/li&gt;
  &lt;li&gt;h前接成分&lt;/li&gt;
  &lt;li&gt;i成语&lt;/li&gt;
  &lt;li&gt;j简称略语&lt;/li&gt;
  &lt;li&gt;k后接成分&lt;/li&gt;
  &lt;li&gt;l习用语&lt;/li&gt;
  &lt;li&gt;m数词
   &lt;ul&gt;
    &lt;li&gt;mg数语素&lt;/li&gt;
    &lt;li&gt;mq 数量词&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
  &lt;li&gt;n名词
   &lt;ul&gt;
    &lt;li&gt;ng名词性语素&lt;/li&gt;
    &lt;li&gt;nr人名&lt;/li&gt;
    &lt;li&gt;nrfg&lt;/li&gt;
    &lt;li&gt;nrt&lt;/li&gt;
    &lt;li&gt;ns地名&lt;/li&gt;
    &lt;li&gt;nt机构团体&lt;/li&gt;
    &lt;li&gt;nz其他专名&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
  &lt;li&gt;o拟声词&lt;/li&gt;
  &lt;li&gt;p介词&lt;/li&gt;
  &lt;li&gt;q量词&lt;/li&gt;
  &lt;li&gt;r代词
   &lt;ul&gt;
    &lt;li&gt;rg 代语素&lt;/li&gt;
    &lt;li&gt;rr人称代词&lt;/li&gt;
    &lt;li&gt;rz指示代词&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
  &lt;li&gt;s处所词&lt;/li&gt;
  &lt;li&gt;t时间词
   &lt;ul&gt;
    &lt;li&gt;tg时语素&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
  &lt;li&gt;u助词
   &lt;ul&gt;
    &lt;li&gt;ud&lt;/li&gt;
    &lt;li&gt;ug&lt;/li&gt;
    &lt;li&gt;uj&lt;/li&gt;
    &lt;li&gt;ul&lt;/li&gt;
    &lt;li&gt;uv&lt;/li&gt;
    &lt;li&gt;uz&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
  &lt;li&gt;v动词
   &lt;ul&gt;
    &lt;li&gt;vd副动词&lt;/li&gt;
    &lt;li&gt;vg动语素&lt;/li&gt;
    &lt;li&gt;vi不及物动词（内动词）&lt;/li&gt;
    &lt;li&gt;vn名动词&lt;/li&gt;
    &lt;li&gt;vq&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
  &lt;li&gt;x非语素字&lt;/li&gt;
  &lt;li&gt;y语气语素&lt;/li&gt;
  &lt;li&gt;z状态词
   &lt;ul&gt;
    &lt;li&gt;zg&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
 &lt;p&gt;其他参考资料：&lt;/p&gt;
 &lt;ul&gt;
  &lt;li&gt;   &lt;a href="http://icl.pku.edu.cn/icl_groups/corpus/spec.htm"&gt;http://icl.pku.edu.cn/icl_groups/corpus/spec.htm&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
 &lt;div&gt;
  &lt;p&gt;No related posts.&lt;/p&gt;
&lt;/div&gt;
&lt;div&gt; &lt;a href="https://itindex.net/"  title="IT 资讯"&gt;&lt;img src="https://itindex.net/images/iconWarning.gif" title="IT 资讯" border="0"/&gt; &lt;/a&gt;</description>
      <category>程序开发 自然语言处理</category>
      <guid isPermaLink="true">https://itindex.net/detail/56121-%E8%87%AA%E7%84%B6%E8%AF%AD%E8%A8%80-%E8%AF%8D%E6%80%A7</guid>
      <pubDate>Sat, 29 Oct 2016 15:52:18 CST</pubDate>
    </item>
    <item>
      <title>从NLP到“自然语言理解”，Facebook如何让Messenger更懂人类？</title>
      <link>https://itindex.net/detail/56868-nlp-%E8%87%AA%E7%84%B6%E8%AF%AD%E8%A8%80-%E7%90%86%E8%A7%A3</link>
      <description>&lt;p&gt;雷锋网按：Facebook的AML和FAIR团队合作进行自然语言处理对自然语言理解进行着合作研究。在2017年4月19日举办的F8开发者大会上，Facebook向公众介绍了他们的研究进展、自然语言理解在Facebook产品中的应用，并且介绍了平民化的自然语言理解平台CLUE，希望依靠大家的力量，继续丰富自然语言理解的应用。&lt;/p&gt; &lt;p&gt;演讲者：Facebook工程主管Benoit Dumoulin，技术项目主管Aparna Lakshmiratan。雷锋网AI科技评论听译。&lt;/p&gt; &lt;p&gt;&lt;/p&gt; &lt;p&gt;  &lt;br /&gt;&lt;/p&gt; &lt;p&gt;  &lt;img src="http://static.leiphone.com/uploads/new/article/740_740/201704/58f97b11d3cba.jpg?imageMogr2/format/jpg/quality/90"&gt;&lt;/img&gt;&lt;/p&gt; &lt;p&gt;（首先上台的是Benoit）大家好，我是Benoit，我是Facebook自然语言理解团队的负责人。&lt;/p&gt; &lt;p&gt;  &lt;img src="http://static.leiphone.com/uploads/new/article/740_740/201704/58f98089dca31.jpg?imageMogr2/format/jpg/quality/90"&gt;&lt;/img&gt;&lt;/p&gt; &lt;p&gt;我们团队隶属于AML（applied machine learning，机器学习应用小组）。今天我想给大家讲讲几个我们团队最近的工作成果，讲讲我们正在研究什么，同时也会讲到我们遇到、并且正在努力解决的问题和挑战。等一下我还会请一个同事上台来介绍一个有意思的产品，其中就用到了我们团队开发的技术。&lt;/p&gt; &lt;p&gt;  &lt;img src="http://static.leiphone.com/uploads/new/article/740_740/201704/58f97ca46438b.jpg?imageMogr2/format/jpg/quality/90"&gt;&lt;/img&gt;&lt;/p&gt; &lt;h3&gt;Facebook为什么需要自然语言理解？&lt;/h3&gt; &lt;p&gt;进入正题，当你打开Facebook之后，你肯定会用到文字。文字是重要的沟通方式，Facebook的每个产品里面都能看到文字，Instagram，Messenger，Whatsapp等等，文字真的到处都是。而你每天在Facebook看到的或者写下的文字，是没有任何要求，任何人都可以随意发挥的，不需要戏剧化或者怎样。所以如果我们能够理解这些文字，那我们就肯定可以让每个用户的使用感受都得到提升。&lt;/p&gt; &lt;p&gt;  &lt;img src="http://static.leiphone.com/uploads/new/article/740_740/201704/58f97cd55ab5a.jpg?imageMogr2/format/jpg/quality/90"&gt;&lt;/img&gt;&lt;/p&gt; &lt;p&gt;理由是这样的，拿我自己举例吧，其实我是法国裔加拿大人，在蒙特利尔长大的（观众喝彩），（笑）。那我呢，工作是科学家，业余时间喜欢冰球，所以当我每天打开Facebook的时候，我想看到我朋友们的新动向、想跟他们聊天；我也想知道最新的冰球比赛结果如何，你看现在就有一场，我挺关心我喜欢的俱乐部怎么样了——不告诉你们叫什么（笑）。同时呢，除了看这些新闻，我还需要关注机器学习方面的动向，我得知道下一场会议在什么时候、都有谁会去、我的朋友们去不去、是谁组织的、有没有什么优秀论文等等，各种各样的事情。为了达到这样的目的呢，我们就需要想办法理解这些文字内容，然后根据我的兴趣进行匹配。&lt;/p&gt; &lt;p&gt;  &lt;img src="http://static.leiphone.com/uploads/new/article/740_740/201704/58f97d304ed2c.jpg?imageMogr2/format/jpg/quality/90"&gt;&lt;/img&gt;&lt;/p&gt; &lt;p&gt;我们经常提到“自然语言理解”和“内容识别”，要表达什么意思呢？简单说就是能给别人解释——一段文字经过算法处理以后，我们能够做出结论或者进行引申。在我们能做的事情里面，最基本的之一就是给文字分类。&lt;/p&gt; &lt;p&gt;  &lt;img src="http://static.leiphone.com/uploads/new/article/740_740/201704/58f97d471ca3f.jpg?imageMogr2/format/jpg/quality/90"&gt;&lt;/img&gt;&lt;/p&gt; &lt;p&gt;比如（右边）这段内容是我发的，把它输到机器里，就能训练它如何把内容分类成为话题，然后就能跟别人解释了，“哦，这段内容是关于厨艺的。” （左边）还有一段关于篮球的内容是我的朋友Jole发的，不过如果你仔细看一下文字的话，你就会发现它也是关于厨艺的，只是不那么明显。不过不用担心，我们训练的机器也可以处理这样的内容。&lt;/p&gt; &lt;p&gt;  &lt;img src="http://static.leiphone.com/uploads/new/article/740_740/201704/58f97f06b8ff8.jpg?imageMogr2/format/jpg/quality/90"&gt;&lt;/img&gt;&lt;/p&gt; &lt;p&gt;我们当然还能做更棒的，更深入地理解一段话，区分出其中的实体。这是另一个朋友的动态，要去看演出，这个乐队我没怎么听说过。当你仔细看一下文字部分就会发现，名字挺逗， 乐队名字是“Muckbucket Sunshine”，演出地点是“BOM BOM ROOM”。那如果这种时候我们能区分出实体，知道了是哪个乐队、在哪个场馆演出，然后就可以把它匹配给喜欢音乐的人；然后呢，我们不需要把所有音乐相关的信息都推荐给他们，只需要推荐跟这个乐队或者这个场馆相关的就可以了。我们所讲的“内容识别”大概就是这样。&lt;/p&gt; &lt;p&gt;  &lt;img src="http://static.leiphone.com/uploads/new/article/740_740/201704/58f97f2a47285.jpg?imageMogr2/format/jpg/quality/90"&gt;&lt;/img&gt;&lt;/p&gt; &lt;p&gt;对于Messenger，你们在听过昨天的演讲、参加一些活动以后就会知道，一旦能够理解文字内容了，就可以做一些很有趣的事情。比如这段对话，我和我的两个朋友打算一起出去喝酒。区分一下实体的话，就是我们要去palo alto，时间也能看得出来。这里我想强调一下，人类可以很容易地理解这段对话，实际上我们3个人用了3种不同的方式来表达时间。&lt;/p&gt; &lt;h3&gt;Facebook的目标和方法&lt;/h3&gt; &lt;p&gt;  &lt;img src="http://static.leiphone.com/uploads/new/article/740_740/201704/58f97f3b284ec.jpg?imageMogr2/format/jpg/quality/90"&gt;&lt;/img&gt;&lt;/p&gt; &lt;p&gt;所以我们的目标就是设计和训练人工智能，让它们对文字内容的理解准确度达到人类水平，确实是这样。这个目标其实挺难达到的，我试着跟你们解释一下，Facebook上面的文字完全是自由地书写的，没有任何限制，用户们想怎么写就怎么写，对不对。&lt;/p&gt; &lt;p&gt;  &lt;img src="http://static.leiphone.com/uploads/new/article/740_740/201704/58f97f58b1b86.jpg?imageMogr2/format/jpg/quality/90"&gt;&lt;/img&gt;&lt;/p&gt; &lt;p&gt;我们打算怎样达到这个目标呢，不是什么秘密，我们用了深度学习的方法。我们最重要的方法之一是来自这篇论文的。它的名字叫《从零开始进行文本理解》（《Text understanding from scratch》），是几年前公开的，其中介绍了可以用深度学习，就是只需一个标准的网络模型就能进行语言识别，并且解决大多数在其中遇到的问题。我们跟Facebook的研究团队一起研究了这篇论文，然后我们就决定建立一个能够支持论文中这样的算法的平台。&lt;/p&gt; &lt;p&gt;  &lt;img src="http://static.leiphone.com/uploads/new/article/740_740/201704/58f97f71bc6af.jpg?imageMogr2/format/jpg/quality/90"&gt;&lt;/img&gt;&lt;/p&gt; &lt;p&gt;  &lt;img src="http://static.leiphone.com/uploads/new/article/740_740/201704/58f97fa980bb1.jpg?imageMogr2/format/jpg/quality/90"&gt;&lt;/img&gt;&lt;/p&gt; &lt;p&gt;这是我们在Facebook建的这个平台建好以后的样子，我们把它叫做Deep Text，是帮我们达成文本识别方面目标的秘密武器。我们把这个平台建立得可以灵活切换，还可以升级拓展。我们每天会拿很多文本给它训练或者处理。它需要支持多种语言，如果你参与了之前的演讲，你一定明白我们有很多用其它语言的用户，他们同样会用不同的语言创造很多内容，我们也需要理解。还有，这个方面有许许多多的问题需要解决，我们希望这个平台能够以无缝的方式解决许多种不同的问题。&lt;/p&gt; &lt;p&gt;  &lt;img src="http://static.leiphone.com/uploads/new/article/740_740/201704/58f97fdff2f0a.jpg?imageMogr2/format/jpg/quality/90"&gt;&lt;/img&gt;&lt;/p&gt; &lt;p&gt;我刚才解释过的内容分类、实体识别和区分只是众多待解决问题中的几个，我们还可以做很多别的事情。我等下还会说一个叫做“文本相似性”的，也是能够很自然地用这样的平台解决的。现在我们回过头来再讲一下Deep Text，看看它是怎么解决文本分类的问题的。&lt;/p&gt; &lt;p&gt;  &lt;img src="http://static.leiphone.com/uploads/new/article/740_740/201704/58f98004aaca6.jpg?imageMogr2/format/jpg/quality/90"&gt;&lt;/img&gt;&lt;/p&gt; &lt;p&gt;刚才说过Deep Text用到了深度学习，其中很有意思的一点就是单词是以向量的形式表示的。我们在向量空间里表示这些词，这样一来，语义学上相似的词也就会处在更接近的位置上；不怎么相似的词就会离得很远。这里是一张这种表示方法的示意图，里面的蓝色和粉色点就是单词。可以看到，几个球类运动的名称挨得比较近，其它概念性的词虽然也跟运动相关，但是离得就要远一些。&lt;/p&gt; &lt;p&gt;  &lt;img src="http://static.leiphone.com/uploads/new/article/740_740/201704/58f980251c552.jpg?imageMogr2/format/jpg/quality/90"&gt;&lt;/img&gt;&lt;/p&gt; &lt;p&gt;我们实际的措施，基本上是基于卷积网络的，这是一种很自然的吸收组合上下文的方法。这里的“上下文”是指，如果你单独拿一个词出来，它可能会有好多种含义，但是当这个词在句子中、有上下文的时候，那这个词的意思就会变得明确得多。这就是我们这种方法可以很自然地做到这件事的原因。基本上你也自己能做一个话题或者分类识别器，就用这样的网络。&lt;/p&gt; &lt;p&gt;  &lt;img src="http://static.leiphone.com/uploads/new/article/740_740/201704/58f98046a5a02.jpg?imageMogr2/format/jpg/quality/90"&gt;&lt;/img&gt;&lt;/p&gt; &lt;p&gt;刚才我提到了文本相似性，它可以很好地说明我们这个平台的灵活性。关于文本相似性，我们就拿上一页的那种网络，然后把它拓展成了一个复杂得多的模型，像这样。在这里我们要做的是，用一侧的网络对一份文本内容进行分析建模，我们把这种模型叫做“双塔模型”，如果你是业内人士的话，你肯定明白我是什么意思。所以你用一侧的网络对一条文本进行建模，用另一侧的网络对另一条文本进行建模，然后再用一个函数对语义区别大的进行惩罚。&lt;/p&gt; &lt;p&gt;  &lt;img src="http://static.leiphone.com/uploads/new/article/740_740/201704/58f9805947e11.jpg?imageMogr2/format/jpg/quality/90"&gt;&lt;/img&gt;&lt;/p&gt; &lt;p&gt;有了这样的方法，我们就可以做很厉害的事情了。比如这个，我不是喜欢冰球嘛，那么有了这样的模型，如果有一个我喜欢的动态，那这个模型就可以学会找到更多的语义类似的动态，然后我就可以看到更多自己喜欢的东西。这个模型挺厉害的，我们在很多Facebook的产品中都用到了这个模型。&lt;/p&gt; &lt;p&gt;  &lt;img src="http://static.leiphone.com/uploads/new/article/740_740/201704/58f9806653e7e.jpg?imageMogr2/format/jpg/quality/90"&gt;&lt;/img&gt;&lt;/p&gt; &lt;p&gt;这是我们当前所做的，对于未来，我们想要做得更好。这是我们在通往与人类类似的文本识别准确率路上的小目标之一，我们可以把文字和图片或者视频进行联合识别。还是回到我朋友Jole的这个动态，文字部分是很隐晦的，但是这张图片非常好理解。所以如果把两者加以结合，让图片和文字里面的信息都发挥作用，建立一个联合识别的模型，就肯定会对这份内容有很好的理解。&lt;/p&gt; &lt;p&gt;  &lt;img src="http://static.leiphone.com/uploads/new/article/740_740/201704/58f980a344047.jpg?imageMogr2/format/jpg/quality/90"&gt;&lt;/img&gt;&lt;/p&gt; &lt;p&gt;以上就是我们最近在做的事情，我们也一直努力做出更好的成果。那么我就讲到这里，下面我会邀请我的同事上台，她会继续给大家讲一些的实际产品，其中就用到了我们团队开发的技术。&lt;/p&gt; &lt;p&gt;（Benoit走下讲台，观众鼓掌，Aparna走上讲台）&lt;/p&gt; &lt;p&gt;  &lt;img src="http://static.leiphone.com/uploads/new/article/740_740/201704/58f980f96bf53.jpg?imageMogr2/format/jpg/quality/90"&gt;&lt;/img&gt;&lt;/p&gt; &lt;p&gt;谢谢Benoit，我是Aparna，我来跟大家讲讲目前Deep Text是如何运用在真实的Facebook产品中的。我不知道大家有没有想过，实际上人们会用Facebook的群组做各种各样的事情，尤其是用它来买卖东西。&lt;/p&gt; &lt;h3&gt;自然语言理解已经在改善用户体验&lt;/h3&gt; &lt;p&gt;  &lt;img src="http://static.leiphone.com/uploads/new/article/740_740/201704/58f98143ab0af.jpg?imageMogr2/format/jpg/quality/90"&gt;&lt;/img&gt;&lt;/p&gt; &lt;p&gt;大概一年之前，群组的商务团队找到我们，让我们帮忙看看有没有办法知道一个动态是不是关于卖东西的；如果真的要卖东西，我们能不能帮用户更好地达成他的目标，来给用户更好的使用体验。这其中的难点是，当用户想要卖东西的时候，我们不想给用户发动态的方式加上任何束缚，我们还是希望用户用自然语言、自由地表达，但是我们还是要能够识别出用户想要卖东西的意愿。当我们有了Deep Text以后，我们就可以做一个高精确度的分类器，它可以阅读用户的动态，看看用户有没有卖东西的打算。而且它还可以识别得更深，就像刚才Benoit说的那样，识别文本中的实体，在这个场景下就可以是产品名称、价格、主要特性，然后我们就可以给用户提供很有吸引力的使用体验。&lt;/p&gt; &lt;p&gt;  &lt;img src="http://static.leiphone.com/uploads/new/article/740_740/201704/58f981553ee34.jpg?imageMogr2/format/jpg/quality/90"&gt;&lt;/img&gt;&lt;/p&gt; &lt;p&gt;再举一个例子，社交推荐，我在自己的Facebook上都经常会使用这个功能。借助Deep Text，我们可以观察用户的动态，如果你在让你朋友帮忙推荐东西的，比如好吃的饭馆、好玩的活动，又比如这个例子里，想找一个靠谱的理发店。我们能做的就是，用Deep Text判断用户想要做什么样的事情，一旦判断出来，接下来的事情会给用户很棒的体验，当你的朋友给出建议以后，评论会分类，找出其中的实体，更重要的是把找到的实体链接到Facebook的地址簿里，然后展示成美观的地图，方便用户互动，最终达成自己的目标。&lt;/p&gt; &lt;p&gt;  &lt;img src="http://static.leiphone.com/uploads/new/article/740_740/201704/58f981743a640.jpg?imageMogr2/format/jpg/quality/90"&gt;&lt;/img&gt;&lt;/p&gt; &lt;p&gt;最后再说一个应用的话，你们可能在昨天的演讲里已经听过了，那就是Messenger中的M建议。当M觉得它能够帮助你做什么的时候，它就会自动在你的聊天中跳出来。它吸引人的地方，就是缩短了从“想做”到“做成”之间的距离。所以M可以帮忙做很多你想要做的事情。比如，当M发现你要去哪里的时候，它可以帮你叫一辆车，看你喜欢Uber还是lift，而且可以不用离开Messenger界面就叫到车。现在这段视频就演示了当M发现用户打算叫外卖，只要点一下，就可以用一种新的体验叫到外卖。&lt;/p&gt; &lt;p&gt;  &lt;img src="http://static.leiphone.com/uploads/new/article/740_740/201704/58f9819120dba.jpg?imageMogr2/format/jpg/quality/90"&gt;&lt;/img&gt;&lt;/p&gt; &lt;p&gt;而且你还会发现这种体验是共享化的，对话里的每个人都可以参与这个点餐的过程。点好以后仍然通过M就可以完成付款。所以这些事情都可以不用离开Messenger界面就可以搞定，而随着M变得越来越智能，我们也希望有更多类似这样的建议可以给更多的用户意愿带来方便。&lt;/p&gt; &lt;p&gt;  &lt;img src="http://static.leiphone.com/uploads/new/article/740_740/201704/58f9825222dc8.jpg?imageMogr2/format/jpg/quality/90"&gt;&lt;/img&gt;&lt;/p&gt; &lt;p&gt;接下来我想讲讲，当我们在研发这些产品的时候都遇到了一些什么样的困难。&lt;/p&gt; &lt;p&gt;  &lt;strong&gt;第一个困难是，很难批量复制机器学习所需要的专家。&lt;/strong&gt;大多数时候，我们团队的机器学习专家和产品团队的工程师一起合作，做出这些非常高准确度的分类器。但是你会注意到，在我提到的这些应用例子里，我们还想给很多很多别的用户意愿做出分类器，还有很多很多的实体我们想要识别提取，但是很明显，我们没办法像批量化建立功能一样地让机器专家们也批量化。&lt;/p&gt; &lt;p&gt;  &lt;strong&gt;第二个问题是重复使用性，我们AML团队很看重这件事。&lt;/strong&gt;回想一下前面我举的两个例子，其中有一个提取地址的功能，我们会觉得这个功能既要用在Messenger的M建议功能里，也要用在社交推荐里是很自然的事情。所以我们也在想如何才能建立一个平台，让不同的程序都能共享和重复使用这个平台的模型、特性以及数据，这样它们就都可以找到突破口，避免开发的时候要每次重复做类似的工作。&lt;/p&gt; &lt;p&gt;  &lt;strong&gt;第三个难点你们应该都理解，&lt;/strong&gt;机器学习的关键是数据，高质量的有标签数据；要获得这样的数据，大家可能都知道，不仅仅是难，而且还很费钱。所以我们也在想  &lt;strong&gt;如何优化标签，让我们在训练这些分类器和提取器的时候尽可能提高标签的使用效率。&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;  &lt;strong&gt;   &lt;br /&gt;&lt;/strong&gt;&lt;/p&gt; &lt;h3&gt;介绍一个平台给你认识一下吧，它叫做CLUE&lt;/h3&gt; &lt;p&gt;  &lt;img src="http://static.leiphone.com/uploads/new/article/740_740/201704/58f982627913e.jpg?imageMogr2/format/jpg/quality/90"&gt;&lt;/img&gt;&lt;/p&gt; &lt;p&gt;这几点就把我们引向了CLUE。CLUE是一个语言识别引擎，是一个自助式的平台。&lt;/p&gt; &lt;p&gt;  &lt;strong&gt;而CLUE做的事情，是让机器学习变得民主化，&lt;/strong&gt;它用优秀的人工智能和漂亮的用户界面吸引着人们进入，这样Facebook的每个用户，不一定非要是机器学习专家，都可以到CLUE里面用最先进的自然语言理解技术建立一个实体提取器和内容分类器。  &lt;strong&gt;这样，当任何的新应用需要的时候，都可以由CLUE这个统一的入口来建立提取器和分类器。&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;  &lt;strong&gt;第二个方面是，CLUE是建立于Deep Text和Facebook的AI开发平台FB LearnerFlow2和Caffe2之上的，&lt;/strong&gt;相信你们今天已经听说过它们了。对Facebook整体来说，这些怕平台极大地提高了灵活性，让人们可以共享和重复使用模型、数据和特性。&lt;/p&gt; &lt;p&gt;  &lt;strong&gt;第三个方面是对标签效率的提升。&lt;/strong&gt;CLUE使用了“主动学习”功能，这个功能在机器学习社区经常可以见到，让它可以为获取到的标签做出优化，让分类器只学习它还需要学习的、还没有弄明白的标签。&lt;/p&gt; &lt;p&gt;  &lt;img src="http://static.leiphone.com/uploads/new/article/740_740/201704/58f9827940157.jpg?imageMogr2/format/jpg/quality/90"&gt;&lt;/img&gt;&lt;/p&gt; &lt;p&gt;接下来，我会站在一个想要运用CLUE的工程师的角度，利用它自助式的设计，建立一个分类器，就比如叫外卖的吧。那么你首先需要做的事情是收集一些数据，你需要先给分类器一些正确的样本，比如能表现出叫外卖意愿的短语或者句子。你可以看到，CLUE提供了一个非常平易近人的用户界面，带有一些关键词搜索来提示你，方便你输入带有这种意愿的语句。&lt;/p&gt; &lt;p&gt;在这个例子里，“我想吃赛百味或者汉堡王”就带有叫外卖的意愿，算是一个不错的开始。你可以添加许多这样的确实具有意愿的句子，来达成你的目标。正确和不正确的样本都行，当你开始收集以后，你需要做的就是给他们加标签。&lt;/p&gt; &lt;p&gt;同样地，CLUE有一个美观的用户界面来让你做这件事。你不仅可以标出哪些有意愿，哪些没意愿，而像Benoit前面说的那样，还可以给实体加标签。对我们这个例子来讲，“赛百味”和“汉堡王”都是值得加标签的内容，可以帮助你达成你的目标。&lt;/p&gt; &lt;p&gt;  &lt;img src="http://static.leiphone.com/uploads/new/article/740_740/201704/58f982a552c6e.jpg?imageMogr2/format/jpg/quality/90"&gt;&lt;/img&gt;&lt;/p&gt; &lt;p&gt;当你添加好标签以后，CLUE就会自动地在后台训练出一个分类器。在你添加标签的过程中，你就已经得到了一个可以使用的分类器了。如果你才刚刚开始的话，效果可能还不是很好，但是毕竟有一个了。然后你就可以看看分类器运行的状况如何。&lt;/p&gt; &lt;p&gt;CLUE支持多种可视化方式，比如召回率曲线、AUC曲线等等，很多种图形供你选择。现在你还可以监控你的分类器运行状况如何，来看看你计划的任务完成得如何。&lt;/p&gt; &lt;p&gt;  &lt;img src="http://static.leiphone.com/uploads/new/article/740_740/201704/58f982b684b4e.jpg?imageMogr2/format/jpg/quality/90"&gt;&lt;/img&gt;&lt;/p&gt; &lt;p&gt;你还可以用CLUE做一件厉害的事情，就是你可以用这种初始状态的分类器去分类真实的Facebook信息流，看看结果如何。我来演示一下要怎么做，在用这个分类器对真实的信息流分类以后，可能很多东西已经分类对了，但是更重要的是，能看到有哪些东西分类错了。&lt;/p&gt; &lt;p&gt;在这个例子里，CLUE就告诉你，你的分类器好像有点弄混了，分不清“能送上门吗”和“我们端着面条说吧”。这就可以提示你如何改进数据和标签，给分类器更正这些错误，给怎样得到越来越好的结果指明了方向。&lt;/p&gt; &lt;p&gt;  &lt;img src="http://static.leiphone.com/uploads/new/article/740_740/201704/58f982ef5518c.jpg?imageMogr2/format/jpg/quality/90"&gt;&lt;/img&gt;&lt;/p&gt; &lt;p&gt;这就是我前面提到过的主动学习循环。随着你调整好了你的模型，当你对结果满意的时候，就可以点一下CLUE里面的“部署”按钮，就这么简单。点一下按钮，你的分类器就可以部署到所有的数据中心里，这样，只要有需要的Facebook产品团队都可以到其中选择、并把你的分类器应用到他们的程序中。&lt;/p&gt; &lt;p&gt;  &lt;img src="http://static.leiphone.com/uploads/new/article/740_740/201704/58f98301b0e6f.jpg?imageMogr2/format/jpg/quality/90"&gt;&lt;/img&gt;&lt;/p&gt; &lt;p&gt;算上Deep Text和CLUE，我们使用在Facebook产品里面的模型已经超过了200个。这里面很厉害的事情是，不仅机器学习的专家们使用这些模型，Facebook里不同产品团队的科学家和工程师也在用这些模型。&lt;/p&gt; &lt;p&gt;  &lt;img src="http://static.leiphone.com/uploads/new/article/740_740/201704/58f9831b47e8e.jpg?imageMogr2/format/jpg/quality/90"&gt;&lt;/img&gt;&lt;/p&gt; &lt;p&gt;在这场演讲的开头，Benoit说我们真正的目标是通过各种各样的应用，借助数百万计的内容把人和人连接起来。今天的Facebook已经做得很好的事情，是通过利用社交信息流，借助你朋友们所说的话、所做的事把你和内容连接起来。我们很想要拓展这件事情，想要把你和这世界中你感兴趣的数百万计的内容也连接起来。即便今天说了这么多，其实我们也只是刚刚开始，为了让AI能够达到这些目标、提供这些新的用户体验，还有很多的事情等待我们去做。谢谢大家！&lt;/p&gt; &lt;p&gt;雷锋网AI科技评论听译&lt;/p&gt; &lt;p&gt; via   &lt;a href="https://developers.facebook.com/videos/f8-2017/natural-language-understanding-facebook/" rel="nofollow" target="_blank"&gt;Natural Language Understanding @Facebook&lt;/a&gt;&lt;/p&gt;&lt;div&gt; &lt;a href="https://itindex.net/"  title="IT 资讯"&gt;&lt;img src="https://itindex.net/images/iconWarning.gif" title="IT 资讯" border="0"/&gt; &lt;/a&gt;</description>
      <category>人工智能</category>
      <guid isPermaLink="true">https://itindex.net/detail/56868-nlp-%E8%87%AA%E7%84%B6%E8%AF%AD%E8%A8%80-%E7%90%86%E8%A7%A3</guid>
      <pubDate>Fri, 21 Apr 2017 21:43:00 CST</pubDate>
    </item>
    <item>
      <title>自然语言处理词向量化总结</title>
      <link>https://itindex.net/detail/56829-%E8%87%AA%E7%84%B6%E8%AF%AD%E8%A8%80-%E5%90%91%E9%87%8F</link>
      <description>&lt;h2&gt;
自然语言处理&lt;/h2&gt;
 &lt;h3&gt;
1. 词向量表示&lt;/h3&gt;
 &lt;p&gt;
distributional representation vs. distributed representation
分布式表达（一类表示方法，基于统计含义），分散式表达（从一个高维空间X映射到一个低维空间Y） 分布假说(distributional
hypothesis)为这一设想提供了 理论基础:上下文相似的词，其语义也相似.&lt;/p&gt;
 &lt;p&gt;
自然语言处理的基础是词向量化，即文本数值化，后面进行数据挖掘工作就和常见的任务类似，即分类，聚类等等。&lt;/p&gt;
 &lt;h4&gt;
1.1 one-hot encoding&lt;/h4&gt;
 &lt;p&gt;
In vector space terms, this is a vector with one 1 and a lot of
zeroes&lt;/p&gt;
 &lt;p&gt;
[0 0 0 0 0 0 0 0 0 0 1 0 0 0 0]&lt;/p&gt;
 &lt;h4&gt;
1.2 count-based&lt;/h4&gt;
 &lt;p&gt;
tf*idf&lt;/p&gt;
 &lt;p&gt;
svd &lt;/p&gt;
 &lt;p&gt;
Glove&lt;/p&gt;
 &lt;h4&gt;
1.3 word embedding&lt;/h4&gt;
 &lt;p&gt;
基于神经网络的词向量表示 word2vec(2*2=4)四种训练方法&lt;/p&gt;
 &lt;p&gt;
网络结构 CBOW，skip-gram&lt;/p&gt;
 &lt;p&gt;
训练方法 Hierarchical Softmax，negative sampling&lt;/p&gt;
 &lt;h3&gt;
2. 词向量实现工具&lt;/h3&gt;
 &lt;p&gt;
word2vec&lt;/p&gt;
 &lt;p&gt;
https://code.google.com/archive/p/word2vec/&lt;/p&gt;
 &lt;p&gt;
gensim&lt;/p&gt;
 &lt;p&gt;
https://github.com/RaRe-Technologies/gensim&lt;/p&gt;
 &lt;p&gt;
fasttext&lt;/p&gt;
 &lt;p&gt;
https://github.com/facebookresearch/fastText&lt;/p&gt;
 &lt;div&gt;
  &lt;pre&gt;

   &lt;code&gt;from gensim.models import KeyedVectors

model = KeyedVectors.load_word2vec_format(&amp;quot;wiki.en.vec&amp;quot;)
words = []
for word in model.vocab:
    words.append(word)

print(&amp;quot;word count: {}&amp;quot;.format(len(words)))

print(&amp;quot;Dimensions of word: {}&amp;quot;.format(len(model[words[0]])))

demo_word = &amp;quot;car&amp;quot;

for similar_word in model.similar_by_word(demo_word):
    print(&amp;quot;Word: {0}, Similarity: {1:.2f}&amp;quot;.format(
        similar_word[0], similar_word[1]
    ))&lt;/code&gt;
&lt;/pre&gt;&lt;/div&gt;
 &lt;div&gt;
  &lt;pre&gt;

   &lt;code&gt;word count: 2519370
Dimensions of word: 300
Word: cars, Similarity: 0.83
Word: automobile, Similarity: 0.72
Word: truck, Similarity: 0.71
Word: motorcar, Similarity: 0.70
Word: vehicle, Similarity: 0.70
Word: driver, Similarity: 0.69
Word: drivecar, Similarity: 0.69
Word: minivan, Similarity: 0.67
Word: roadster, Similarity: 0.67
Word: racecars, Similarity: 0.67&lt;/code&gt;
&lt;/pre&gt;&lt;/div&gt;
 &lt;p&gt;
Glove&lt;/p&gt;
 &lt;p&gt;
https://github.com/stanfordnlp/GloVe&lt;/p&gt;
 &lt;div&gt;
  &lt;pre&gt;

   &lt;code&gt;
import os

import numpy as np
import matplotlib.pyplot as plt
from sklearn.manifold import TSNE
from tsne import bh_sne

def read_glove(glove_file):
    embeddings_index = {}
    embeddings_vector = []
    f = open(&amp;quot;glove.6B.100d.txt&amp;quot;, &amp;quot;rb&amp;quot;)
    word_idx = 0
    for line in f:
        values = line.decode(&amp;quot;utf-8&amp;quot;).split()
        word = values[0]
        vector = np.asarray(values[1:], dtype=&amp;quot;float64&amp;quot;)
        embeddings_index[word] = word_idx
        embeddings_vector.append(vector)
        word_idx += 1
    f.close()
    inv_index = {v : k for k, v in embeddings_index.items()}
    glove_embeddings = np.vstack(embeddings_vector)
    glove_norms = np.linalg.norm(glove_embeddings, axis=-1, keepdims=True)
    glove_embeddings_normed = glove_embeddings / glove_norms
    # glove_embeddings_normed.fill(0)

    return embeddings_index, glove_embeddings, glove_embeddings_normed, inv_index

def get_emb(word, embeddings_index, glove_embeddings):
    idx = embeddings_index.get(word)
    if idx is None:
        return None
    else:
        return glove_embeddings[idx]

def get_normed_emb(word, embeddings_index, glove_embeddings_normed):
    idx = embeddings_index.get(word)
    if idx is None:
        return None
    else:
        return glove_embeddings_normed[idx]


def most_similar(words, inv_index, embeddings_index, glove_embeddings, glove_embeddings_normed, topn=10):
    query_emb = 0

    if type(words) == list:
        for word in words:
            query_emb += get_emb(word, embeddings_index, glove_embeddings)
    else:
        query_emb = get_emb(words, embeddings_index, glove_embeddings)

    query_emb = query_emb / np.linalg.norm(query_emb)

    cosin = np.dot(glove_embeddings_normed, query_emb)

    idxs = np.argsort(cosin)[::-1][:topn]

    return [(inv_index[idx], cosin[idx]) for idx in idxs]


def plot_tsne(glove_embeddings_normed, inv_index, perplexity, img_file_name, word_cnt=100):
    #word_emb_tsne = TSNE(perplexity=30).fit_transform(glove_embeddings_normed[:word_cnt])
    word_emb_tsne = bh_sne(glove_embeddings_normed[:word_cnt], perplexity=perplexity)
    plt.figure(figsize=(40, 40))
    axis = plt.gca()
    np.set_printoptions(suppress=True)
    plt.scatter(word_emb_tsne[:, 0], word_emb_tsne[:, 1], marker=&amp;quot;.&amp;quot;, s=1)
    for idx in range(word_cnt):
        plt.annotate(inv_index[idx],
                     xy=(word_emb_tsne[idx, 0], word_emb_tsne[idx, 1]),
                     xytext=(0, 0), textcoords=&amp;apos;offset points&amp;apos;)
    plt.savefig(img_file_name)
    plt.show()

def main():
    glove_input_file = &amp;quot;glove.6B.100d.txt&amp;quot;
    embeddings_index, glove_embeddings, glove_embeddings_normed, inv_index = read_glove(glove_input_file)
    print(np.isfinite(glove_embeddings_normed).all())
    print(glove_embeddings.shape)
    print(get_emb(&amp;quot;computer&amp;quot;, embeddings_index, glove_embeddings))
    print(most_similar(&amp;quot;cpu&amp;quot;, inv_index, embeddings_index, glove_embeddings, glove_embeddings_normed))
    print(most_similar([&amp;quot;river&amp;quot;, &amp;quot;chinese&amp;quot;], inv_index, embeddings_index, glove_embeddings, glove_embeddings_normed))
    # plot tsne viz
    plot_tsne(glove_embeddings_normed, inv_index, 30.0, &amp;quot;tsne.png&amp;quot;, word_cnt=1000)

if __name__ == &amp;quot;__main__&amp;quot;:
    main()&lt;/code&gt;
&lt;/pre&gt;&lt;/div&gt;
 &lt;h3&gt;
  &lt;a href="http://blog.photo.sina.com.cn/showpic.html#url=http://album.sina.com.cn/pic/001N0mEhzy7a2W7Koqo04" target="_blank"&gt;   &lt;img height="690" src="http://s5.sinaimg.cn/mw690/001N0mEhzy7a2W7Koqo04&amp;690" width="690"&gt;&lt;/img&gt;&lt;/a&gt;  &lt;br /&gt;
  &lt;br /&gt;&lt;/h3&gt;
 &lt;h3&gt;
3. papers&lt;/h3&gt;
 &lt;ol&gt;
  &lt;li&gt;Neural
Word Embeddings as Implicit Matrix Factorization&lt;/li&gt;
  &lt;li&gt;
Linguistic Regularities in Sparse and Explicit Word
Representation&lt;/li&gt;
  &lt;li&gt;Random
Walks on Context Spaces Towards an Explanation of the Mysteries of
Semantic Word Embeddings&lt;/li&gt;
  &lt;li&gt;
word2vec Explained Deriving Mikolov et al.’s Negative Sampling Word
Embedding Method&lt;/li&gt;
  &lt;li&gt;Linking
GloVe with word2vec&lt;/li&gt;
  &lt;li&gt;Word
Embedding Revisited: A New Representation Learning and Explicit
Matrix Factorization Perspective&lt;/li&gt;
  &lt;li&gt;
Hierarchical Probabilistic Neural Network Language Model&lt;/li&gt;
  &lt;li&gt;Notes
on Noise Contrastive Estimation and Negative Sampling&lt;/li&gt;
  &lt;li&gt;
Noise-contrastive estimation: A new estimation principle for
unnormalized statistical models&lt;/li&gt;
  &lt;li&gt;
Distributed Representations of Words and Phrases and their
Compositionality&lt;/li&gt;
  &lt;li&gt;
Efficient Estimation of Word Representations in Vector Space&lt;/li&gt;
  &lt;li&gt;GloVe
Global Vectors forWord Representation&lt;/li&gt;
  &lt;li&gt;Neural
probabilistic language models&lt;/li&gt;
  &lt;li&gt;Natural
language processing (almost) from scratch&lt;/li&gt;
  &lt;li&gt;
Learning word embeddings efficiently with noise contrastive
estimation&lt;/li&gt;
  &lt;li&gt;A
scalable hierarchical distributed language model&lt;/li&gt;
  &lt;li&gt;Three
new graphical models for statistical language modelling&lt;/li&gt;
  &lt;li&gt;
Improving word representations via global context and multiple word
prototypes&lt;/li&gt;
  &lt;li&gt;A
Primer on Neural Network Models for Natural Language
Processing&lt;/li&gt;
  &lt;li&gt;Joulin,
Armand, et al. &amp;quot;Bag of tricks for efficient text classification.&amp;quot;
FAIR 2016&lt;/li&gt;
  &lt;li&gt;P.
Bojanowski   &lt;em&gt;, E.
Grave&lt;/em&gt;, A. Joulin, T. Mikolov, Enriching Word Vectors with
Subword Information&lt;/li&gt;
&lt;/ol&gt;
 &lt;p&gt;
https://github.com/oxford-cs-deepnlp-2017/lectures&lt;/p&gt;
 &lt;p&gt;
wget http://nlp.stanford.edu/data/glove.6B.zip&lt;/p&gt;
 &lt;p&gt;
wget
https://s3-us-west-1.amazonaws.com/fasttext-vectors/wiki.zh.zip&lt;/p&gt;
 &lt;p&gt;
wget
https://s3-us-west-1.amazonaws.com/fasttext-vectors/wiki.en.zip&lt;/p&gt;
 &lt;p&gt;
https://blog.manash.me/how-to-use-pre-trained-word-vectors-from-facebooks-fasttext-a71e6d55f27&lt;/p&gt;
 &lt;h3&gt;
4. 自然语言处理应用&lt;/h3&gt;
 &lt;p&gt;
自然语言处理的基础是文本词向量化，之后可以进行分类，聚类，情感分析等等。&lt;/p&gt;
 &lt;p&gt;
Natural Language Processing&lt;/p&gt;
 &lt;p&gt;
Topic Classification&lt;/p&gt;
 &lt;p&gt;
Topic modeling&lt;/p&gt;
 &lt;p&gt;
Sentiment Analysis&lt;/p&gt;
 &lt;p&gt;
Google Translate&lt;/p&gt;
 &lt;p&gt;
Chatbots / dialogue systems&lt;/p&gt;
 &lt;p&gt;
Natural language query understanding (Google Now, Apple Siri,
Amazon Alexa)&lt;/p&gt;
 &lt;p&gt;
Summarization&lt;/p&gt; &lt;br /&gt; &lt;img src="http://simg.sinajs.cn/blog7style/images/special/1265.gif"&gt;&lt;/img&gt; &lt;div&gt; &lt;a href="https://itindex.net/"  title="IT 资讯"&gt;&lt;img src="https://itindex.net/images/iconWarning.gif" title="IT 资讯" border="0"/&gt; &lt;/a&gt;</description>
      <category>数据挖掘</category>
      <guid isPermaLink="true">https://itindex.net/detail/56829-%E8%87%AA%E7%84%B6%E8%AF%AD%E8%A8%80-%E5%90%91%E9%87%8F</guid>
      <pubDate>Tue, 04 Apr 2017 23:52:47 CST</pubDate>
    </item>
    <item>
      <title>哪些人在Twitter上发言的语法最规范？比尔盖茨排第二</title>
      <link>https://itindex.net/detail/55276-twitter-%E8%AF%AD%E6%B3%95-%E8%A7%84%E8%8C%83</link>
      <description>&lt;p&gt;美国有个诡计的节日，叫国家语法日（National Grammar Day），可能一般人是不知道的，但Grammarly不会忘记。Grammarly是个应用，据说它真正懂英语。大概是要庆祝国家语法日，Grammarly对Twitter上粉丝最多的50个名人最近发的150条推文进行了研究，排除了那些转发的推文，确保研究对象是这些名人自己说的。&lt;/p&gt; &lt;p&gt;  &lt;a href="http://static.cnbetacdn.com/article/2016/0301/3cde60089338158.png"&gt;   &lt;img alt="http://static.cnbetacdn.com/article/2016/0301/3cde60089338158.png" src="http://static.cnbetacdn.com/thumb/article/2016/0301/3cde60089338158.png_600x600.png" title="E3570A66-05C8-4E19-9AF7-B6A657D6D548.png"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;随后他们将这些推文放到Grammarly应用里，得出结果后，再让人类二次校对。&lt;/p&gt; &lt;p&gt;Grammarly这款应用官网上是这么描述的：“Grammarly让你成为更好的作者，相比你的文字处理工具，它能找到、纠正超过10倍的错误。”据说它能找到的很多语法错误，是Word完全发现不了的。&lt;/p&gt; &lt;p&gt;这次测试的结果发现，排名第二的是比尔盖茨——  &lt;a href="http://clkde.tradedoubler.com/click?p=235167&amp;a=2355305&amp;g=21862034"&gt;微软&lt;/a&gt;的联合创始人，早年从哈佛退学。然后你肯定很想知道第一名是谁。&lt;/p&gt; &lt;p&gt;这也是一名上过哈佛的同学，而且他是以很优秀的成绩从哈佛毕业的，此人就是Conan O&amp;apos;Brien，著名脱口秀节目主持人，这个人的职业另外还有作家、配音演员等，应该说语法对他而言原本就不是问题。&lt;/p&gt; &lt;p&gt;第三名还是哈佛的高材生，美国总统奥巴马。&lt;/p&gt; &lt;p&gt;  &lt;a href="http://static.cnbetacdn.com/article/2016/0301/19d1cd53032da55.png"&gt;   &lt;img alt="http://static.cnbetacdn.com/article/2016/0301/19d1cd53032da55.png" src="http://static.cnbetacdn.com/thumb/article/2016/0301/19d1cd53032da55.png_600x600.png" title="9C7E7548-AC42-4E7A-996A-058D5B99751F.png"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;接下来，应该会有很多人想知道在语法方面，究竟有哪些名人表现得比较糟糕了。很多看起来跟音乐是相关的，下面这些：Niall Horan、Miley Cyrus、Bruno Mars、Louis Tomlinson、Liam Payne、Ariana Grande。&lt;/p&gt; &lt;p&gt;排在最末尾的是脱口秀主持人Daniel Tosh（第一名和最后一名是一样的职业…）。&lt;/p&gt; &lt;p&gt;Grammarly表示，这次“只看明显错误，比如拼写错误，错误使用标点符号，错误用词，主谓不一致等。我们也忽略了一些风格特色，比如故意拼写错误、首字母缩写、常用俚语、标签错误、外国语言，没写句号，用&amp;amp;替代and，省略号，还有句子不完整。”&lt;/p&gt; &lt;p&gt;从结果来看，20-29岁的名人犯的语法错误是最多的，相比30-39岁组多出两倍的语法错误。&lt;/p&gt; &lt;p&gt;一名Grammarly发言人表示：“虽然我们没有考量表情符号部分，但Grammarly结合了数百万用户的反馈，他们让我们了解人们日常沟通的最新方式。”“和同辈、老师、同事清晰、高效地沟通的需求应该持续。实际上，我要说这种需求比以往都更佳重要，因为英语越来越成为商务语言，并且也是全球很多地方的第二语言。”&lt;/p&gt; &lt;p&gt;  &lt;a href="http://m.cnbeta.com/comments_479629.htm"&gt;查看评论&lt;/a&gt;&lt;/p&gt;&lt;div&gt; &lt;a href="https://itindex.net/"  title="IT 资讯"&gt;&lt;img src="https://itindex.net/images/iconWarning.gif" title="IT 资讯" border="0"/&gt; &lt;/a&gt;</description>
      <category />
      <guid isPermaLink="true">https://itindex.net/detail/55276-twitter-%E8%AF%AD%E6%B3%95-%E8%A7%84%E8%8C%83</guid>
      <pubDate>Tue, 01 Mar 2016 23:21:24 CST</pubDate>
    </item>
    <item>
      <title>2015年需要了解的前端框架和语言</title>
      <link>https://itindex.net/detail/54201-%E9%9C%80%E8%A6%81-%E5%89%8D%E7%AB%AF-%E6%A1%86%E6%9E%B6</link>
      <description>&lt;p&gt;Node.js 第一，PHP 第二，JavaScript 第三。因为Node.js的社区很多，所以这个结果你也不用太意外。如果你知道JavaScript,你已经一只脚踏进了用Node.js来构建Web APP的可能。&lt;/p&gt;
 &lt;h3&gt;框架&lt;/h3&gt;
 &lt;p&gt;  &lt;img alt="" height="371" src="http://www.techug.com/wordpress/wp-content/uploads/2015/08/blog_2015_new%E5%B1%8F%E5%B9%95%E5%BF%AB%E7%85%A7-2015-07-09-%E4%B8%8A%E5%8D%887.35.00.png?8f3a10" width="600"&gt;&lt;/img&gt;&lt;/p&gt;
 &lt;p&gt;AngularJS 处于框架的领导地位。大量的公司和企业已经采用 Angular，这就要求开发者更多的具备使用这个框架的技能。主要还是因为有 Google 里最好的工程师支持。&lt;/p&gt;
 &lt;h3&gt;2015你应该学习的&lt;/h3&gt;
 &lt;p&gt;很多的库和框架产生和消亡，对于把有限的精力投入到最有价值的事情上是有挑战的。下面是我们的一些关于语言和框架的建议，这些都是我们认为很有意义去学习的。它们都很流行，有活跃的社区，并且有大量的就业机会。&lt;/p&gt;
 &lt;h3&gt;1. 无所不在的 JavaScript&lt;/h3&gt;
 &lt;p&gt;  &lt;img alt="" height="320" src="http://www.techug.com/wordpress/wp-content/uploads/2015/08/blog_2015_new674862A7-CF67-44B6-A62B-2B968F7A6281.jpg?8f3a10" width="760"&gt;&lt;/img&gt;&lt;/p&gt;
 &lt;p&gt;如果你做 web 的开发，Javascript 是你必须知道的，不管你写后台用的何种语言。现在你可以用JS在浏览器、服务器、手机应用甚至是可编程的硬件。ES6 将会提高并让这个语言更加强大。学习 Bower 和 npm工具是很有必要的，也包括 jshint 和 jscs 这种代码样式和代码检测。&lt;/p&gt;
 &lt;h3&gt;2. AngularJS&lt;/h3&gt;
 &lt;p&gt;  &lt;img alt="" height="320" src="http://www.techug.com/wordpress/wp-content/uploads/2015/08/blog_2015_newA2DACE7E-9AAC-4FAC-82DD-1EE1CAB462AE.jpg?8f3a10" width="760"&gt;&lt;/img&gt;&lt;/p&gt;
 &lt;p&gt;AngularJS是  &lt;br /&gt;
一个Google发明的JavaScript框架，它能快速的构建企业级的web应用。快速的需求增长要求程序员有这个框架的使用经验，很多时候，你会看  &lt;br /&gt;
到招聘工作的时候会涉及这个框架的使用。但是别太着急。它将会有一个大的重写，在它的2.0版本发布后再学习是个更好的方式。可以查看学习指南 angularjs examples.&lt;/p&gt;
 &lt;h3&gt;3. React&lt;/h3&gt;
 &lt;p&gt;  &lt;img alt="" height="320" src="http://www.techug.com/wordpress/wp-content/uploads/2015/08/blog_2015_newC9E2EA70-F356-4960-9FC9-1EC873FA7BE1.jpg?8f3a10" width="760"&gt;&lt;/img&gt;&lt;/p&gt;
 &lt;p&gt;React 是新的竞争者，但它是可提供复用的web组件。这个库是Facebook开发并实现了非常快的虚拟DOM，并能很简单的接入到现有项目中去。它也有非常活跃的社区来提供开发组件all kinds of components.在我们看来，Reacts是非常有潜力的并值得在2015年关注的。查看我们的学习指南react tutorial.&lt;/p&gt;
 &lt;h3&gt;4. Node.js&lt;/h3&gt;
 &lt;p&gt;  &lt;img alt="" height="320" src="http://www.techug.com/wordpress/wp-content/uploads/2015/08/blog_2015_new54EBC058-5C63-461F-86B7-EFB66C424BE1.jpg?8f3a10" width="760"&gt;&lt;/img&gt;&lt;/p&gt;
 &lt;p&gt;用Node.js你可以用JavaScript来实现服务端的应用。它可以很简单的实现后台，像这些框架Express, API endpoints, websocket甚至torrent clients. Node有令人难以置信的活跃的社区超越任何其他一种语言在这一年实现的模块。如果你是个初学者，我们推荐你尝试下NodeSchool.&lt;/p&gt;
 &lt;h3&gt;5. NoSQL databases&lt;/h3&gt;
 &lt;p&gt;  &lt;img alt="" height="320" src="http://www.techug.com/wordpress/wp-content/uploads/2015/08/blog_2015_new176957D5-2F71-48AA-A431-D78AEB6D4A2D.jpg?8f3a10" width="760"&gt;&lt;/img&gt;&lt;/p&gt;
 &lt;p&gt;既不是关系型也不是 SQL 查询型的数据库是对今天的web开发者更有价值的，我们相信这样的数据库将会在未来更加的流行。有两个值得关注的是 Mongodb 和 Redis。很容易使用它们中得任意一个比起MySQL和Postgres.但是别傻傻的认为NoSQL数据库就是完美的取代—有的情况，那些经典的关系型数据库还是会让你的开发更简单。&lt;/p&gt;
 &lt;h3&gt;6. Less/Sass/Stylus&lt;/h3&gt;
 &lt;p&gt;  &lt;img alt="" height="320" src="http://www.techug.com/wordpress/wp-content/uploads/2015/08/blog_2015_newDA563D03-FCEC-4396-9D09-74912604DE08.jpg?8f3a10" width="760"&gt;&lt;/img&gt;&lt;/p&gt;
 &lt;p&gt;有很多人不喜欢CSS.它很容易就达到了1000行的css文件并且不容易被定位和修改。为了解决这些问题，有些语言像Less, Sass 和 Stylus可以编译成CSS文件，并可以使用变量、宏和其它的方式来提高你的编码。你可以一下午就搞定它们中的一种。&lt;/p&gt;
 &lt;h3&gt;7. 令人兴奋的框架&lt;/h3&gt;
 &lt;p&gt;  &lt;img alt="" height="320" src="http://www.techug.com/wordpress/wp-content/uploads/2015/08/blog_2015_new0C2E7743-8AD2-41B6-B536-31BC41FF2EF6.jpg?8f3a10" width="760"&gt;&lt;/img&gt;&lt;/p&gt;
 &lt;p&gt;Meteor 是一个全新的web应用开发方式，它模糊了前端和后端的边界。它允许你书写实施的应用，并且有迅速成长的社区来提供各种包模块。Hood.ie 是一个小得竞争者，但是提供新颖的方式。它能为你处理后台，所以你可以集中精力来做你应用的前台。&lt;/p&gt;
 &lt;h3&gt;8. 令人兴奋的语言&lt;/h3&gt;
 &lt;p&gt;  &lt;img alt="" height="320" src="http://www.techug.com/wordpress/wp-content/uploads/2015/08/blog_2015_new15945E83-0B58-4D69-A168-BEFCDB6DB026.jpg?8f3a10" width="760"&gt;&lt;/img&gt;&lt;/p&gt;
 &lt;p&gt;对于一些编程语言迷来说，这又一些东西。Golang, Rust and Elixir增长的势头很强，被用在一些对性能要求很高的情况下。我们不推荐转移你的编程方向到这些语言中，但是你可能会在要求与其它的网站交互时会用到。&lt;/p&gt;
 &lt;h3&gt;9. 经典的全栈式框架&lt;/h3&gt;
 &lt;p&gt;  &lt;img alt="" height="320" src="http://www.techug.com/wordpress/wp-content/uploads/2015/08/blog_2015_new26644D60-E2F5-4145-AD5A-A174FE314ACA.jpg?8f3a10" width="760"&gt;&lt;/img&gt;&lt;/p&gt;
 &lt;p&gt;尽管那些单页面应用增长迅速，但还是有大量的使用服务端的web应用。on Rails, Django, Laravel, Play, ASP.NET是这排名靠前的几个框架。花点时间学习任何的MVC框架都会让你获益良多。&lt;/p&gt;
&lt;div&gt; &lt;a href="https://itindex.net/"  title="IT 资讯"&gt;&lt;img src="https://itindex.net/images/iconWarning.gif" title="IT 资讯" border="0"/&gt; &lt;/a&gt;</description>
      <category>业界观察</category>
      <guid isPermaLink="true">https://itindex.net/detail/54201-%E9%9C%80%E8%A6%81-%E5%89%8D%E7%AB%AF-%E6%A1%86%E6%9E%B6</guid>
      <pubDate>Wed, 19 Aug 2015 21:05:39 CST</pubDate>
    </item>
  </channel>
</rss>

