diff --git "a/20171015 \347\254\25413\346\234\237/Intro To Data Analysis For Everyone! Part 1.md" "b/20171015 \347\254\25413\346\234\237/Intro To Data Analysis For Everyone! Part 1.md" index 51ff9b0a12d28586cb5ecacf6cc8ac4f6f8a88b5..a238f12b74ff238208d092867ffc6f0d3b9fb996 100644 --- "a/20171015 \347\254\25413\346\234\237/Intro To Data Analysis For Everyone! Part 1.md" +++ "b/20171015 \347\254\25413\346\234\237/Intro To Data Analysis For Everyone! Part 1.md" @@ -1,171 +1,171 @@ -# 每个人的数据分析! Part 1 - -原文链接:[Intro To Data Analysis For Everyone! Part 1](https://towardsdatascience.com/intro-to-data-analysis-for-everyone-part-1-ff252c3a38b5?from=hackcv&hmsr=hackcv.com) - -数据分析是任何数据科学家日常工作的一部分([以及数据篡改和清理](https://www.thoughtworks.com/insights/blog/let-data-scientists-be-data-mungers))。这对现代劳动力中其他大部分人来说也是非常重要的。可以是系统分析师、业务所有者、财务团队和项目经理。 - -然而,大多数本科课程并没有[或至少没有](https://www.coursera.org/browse/datscience/datanalysis?)数据分析,而是有数学和统计学的课程,还有大量涉及数据结构和算法的计算机编程课程。 - -然而,这些都没有关注如何查看来自数据库、csvs或现代数据世界中存在的数十个其他数据源的数据集。 - -可能偶尔会有需要分析数据的项目。有些人可能很幸运地收到了一组项目,迫使他们第一次从数据库中分析数据。然而,大多数学生都在他们的第一份工作中试图自己解决这个问题。 - -对于不打算成为程序员的学生来说, [理解数据库和SQL是一项非常有价值的技能](http://www.skilledup.com/articles/learn-sql-it-most-in-demand-skill-in-single-day),这样可以让他们理解那些已经被数据库团队分析后的数据。 - -管理人员不再能接受他们的团队看不懂数据,或不知道如何进行数据分析!因此,即使是营销专业的学生也需要知道如何使用和设计数据分析! - -数据分析是抽象的。它不是数学(虽然涉及数学),也不是英语或会计。要真正理解优秀分析师会遇到的陷阱,就需要有实际的方法。然而,很遗憾的是大多数学生在进入第一份工作时,还不需要处理模糊的参数和庞大的数据集,许多学生甚至没有听说过数据仓库,然后这正是帮助管理者做出关键决策的大部分数据所在之处。 - -在现代商业世界中,数据分析并不局限于数据科学家。对于分析师、系统工程师、金融团队、公关、人力资源、营销等等来说,这也是很重要的技能。 - -因此,我们的团队想提供一个指南,帮助新学生和那些有兴趣学习更多数据科学和分析的人。 - -### 良好数据科学和分析的基础 - -本系列的第一部分将介绍良好分析所需的重要软技能。 [数据分析不仅仅是数学、SQL和脚本](https://www.theseattledataguy.com/statistics-data-scientist-review/)。它还包括保持组织有序,能够清晰地向管理者阐明已经发现的发现。这是[成功的数据科学和分析团队所描绘](https://www.theseattledataguy.com/top-30-tips-data-science-team-succeeds/)的众多特征之一。我们认为首先指出这些是很重要的,因为它为我们接下来的几个部分奠定了基础。 - -在本节之后,我们将讨论分析过程、技术,并通过数据集、SQL和python笔记给出示例。 - -**沟通** - -[术语数据讲故事者已经与数据科学家联系在一起](https://www.ted.com/talks/hans_rosling_shows_the_best_stats_you_ve_ever_seen),但对于使用数据的人来说,擅长传达他们的发现也很重要! - -这种技能子集符合通信的一般技能。数据科学家可以访问来自不同部门的多个数据源。这使他们有责任并且需要能够清楚地解释他们在多个领域向高管和中小企业发现的内容。他们采用复杂的数学和技术概念,创建清晰简洁的信息,管理人员可以采取行动。不只是躲在他们的行话背后,而是将他们复杂的想法转化为商业话语。分析师和数据科学家都必须能够获取数字并返回明确规定的投资回报率和可行的决策。 - -这意味着不仅要记笔记,还要创造扎实的工作簿。它还意味着为其他团队创建可靠的报告和遍历。 - -这是如何做到的?(这可能是一个帖子本身),但这里有一些快速提示,可以更好地在报告或演示文稿中传达你的想法。 - - 1. 标记每个图形,轴,数据点等 - 2. 在笔记本中创建自然的数据和笔记流 - 3. 确保突出您的主要发现!不要藏起来,把你的结论展示出来!使用大量数据证明您的观点时,这说起来容易做起来难。 - 4. 想象一下,你实际上在讲故事或写一篇有关数据的文章 - 5. 不要让观众觉得枯燥,保持甜美和简洁 - 6. 避免繁重的数学术语!如果你不能用简单的英语解释你的计算,你就没有完全理解。 - 7. 让同行审核您的报告和演示文稿,以确保最大程度的清晰度 - -**我们最喜欢的数据故事之一!** - - - - - -**善于倾听** - -数据科学家和分析师并不总是与企业主和管理人员在同一个团队中提出问题。这使得分析师非常重视聆听实际被问到的内容。 - -在大公司工作,试图寻找其他团队的痛点和问题并帮助他们度过难关是很有价值的!这意味着要有同理心。这项技能的一部分需要劳动力的经验,而这项技能的其他部分只需要了解其他人。 - -为什么他们真的要求进行分析?你如何使分析尽可能清晰准确? - -与企业主沟通不畅很容易发生。因此 [认真倾听和倾听言外之意是一项很棒的技能](https://www.forbes.com/sites/glennllopis/2013/05/20/6-effective-ways-listening-can-make-you-a-better-leader/#3fafb2421756)。 - - - -![img](https://cdn-images-1.medium.com/max/1000/0*x4gXpuM1k7rgyHi9.) - -**关注背景** - -除了关注细节。数据分析师和数据科学家还需要关注他们分析的数据背后的背景。这意味着理解请求项目的其他部门的需求,以及实际理解他们分析的数据背后的过程。 - -数据通常表示业务的流程。这可能是一个用户与电子商务网站交互,一个病人在医院,一个项目获得批准,软件被购买和开发等等。 - -这意味着,数据分析师需要理解这些业务规则和逻辑!否则,他们就无法进行良好的分析,他们会做出错误的假设,并且常常会创建脏的、重复的数据。 - -这都是因为他们不理解使用的场景。上下文允许以数据为中心的团队更清楚地做出假设。他们不需要在假设阶段花太多时间去检验所有可能的理论。相反,他们可以利用上下文来帮助加速分析的过程。 - -数据周围的元数据(例如上下文)对于数据科学家来说就像黄金。它并不总是在那里,但当它在的时候。它使我们的工作更容易! - -**记录能力** - -[无论是用excel还是Jupyter笔记本](http://jupyter-notebook-beginner-guide.readthedocs.io/en/latest/what_is_jupyter.html).。对于数据分析师来说,了解如何跟踪他们的工作是很重要的! - -分析需要大量的假设和问题,如果没有记录下来,就会失去思路。 - -第二天回来时,很容易忘记分析了什么,不同的查询和指标是如何以及为什么被提取的,等等。因此,以一种勤奋的方式记录下每一件事情是很重要的。这个技巧是不能留给第二天的,因为总是会有信息丢失! - -创建一个清晰的记录方式使每个人都更容易参与。我们在之前的交流中提到过。然而,一次。 - -标签,创造自然流通的笔记,避免商业术语可以帮助每个人参与,包括当初的记录人!当记录者都不理解自己的笔记,这将是相当尴尬的一件事。 - -记笔记很重要! - -**创造性和抽象思维** - -创造力和 [抽象思维 ](http://www.projectlearnet.org/tutorials/concrete_vs_abstract_thinking.html)有助于数据科学家更好地假设他们在最初探索阶段看到的可能模式和特征。将逻辑思维与最小的数据点结合起来,数据科学家可以得出几种可能的解决方案。然而,这需要跳出框框进行思考。 - -分析是有纪律的研究和创造性思维的结合。如果分析师受到确认偏差或过程的限制,那么他们可能无法得出正确的结论。 - -另一方面,如果他们过于疯狂地思考,没有使用基本的推论和归纳来驱动他们的搜索。在浏览各种数据集时,他们可能会花上数周时间试图回答一个简单的问题,而没有任何明确的目标。 - -**Engineering Mindset** - -分析师需要能够将大问题和数据集分解成更小的部分。有时候,一个单独的团队提出的2-3个问题无法用2-3个答案来回答。 - -相反,2-3个问题本身可能需要被分解成小问题,这些问题可以被数据分析和支持。 - -只有这样,分析师才能回去回答更大的问题。特别是对于大而复杂的数据集。[能够清楚地将分析分解成适当的部分](http://www.thwink.org/sustain/articles/000_AnalyticalApproach/index.htm).变得越来越重要。 - -**注意细节** - -分析需要注意细节。仅仅因为一个分析师或数据科学家可能是一个大局观的人。这并不意味着他们不负责找出围绕项目的所有有价值的细节。 - -公司,甚至是小公司都有很多角落和缝隙。流程上有流程,但不理解这些流程及其细节会影响可执行的分析级别。 - -特别是在编写复杂的查询和编程脚本时。很容易不正确地连接表或过滤错误的东西。因此,总是进行两次和三次检查工作是非常关键的(而且,如果涉及脚本,同行评审也应该如此!) - - - -![img](https://cdn-images-1.medium.com/max/1000/0*R-Rff55mXIQkP7mJ.) - -**好奇心** - -分析需要的好奇心。当我们分解这个过程时,我们会讲到这个。然而,分析过程中的一个步骤是列出所有您认为对分析有价值的问题。这需要一个好奇的心去关心答案。 - -为什么数据是这样,为什么我们看到模式,我们能用什么来找到答案,谁知道呢? - -这些只是一些模糊的问题,可以帮助我们开始向正确的方向进行分析。 [需要有那种动力和欲望去知道为什么!](http://www.ibmbigdatahub.com/podcast/curious-data-scientist) - -**宽容失败** - -数据科学与科学领域有许多相似之处。从这个意义上说,可能有99个失败的假设导致1个成功的解决方案。一些数据驱动型的公司只希望他们的机器学习工程师和数据科学家每年创造新的算法,或者每年半的相关性。这取决于任务的大小和所需的实现类型(例如流程实现、技术、策略等)。在所有这些工作中都有失败后的失败,有未回答的问题后的问题和分析师不得不继续。 - -关键是要得到答案,或者清楚地说明为什么你不能回答这个问题。然而,它不能仅仅因为最初的几次尝试失败而放弃。 - -分析可以成为时间的黑洞。一个接一个的问题可能是不正确的。这就是为什么半结构化过程很重要。它可以指导分析师,但不会阻止他们。 - -### **数据科学和分析软技能** - -这些技能分析人员和数据科学家需要的不仅仅是编程和统计分析。相反,这些技巧的重点在于确保所发现的洞见是易于转移的。这允许其他团队成员和经理也从分析中获益! - -分析师需要做的不仅仅是得出结论。他们需要能够创造出易于复制和传播的工作。 - -**为什么?** - -它不仅节省时间! - -更重要的是,这有助于领导信任分析师的结论。否则,分析师可能是对的,但如果他或她听起来不自信,如果他们记错了笔记,甚至漏掉了一个数据点。这会立即导致领导层之间的不信任! - -不幸的是,这是真的!当仅仅一个数据点不正确或沟通不畅时,分析师的工作就会立即受到质疑。我们经常建议数据团队检查他们的报告和演示文稿,检查漏洞。在这种情况下,有一个善于质疑每个角度的团队成员是很好的! - -你的团队可以提前回答高管可能提出的问题越多。高管们更有可能在项目的下一阶段签字! - - - -![img](https://cdn-images-1.medium.com/max/1000/0*J7W2YgdjexxKsr4X.) - -**数据分析的过程** - -在下一部分中,我们将介绍分析数据的过程。我们将建立基本的笔记和描述简单的过程,这将帮助新的和有经验的数据科学家和分析师确保他们有效地跟踪他们的工作。 - -### [Part 2 每个人的数据分析](https://medium.com/@SeattleDataGuy/data-analysis-for-everyone-part-2-cf1c79441940) - -**其他关于数据科学和策略的资源** - -[How To Apply Data Science To Real World Problems](https://www.theseattledataguy.com/data-science-case-studies/) - -[Amazon Using Data To Win The Grocery Store Game](https://www.theseattledataguy.com/amazon-taking-lunch-data-driven-strategies/) - -[30 Tips To Ensure Your Data Science Team Succeeds](https://www.theseattledataguy.com/top-30-tips-data-science-team-succeeds/) - +# 每个人的数据分析! Part 1 + +原文链接:[Intro To Data Analysis For Everyone! Part 1](https://towardsdatascience.com/intro-to-data-analysis-for-everyone-part-1-ff252c3a38b5?from=hackcv&hmsr=hackcv.com) + +数据分析是任何数据科学家日常工作的一部分([以及数据篡改和清理](https://www.thoughtworks.com/insights/blog/let-data-scientists-be-data-mungers))。这对现代劳动力中其他大部分人来说也是非常重要的。可以是系统分析师、业务所有者、财务团队和项目经理。 + +然而,大多数本科课程并没有[或至少没有](https://www.coursera.org/browse/datscience/datanalysis?)数据分析,而是有数学和统计学的课程,还有大量涉及数据结构和算法的计算机编程课程。 + +然而,这些都没有关注如何查看来自数据库、csvs或现代数据世界中存在的数十个其他数据源的数据集。 + +可能偶尔会有需要分析数据的项目。有些人可能很幸运地收到了一组项目,迫使他们第一次从数据库中分析数据。然而,大多数学生都在他们的第一份工作中试图自己解决这个问题。 + +对于不打算成为程序员的学生来说, [理解数据库和SQL是一项非常有价值的技能](http://www.skilledup.com/articles/learn-sql-it-most-in-demand-skill-in-single-day),这样可以让他们理解那些已经被数据库团队分析后的数据。 + +管理人员不再能接受他们的团队看不懂数据,或不知道如何进行数据分析!因此,即使是营销专业的学生也需要知道如何使用和设计数据分析! + +数据分析是抽象的。它不是数学(虽然涉及数学),也不是英语或会计。要真正理解优秀分析师会遇到的陷阱,就需要有实际的方法。然而,很遗憾的是大多数学生在进入第一份工作时,还不需要处理模糊的参数和庞大的数据集,许多学生甚至没有听说过数据仓库,然后这正是帮助管理者做出关键决策的大部分数据所在之处。 + +在现代商业世界中,数据分析并不局限于数据科学家。对于分析师、系统工程师、金融团队、公关、人力资源、营销等等来说,这也是很重要的技能。 + +因此,我们的团队想提供一个指南,帮助新学生和那些有兴趣学习更多数据科学和分析的人。 + +### 良好数据科学和分析的基础 + +本系列的第一部分将介绍良好分析所需的重要软技能。 [数据分析不仅仅是数学、SQL和脚本](https://www.theseattledataguy.com/statistics-data-scientist-review/)。它还包括保持组织有序,能够清晰地向管理者阐明已经发现的发现。这是[成功的数据科学和分析团队所描绘](https://www.theseattledataguy.com/top-30-tips-data-science-team-succeeds/)的众多特征之一。我们认为首先指出这些是很重要的,因为它为我们接下来的几个部分奠定了基础。 + +在本节之后,我们将讨论分析过程、技术,并通过数据集、SQL和python笔记给出示例。 + +**沟通** + +[术语数据讲故事者已经与数据科学家联系在一起](https://www.ted.com/talks/hans_rosling_shows_the_best_stats_you_ve_ever_seen),但对于使用数据的人来说,擅长传达他们的发现也很重要! + +这种技能子集符合通信的一般技能。数据科学家可以访问来自不同部门的多个数据源。这使他们有责任并且需要能够清楚地解释他们在多个领域向高管和中小企业发现的内容。他们采用复杂的数学和技术概念,创建清晰简洁的信息,管理人员可以采取行动。不只是躲在他们的行话背后,而是将他们复杂的想法转化为商业话语。分析师和数据科学家都必须能够获取数字并返回明确规定的投资回报率和可行的决策。 + +这意味着不仅要记笔记,还要创造扎实的工作簿。它还意味着为其他团队创建可靠的报告和遍历。 + +这是如何做到的?(这可能是一个帖子本身),但这里有一些快速提示,可以更好地在报告或演示文稿中传达你的想法。 + + 1. 标记每个图形,轴,数据点等 + 2. 在笔记本中创建自然的数据和笔记流 + 3. 确保突出您的主要发现!不要藏起来,把你的结论展示出来!使用大量数据证明您的观点时,这说起来容易做起来难。 + 4. 想象一下,你实际上在讲故事或写一篇有关数据的文章 + 5. 不要让观众觉得枯燥,保持甜美和简洁 + 6. 避免繁重的数学术语!如果你不能用简单的英语解释你的计算,你就没有完全理解。 + 7. 让同行审核您的报告和演示文稿,以确保最大程度的清晰度 + +**我们最喜欢的数据故事之一!** + + + + + +**善于倾听** + +数据科学家和分析师并不总是与企业主和管理人员在同一个团队中提出问题。这使得分析师非常重视聆听实际被问到的内容。 + +在大公司工作,试图寻找其他团队的痛点和问题并帮助他们度过难关是很有价值的!这意味着要有同理心。这项技能的一部分需要劳动力的经验,而这项技能的其他部分只需要了解其他人。 + +为什么他们真的要求进行分析?你如何使分析尽可能清晰准确? + +与企业主沟通不畅很容易发生。因此 [认真倾听和倾听言外之意是一项很棒的技能](https://www.forbes.com/sites/glennllopis/2013/05/20/6-effective-ways-listening-can-make-you-a-better-leader/#3fafb2421756)。 + + + +![img](https://cdn-images-1.medium.com/max/1000/0*x4gXpuM1k7rgyHi9.) + +**关注背景** + +除了关注细节。数据分析师和数据科学家还需要关注他们分析的数据背后的背景。这意味着理解请求项目的其他部门的需求,以及实际理解他们分析的数据背后的过程。 + +数据通常表示业务的流程。这可能是一个用户与电子商务网站交互,一个病人在医院,一个项目获得批准,软件被购买和开发等等。 + +这意味着,数据分析师需要理解这些业务规则和逻辑!否则,他们就无法进行良好的分析,他们会做出错误的假设,并且常常会创建脏的、重复的数据。 + +这都是因为他们不理解使用的场景。上下文允许以数据为中心的团队更清楚地做出假设。他们不需要在假设阶段花太多时间去检验所有可能的理论。相反,他们可以利用上下文来帮助加速分析的过程。 + +数据周围的元数据(例如上下文)对于数据科学家来说就像黄金。它并不总是在那里,但当它在的时候。它使我们的工作更容易! + +**记录能力** + +[无论是用excel还是Jupyter笔记本](http://jupyter-notebook-beginner-guide.readthedocs.io/en/latest/what_is_jupyter.html).。对于数据分析师来说,了解如何跟踪他们的工作是很重要的! + +分析需要大量的假设和问题,如果没有记录下来,就会失去思路。 + +第二天回来时,很容易忘记分析了什么,不同的查询和指标是如何以及为什么被提取的,等等。因此,以一种勤奋的方式记录下每一件事情是很重要的。这个技巧是不能留给第二天的,因为总是会有信息丢失! + +创建一个清晰的记录方式使每个人都更容易参与。我们在之前的交流中提到过。然而,一次。 + +标签,创造自然流通的笔记,避免商业术语可以帮助每个人参与,包括当初的记录人!当记录者都不理解自己的笔记,这将是相当尴尬的一件事。 + +记笔记很重要! + +**创造性和抽象思维** + +创造力和 [抽象思维 ](http://www.projectlearnet.org/tutorials/concrete_vs_abstract_thinking.html)有助于数据科学家更好地假设他们在最初探索阶段看到的可能模式和特征。将逻辑思维与最小的数据点结合起来,数据科学家可以得出几种可能的解决方案。然而,这需要跳出框框进行思考。 + +分析是有纪律的研究和创造性思维的结合。如果分析师受到确认偏差或过程的限制,那么他们可能无法得出正确的结论。 + +另一方面,如果他们过于疯狂地思考,没有使用基本的推论和归纳来驱动他们的搜索。在浏览各种数据集时,他们可能会花上数周时间试图回答一个简单的问题,而没有任何明确的目标。 + +**Engineering Mindset** + +分析师需要能够将大问题和数据集分解成更小的部分。有时候,一个单独的团队提出的2-3个问题无法用2-3个答案来回答。 + +相反,2-3个问题本身可能需要被分解成小问题,这些问题可以被数据分析和支持。 + +只有这样,分析师才能回去回答更大的问题。特别是对于大而复杂的数据集。[能够清楚地将分析分解成适当的部分](http://www.thwink.org/sustain/articles/000_AnalyticalApproach/index.htm).变得越来越重要。 + +**注意细节** + +分析需要注意细节。仅仅因为一个分析师或数据科学家可能是一个大局观的人。这并不意味着他们不负责找出围绕项目的所有有价值的细节。 + +公司,甚至是小公司都有很多角落和缝隙。流程上有流程,但不理解这些流程及其细节会影响可执行的分析级别。 + +特别是在编写复杂的查询和编程脚本时。很容易不正确地连接表或过滤错误的东西。因此,总是进行两次和三次检查工作是非常关键的(而且,如果涉及脚本,同行评审也应该如此!) + + + +![img](https://cdn-images-1.medium.com/max/1000/0*R-Rff55mXIQkP7mJ.) + +**好奇心** + +分析需要的好奇心。当我们分解这个过程时,我们会讲到这个。然而,分析过程中的一个步骤是列出所有您认为对分析有价值的问题。这需要一个好奇的心去关心答案。 + +为什么数据是这样,为什么我们看到模式,我们能用什么来找到答案,谁知道呢? + +这些只是一些模糊的问题,可以帮助我们开始向正确的方向进行分析。 [需要有那种动力和欲望去知道为什么!](http://www.ibmbigdatahub.com/podcast/curious-data-scientist) + +**宽容失败** + +数据科学与科学领域有许多相似之处。从这个意义上说,可能有99个失败的假设导致1个成功的解决方案。一些数据驱动型的公司只希望他们的机器学习工程师和数据科学家每年创造新的算法,或者每年半的相关性。这取决于任务的大小和所需的实现类型(例如流程实现、技术、策略等)。在所有这些工作中都有失败后的失败,有未回答的问题后的问题和分析师不得不继续。 + +关键是要得到答案,或者清楚地说明为什么你不能回答这个问题。然而,它不能仅仅因为最初的几次尝试失败而放弃。 + +分析可以成为时间的黑洞。一个接一个的问题可能是不正确的。这就是为什么半结构化过程很重要。它可以指导分析师,但不会阻止他们。 + +### **数据科学和分析软技能** + +这些技能分析人员和数据科学家需要的不仅仅是编程和统计分析。相反,这些技巧的重点在于确保所发现的洞见是易于转移的。这允许其他团队成员和经理也从分析中获益! + +分析师需要做的不仅仅是得出结论。他们需要能够创造出易于复制和传播的工作。 + +**为什么?** + +它不仅节省时间! + +更重要的是,这有助于领导信任分析师的结论。否则,分析师可能是对的,但如果他或她听起来不自信,如果他们记错了笔记,甚至漏掉了一个数据点。这会立即导致领导层之间的不信任! + +不幸的是,这是真的!当仅仅一个数据点不正确或沟通不畅时,分析师的工作就会立即受到质疑。我们经常建议数据团队检查他们的报告和演示文稿,检查漏洞。在这种情况下,有一个善于质疑每个角度的团队成员是很好的! + +你的团队可以提前回答高管可能提出的问题越多。高管们更有可能在项目的下一阶段签字! + + + +![img](https://cdn-images-1.medium.com/max/1000/0*J7W2YgdjexxKsr4X.) + +**数据分析的过程** + +在下一部分中,我们将介绍分析数据的过程。我们将建立基本的笔记和描述简单的过程,这将帮助新的和有经验的数据科学家和分析师确保他们有效地跟踪他们的工作。 + +### [Part 2 每个人的数据分析](https://medium.com/@SeattleDataGuy/data-analysis-for-everyone-part-2-cf1c79441940) + +**其他关于数据科学和策略的资源** + +[How To Apply Data Science To Real World Problems](https://www.theseattledataguy.com/data-science-case-studies/) + +[Amazon Using Data To Win The Grocery Store Game](https://www.theseattledataguy.com/amazon-taking-lunch-data-driven-strategies/) + +[30 Tips To Ensure Your Data Science Team Succeeds](https://www.theseattledataguy.com/top-30-tips-data-science-team-succeeds/) + [A Brilliant Explanation of A Decision Tree](http://www.acheronanalytics.com/acheron-blog/brilliant-explanation-of-a-decision-tree-algorithms) \ No newline at end of file diff --git "a/20171015 \347\254\25413\346\234\237/PyTorch tutorial distilled.md" "b/20171015 \347\254\25413\346\234\237/PyTorch tutorial distilled.md" index 13df31c62b53047b486c664ded3c9e64564fda06..07b3d8e5ef046fc458ae9692d5270833a6728207 100644 --- "a/20171015 \347\254\25413\346\234\237/PyTorch tutorial distilled.md" +++ "b/20171015 \347\254\25413\346\234\237/PyTorch tutorial distilled.md" @@ -1,188 +1,188 @@ -# PyTorch教程 - -原文链接:[PyTorch tutorial distilled](https://towardsdatascience.com/pytorch-tutorial-distilled-95ce8781a89c?from=hackcv&hmsr=hackcv.com) - -## 从 TensorFlow 转向了 PyTorch - - - -![img](https://cdn-images-1.medium.com/max/2000/1*aqNgmfyBIStLrf9k7d9cng.jpeg) - -在我第一次开始学习PyTorch时候,过了几天我就放弃了,对我来说理解这个框架的核心概念和TensorFlow比起来太难了。这就是为什么我把它放在了我的“知识书架”上,渐渐的遗忘了它。但是不久之后,PyTorch的新版本的发布了,我决定再尝试一次。过了一会,我意识到这个框架简便易行,让我很开心的使用PyTorch来编程。我会尝试清楚地解释它的核心概念,这样你就会有动力,至少现在试一试,而不是几年或更长时间。我们将介绍一些基本原则和一些高级内容,如学习速率调度程序,自定义层等。 - -#### 学习资料 - -首先,你应该了解PyTorch, [文档](http://pytorch.org/docs/master/) 和 [教程](http://pytorch.org/tutorials/)是分开存储的。因为更新的太快了,所有他们可能有部分会不一样,所以请查阅 [源代码](http://pytorch.org/tutorials/),这就非常明确和直截了当。而且,还有一个很棒的[PyTorch论坛](https://discuss.pytorch.org/),在那里你可以提出任何合适的问题,你可以得到一个相对较快的答案。 对于PyTorch用户来说,这个地方似乎比StackOverflow更受欢迎。 - -#### PyTorch as NumPy - -让我们来讨论PyTorch本身,PyTorch的主要构建块是tensors。确实他和[NumPy ones](https://docs.scipy.org/doc/numpy-dev/user/quickstart.html)很相似。 Tensors支持很多和相同的API,因此有时可以使用PyTorch作为NumPy的代替品。你可能想问为什么要这么做,主要的原因是PyTorch的主要目标是使用GPU,这样您就可以将数据预处理或任何其他需要大量计算的内容转移到机器学习中。很容易就可以转换tensors从NumPy转换为PyTorch,反之亦然。我们用代码来举个例子: - - - -您可能会注意到, 我们手动计算并应用了渐变。我们有优化器吗?答案是肯定的! - - - - - -现在我们所有的变量都会自动更新。但是你应该从最后一个片段得到的要点:我们仍然应该在计算新的渐变之前手动归零。这是PyTorch的核心概念之一。有时为什么我们应该这样做可能不是很明显,但另一方面,我们可以完全控制我们的渐变,我们何时以及如何应用它们。 - -#### 静态与动态计算图的比较 - -PyTorch和TensorFlow的下一个主要区别是它们对图形表示的方法。 Tensorflow [使用静态图表](https://www.tensorflow.org/programmers_guide/graphs),这意味着我们一次又一次地执行该图表后定义它。在PyTorch中,每个前向传递定义了一个新的计算图。一开始,这些方法之间的区别并不那么大。但是,当您想要调试代码或定义一些条件语句时,动态图变得非常少。您可以使用自己喜欢的调试器!比较while循环语句的下两个定义 - TensorFlow中的第一个定义和PyTorch中的第二个定义: - - - - - - - - - -It seems to me that second solution much easier than first one. And what do you think about it? - -#### Models definition - -好的,现在我们看到在PyTorch中构建一些if / else / while复杂语句很容易。但是让我们回到通常的模型。该框架提供了与[Keras](https://keras.io/) 非常相似的开箱即用层构造函数: - -> `nn`包定义了一组**模块**,大致相当于神经网络层。模块接收输入变量并计算输出变量,但也可以保持内部状态,例如包含可学习参数的变量。 `nn`包还定义了一组在训练神经网络时常用的有用损失函数。 - - - - - -另外,如果我们想构建更复杂的模型,我们可以子类提供`nn.Module`类。当然,这两种方法可以相互混合。 - - - - - -在`__init__`方法中,我们应该定义稍后将使用的所有层。在`forward`方法中,我们应该提出我们想要使用已经定义的层的步骤。像往常一样,向后传递将自动计算。 - -#### 自定义图层 - -但是如果我们想用非标准的backprop定义一些自定义模型呢?这是一个例子 - XNOR网络: - - - -![img](https://cdn-images-1.medium.com/max/1000/1*cjzIFgglAP9xGKg8mlRysQ.png) - - - -我不会深入了解详细信息,更多关于您可能在[入门手册](https://arxiv.org/abs/1603.05279)中阅读的此类网络。与我们的问题相关的是,反向传播应仅适用于小于1且大于-1的权重。在PyTorch中,它[可以非常简单地实现](http://pytorch.org/docs/master/notes/extending.html): - - - -你可能会看到,我们应该只定义两个方法:一个用于前进,一个用于后向传递。如果我们需要从前向传递中访问一些变量,我们可以将它们存储在`ctx`变量中。注意:在以前的API中,前向/后向方法不是静态的,我们将所需的变量存储为`self.save_for_backward(input)`并通过`input,_ = self.saved_tensors`访问。 - -#### 用CUDA训练模型 - -如果之前讨论过如何将一个张量传递给CUDA。但是如果我们想要传递整个模型,可以从模型本身调用`.cuda()`方法,并将每个输入变量包装到`.cuda()`中就足够了。在所有计算之后,我们应该使用`.cpu()`方法返回结果。 - - - - - -此外,PyTorch支持源代码中的直接设备分配: - - - - - -因为有时我们想在没有代码修改的情况下在CPU和GPU上运行相同的模型,我建议使用某种包装器: - - - - - -#### 权重初始化 - -在TensorFlow中,权重初始化主要在张量声明期间进行。 PyTorch提供了另一种方法 - 首先应该声明张量,并且在下一步中应该改变该张量的权重。权重可以初始化为对tensor属性的直接访问,作为对`torch.nn.init`包中的一堆方法的调用。这个决定可能不是很简单,但是当你想用相同的初始化初始化某些类型的所有层时它会变得很有用。 - - - - - -#### 逆向排除子图 - -有时,当您想要重新训练模型的某些层或为生产模式做好准备时,您可以为某些图层禁用自动编程机制。为此,[PyTorch提供了两个标志](http://pytorch.org/docs/master/notes/autograd.html):`requires_grad`和`volatile`。第一个将禁用当前图层的渐变,但子节点仍然可以计算一些。第二个将禁用当前层和所有子节点的autograd。 - - - - - -#### 训练过程 - -PyTorch中还存在一些其他的花里胡哨。例如,您可以使用[学习率调度程序](http://pytorch.org/docs/master/optim.html#how-to-adjust-learning-rate)来根据某些规则调整学习率。或者您可以使用简单的训练标志来启用或者禁用批次归一化和丢失。如果你想要为CPU和GPU分别更改随机种子,将会很容易实现。 - - - -此外,您可以打印有关模型的信息,或使用几行代码保存/加载它。如果您的模型使用[OrderedDict](https://docs.python.org/3/library/collections.html)或者基于类的模型字符串表示形式初始化的,那么将包含层的名称。 - - - -根据PyTorch文档保存模型,使用‘state_dict()’方法更为可取(http://pytorch.org/docs/master/notes/serializ.htm)。 - -根据PyTorch文档保存模型,使用`state_dict()`方法[更为可取](http://pytorch.org/docs/master/notes/serializ.htm)。 - -#### 记录 - -记录训练过程是一个非常重要的部分。不幸的是,PyTorch没有tensorboard这样的工具。因此,您可以使用[Python日志模块](https://docs.python.org/3/library/logging.html)中的常规文本日志,或者尝试一些第三方库: - -- [一个用于实验的简单记录器](https://github.com/oval-group/logger) -- [TensorBoard与语言无关的界面](https://github.com/torrvision/crayon) -- [在不触及TensorFlow的情况下记录TensorBoard事件](https://github.com/TeamHG-Memex/tensorboard_logger) -- [pytorch使用tensorboard ](https://github.com/lanpa/tensorboard-pytorch) -- [Facebook可视化库智慧](https://github.com/facebookresearch/visdom) - -#### 数据处理 - -您可能还记得[TensorFlow中提出的数据加载器](https://www.tensorflow.org/api_guides/python/reading_data),甚至尝试实现其中的一些加载器。对我来说,花了大约4个小时或更多的时间来了解所有管道应该如何工作。 - - - -![img](https://cdn-images-1.medium.com/max/1000/1*S00VU2HiEjNZ35zlj2kqfw.gif) - -图片来源:TensorFlow docs - -最初,我想在这里添加一些代码,但我认为这样的gif足以解释所有事情是如何发生的基本思想。 - -PyTorch的开发者决定不重新发明轮子。他们只是使用多处理。要创建自己的自定义数据加载器,从' torch.utils.data '继承类就足够了。数据集'和改变一些方法: - - - - - -你应该知道的两件事。首先 , 图像尺寸与TensorFlow不同。它们是[batch_size x channels x height x width]。但是,通过预处理步骤`torchvision.transforms.ToTensor()`,可以在没有您交互的情况下进行此转换。[转化包](http://pytorch.org/docs/master/torchvision/transforms.html)中还有很多有用的工具。 - -第二个重要的事情是你可以在GPU上使用固定内存。为此,您只需要在`cuda()`调用中添加另外的标志`async = True`,并从DataLoader获取带有标志`pin_memory = True`的固定批次。 [更多相关讨论](http://pytorch.org/docs/master/notes/cuda.html#use-pinned-memory-buffers). - -#### 最后的体系结构概述 - -现在你知道了模型,优化器和很多其他的东西。合并它们的正确方法是什么?我建议将你的模型和所有包装在这样的积木上: - -![img](https://cdn-images-1.medium.com/max/1000/1*A-cWYNur2lqDEhUF1_gdCw.png) - -这里有一些用于阐述的伪代码: - - - -#### 总结 - -我希望通过这篇文章,你能理解PyTorch的要点: - -- 它可以作为临时代替Numpy -- 这对于原型设计来说非常快 -- 调试和使用条件流很容易 -- 有很多现成的好工具 - +# PyTorch教程 + +原文链接:[PyTorch tutorial distilled](https://towardsdatascience.com/pytorch-tutorial-distilled-95ce8781a89c?from=hackcv&hmsr=hackcv.com) + +## 从 TensorFlow 转向了 PyTorch + + + +![img](https://cdn-images-1.medium.com/max/2000/1*aqNgmfyBIStLrf9k7d9cng.jpeg) + +在我第一次开始学习PyTorch时候,过了几天我就放弃了,对我来说理解这个框架的核心概念和TensorFlow比起来太难了。这就是为什么我把它放在了我的“知识书架”上,渐渐的遗忘了它。但是不久之后,PyTorch的新版本的发布了,我决定再尝试一次。过了一会,我意识到这个框架简便易行,让我很开心的使用PyTorch来编程。我会尝试清楚地解释它的核心概念,这样你就会有动力,至少现在试一试,而不是几年或更长时间。我们将介绍一些基本原则和一些高级内容,如学习速率调度程序,自定义层等。 + +#### 学习资料 + +首先,你应该了解PyTorch, [文档](http://pytorch.org/docs/master/) 和 [教程](http://pytorch.org/tutorials/)是分开存储的。因为更新的太快了,所有他们可能有部分会不一样,所以请查阅 [源代码](http://pytorch.org/tutorials/),这就非常明确和直截了当。而且,还有一个很棒的[PyTorch论坛](https://discuss.pytorch.org/),在那里你可以提出任何合适的问题,你可以得到一个相对较快的答案。 对于PyTorch用户来说,这个地方似乎比StackOverflow更受欢迎。 + +#### PyTorch as NumPy + +让我们来讨论PyTorch本身,PyTorch的主要构建块是tensors。确实他和[NumPy ones](https://docs.scipy.org/doc/numpy-dev/user/quickstart.html)很相似。 Tensors支持很多和相同的API,因此有时可以使用PyTorch作为NumPy的代替品。你可能想问为什么要这么做,主要的原因是PyTorch的主要目标是使用GPU,这样您就可以将数据预处理或任何其他需要大量计算的内容转移到机器学习中。很容易就可以转换tensors从NumPy转换为PyTorch,反之亦然。我们用代码来举个例子: + + + +您可能会注意到, 我们手动计算并应用了渐变。我们有优化器吗?答案是肯定的! + + + + + +现在我们所有的变量都会自动更新。但是你应该从最后一个片段得到的要点:我们仍然应该在计算新的渐变之前手动归零。这是PyTorch的核心概念之一。有时为什么我们应该这样做可能不是很明显,但另一方面,我们可以完全控制我们的渐变,我们何时以及如何应用它们。 + +#### 静态与动态计算图的比较 + +PyTorch和TensorFlow的下一个主要区别是它们对图形表示的方法。 Tensorflow [使用静态图表](https://www.tensorflow.org/programmers_guide/graphs),这意味着我们一次又一次地执行该图表后定义它。在PyTorch中,每个前向传递定义了一个新的计算图。一开始,这些方法之间的区别并不那么大。但是,当您想要调试代码或定义一些条件语句时,动态图变得非常少。您可以使用自己喜欢的调试器!比较while循环语句的下两个定义 - TensorFlow中的第一个定义和PyTorch中的第二个定义: + + + + + + + + + +It seems to me that second solution much easier than first one. And what do you think about it? + +#### Models definition + +好的,现在我们看到在PyTorch中构建一些if / else / while复杂语句很容易。但是让我们回到通常的模型。该框架提供了与[Keras](https://keras.io/) 非常相似的开箱即用层构造函数: + +> `nn`包定义了一组**模块**,大致相当于神经网络层。模块接收输入变量并计算输出变量,但也可以保持内部状态,例如包含可学习参数的变量。 `nn`包还定义了一组在训练神经网络时常用的有用损失函数。 + + + + + +另外,如果我们想构建更复杂的模型,我们可以子类提供`nn.Module`类。当然,这两种方法可以相互混合。 + + + + + +在`__init__`方法中,我们应该定义稍后将使用的所有层。在`forward`方法中,我们应该提出我们想要使用已经定义的层的步骤。像往常一样,向后传递将自动计算。 + +#### 自定义图层 + +但是如果我们想用非标准的backprop定义一些自定义模型呢?这是一个例子 - XNOR网络: + + + +![img](https://cdn-images-1.medium.com/max/1000/1*cjzIFgglAP9xGKg8mlRysQ.png) + + + +我不会深入了解详细信息,更多关于您可能在[入门手册](https://arxiv.org/abs/1603.05279)中阅读的此类网络。与我们的问题相关的是,反向传播应仅适用于小于1且大于-1的权重。在PyTorch中,它[可以非常简单地实现](http://pytorch.org/docs/master/notes/extending.html): + + + +你可能会看到,我们应该只定义两个方法:一个用于前进,一个用于后向传递。如果我们需要从前向传递中访问一些变量,我们可以将它们存储在`ctx`变量中。注意:在以前的API中,前向/后向方法不是静态的,我们将所需的变量存储为`self.save_for_backward(input)`并通过`input,_ = self.saved_tensors`访问。 + +#### 用CUDA训练模型 + +如果之前讨论过如何将一个张量传递给CUDA。但是如果我们想要传递整个模型,可以从模型本身调用`.cuda()`方法,并将每个输入变量包装到`.cuda()`中就足够了。在所有计算之后,我们应该使用`.cpu()`方法返回结果。 + + + + + +此外,PyTorch支持源代码中的直接设备分配: + + + + + +因为有时我们想在没有代码修改的情况下在CPU和GPU上运行相同的模型,我建议使用某种包装器: + + + + + +#### 权重初始化 + +在TensorFlow中,权重初始化主要在张量声明期间进行。 PyTorch提供了另一种方法 - 首先应该声明张量,并且在下一步中应该改变该张量的权重。权重可以初始化为对tensor属性的直接访问,作为对`torch.nn.init`包中的一堆方法的调用。这个决定可能不是很简单,但是当你想用相同的初始化初始化某些类型的所有层时它会变得很有用。 + + + + + +#### 逆向排除子图 + +有时,当您想要重新训练模型的某些层或为生产模式做好准备时,您可以为某些图层禁用自动编程机制。为此,[PyTorch提供了两个标志](http://pytorch.org/docs/master/notes/autograd.html):`requires_grad`和`volatile`。第一个将禁用当前图层的渐变,但子节点仍然可以计算一些。第二个将禁用当前层和所有子节点的autograd。 + + + + + +#### 训练过程 + +PyTorch中还存在一些其他的花里胡哨。例如,您可以使用[学习率调度程序](http://pytorch.org/docs/master/optim.html#how-to-adjust-learning-rate)来根据某些规则调整学习率。或者您可以使用简单的训练标志来启用或者禁用批次归一化和丢失。如果你想要为CPU和GPU分别更改随机种子,将会很容易实现。 + + + +此外,您可以打印有关模型的信息,或使用几行代码保存/加载它。如果您的模型使用[OrderedDict](https://docs.python.org/3/library/collections.html)或者基于类的模型字符串表示形式初始化的,那么将包含层的名称。 + + + +根据PyTorch文档保存模型,使用‘state_dict()’方法更为可取(http://pytorch.org/docs/master/notes/serializ.htm)。 + +根据PyTorch文档保存模型,使用`state_dict()`方法[更为可取](http://pytorch.org/docs/master/notes/serializ.htm)。 + +#### 记录 + +记录训练过程是一个非常重要的部分。不幸的是,PyTorch没有tensorboard这样的工具。因此,您可以使用[Python日志模块](https://docs.python.org/3/library/logging.html)中的常规文本日志,或者尝试一些第三方库: + +- [一个用于实验的简单记录器](https://github.com/oval-group/logger) +- [TensorBoard与语言无关的界面](https://github.com/torrvision/crayon) +- [在不触及TensorFlow的情况下记录TensorBoard事件](https://github.com/TeamHG-Memex/tensorboard_logger) +- [pytorch使用tensorboard ](https://github.com/lanpa/tensorboard-pytorch) +- [Facebook可视化库智慧](https://github.com/facebookresearch/visdom) + +#### 数据处理 + +您可能还记得[TensorFlow中提出的数据加载器](https://www.tensorflow.org/api_guides/python/reading_data),甚至尝试实现其中的一些加载器。对我来说,花了大约4个小时或更多的时间来了解所有管道应该如何工作。 + + + +![img](https://cdn-images-1.medium.com/max/1000/1*S00VU2HiEjNZ35zlj2kqfw.gif) + +图片来源:TensorFlow docs + +最初,我想在这里添加一些代码,但我认为这样的gif足以解释所有事情是如何发生的基本思想。 + +PyTorch的开发者决定不重新发明轮子。他们只是使用多处理。要创建自己的自定义数据加载器,从' torch.utils.data '继承类就足够了。数据集'和改变一些方法: + + + + + +你应该知道的两件事。首先 , 图像尺寸与TensorFlow不同。它们是[batch_size x channels x height x width]。但是,通过预处理步骤`torchvision.transforms.ToTensor()`,可以在没有您交互的情况下进行此转换。[转化包](http://pytorch.org/docs/master/torchvision/transforms.html)中还有很多有用的工具。 + +第二个重要的事情是你可以在GPU上使用固定内存。为此,您只需要在`cuda()`调用中添加另外的标志`async = True`,并从DataLoader获取带有标志`pin_memory = True`的固定批次。 [更多相关讨论](http://pytorch.org/docs/master/notes/cuda.html#use-pinned-memory-buffers). + +#### 最后的体系结构概述 + +现在你知道了模型,优化器和很多其他的东西。合并它们的正确方法是什么?我建议将你的模型和所有包装在这样的积木上: + +![img](https://cdn-images-1.medium.com/max/1000/1*A-cWYNur2lqDEhUF1_gdCw.png) + +这里有一些用于阐述的伪代码: + + + +#### 总结 + +我希望通过这篇文章,你能理解PyTorch的要点: + +- 它可以作为临时代替Numpy +- 这对于原型设计来说非常快 +- 调试和使用条件流很容易 +- 有很多现成的好工具 + PyTorch是一个快速发展的框架,拥有很棒的社区。我认为今天的尝试很棒! \ No newline at end of file diff --git "a/20171015 \347\254\25413\346\234\237/README.md" "b/20171015 \347\254\25413\346\234\237/README.md" index 81899a60630617fcadb22a1bd69863d8a487062a..e8295d221b515f751419ae4931313b5667e35854 100644 --- "a/20171015 \347\254\25413\346\234\237/README.md" +++ "b/20171015 \347\254\25413\346\234\237/README.md" @@ -1,6 +1,5 @@ -| 标题 | 简介 | -| ------------------------------------------------------------ | ---- | -| [PyTorch tutorial distilled](https://towardsdatascience.com/pytorch-tutorial-distilled-95ce8781a89c?from=hackcv&hmsr=hackcv.com) | | -| [Intro To Data Analysis For Everyone! Part 1](https://towardsdatascience.com/intro-to-data-analysis-for-everyone-part-1-ff252c3a38b5?from=hackcv&hmsr=hackcv.com) | | -| [The Search for Better Search at Reddit](https://redditblog.com/2017/09/07/the-search-for-better-search-at-reddit/?from=hackcv&hmsr=hackcv.com&utm_medium=hackcv.com&utm_source=hackcv.com) | | - +| 标题 | 简介 | +| ------------------------------------------------------------ | ---------------------------- | +| [PyTorch tutorial distilled](https://towardsdatascience.com/pytorch-tutorial-distilled-95ce8781a89c?from=hackcv&hmsr=hackcv.com) | PyTorch简单的介绍 | +| [Intro To Data Analysis For Everyone! Part 1](https://towardsdatascience.com/intro-to-data-analysis-for-everyone-part-1-ff252c3a38b5?from=hackcv&hmsr=hackcv.com) | 数据科学家需要具备的几个能力 | +| [The Search for Better Search at Reddit](https://redditblog.com/2017/09/07/the-search-for-better-search-at-reddit/?from=hackcv&hmsr=hackcv.com&utm_medium=hackcv.com&utm_source=hackcv.com) | Reddit的搜索功能实现介绍 | diff --git "a/20171015 \347\254\25413\346\234\237/The Search for Better Search at Reddit.md" "b/20171015 \347\254\25413\346\234\237/The Search for Better Search at Reddit.md" index 461fbe9536ed3c37c8dc783c6dc6bf58af8d51c3..c6eb44c731c213ecb46fbc96a030a0e3b8d5aa10 100644 --- "a/20171015 \347\254\25413\346\234\237/The Search for Better Search at Reddit.md" +++ "b/20171015 \347\254\25413\346\234\237/The Search for Better Search at Reddit.md" @@ -1,132 +1,132 @@ -# 在Reddit上搜索更好的搜索 - -原文链接:[The Search for Better Search at Reddit](https://redditblog.com/2017/09/07/the-search-for-better-search-at-reddit/?from=hackcv&hmsr=hackcv.com&utm_medium=hackcv.com&utm_source=hackcv.com) - - - -[TECHNOLOGY](https://redditblog.com/topic/technology/) [Staff](https://redditblog.com/author/blabyrinth/) • [September 7, 2017](https://redditblog.com/2017/09/07/the-search-for-better-search-at-reddit/) - -**Chris Slowe, Nick Caldwell, & Luis Bitencourt-Emilio***CTO, VP of Engineering, Director of Engineering* - -## **什么是Fuss?** - -我们从Reddit的新手工程团队成员那里得到的一个常见问题是“我们什么时候才能修复搜索?”直到今年,答案总是“去询问5楼的搜索团队。”这很有趣,因为 - -1. 到5楼的电梯按钮没有工作 -2. 没有搜索团队 - -但是时代在进步,这是一个改革。我们很高兴地宣布,我们正在Reddit推出一个新的搜索引擎。实际上,在过去的几周里它已经启动了50%的流量,并且已经提供了近5亿次查询。现在我们对我们的系统充满信心,我们将其推向100%的流量。我们希望您享受更快,更可靠的结果! - -更重要的是,我们还在Reddit开设了一个专门用于搜索和相关的整个产品部门,由我们的工程总监Luis领导。我们认识到这些技术对Reddit的未来至关重要。我们的平台包含世界上最有趣的内容集合之一,目前索引超过25亿个搜索帖子,并且它每天都在变大。但我们知道这个内容很难找到。改进搜索和相关性将使Reddit能够筛选数百万个帖子,评论和社区,以便直接为您的家庭Feed提供定制的精彩内容流。 - -那就是未来。就目前而言,我们认为沿着记忆之路旅行会很有趣。 - - - -## **Reddit搜索简洁的历史** - -不用说,搜索不是一个容易解决的挑战。在Reddit上搜索的时候,我们就像坐过山车一样,但现在我们已经是第六次搜索了,我们对大规模搜索的困难并不陌生。下面是关于12年历史的粗略概述,以及一些来自我们团队的精选引语,我们通过迭代来将我们的infra扩展到Reddit的需求: - -- 2005 – Steve Huffman ([u/spez](https://www.reddit.com/user/spez)), 创始人之一,现任首席执行官, 开启了 postgres 7.4’s contrib/[tsearch2](http://www.sai.msu.su/~megera/postgres/gist/tsearch/V2/). - - 当有人说 “哦,我们可以用 Postgres来完成!” , “对我来说听起来不错!?” “我们当时也非常喜欢TRIGGERs(”不,这很酷。数据库完成所有工作,并且保证准确无误“是我们毫无疑问的说法)。它工作得很好,但它不是很可调,我们很快发现我们正在以少数(约2%)搜索流量阻塞大多数Postgres查询: - - - “我们修复了搜索结果排序中的错误。” —[Steve](https://redditblog.com/2006/02/27/if-you-want-something-done-right-do-it-yourself/) - - “我们今天早上更新了搜索系统,以帮助缓解一些负载问题。” —[Steve](https://redditblog.com/2006/07/25/searching/) - - “Jeremy正致力于搜索!这不是一个复杂的修复(排序很糟糕)。” —[Steve](https://redditblog.com/2007/04/28/updates/) - -- 2007 – Chris Slowe ([u/KeyserSosa](https://www.reddit.com/user/KeyserSosa)), 创始工程师(现在是CTO),与PyLucene一起重新实施。 - - - - 这实际上是在10年前的2007年7月实现的。它由一个Python进程组成,该进程被设置为TCP上的线程RPC服务器。在初始版本中,我们实际上支持搜索帖子标题和评论,并且Lucene索引文件可以舒适地存储在一个盒子上。这也是在我们搬到AWS之前,当时我们已经认真考虑过使用Google Search Appliance,这对我们的单机架来说是一个很好的补充。这个版本很灵活,但我们没有以一种易于扩展的方式进行设置: - - - “搜索的效果变得更好这标记着用户可以更好的进行控制。” —[Steve](https://redditblog.com/2007/07/26/new-reddit-on-the-horizon/) - - “搜索效果更好,但是不是我们喜欢的地方。” —[Steve](https://redditblog.com/2007/08/21/its-slow-its-unstable-its-beta/) - - “统计数据和搜索暂时被禁用,但只要我们能够修复它们就会回来。” —[Steve](https://redditblog.com/2007/10/16/reddit-status-update/) - - “我们希望包含升级后的搜索,与上一版本不同,它实际上非常有用,可以帮助您找到所需内容。不幸的是,我们确定的版本并没有很好地加载测试。” —[Steve](https://redditblog.com/2007/10/18/reddit-status-update-part-ii/) - - “我快速修复了搜索,我希望有所帮助,直到我们有机会真正解决它。” —[Steve](https://redditblog.com/2007/06/08/a-note-on-search-and-what-were-working-on/) - -- 2008 – David King ([u/ketralnis](https://www.reddit.com/user/ketralnis)), 第三名员工,现在是搜索工程师,实施Solr。 - - 实际上,他实现了一个自制的pysolr,它能够以XML格式将更新文档发送给Solr,并以这样的方式包装响应,以便模拟我们现有的Query模型,足以将其放入任何类型或列表中。它实际上很甜蜜。初始版本不支持评论,但后来确实如此。 - - - “[David]一直在修复Erlang的搜索和黑客攻击项目。” —[Alexis Ohanian](https://redditblog.com/2008/04/17/welcome-david/) - - “我完全取代了reddit搜索功能。” —[David King](https://redditblog.com/2008/04/21/new-search-2/) - -- 2010 – David将Solr替换为第三方搜索提供商IndexTank。 - - 当你喜欢某些东西时,将其外包......从来没有人说过。随着网站持续增长,我们首先在一个月内与一个四人工程团队一起破解了十亿次网页浏览,我们将所有努力投入503缓解,继续添加Postgres读取,添加更多缓存,开始利用Cassandra的早期版本(之后很快就发生了一次令人难忘的停电),并且通常无视搜索的糟糕程度。我们有一个勇敢的决定,永远使用第三方搜索提供商,比我们为保持Solr运行所付出的更少,所以我们签了! - - - “我们昨天推出了一个新的搜索引擎。冷静。没关系。我知道。你以前受伤了。” —[David King](https://redditblog.com/2010/07/21/new-search/) - -- 2012 – Keith Mitchell (u/kemitche) 在LinkedIn关闭IndexTank后实施CloudSearch。 - - 很明显,这个永远过于短暂,IndexTank在公司被收购之前为我们提供了很好的帮助。当我们发现他们正在关闭时,我们不得不离开IndexTank并快速过渡到AWS CloudSearch。继续我们长期以来的传统“让新人照顾它”,这项任务落到了Keith身上,在接下来的几年里,我们将CloudSearch扩展到了爆炸状态: - - - “今天,我们从旧的Amazon CloudSearch域迁移到新的Amazon CloudSearch域。旧的搜索域存在严重的性能问题:大约33%的查询需要5秒才能完成,并且会导致搜索错误页面。” —[u/bsimpson](https://www.reddit.com/r/changelog/comments/694o34/reddit_search_performance_improvements/) - -- TODAY – Lucidworks Fusion! - - 这一次,我们希望确保搜索符合三个标准:它需要快速,需要与Reddit的增长很好地扩展,最重要的是,它需要具有相关性。最终,这促使我们与Lucidworks的搜索专家合作,利用Fusion及其由多个Solr提交者组成的团队的独特搜索专业知识。下面,我们将更详细地解释我们如何进行此操作。 - - - “As [/u/bitofsalt](https://www.reddit.com/u/bitofsalt) [几个月前我们提到过](https://www.reddit.com/r/funny/comments/65ryr3/and_now_a_look_at_the_machine_that_powers_reddits/dgd22mi/), 我们一直在努力改进搜索。我们甚至可能领先于 [spez’s 的10年计划](https://www.reddit.com/r/announcements/comments/59k22p/hey_its_reddits_totally_politically_neutral_ceo/d992fwq/?context=1).” —[u/starfishjenga](https://www.reddit.com/r/changelog/comments/6pi0kk/improving_search/) - -## **感受更多** - -今年早些时候,对Reddit的搜索变得非常糟糕。简单的查询只能在一半的时间内成功。想要使用两个关键字进行搜索?离开这里! - -![img](https://redditupvoted.files.wordpress.com/2017/09/screen-shot-2017-09-07-at-11-43-15-am.png?w=720&h=505) - -图1:我们的CloudSearch集群负载过重时的示例错误页面。 - -在查看了几个选项后,我们与 [Lucidworks](https://lucidworks.com/) 合作,重振Reddit的搜索系统。 Lucidworks是Fusion的创建者,Fusion是一个基于Solr的搜索堆栈,支持巨大的文档规模和高查询吞吐量。 - -## **第一件事:以Reddit量表摄取** - -迁移到新搜索系统的最大挑战是我们的索引管道需要更新。第一次尝试很艰难。为了速度,我们匆忙将它放在我们由 [Jenkins](https://jenkins.io/)和[Azkaban](https://azkaban.github.io/) 组成的遗留ETL系统上,编排了许多Hive查询。正如您在下图中所看到的,将来自多个来源的数据汇总到一个有索引的规范视图中进行索引,证明比最初预期的更复杂。 - -![img](https://redditupvoted.files.wordpress.com/2017/09/screen-shot-2017-09-07-at-11-44-37-am.png?w=720&h=433) - -图2:我们新的搜索提取管道的第一次迭代,现在被替换为显着简化的版本。 - -我们的第二次尝试既简单又产生了明显更好的结果。我们设法将整个管道修剪为仅仅四个更简单和更准确的Hive查询,这使得索引的帖子增加了33%。另一个重大改进是,我们不仅索引新的帖子创作,而且还实时更新其相关信号,因为投票,评论和其他信号全天都在流动。 - -## **使其相关** - -如果它们不相关,搜索结果并不意味着什么。对于我们的初始部署,主要目标是避免降低返回结果的整体相关性。 - -为了监控这一点,我们测量了搜索结果页面上的点击次数,并比较了在新旧搜索系统中点击的结果的排名。一个完美的搜索引擎会在返回的最高结果上产生100%的点击次数,这是另一种表示您希望在顶部获得最相关结果的方式。由于我们知道完美的搜索引擎不是一个可实现的目标,我们使用 [平均互惠等级](https://en.wikipedia.org/wiki/Mean_reciprocal_rank)和 [折扣累积增益](https://en.wikipedia.org/wiki/Discounted_cumulative_gain)等措施来比较我们的结果质量。 - -虽然它在我们的实验中还处于早期阶段,但迄今为止的数据指向了我们的旧堆栈与新堆栈之间非常可比的相关性测量,而Fusion具有轻微的优势。这个有希望的部分是我们还没有进行太多的相关调整 - 这是我们的新系统实际支持的东西。个性化,机器学习模型以及查询意图和重写等进步现在已经成为现实。 - -![img](https://redditupvoted.files.wordpress.com/2017/09/screen-shot-2017-09-07-at-11-46-10-am.png?w=720&h=276) - -图3:Fusion和CloudSearch堆栈之间搜索结果点击位置的比较。 - -## **首次展示** - -在我们克服数据提取挑战和监控相关性时,我们继续将使用率提高到越来越多的redditors。这个早期小组的 [反馈](https://www.reddit.com/r/changelog/comments/6pi0kk/improving_search/)非常宝贵,我们非常感谢社区帮助我们解决漏洞和不太常见的用例。我们在新筹码上只有1%的用户开始工作,处理报告的问题并改进了摄取管道,因为我们在GA之前将推出百分比提高到5,10,25和最终50%的流量。在这段时间里,我们将所有搜索查询作为黑暗流量发送到我们的新搜索群集,以确保随着我们增加推出百分比,它可以全面扩展。 - -![img](https://redditupvoted.files.wordpress.com/2017/09/screen-shot-2017-09-07-at-11-47-24-am.png?w=720&h=376) - -图4:黄色的CloudSearch错误和绿色的Fusion。 - -我们很自豪地说Reddit Search比以往更好!所有Reddit内容的完整重新索引现在在大约5个小时内完成(从大约11个小时开始),我们不断将实时更新流式传输到索引。错误率下降了两个数量级,99%的搜索结果在500毫秒内完成。运行搜索所需的机器数量从今年早些时候的约200台减少到30台左右,因此我们甚至设法节省了一些成本。 - -![img](https://redditupvoted.files.wordpress.com/2017/09/screen-shot-2017-09-07-at-11-48-12-am.png?w=720&h=308) - -图5:Reddit新搜索堆栈概述。 - -更快,更可靠,更相关,更低成本!当然这应该是我们最后一次需要更改搜索堆栈! - -## **展望未来** - -严肃地说,我们认为你会喜欢这个更新。我们希望新的搜索堆栈将成为改进的基础,以便更容易地发现Reddit上的所有优秀内容。更重要的是:我们没有完成。修复搜索只是一系列新功能的第一步,这些功能将使Reddit更加个性化并与您的兴趣相关。 Reddit最终拥有一个Search&Relevance团队,我们正在疯狂招聘。如果您对在数亿人使用的搜索和相关性平台上使用世界上最有趣的数据集之一感到兴奋,那么请查看我们的工作列表: - -**Head of Search:** [https://boards.greenhouse.io/reddit/jobs/723000#.Wa3yONOGOEI -](https://boards.greenhouse.io/reddit/jobs/723000#.Wa3yONOGOEI)**Head of Relevance:** [https://boards.greenhouse.io/reddit/jobs/611466#.WbC_ltOGOEI -](https://boards.greenhouse.io/reddit/jobs/611466#.WbC_ltOGOEI)**Head of Discovery:** [https://boards.greenhouse.io/reddit/jobs/764831#.WbC_2NOGOEI -](https://boards.greenhouse.io/reddit/jobs/764831#.WbC_2NOGOEI)**Search Engineers:** - +# 在Reddit上搜索更好的搜索 + +原文链接:[The Search for Better Search at Reddit](https://redditblog.com/2017/09/07/the-search-for-better-search-at-reddit/?from=hackcv&hmsr=hackcv.com&utm_medium=hackcv.com&utm_source=hackcv.com) + + + +[TECHNOLOGY](https://redditblog.com/topic/technology/) [Staff](https://redditblog.com/author/blabyrinth/) • [September 7, 2017](https://redditblog.com/2017/09/07/the-search-for-better-search-at-reddit/) + +**Chris Slowe, Nick Caldwell, & Luis Bitencourt-Emilio***CTO, VP of Engineering, Director of Engineering* + +## **什么是Fuss?** + +我们从Reddit的新手工程团队成员那里得到的一个常见问题是“我们什么时候才能修复搜索?”直到今年,答案总是“去询问5楼的搜索团队。”这很有趣,因为 + +1. 到5楼的电梯按钮没有工作 +2. 没有搜索团队 + +但是时代在进步,这是一个改革。我们很高兴地宣布,我们正在Reddit推出一个新的搜索引擎。实际上,在过去的几周里它已经启动了50%的流量,并且已经提供了近5亿次查询。现在我们对我们的系统充满信心,我们将其推向100%的流量。我们希望您享受更快,更可靠的结果! + +更重要的是,我们还在Reddit开设了一个专门用于搜索和相关的整个产品部门,由我们的工程总监Luis领导。我们认识到这些技术对Reddit的未来至关重要。我们的平台包含世界上最有趣的内容集合之一,目前索引超过25亿个搜索帖子,并且它每天都在变大。但我们知道这个内容很难找到。改进搜索和相关性将使Reddit能够筛选数百万个帖子,评论和社区,以便直接为您的家庭Feed提供定制的精彩内容流。 + +那就是未来。就目前而言,我们认为沿着记忆之路旅行会很有趣。 + + + +## **Reddit搜索简洁的历史** + +不用说,搜索不是一个容易解决的挑战。在Reddit上搜索的时候,我们就像坐过山车一样,但现在我们已经是第六次搜索了,我们对大规模搜索的困难并不陌生。下面是关于12年历史的粗略概述,以及一些来自我们团队的精选引语,我们通过迭代来将我们的infra扩展到Reddit的需求: + +- 2005 – Steve Huffman ([u/spez](https://www.reddit.com/user/spez)), 创始人之一,现任首席执行官, 开启了 postgres 7.4’s contrib/[tsearch2](http://www.sai.msu.su/~megera/postgres/gist/tsearch/V2/). + + 当有人说 “哦,我们可以用 Postgres来完成!” , “对我来说听起来不错!?” “我们当时也非常喜欢TRIGGERs(”不,这很酷。数据库完成所有工作,并且保证准确无误“是我们毫无疑问的说法)。它工作得很好,但它不是很可调,我们很快发现我们正在以少数(约2%)搜索流量阻塞大多数Postgres查询: + + - “我们修复了搜索结果排序中的错误。” —[Steve](https://redditblog.com/2006/02/27/if-you-want-something-done-right-do-it-yourself/) + - “我们今天早上更新了搜索系统,以帮助缓解一些负载问题。” —[Steve](https://redditblog.com/2006/07/25/searching/) + - “Jeremy正致力于搜索!这不是一个复杂的修复(排序很糟糕)。” —[Steve](https://redditblog.com/2007/04/28/updates/) + +- 2007 – Chris Slowe ([u/KeyserSosa](https://www.reddit.com/user/KeyserSosa)), 创始工程师(现在是CTO),与PyLucene一起重新实施。 + + + + 这实际上是在10年前的2007年7月实现的。它由一个Python进程组成,该进程被设置为TCP上的线程RPC服务器。在初始版本中,我们实际上支持搜索帖子标题和评论,并且Lucene索引文件可以舒适地存储在一个盒子上。这也是在我们搬到AWS之前,当时我们已经认真考虑过使用Google Search Appliance,这对我们的单机架来说是一个很好的补充。这个版本很灵活,但我们没有以一种易于扩展的方式进行设置: + + - “搜索的效果变得更好这标记着用户可以更好的进行控制。” —[Steve](https://redditblog.com/2007/07/26/new-reddit-on-the-horizon/) + - “搜索效果更好,但是不是我们喜欢的地方。” —[Steve](https://redditblog.com/2007/08/21/its-slow-its-unstable-its-beta/) + - “统计数据和搜索暂时被禁用,但只要我们能够修复它们就会回来。” —[Steve](https://redditblog.com/2007/10/16/reddit-status-update/) + - “我们希望包含升级后的搜索,与上一版本不同,它实际上非常有用,可以帮助您找到所需内容。不幸的是,我们确定的版本并没有很好地加载测试。” —[Steve](https://redditblog.com/2007/10/18/reddit-status-update-part-ii/) + - “我快速修复了搜索,我希望有所帮助,直到我们有机会真正解决它。” —[Steve](https://redditblog.com/2007/06/08/a-note-on-search-and-what-were-working-on/) + +- 2008 – David King ([u/ketralnis](https://www.reddit.com/user/ketralnis)), 第三名员工,现在是搜索工程师,实施Solr。 + + 实际上,他实现了一个自制的pysolr,它能够以XML格式将更新文档发送给Solr,并以这样的方式包装响应,以便模拟我们现有的Query模型,足以将其放入任何类型或列表中。它实际上很甜蜜。初始版本不支持评论,但后来确实如此。 + + - “[David]一直在修复Erlang的搜索和黑客攻击项目。” —[Alexis Ohanian](https://redditblog.com/2008/04/17/welcome-david/) + - “我完全取代了reddit搜索功能。” —[David King](https://redditblog.com/2008/04/21/new-search-2/) + +- 2010 – David将Solr替换为第三方搜索提供商IndexTank。 + + 当你喜欢某些东西时,将其外包......从来没有人说过。随着网站持续增长,我们首先在一个月内与一个四人工程团队一起破解了十亿次网页浏览,我们将所有努力投入503缓解,继续添加Postgres读取,添加更多缓存,开始利用Cassandra的早期版本(之后很快就发生了一次令人难忘的停电),并且通常无视搜索的糟糕程度。我们有一个勇敢的决定,永远使用第三方搜索提供商,比我们为保持Solr运行所付出的更少,所以我们签了! + + - “我们昨天推出了一个新的搜索引擎。冷静。没关系。我知道。你以前受伤了。” —[David King](https://redditblog.com/2010/07/21/new-search/) + +- 2012 – Keith Mitchell (u/kemitche) 在LinkedIn关闭IndexTank后实施CloudSearch。 + + 很明显,这个永远过于短暂,IndexTank在公司被收购之前为我们提供了很好的帮助。当我们发现他们正在关闭时,我们不得不离开IndexTank并快速过渡到AWS CloudSearch。继续我们长期以来的传统“让新人照顾它”,这项任务落到了Keith身上,在接下来的几年里,我们将CloudSearch扩展到了爆炸状态: + + - “今天,我们从旧的Amazon CloudSearch域迁移到新的Amazon CloudSearch域。旧的搜索域存在严重的性能问题:大约33%的查询需要5秒才能完成,并且会导致搜索错误页面。” —[u/bsimpson](https://www.reddit.com/r/changelog/comments/694o34/reddit_search_performance_improvements/) + +- TODAY – Lucidworks Fusion! + + 这一次,我们希望确保搜索符合三个标准:它需要快速,需要与Reddit的增长很好地扩展,最重要的是,它需要具有相关性。最终,这促使我们与Lucidworks的搜索专家合作,利用Fusion及其由多个Solr提交者组成的团队的独特搜索专业知识。下面,我们将更详细地解释我们如何进行此操作。 + + - “As [/u/bitofsalt](https://www.reddit.com/u/bitofsalt) [几个月前我们提到过](https://www.reddit.com/r/funny/comments/65ryr3/and_now_a_look_at_the_machine_that_powers_reddits/dgd22mi/), 我们一直在努力改进搜索。我们甚至可能领先于 [spez’s 的10年计划](https://www.reddit.com/r/announcements/comments/59k22p/hey_its_reddits_totally_politically_neutral_ceo/d992fwq/?context=1).” —[u/starfishjenga](https://www.reddit.com/r/changelog/comments/6pi0kk/improving_search/) + +## **感受更多** + +今年早些时候,对Reddit的搜索变得非常糟糕。简单的查询只能在一半的时间内成功。想要使用两个关键字进行搜索?离开这里! + +![img](https://redditupvoted.files.wordpress.com/2017/09/screen-shot-2017-09-07-at-11-43-15-am.png?w=720&h=505) + +图1:我们的CloudSearch集群负载过重时的示例错误页面。 + +在查看了几个选项后,我们与 [Lucidworks](https://lucidworks.com/) 合作,重振Reddit的搜索系统。 Lucidworks是Fusion的创建者,Fusion是一个基于Solr的搜索堆栈,支持巨大的文档规模和高查询吞吐量。 + +## **第一件事:以Reddit量表摄取** + +迁移到新搜索系统的最大挑战是我们的索引管道需要更新。第一次尝试很艰难。为了速度,我们匆忙将它放在我们由 [Jenkins](https://jenkins.io/)和[Azkaban](https://azkaban.github.io/) 组成的遗留ETL系统上,编排了许多Hive查询。正如您在下图中所看到的,将来自多个来源的数据汇总到一个有索引的规范视图中进行索引,证明比最初预期的更复杂。 + +![img](https://redditupvoted.files.wordpress.com/2017/09/screen-shot-2017-09-07-at-11-44-37-am.png?w=720&h=433) + +图2:我们新的搜索提取管道的第一次迭代,现在被替换为显着简化的版本。 + +我们的第二次尝试既简单又产生了明显更好的结果。我们设法将整个管道修剪为仅仅四个更简单和更准确的Hive查询,这使得索引的帖子增加了33%。另一个重大改进是,我们不仅索引新的帖子创作,而且还实时更新其相关信号,因为投票,评论和其他信号全天都在流动。 + +## **使其相关** + +如果它们不相关,搜索结果并不意味着什么。对于我们的初始部署,主要目标是避免降低返回结果的整体相关性。 + +为了监控这一点,我们测量了搜索结果页面上的点击次数,并比较了在新旧搜索系统中点击的结果的排名。一个完美的搜索引擎会在返回的最高结果上产生100%的点击次数,这是另一种表示您希望在顶部获得最相关结果的方式。由于我们知道完美的搜索引擎不是一个可实现的目标,我们使用 [平均互惠等级](https://en.wikipedia.org/wiki/Mean_reciprocal_rank)和 [折扣累积增益](https://en.wikipedia.org/wiki/Discounted_cumulative_gain)等措施来比较我们的结果质量。 + +虽然它在我们的实验中还处于早期阶段,但迄今为止的数据指向了我们的旧堆栈与新堆栈之间非常可比的相关性测量,而Fusion具有轻微的优势。这个有希望的部分是我们还没有进行太多的相关调整 - 这是我们的新系统实际支持的东西。个性化,机器学习模型以及查询意图和重写等进步现在已经成为现实。 + +![img](https://redditupvoted.files.wordpress.com/2017/09/screen-shot-2017-09-07-at-11-46-10-am.png?w=720&h=276) + +图3:Fusion和CloudSearch堆栈之间搜索结果点击位置的比较。 + +## **首次展示** + +在我们克服数据提取挑战和监控相关性时,我们继续将使用率提高到越来越多的redditors。这个早期小组的 [反馈](https://www.reddit.com/r/changelog/comments/6pi0kk/improving_search/)非常宝贵,我们非常感谢社区帮助我们解决漏洞和不太常见的用例。我们在新筹码上只有1%的用户开始工作,处理报告的问题并改进了摄取管道,因为我们在GA之前将推出百分比提高到5,10,25和最终50%的流量。在这段时间里,我们将所有搜索查询作为黑暗流量发送到我们的新搜索群集,以确保随着我们增加推出百分比,它可以全面扩展。 + +![img](https://redditupvoted.files.wordpress.com/2017/09/screen-shot-2017-09-07-at-11-47-24-am.png?w=720&h=376) + +图4:黄色的CloudSearch错误和绿色的Fusion。 + +我们很自豪地说Reddit Search比以往更好!所有Reddit内容的完整重新索引现在在大约5个小时内完成(从大约11个小时开始),我们不断将实时更新流式传输到索引。错误率下降了两个数量级,99%的搜索结果在500毫秒内完成。运行搜索所需的机器数量从今年早些时候的约200台减少到30台左右,因此我们甚至设法节省了一些成本。 + +![img](https://redditupvoted.files.wordpress.com/2017/09/screen-shot-2017-09-07-at-11-48-12-am.png?w=720&h=308) + +图5:Reddit新搜索堆栈概述。 + +更快,更可靠,更相关,更低成本!当然这应该是我们最后一次需要更改搜索堆栈! + +## **展望未来** + +严肃地说,我们认为你会喜欢这个更新。我们希望新的搜索堆栈将成为改进的基础,以便更容易地发现Reddit上的所有优秀内容。更重要的是:我们没有完成。修复搜索只是一系列新功能的第一步,这些功能将使Reddit更加个性化并与您的兴趣相关。 Reddit最终拥有一个Search&Relevance团队,我们正在疯狂招聘。如果您对在数亿人使用的搜索和相关性平台上使用世界上最有趣的数据集之一感到兴奋,那么请查看我们的工作列表: + +**Head of Search:** [https://boards.greenhouse.io/reddit/jobs/723000#.Wa3yONOGOEI +](https://boards.greenhouse.io/reddit/jobs/723000#.Wa3yONOGOEI)**Head of Relevance:** [https://boards.greenhouse.io/reddit/jobs/611466#.WbC_ltOGOEI +](https://boards.greenhouse.io/reddit/jobs/611466#.WbC_ltOGOEI)**Head of Discovery:** [https://boards.greenhouse.io/reddit/jobs/764831#.WbC_2NOGOEI +](https://boards.greenhouse.io/reddit/jobs/764831#.WbC_2NOGOEI)**Search Engineers:** + 最后,感谢Lucidworks团队提供了一个惊人的合作伙伴关系,并帮助我们在Reddit上寻找更好的搜索。 \ No newline at end of file