02 Feb 2021
前不久加入了前哨科技训练营,哨长(王煜全)有个观点我非常认同———看得懂才拿得住。为了看得懂行业趋势、企业价值,特对训练营方法论进行整理,并决定在次基础上,每双周研究一家科技型企业。
在整理方法论之前,需要明白两个概念:趋势投资和价值投资,前者表示热点板块所有公司全部升值,后者表示趋势过后,回归公司内在价值,出现两极分化。由此我们需要知道两个重点,其一,未来产业风口(热点板块)在哪?其二,热点板块里哪些公司价值更明显?
1. 如何定义产业风口
考虑市场潜力是否明显,包括已有业务、已决定要做的业务、未来有潜力的业务
例如苹果(已有业务:手机;已决定要做的业务:ar、vr;未来有潜力的业务:大健康),特斯拉(已有业务:电动车代替燃油车;已决定要做的业务:自动驾驶等软件业务;未来有潜力的业务:新能源)
观察收入利润是否成指数级增长
例如寒武纪(高端芯片,收入一般)、地平线(中低端芯片,收入可观)
判断是否能够形成风口,包括好坏业务判断标准、风口来临前兆、已经形成风口特征
(1)好坏业务判断标准
好业务:产品生产规模化节省时间(Irobot“扫地机器人,提高效率、替代还是增强”)=>服务经验规模化(完整的职业替代和增强)=>创意规模化
坏业务:市场越做越小(AI美颜)、K12教育(零和博弈、烧钱大战)
(2)风口来临前兆
从风险投资VC到股权投资PE,市场小范围启动,收入增长迅速
(3)已经形成风口特征
有头羊,有跟随,形成板块
2. 如何定义企业成败
市场的天花板(新东方为什么不如阿里)
企业成长性(市销率比市盈率重要)
扩大经营的难度(米其林三星为什么做不大)
用户忠诚度与传染性(从关系到超越关系)
竞争与壁垒(uber与阿里,市场本身要成长、市场里的份额要成长,电动车分品类替代燃油车)
3. 分析企业的方法
市场数据收集与系统分析
(1)保持对数据敏感度,固态电池Quantumscape工程师跳槽苹果
(2)保持对规则的理解力
电动车市场预期与教育辅助市场预期有什么不同?
现有全球汽车保有量20亿台,特斯拉目标时年产2000万辆,每年替代全球1%燃油车
教育辅导现有1%,而韩国时70%,每个人能交多少钱,东西太热政府调控(虚构千亿级市场)
(3)思考的系统性
产业:颠覆、增强、新兴
企业:团队与经营水平
技术:延伸性与领先性
技术与产业化比较:技术和技术比较,一定要带上产业化时点,要在同一个产业化时点比较技术优势才有意义,如果产业化时点不同的技术是不可比的)
(4)保持分析的持续性(特斯拉50万辆小目标)
预测方法
(1)范围越窄,预测越准
连续监控、连续预测(《超预测》:通过训练,准确的预测可以做到,并不断地提升准确率)
小心外展过长(正常期:未来1-2年能很准,超过5年就难准,小变化积累起来就会不准;变革期:巨变,小心业内专家的话)
(2)把握规律越清晰,预测越准
社会规律:社会是演化的,不要刻舟求剑
产业规律:电动车给传统行业带来的冲击
行业规律:为什么IT公司能推动,中国运营商推不动
企业规律:并购能力,为什么研发实力无法决定科技实力?
(3)找到变化的信号
系统改变的关键点“销售代表主导没变,个性化治疗医疗器械化是产业变化的关键”
捕捉实现改变的信号“model3可提车”
(4)预测的问题
越模糊越没有信息量,不讲时点的预测没有意义
26 Nov 2020
随着越来越多的业务从线下交付转向在线交付,作为企业与用户打交道的重要界面,联络中心在企业客户经营过程中的重要性与日俱增,其每天所产生的各类交互数据规模日渐客观,其中由电话坐席和在线坐席共同产生的各类交互文本数据中,记录了企业与客户整个交互过程中的大量客户需求、产品偏好和服务评价等业务信息,是典型的价值相对密集的“非结构化大数据”,是企业改善产品服务和客户经营绩效的重要参考因素。
中金智汇推出的新一代联络中心智能分析系统综合应用了大数据分析挖掘与自然语言处理技术,以实现深度挖掘联络中心各类客户交互数据的价值为目的,面向联络中心提供分析能力和应用服务的智能决策支撑系统,该产品在三个方面提供了全新价值,旨在充分响应应用智能化大背景下联络中心运营分析的升级需求,为金融、互联网、政府等行业领域的大中型联络中心高效运营和升级转型提供有效支撑。
· 在数据分析应用中突破性地引入多种自然语言处理技术
传统的各类商业决策支持系统和数据分析系统中,都比较注重结构化数据的分析处理和挖掘,一方面是传统观念认为结构化数据的价值密度相对较高,另一方面,非结构化数据解析的技术成熟度和普及度在相当长一段时间内都有所欠缺,正是因此作为联络中心一项重要的数据资产,文本数据在过去很长一段时间内没有得到足够重视。由于大数据概念的深入人心,各类半结构化、非结构化数据的价值逐渐得到认可和越来越多的重视,随着人工智能技术的迅猛发展,自然语言处理技术的广泛商用,针对文本数据进行深度挖掘成为可能。中金智汇正是基于这个日益迫切的市场需求,在所提供的智能质检分析系统广受市场欢迎的基础上,推出了新一代联络中心智能分析系统。在过去一年多时间里,更是通过不断的改版升级,结合联络中心客户经营数据挖掘分析的深度实践经验,在该系统中引入了多年来探索和积累的多种自然语言处理技术,其中包括基于关键词的文本检索技术,综合利用知识图谱、依存句法、指代消解的文本结构化技术,和根据上下文识别段落意图、判别篇章主题的文本理解技术等,为联络中心数据分析工作的升级和深入提供支持。
· 面向业务运营人员提供的多样化主题分析报告
针对大多数联络中心的运营人员更关注具体业务问题的响应及解决方式,而非处理这些数据所需的技术手段,联络中心智能分析系统提供面向具体业务场景的主题分析报告。其中包括来电原因分析、异常话务分析、坐席执行分析、客户投诉分析等呼入型业务,和金牌话术分析、失败原因分析、营销执行分析、同业竞争分析等呼出型业务,共18种不同类别的主题分析报告。以来呼入型业务为例,借助智能分析系统,我们可以根据文本内容将其划分为产品质量、功能维护、客户服务等不同类型的原因,进一步我们还能够提炼出“手机银行-转账-不成功”“信用卡-遗失-补办”等具体的业务问题。通过统计分析方法,我们不仅可以迅速找到热门的来电原因和业务问题,还可以结合时间、地区等业务数据进行对比,从而看清来电原因的变化趋势及深层的问题反馈,为现场运营指导提供强有力的数据支持。关于呼出型业务,智能分析系统一方面会自动判断一通电话完成后的营销状态,包括成功、强烈意向、明确拒绝、犹豫等,另一方面会总结高绩效成功坐席的历史通话内容,提炼最佳话术流程及FAQ应答方式。据此,智能分析系统能够针对不同营销状态下的客户,推荐最佳的跟踪时间及营销方式,从而有助于联络中心提高有意向客户的成交量,避免对无意向客户耗费过多人力成本。
· 面向具有进阶需求的专业化团队提供自主分析支持
针对配备了专业的数据分析人才或数据应用开发人员的机构,智能分析系统还提供了更加灵活的自主分析功能。自主分析功能主要包括自定义数据集提取、多种底层文本分析建模能力和自定义报表展示。首先,分析人员能够根据业务需求在系统中快速提取到业务所需的文本数据,其次针对这批文本数据,分析人员能够借助系统所提供的特征提取、文本分类、知识图谱等底层的文本分析建模能力,快速将这批文本拆解成业务可用的结构化字段。接下来,分析人员可以在自定义报表模块对这批加工后的业务数据进行汇总分析,形成柱状图、饼状图等可视化图形。最后,分析人员还可以加入地区、产品、坐席组等数据进行交叉分析,制造多维度的主题分析报告。结合文本数据进行自主分析,可以帮助企业灵活应对复杂多变的业务分析需求,为后续联络中心运营决策提供强有力的数据支持。在必要的情况下,也可由智汇专业的分析团队提供文本数据分析挖掘相关的二次研发支持,为实现联络中心真正深度文本价值挖掘提供必要保障。
对客户交互行为数据的深度利用是大数据时代的一个重要趋势,中金智汇的新一代联络中心智能分析系统将有利于帮助盘活企业数据资产,提升企业客户经营效率,更有望助力协助企业在此过程中完成客户经营数据数据到客户经营知识的转化和沉淀,为联络中心、客户经营过程的数智化乃至企业经营的全面数智化打下坚实基础。
25 Nov 2020
前迪士尼EVP在总结他10年的迪士尼经验时说:“三流的企业卖产品,二流的企业卖服务,一流的企业卖体验。”身处体验为王的潮流中,我们时刻面对日趋激烈的竞争,用户体验的好坏直接关系到企业的竞争优势。NPS作为可衡量用户体验的重要指标之一,受到苹果、微软、京东等国内外各大厂商的高度关注。那么NPS具体是什么?为什么采用NPS进行分析?如何基于NPS优化用户体验,提高企业利润?今天就在这里为大家答疑解惑。
· 什么是NPS
NPS 全称(NetPromoter Score)即净推荐值,是反应客户忠诚度的一个指数。其最早由Fred Reichheld在2003年《哈佛商业评论》提出,例如一家公司想要了解客户是否满意,那么可以在问卷中设置NPS题型“你有多大可能把我们(或这个产品/服务/品牌等等)推荐给朋友或同事?请从0-10分评分”
根据评分结果,企业能够将用户分为以下三类:
推荐者:评分9~10分的客户,他们对产品和服务很满意。会有较高的存留率,并愿意向朋友介绍、推荐贵公司的产品和服务。
被动者:评分~8分的客户,他们对产品和服务基本满意。但是不太会和朋友做推荐。
贬损者:评分0~6分的客户,他们对产品和服务的整体感受是不满意的。很可能使用其他产品,甚至可能损坏公司声誉。
净推荐值(NPS)=(推荐者数/总样本数)×100%-(贬损者数/总样本数)×100%
· 为什么用NPS进行用户体验分析
在引用NPS的概念之前,企业常用客户满意度指数(CSAT)进行用户体验分析,也就是大家常遇到的非常满意、满意、一般、不满意、非常不满意的问卷形式。CSAT能够在一定程度上体现客户期望值与客户体验的匹配程度,但其无法反映客户重复购买的意向和预期消费新增额度。因此通过CSAT仅能分析当前用户体验的好坏,而不能将用户体验与企业营收增长关联起来。
然而NPS能够更好的体现客户重复购买的意向,以及可能新增的消费金额,具体原因如下:其一,NPS所设置的指标能更好地体现用户行为,而不仅仅停留在对客户态度的观察上;其二,相较于CSAT从非常满意到非常不满意的层级划分,NPS采用10分制,能更细致地反映客户满意度;其三,NPS侧重于对公司、产品以及服务的整体感受,企业可以更直观地了解客户复购及推荐意向。据此越来越多的企业选择用NPS进行用户体验分析,以达到企业的增收目的。
· 如何基于NPS进行用户体验分析
企业在引入NPS时,也常遇到数据处理能力不完善,业务分析主题不确定的问题。以国内某大型物流企业为例,该企业平均每个季度会下发一次NPS问卷,问卷内容除了常规的NPS评分外,还让客户给出具体的评价理由。面对大批量的问卷反馈,该企业必须解决以下三方面问题:其一,客户评价属于文本类的非结构化数据,需要将其结构化后才能进行分析;其二,用户体验分析需要体系化的数据分析思路,从而构建面向具体业务场景的分析报告;其三,针对于大批量的问卷数据,不仅需要高效的数据处理能力,还需要支持历史数据的存储及查询;
为解决上述问题,中金智汇以智能分析产品为依托,形成一套切实可行的用户体验分析解决方案。该方案主要包括以下几个方面特点:
(1) 采用NLP技术完成非结构化数据处理
客户评价数据一方面能够反映真实的客户心声,另一方面多个客户心声之间具有相关性,因此针对客户评论进行数据分析显得尤为必要。中金智汇采用最新的NLP(自然语言处理)技术,通过大规模的语料训练,构建多层级的分类模型。通过该模型,系统能够自动对每一份问卷中的客户评论数据进行分类,例如客户评论说“繁忙时间段,不能准时送达”,系统能够自动将其识别为“物流配送服务-骑士服务-订单时效”的类别。这些处理好的非结构化数据作为重要的分析项,为后续业务主题分析报告提供数据支持。
(2) 提供基于NPS的主题分析报告
为优化用户体验,完善业务流程,中金智汇提供基于NPS的主题分析报告。该报告一方面针对NPS评分提供不同时段、不同地区多维度的趋势分析,另一方面针对NPS评价提供推荐/贬损原因分析,热点问题分析等主题报告。业务运营人员可以随时查看多个季度的NPS评分状态,及时发现推荐/贬损者占比的增加或减少。面对NPS评分异常的情况,可在不追溯原文的情况下,快速定位客户主要反馈问题及建议点。从而及时调整运营策略,优化产品功能,以获得更好的用户体验。
(3) 定时、高效的数据存储及处理机制
面对大规模的数据存储及处理要求,中金智汇采用HDFS分布式文件系统解决存储容量问题,采用Tachyon等解决内存容量问题,采用HBase解决数据库容量问题;Kafka等解决队列容量和性能问题,采用Zookeeper解决分布式锁问题,采用Hadoop、Strom、Spark等分布式计算系统解决计算量问题。
基于NPS的用户体验分析能够帮助我们更高效的触及客户心声、挖掘用户价值,维持超级用户群体,努力将贬损者转化成推荐者,持续的发现问题并且优化。从而形成一个以用户为核心的运营优化体系,为企业的营收增长提供新动力。
25 Nov 2020
联络中心作为客户与企业之间沟通的桥梁,客服人员操作的规范性、服务的友好度都会直接影响到客户体验。因此大多数联络中心都会设立专门的质检组,针对客服人员与客户之间的交互内容进行质量检测。一般情况下,单个客服人员平均一天需要接听电话130通,而每个质检员需要监管13个左右的客服人员。因此想要质检员对客服人员进行全量监控是不切实际的,他们只能根据业务经验进行抽样质检。这一方面可能遗漏部分客服人员的违规操作,另一方面可能由于采样偏颇造成人员绩效评价不客观的问题。
· 基于规则模型的智能质检系统
为了解决上述问题,智能质检系统所提供的规则模型检测功能,能够有效帮助质检员实现全量录音监控。举个例子,若想要质检所有包含客户投诉的录音,第一步,质检员只需要根据专家经验将投诉、举报、报警等业务词整理出来,再用and/or等关联词进行拼接,形成客户投诉的规则模型,具体如下:
第二步,质检员可以一键发起质检任务,系统会自动根据规则模型中的检测逻辑进行全量自动检测。虽然构建规则模型的方式能够解决全量监控的问题,但仍存在诸多的缺陷,其一需要质检员对业务有较深刻的理解并熟练掌握模型构建方法,其二规则模型更适用于简单的业务场景,在复杂场景下模型精准率相对较低,其三模型维护需要大量的人力成本,并且在达到一定准确率之后很难有进一步提升。
· 基于语义模型的智能质检系统
针对上述规则模型存在的限制因素,中金智汇采用最新的AI技术,新增了语义质检模型。语义质检模型简单来说就是让机器从大量已标记的样本中学习数据特征,从而自动构建质检模型。例如,同样创建一个“客户投诉模型”,质检员只需提供一批标记过投诉和未投诉的录音样本,系统会基于特征词、上下文及文本相似度自动训练出客户投诉模型,当有新的录音进来时,该模型可自动标记出投诉或者未投诉。语义质检模型一方面可以解决关键词穷举,人工维护成本过高的问题,另一方面由于质检过程中标注样本不断积累,语义质检模型便可以自动学习并持续优化,从而突破规则模型准确率提升的瓶颈。
· 规则+语义双模质检
然而,语义质检模型虽有它独特的优势,但也存在需要大规模标注样本的前提,并且由于训练好的语义模型类似于一个盲盒,质检员难以掌控并对其进行调整。因此单一使用语义质检模型容易造成实施难度过高、项目周期过长的问题。通过上图可以看出,在业务冷启动阶段,因缺乏标注样本,需要优先建立规则质检模型,从而达到快速部署质检系统,及时优化质检业务流程的目标;在业务增长期,当获取到一定量级的标注样本,则可考虑开始构建语义质检模型,解决规则质检模型泛化能力不足的问题;在业务稳定阶段,标注语料足够充沛,并且规则穷举已到瓶颈,这时采用语义质检模型替换原有规则质检模型,从而满足质检准确率的要求。
中金智汇的智能质检系统正是结合了规则模型和语义模型,利用两种模型各自的优势帮助联络中心提升整体质检效率及准确率。相信智能质检系统将是企业提升业务合规化、人员绩效合理化、业务指导精准化的最优选择。
25 Nov 2020
很多人只把markdown用于网络文章发表,这糟蹋了markdown。
markdown不止是HTML的简化版,更重要的是txt的升级版、word的轻量版、笔记的最佳载体。
作为一种简单的格式标记语言,不同于txt的无格式,不同于HTML的复杂标记,也不同于word的鼠标调整样式。markdown通过简单的几个字符键入,就可以快捷的定义文档的样式。
比如在行首敲一个“#”,就把这行定义为了1级标题,并且在HBuilderX里有直观完善的着色,这样无需发布为web页面,可直接当word用。
掌握markdown,你可以完全抛弃txt和笔记软件的编辑器,并且在大多数场景下替代掉复杂臃肿的word。享受简洁之美、享受效率提升。
而HBuilderX,可以被称为最强大的markdown书写工具了。
下面的示例列举了markdown语法及对应的HBuilderX使用技巧:
开始前,可以先按下文档结构图的快捷键Alt+w(Mac是Ctrl+w),浏览本文的大纲。
标题语法
markdown的标题是行首以#号开头,空格分割的,不同级别的标题,在HX里着色也不同。如下:
标题1
标题2
标题3
标题4
标题5
标题6
标题使用技巧:
Emmet快速输入:敲h2+Tab即可生成二级标题【同HTML里的emmet写法,不止标题,HX里所有可对应tag的markdown语法均支持emmet写法】。仅行首生效
智能双击:双击#号可选中整个标题段落
智能回车:行尾回车或行中Ctrl+Enter强制换行后会自动在下一行补#。而连续2次回车后将自动补的#去掉。(体验同word)
回车后再次按Tab可递进一层标题,再按Tab切换列表符
在# 后回车,可上插一个空标题行【同word】,或任意位置按Ctrl+Shift+Enter也可以上插空标题行
折叠:
点标题前的-号可折叠该标题段落,快捷键是Alt+-(展开折叠是Alt+=)
多层折叠时折叠或展开子节点,快捷键是Alt+Shift+-或=
全文全部折叠或展开,快捷键是Ctrl+Alt+Shift+-或=
折叠其他区域,快捷键是Alt+Shift+o。这对长文档管理非常有用,可以专注于当前章节
可以在菜单-跳转-折叠中随时找到这些功能
列表
markdown的列表支持有序列表、无序列表以及特殊的任务列表。
同样也是在行前加一个特殊符号,并空格后再跟列表文字内容。
有序列表
有序列表就是有顺序的列表,依靠行前的数字标记顺序。
有序列表1 【设置或取消有序列表符的快捷键:Ctrl+Alt+1,可选中多行批量设置序号;支持多光标批量设置列表符,即按Ctrl+鼠标左键添加多光标】
有序列表2 【列表后回车会自动补序号】
有序列表3 【智能双击:双击前面的数字,可重新对数字排序,修正序号错误,并选中有序列表段落(左边的4是故意写错让你体验的)】
无序列表
无序列表就是列表不排序,无序列表因书写随意而被更广泛的使用。
无序列表有3种前缀,HX里分别用于表示1级列表、2级列表、3级列表。
无序列表1 【快捷键:Ctrl+Alt+-;智能双击:双击-号可选中整段无序列表;再次按Tab会更换二级列表符】
无序列表2
Emmet:li后敲Tab可生成*号列表符,行首生效
快捷键:Ctrl+Alt+8【8即*对应的数字】,支持多光标批量设置列表符,即按Ctrl+鼠标左键添加多光标
智能双击:双击*号可选中整段无序列表
智能回车:行尾回车或行中Ctrl+Enter强制换行后会自动续列表;连续按回车会清除列表符;再次按Tab会更换列表符;在列表符后回车或行尾Shift+回车,上一行留出列表符
*号常用于二级列表,列表符后继续Tab,可切换列表符
无序列表3 【快捷键:Ctrl+Alt+=;常用于三级列表;其他同上】
任务列表
任务列表非常实用,管理待办、已办非常便利。
[ ] 任务列表-未完成任务 【快捷键:Ctrl+Alt+[】
[x] 任务列表-已完成任务 【快捷键:Ctrl+Alt+]】
1. 智能双击:双击方括号内可切换勾选状态,把任务标记为完成或未完成;双击方括号右侧可选中任务列表段落
2. 智能回车:回车后自动补任务列表前缀符号;连续按回车清除前缀符号;在列表符后回车或行尾Shift+回车,上一行留出列表符
如需发布到web渲染,需增加无序列表- 的前缀
以上三种列表,均支持批量修改列表符,有如下方式建议依次学习尝试:
选中多行,按快捷键Ctrl+Alt+“1”或“-”或“[”或“]”,批量设置列表符
如果需要跳行设置有序或无序列表,通过Ctrl+鼠标左键点中目标多行(可不连续),产生多光标,然后按快捷键Ctrl+Alt+“1”或“-”或“[”或“]”,可跳行设置列表符,尤其是有序列表,数字也会跳行加1
按Alt+鼠标选中行首那列(列选择),这样每行行首都有光标,然后再键入或删除列表符即可批量操作
选中多行,按快捷键Ctrl+Shift+\(其实就是Ctrl+
),可以在每行行首添加一个光标
引用列表
引用1
引用2
快捷键:Ctrl+Alt+Shift+.
智能双击:双击>号可选中整段引用列表
智能回车:行尾回车或行中Ctrl+Enter强制换行后会自动续列表;连续按回车会清除列表符;在列表符后回车或行尾Shift+回车,上一行留出列表符
文字样式语法
加粗 【快捷键:Ctrl+B,支持多光标;Emmet:b后敲Tab】
加粗2
倾斜【Emmet:i后敲Tab;前后包围:选中文字按Ctrl+\是在选区两侧添加光标,可以继续输入_】
倾斜
删除线
单行代码
包围插入:先选中文字内容,然后按_*~`等符号,会自动在2侧加包围
智能双击:双击语法区前面的定义符号,选中包含定义符的整段文字
去包围:选中整段文字后,按Ctrl+Shift+],可去除2侧包围符号
引号括号虽然不属于markdown语法,但也支持相同的包围、选择、去包围操作。
引号括号智能双击选择时略特殊的是:双击引号括号内侧,选中引号括号里的内容(不含引号括号);按下Alt+双击引号括号内侧,则选中包含符号的整段文字
HBuilderX还支持以下对2侧文本高效处理的手段
选中文字按Ctrl+\是在选区两侧添加光标,可以继续输入~~,会在2侧同时输入
向2侧扩大选择:【Win:Alt+Shit+→ 、Mac:Ctrl++Shit+→】;由2侧向内减少选择:【Win:Alt+Shit+← 、Mac:Ctrl++Shit+←】
链接文字
Emmet:a后敲Tab
打开链接:Alt+鼠标单击;如果是本地文件,可通过Shift+Alt+单击,在另一分栏打开文件
智能粘贴:粘贴URL会自动变成超链接格式;粘贴本地文件进来也会自动创建引用链接
智能双击:双击语法区开头,即[左侧,选中包含定义符的整段文字
Emmet:img后敲Tab
智能粘贴:粘贴剪切板里的图形时会自动保存为本md文档的附件;删除文档中的图片语法,保存md文档时会自动删除对应的图片附件;粘贴图片文件时自动变成链接引用格式;
悬浮预览:鼠标移到图片语法上,本地图片会自动显示出来
智能双击:双击语法区开头,即!左侧,选中包含定义符的整段文字
表格
Emmet:table3*3后敲Tab,表示生成3行3列的表格,行首生效
md表格对齐是传统md的痛点,按下Ctrl+K可以自动整理表格格式(暂未兼容不同缩放模式和字体的情况)
支持从excel、wps、word、number的表格中复制粘贴表格进来(不支持合并单元格和单元格换行)
分割线
————- 【Emmet:hr后敲Tab】
*****
=============
代码区
var a = document
Emmet:code后敲Tab,行首生效
智能双击:双击语法区开头,即!左侧,选中包含定义符的整段文字
支持代码直接高亮着色,这应该是只有HBuilderX才有的功能。注意需要在代码区开头指定语言类型
注释
快捷键:Ctrl+/
智能双击:双击注释首尾的定义符,选中整段注释
其他emmet快捷输入
day后敲Tab,当前日期。注意day需在行首或前面有空格
time后敲Tab,当前时间。注意time需在行首或前面有空格
文档结构图
文章很长时,word里有文档结构图,HBuilderX也有。
菜单视图-文档结构图,快捷键Alt+W(mac是ctrl+W),轻松管理长文档
运行、预览和打印PDF
对md文件点工具栏或菜单里的浏览器运行,可以使用外部浏览器预览此md文件,会自动渲染为HTML。
点右上角的预览【快捷键Alt+p】,可在HBuilderX右侧预览该md文档的HTML渲染结果。
在浏览器中点打印,选择打印到PDF,可将md输出为PDF格式。(注意在打印选项里去掉页眉页脚)
其他常用但你可能不知道的快捷操作技巧
Ctrl+鼠标左键添加多光标,然后敲字或粘贴,可批量处理。Ctrl+鼠标左键拖选,可选中多个选区。
Ctrl+鼠标右键删除多光标
不选内容按Ctrl+C或X可复制或剪切整行
选中2个选区后,按Ctrl+Shift+X,可互换选区内容。如无选区,只是2个光标,则互换2行
Ctrl+上下键可上下移动行
Ctrl+Insert可重复插入当前行,如果有选中内容,可重复插入选中内容
Ctrl+Shift+K可合并多行(是格式化Ctrl+K的反操作)
删除
按Ctrl+D可删除选中行,支持多光标
Shift+Del删除到行尾
Shift+Backspace删除到行首
选择
Ctrl+E选相同词(mac是Command+D),连续按可选中多词进一步操作,比替换更方便
Ctrl+L可连选多行,Ctrl+Shift+L也是选择行,但不选行首尾的空白字符
Ctrl+=可逐级放大选区
双击标题、列表符可选中相应段落
双击英文引号、括号内侧,可选中内部内容
双击缩进符,可选中同缩进段落
双击连字符比如-或_,可选中相连的词,比如双击这里试试,uni-app
查找
Ctrl+P查找文件
Ctrl+Alt+F可在当前目录的所有文档中搜索指定关键字(mac是Command+Shift+f)
选中文字按F3,查找下一个,Shift+F3找上一个
云同步:HBuilderX+markdown用于云同步笔记的技巧,请参考http://ask.dcloud.net.cn/article/13097
都学会了吗?
markdown语法其实很简单,认真学半小时就能掌握。
HBuilderX的极客操作则需要不停反复练习,熟练掌握这些技巧,你将成为高效极客!
29 Mar 2020
做了这么多年的NLP研究,惯性思维是想着如何去优化算法逻辑。但大家有没想过,做自然语言处理如果不懂自然语言,就像是做数据分析不懂平均值一样可笑不是?因此我准备再次学习中英文,目的是了解中英文背后的语言逻辑。
· P词:代表“旗帜”,标记位置,领先
1.标记位置,方位、位置
piss撒尿、piss sb off惹毛(撒尿脱离了)、pee撒尿(狗尿尿标记位置)
pose放置/姿势、propose建议(把观点先放出来)/求婚、impose施加(往里放,往里塞)、expose曝光(放到外面去)、repose休息(放回来)、dispose处理/扔掉(分开放)、depose免职(向下放)、dispose安排/部署(分开放)、suppose猜想/假设(私底下悄悄放着)
oppose反对(相反放着)、opponent对手、rival竞争对手、enemy敌人
compose组成/构成(放到一起)、composition组成/作文(结构是骨头,内容是皮肉,观点是灵魂)、composer作曲家
posit放、deposit存款(放下去,沉积钱)、depose罢免/免职、position位置、positive积极的、negative消极的
possess拥有(放好了ess表强调)、 possession拥有、desire for possession占有欲
post寄送、post office邮局、postpone推迟(向后方)
poster海报、propose提议/求婚(提前去放)
press压/出版社(印上去的文字)、pressure压力(放上去的的)
parcel包、pack包、package包=>薪资的构成:salary薪水、bonus奖金、allowance津贴/补助、pension养老金、insurrance保险、care medical医保(护理医疗)、housing fund住房公积金、
parasite寄生虫、parachute降落伞(para寄生=>帮/保护,保护的伞)、parapack空投箱(保护箱子)、paradise天堂(保护灵魂的地方)
2.pro-、pre-领先,旗帜在前面
(1)pro表示方位向前、领先
promote促进/促销(向前移动,方位上)、probable很有可能(提前准备able可能,ability能力)、promise承诺
proceed前进/继续(向前走,方位上)、process过程/进行、procedure步骤/程序(办理事务的流程)、program程序(电脑程序)、precede领先(提前走,时间上)、recede后退/减弱(cede、ceed走路,向回走)
produce生产(提前duce引导,introduce介绍)、product产品、progress进步(向前走)
profess宣称(在前面说话)、professor教授(站在前面fess说话)、profession专业的(教授肯定是专业的)
project投掷(向前扔)/工程(提前规划某事)/设计(提前设计)、projector投影仪/设计者
prospect预期/前景(向前看,方位向前)、expect期待(向外看)、aspect方面(向一个方面看)、inspect检查(向内看)、introspect内省(交叉审视)、respect尊重(反复看一个句子)、retrospect回顾(向以前看)、suspect疑似(由下往上看,心里活动嗯?)
prolong延长(向前长的,时间范围延长)、lengthen变长/加长、propel推动(向前pel推动)
prospect展望(向未来看)、expect期待(向外看)、aspect方面(向一个方面看)、inspect检查(向内看)、introspect内省(交叉审视)、respect尊重、retrospect回顾(向以前看)、suspect疑似(真相扭曲)
provoke挑衅/激怒(前面voice喊出声音)、proclaim宣告(提前喊)、pronounce宣告/发音(提前说)、provide提供(走上去看看video里面提供什么)
prompt敏捷的(向前突进的感觉)/促使促进、promption晋升
propel推动(向前推动)、propeller螺旋桨、expel开除(向外推出去)、repel反抗(一群人进攻,往回往后推)、compel强迫/被迫(共同推动)、impel促使/激励(内心推动)
(2)pre表示时间提前
predict预测(提前说,时间上)、previous以前的/先前的(时间上之前的)、precise精确的、exact精确的(超高标准的动作)、prepaid预付款(提前paid付款)、prepare预备(提前pare准备)
preserve保存/维护(提前去serve服务)、reserve保留(再次服务)、conserve保守(共同留心)、deserve应得(向下服务)、observe观察(细致服务)、server服务器、servant服务员(ant人)
preclude预防(提前clude关闭)、exclude排除、include包含、seclude隐居/隔离(分开之后关住)
precede领先(时间在前面的)、precedence优先、precedent先例、precedented有过先例的、unprecedented史无前例的、proceed前进(向前走,方位上)
predetermine预先决定、precaution预防措施(caution小心,时间上提前小心)
president总统、cheirman领袖、preside主持(提前side坐在那,总统主持)、preside over the meeting、host主持、prime minister首相(minister大臣/部长,为国王打工)
3.per-完全
perfect完美、persist坚持到底、perish毁灭(全死了)、perform表演(水平全表现出来)、persude说服(彻底said说动心,完全改变主意)
perturb搅动/扰动(完全搅动,内心感情)、disturb干扰/打搅(分开搅动)、turbo涡轮增加(搅动)、masturbo手淫(master手动turbo涡轮增加)
· H词:代表“高”,向上,梯子
1.高,与“天”有关(天是顶,顶表示高)
heaven天堂、hell地狱(梯子可上可下)
horizon地平线/天际线=>视野(on the horizon看到希望)
haze雾霾、hurricane飓风(程度很高的风)
hail冰雹(也表示欢呼)、hailstorm暴风雪
hover翱翔、hovercraft气垫船
helicopter直升飞机
hawk老鹰
天上有神仙=>与神仙相关
halo光环、光晕
halloween万圣节(各路神仙的节日)
hallow圣人/圣徒(deathly hallows死亡圣器)、hollow洞/空洞
holy神圣的、holy bible圣经
honour/honor尊敬/荣誉=>honor his words信守诺言
honest诚实的(圣洁的)
hero英雄、heroine女英雄
haunt附体、作祟(鬼影重重)
holiday假期(神仙的节日)、vacation假期(空出来的)
2.高,与兴致相关,人的兴致特别高
hop跳(高兴到跳起来)、hip hop嘻哈音乐、hopper跳蚤
hormone荷尔蒙(青春开心)
hail欢呼、happy高兴、hilarious特别高兴的(希拉里hilar)、hysterical歇斯底里的(特别特别高兴/兴奋的)
human人类(hum向下表示泥土)、humid潮湿的、humble谦卑的(把自己低到尘土里)、humiliate侮辱、humour幽默(取悦观众的)、harmony幽默的/和谐的、hum哼哼声/嗡嗡声、hummingbird蜂鸟
heroin海洛因(嗨药)、hallucination幻觉(嗨觉)
high嗨/兴奋(也表示高)、hale精神矍铄的
3.高,与位置相关
位置特别高:
high高、height高度
head头、hair头发=>hairy多毛的、hairdresser理发师、hand手(高的动作系)、heart心、heel脚跟(Achilles’ hell阿克琉斯之踵=>弱点)
headline标题/头条新闻、headlines today今日头条、hardline强硬的、underline下划线、frontline前线(前面的线)、timeline时间线、deadline最后截止时间(死亡线)
headmaster首长、headhunt猎头、headquarters总公司(公司总部)
horn角(动物头上)=>horny淫荡的(角的形状)、hump驼峰=>humpbacked驼背的、hunch隆起/堆起=>预感/第六感(突如其来的感觉)、horse马(跳马鞍)
hose软管/水管/长袜(长的、高的袜子)、sock短袜
helmet头盔
位置从高到低:
history历史、heritage传承/遗产
4.高,与“家”有关
home家庭、husband丈夫(家庭顶梁柱)、house房子、house of commons下议院(平民院)、house of lords上议院(贵族院)、house of repersentatives众议院、housework家务活、housing fund住房公积金
host主机/主人/主持、hospitality好客的、hostage人质、hostile敌对的
hall大厅、hollow山洞/空的/空洞(空的山洞)、hole洞
hut小木屋、hospital医院=>hospitable好客的、hotel酒店
habitat居住=>habit习惯(居住形成了习惯)=>habitual loneliness习惯性孤独;habitual criminal惯犯
harbour海港=>庇护、隐藏
5.高,高东西遮挡(家帮忙遮风避雨)
hide躲(被高的东西挡住)
halt阻止/妨碍、hamper妨碍、hinder妨碍
hurdle障碍=>克服、handle处理/应付
6.高,与动作相关
从下往上:hold举起=>holder持有者、hoist升起/吊起、heave举起、hang悬挂(挂的高高的)、hook挂钩/钩住=>hooker妓女(勾引男人)=>hooked着迷的(被勾引的)、heap堆积(从下往上堆起来)
从上往下:hack劈/砍(被侵入、被黑)=>hacker黑客、haggle讨价还价(乱砍价)、hit打击、hammer锤子、harm危害(被打了)
7.高,与高的度数相关,程度高
horrible可怕的(程度特别可怕)、hazard危险(程度危险的)、heavy重量(程度特别重)、hot热的(程度特别热)
hugh巨大的(程度很大的)、hurry匆忙(程度别特忙)、harsh严厉的/粗糙的(程度严厉的或粗糙的)
hard硬的/难的(程度硬的、困难的)=>hardline policy强硬的政策(注意与headline、hairline区别)
8.总结:词根词缀
home家=>homo-相同的=>homegenous同类的
hyper-超(超过之上)=>hypertension高血压、hypercritical苛刻的(吹毛求疵)、hyperactive超活跃/多动的、hyperbole夸张、hyperlink超链接、hyperfine超精细的(fine hair精细的毛,汗毛)
hypo-超(超过低)=>hypotension低血压、hypocrisy虚伪/伪善(什么都不说不好的话)、hypothesis假设(thesis论文、论淡,放在文中的假设)
hydrogen氢=>hydr-水=>hydroelectric水电的
· R词:与太阳关联,表示放射、辐射出去
1.与太阳关联,表示辐射
Amun-Ra阿蒙拉(拉丁文太阳神的名字)
ray光线(辐射出来的光线)、X-ray X光线、raymond大光线
radar雷达(辐射出来)、radio收音机(辐射出声波)、radio-activity放射性、radioactive放射性的
radical激进的、radial放射状的
rapid急速的、radius半径(太阳能辐射的位置)
radium镭(辐射开的)、radiate辐射/放射、radiation辐射/放射线
radiant精神焕发的、hale精神矍铄的
row列(龙舟:两列人划船)=>划船、line行
radius半径(辐射出去的)
2.表示蔓延开来(太阳光辐射出来)
root树根(辐射状蔓延)、grass roots草根/普通民众、radical根本的=>激进的(散出去的)、raddish萝卜
river河流(辐射状蔓延)
ring撞钟(声波辐射状蔓延)=>戒指(结婚教堂钟声)
road道路(道路辐射状蔓延)、route路线(路线辐射状)、routine例行公事/惯例(常规路线)、reach伸出(手伸出蔓延)
rail铁路(铁路辐射状蔓延)、railway铁路/铁轨、light rail轻轨、rail怒斥
rabbit兔子(繁殖能力快,可迅速蔓延开)、rabble暴民/乌合之众、rapid急速的(兔子迅速蔓延开来)、rat老鼠(同繁殖能力快)、raver乌鸦
3.表示乡村的(基于城市向外蔓延)
rural乡村、rural club乡村俱乐部(city城市、culture文化、civilization文明、civil law民法)
rust破旧的(农村破旧的房子)、rough粗糙的(harsh严厉的/粗糙的)、rude野蛮的/粗鲁的、rudimental初级的/基本的(农村初级的城市)
rite仪式(农村比较多)、raw原始的(原材料)
rug地毯(农村的地上)
rake耙子(农村耕地用的)、rake-off薅羊毛(耙一把肉下来,回扣)、kickback回扣、rake in轻易地赚取
4.表示分开、分裂(太阳内部不断分裂)
race民族(从前分开居住)=>比赛(跑道分开)、racecar赛车、racehorse赛马、racial种族的、racism种族主义/种族歧视
room房间(房间是分开的)、rack架子/隔板(将物体分隔开)、rack one’s brains绞尽脑汁(把脑子分门别类重新排列)、racket球拍(把网张开、分开张裂)=>喧闹声(炸裂的感觉)
rent租赁(将房子出租)、render提供/是的(房子提供出去)
range范围(划范围和其他东西分开)、range rover路虎揽胜(不设范围到处漫游)、rover漫游者、rove漫步
rank等级(将人区分开)=>军衔(将军人区分开)
rip撕开(将东西分卡)、ripper开膛手、ripple涟漪/水波(水波荡漾开,把水波分开)、rip off宰人/坑人(从身上撕下了一块肉)、rib肋骨(肋骨是分开的)
ripe成熟的(水果成熟与树分开,瓜熟蒂落)
ration配给量/定量(一堆粮食分成好几块) 、rational合理的(分的非常平均)、irrational非理性的(分的不均匀)、rate比率/费用(百分比)、ratio比率/比例(整体分成好几块)
5.表示破坏、破裂(太阳具有破坏的力量)
(1)ra开头表示破坏
rag抹布(破裂的布)、rage愤怒(破裂的气、气炸了)、outrage暴行/愤怒、rail怒斥
ram猛撞(破坏)、rampage暴力/横冲直撞、rampant狂暴的/失控的/猖獗的
rape强暴(破坏妇女身体)、grab抓、ripe成熟的、reap收割/获得
raid袭击/突袭(搞破坏)、air raid空袭、raider劫匪
raze彻底破坏、raze sth to the ground将..夷为平地、razor剃须刀(胡须全破坏)、razor-sharp锋利的、a razor-thin victory险胜(刀锋上的胜利)、on the razor’s edge处于危险境地(剃刀边缘)、eraser橡皮擦(全部切掉、擦掉)
ravage摧毁、revenge复仇(复仇去破坏)
ransack洗劫(抢劫拿个包把所有东西都拿走)、ransom赎金
(2)ro开头表破坏
rob抢劫(破坏门面)、robbery抢劫
rocket火箭(向上破裂而出)、rock岩石(破土而出)=>摇滚
(3)ri开头表破坏
risk风险/冒险(被破坏的风险)、ruin破坏/毁坏
riot暴动、rioter暴徒、mob暴民、rabble暴民/乌合之众、rebel反抗、rebellion叛乱/反抗
(4)rupt开头表破坏
rupt破裂/断裂、rupture破裂/断绝、bankrupt破产、disrupt打扰(扰乱)=>interrupt打扰、erupt爆发、abrupt唐突的(突然破开冒出来)、corrupt腐败的(共同破裂了,一起腐败)、cooperate合作
6.表示重新、再次(太阳具有重生的力量)
receive收到(accept接收、ceive=get/take再次拿到)、receipt收据(付款后再收到)、receiver接收者/接收赃物的人、receptor接收体(神经末梢)
conceive构思/想象(一起构想、头脑风暴)、inconceivable不可思议的、deceive欺骗(向下接收假的为真的)、perceive察觉(提前接收到)
refresh提神(再次新鲜了)、refresher提神物、boost促进/增进、booster提神物
refer参考(再次提及)、reply回复、respond答复/回答、recite背诵(记忆再说出来)、record记录、recall回忆、reclaim改造/感化、return回来、rebirth重生、recapture夺回(再次抓住)、reconfirm再次确认、reconsider重复考虑、recognize认出(再次确认)
refine更加精致的、react反应(再次行动)、reveal揭示(再次看)、revise修改(再改)、regret遗憾/懊悔
recycle再循环、bicycle自行车、encircle包围、circle圆圈
reflect反应、recast重铸(cast铸造、forecast预测)
revolve旋转(往回旋转、沃尔沃旋转)、revolution革命、reform改革(再形成新的制度)
recur重现(再流动,cur表示流动currency货币)、recurring重复的/屡次发生的、occur发生(流出来了)、concur巧合/同意(同时发生、流过来)、incur招致(往里走)、recruit招聘(再招新的补充进来)
reconstruct重建、obstruct阻碍(反着修改、妨碍修建)、destruct摧毁(向下修建、毁了)、instruct引导(向内修建)、instructor导师(心灵修建的导师)
reinforce加强/在增援、reassure使安心(再次使放心)、assure确保
rely依靠、reliable可靠地、remain剩下/依旧是(再次留下)、remainder剩余物、respect尊敬(视其所以、观其所由)
由重新、再次引出表示往回、往后
reverse相反的、diverse不同的
retrospect回顾
rebel反叛者(别人打你又打回去)、rebellion反叛、rabble暴民/乌合之众
rebound回弹/反弹
recede后退/减弱(cede、ceed走路,向回走)、recession衰退、proceed行进/进程(向前走)、precede领先(提前走)、excessive多余的(向外多走的路)
retract撤回(向后撤回)
reduce减少(向回降低)、introduce介绍、seduce勾引
refuse拒绝(fuse融合、不再融合)、confuse混乱(共同融合乱了)、diffuse传播(将谣言分开传播开)
reject拒绝/抵制、inject注入、eject喷射/驱逐、subject主题/学科、object对象、project计划
revenue财政收入(先工作然后有收入走回来)、advent出现(走的越来越靠近)、revenge复仇
7.表示正、直(太阳表示正、直)
right正确的、correct正确
rect-直的、rectangle矩形、right angle直角、triangle三角形、right triangle直角三角形、angle角、angel天使
rectitude正直(正直得态度)、attitude态度
regular有规则的、regulate调整(尺子调整)=>管制、regulation规则/规章
ruler尺子/暴君(制定规则的人)、rule规则
· B词:与木头相关
1.关于木头(砰砰的敲击声)
bar酒吧酒馆(一排木桌、木凳)/条状(a bar of soap一条肥皂)/法律职业(法律都是一条条的)、bar examination律师资格考试、bar association律师协会
bank银行(木头柜台)、band乐队(许多人捆在一起)、bed床(木头做的)
board木板甲板/上船(在甲板上)、boarding call登机通知/董事会(拍板的人)、board member董事会成员、director of board董事长/寄宿 board school寄宿制学校(给个木板睡觉)
broad宽广的/辽阔的(未被禁止的road路)、broadcast广播
branch树枝/分支分叉/分公司、brid鸟(在树枝上)
brand商标标牌(木头牌子)、烙印(刻在木牌上,打上烙印)、丑化/败坏名声(给某人打上烙印)
brandish挥舞(用木棒挥舞)
barbecue烧烤(木串烧烤)、barrel木桶(bar木条条做成的木桶)、a barrel/bottle/glass of beer一桶/瓶/杯啤酒
booth小隔间(用木头做的)/货摊(市场里的小木摊)/公用电话亭(木头做的电话亭)
barn谷仓/牲畜棚(木板搭起的棚子bar木条条)
beam横梁(木头做的梁)/光线(横梁有光线进来)/开怀大笑(脸上有光彩)、a beam of light一束光、brick砖块/用砖做的
bean豆子(在木头上生长豆芽)、bead珠子(木头做的珠子)
2.打击(用木头打,砰砰)
bat打击/球棒(用棍子打)/蝙蝠=>combat战斗(共同打击)、debate争论辩论(口头言语战斗)、rebate折扣(钱打回来)、discount打折扣、rebel造反(攻击打回来)
baton警棍(bat木头棍子打)、butt顶撞
bandit强盗/土匪/恶棍(用木棍抢劫,bank银行=>band土匪强银行)、brandish挥舞(用木头打)
beat敲打/敲击声=>节奏(打出节拍)、offbeat奇葩的(不合拍的)
bargain讨价还价/便宜货、haggal砍价乱劈
break打破弄破=>稍停=>短暂休期 broke the silence打破寂静
breach违背/违约/打开缺口(打破break合同)、breach of contract违反合同
broke破产的/break过去式
battle战斗(打击)/斗争、battlefield、battleground战斗场地、battalion军营(battle战斗、击打)、batter殴打
bruise擦伤(被打之后)、brutal残忍的/残酷的(用棒子乱打)、bitter苦涩的/痛苦的(被打了一样)、bit少量(被打了一点点)、embarrass使尴尬(用棒子打的尴尬)
bomb炸弹/轰炸(爆炸的声音)
boom繁荣(拟声词、欢呼雀跃)、recession衰退(往回走)、depression衰退
boost推动/促进(拿木头在后面打)、booster助推器、rocket火箭
3.禁止、约束(被木条、木棒阻挡)
bar阻挡/阻止(被木条、木棒阻挡)、barrier障碍/关卡、barricade路障/阻挡
ban禁令/禁止、banish放逐/驱逐(禁止ban在这块地方)
bay海湾(海边禁止范围)、harbour海港、enclose包围、peninsula半岛(往外突出)、penis阴茎(突出的意思)、insulate隔离/使孤立
broad宽广的/辽阔的(未被禁止的road路)、broadcast广播、brink边缘(禁止的边缘)、on the brink of war/death在战争/死亡的边缘上
border国界/边境(被order命令禁止了范围)、boundary边界/分界线(被禁止了范围)
boot靴子=>给违规停放的车辆加上夹锁(禁止动)
4.捆绑、约束(被木条围在一起)
bar一条/条状
bind捆绑/约束(静止乱动)be bound to do sth必须做什么(被约束去做什么)、in a bind处于困境之中(处于约束、捆绑的困境之中)、binding有约束力的
boundage绷带/用绷带包扎、bridge桥梁(将两边连在一起)、bridle缰绳/马勒/约束物、bride新娘(将两人连在一起)
band乐队(几个人困在一起)/环带(绑成了一个环)
bond债券(国家与你之前的关系被绑定)
blend混合/融合(都混合在一起)
boycott联合抵制/联合拒绝(联合起来不要什么东西)
5.向下、向后(木头根植于地下、后面)
back后背/背部/向后的、backer支持者(背后的支持者)、backbone支柱/脊梁骨、backup后援/支援
backhander贿赂、corrupt贿赂
bastard私生子/杂种(私底下生的)
bottom底部(向下的)/底部的、beforehand预先
beg乞求(地位低的向地位高的乞求)
fundmental基础的、infrastucture基础设施、stucture结构/构造
base底部/基地、air base空军基地、naval base海军基地、baseless毫无根据的、abase使谦卑(ad base主观向下)、debase降低/削减/贬低(客观向下到底部去)
base metal基础物质/贱金属、nobel metal贵金属、precious metal贵金属
basic基本的、basis基础、baseless无基础的
basin脸盆/盆地(向下凹陷的地域)、a barrel/basin of water一桶/盆水、bowl碗(向下凹陷)、bow鞠躬、bow tie蝴蝶结(用木条绑在一起)
box盒子(向下凹陷)/打拳击(拳击台类似盒子)、boxing拳击
bass男低音/贝斯(低下的声音)、bassist贝斯手
6.一块一块、一束一束(木头是一块一块的)
block大块(木头一大块)/街区(一块一块)大楼/阻挡堵住(一大块木头阻挡了)many roads were blocked
brick砖头(一块一块)、brick by brick一砖一瓦=>一点一滴的Roma was build brick by brick.
bunch串束(一串一束)/一群一伙、a bunch of bandits
bouquet一束、a bouquet of flowers一束花
bulk大块/体积、in bulk批发
battery电池/一组一串(电池一串买的)、a battery of question
bean豆子/豆荚(一串出现)、bead珠子(一串出现)
7.与球有关的(木头圆的)
ball球/舞会(舞会上有个灯球)、ballet芭蕾舞、balloon气球
ballot投票选举(投进去的球状)
bald秃顶的(脑袋光秃秃球状的)、receding hairline后退发际线
bold大胆的/粗体的/黑体的(胆子吹圆了)
8.拟声词
bomb炸弹(炸弹爆炸、炸弹是球状的)/轰炸、bomber轰炸机
boom繁荣/激增、bloom盛开、baby boom婴儿潮、phone booming电话轰炸
boost促进/增长(拟声词,boost推)、booster助推器/产生激励作用的事物、refresher提神物
bang突然巨响/敲门(拟声词,bang的一下)、big bang生活大爆炸
bound跳跃(拟声词、bangbangbang)、rebound反弹、bounce弹跳(拟声词、弹跳一来一回的动作)
注意:bind-bound、find-found
bubble泡沫(泡泡破了)/心中洋溢某种情感(开心的都要冒泡了)
bark狗叫(狗叫声)/树皮
· S词:曲线和分割
1.se-/sc-分割、分离(太极阴阳)
section部分(分割成多个部分)、subsection细分(大部分下面)、sector行业领域(人为分割多个不同的部分,大的行业)、stage阶段、department部门(分成多块)、room房间(分割开)、rack(将物体分隔开)
season季节(分成四个季度)、semester学期、secure安全的/获得(分割下这一块)
insect昆虫(节肢动物,一节一节的蜈蚣,分割开的)、intersect交叉(内部交叉划分)、intersection十字路口、dissect解剖(彻底的分开了)
secede割断(分开走)、secession脱离(分割开了)、secessionism分裂主义、recede衰退(往回走)、recession衰退、depression衰落、precede领先(向前走)、accede同意(往前走)、accept、assent同意
secret秘密(将秘密分开不让人知道)、secrecy保密、secren秘书、classify秘密
seduce引诱/勾引(勾引到房间)、hooker妓女
seclude隐居/隔离(分开之后关住)、include包括(关在房间里)、exclude排除(关在房间外)、close关闭
segregate分离(将人分开)、segregation隔离、quarantine隔离(防疫隔离,有病才隔离)
select选择(将某物从分离开)、elect选举(将某人分离出来)
scratch抓/划掉(把东西分割开)、scream尖叫(具有割裂感的声音)、school学校、scholar学者、scholarship奖学金
scrimp节衣缩食(切割东西)、scrimp and save节衣缩食省吃俭用、scatter撒/散开(把盐分散开)、scandal丑闻(分开的新闻)
scale规模/范围(穿山甲鳞片=>尺子刻度=>占了多大的规模)、scope范围/能力(分开的范围)、escape逃脱
scheme方案(方案更加细致,一点点分开)/阴谋(分得非常清楚的计划)、schedule日程表(分割非常清楚的日程)、conspriacy阴谋(con共同去spr呼吸,沆瀣一气)、plan计划
semi-一半的、semifinal半决赛(一半final最终的)、semiautomatic半自动化(一半automatic自动化)、semicircle半圆、semiconductor半导体、conduct引导/组织
2.st-停止(太极以不变应万变、分开不要动)
stay呆在那(不要动)、sit坐在那(不要动)、stand站在那(不要动)/忍受(不能再不动了)、stay clam、stamp邮票(集邮长期存放)/按压(铁板钉钉不动)
star恒星(不动的行星)/主角、movie star、stare凝视(盯着看不动)、stage舞台(舞台布置好不要动)/阶段(在某个阶段不动)、stagnant停滞不前/僵化的(在一个阶段停滞不前了)
stable稳定的/牢固的(不动的)、steady稳定的、still不动的、stabilize稳定、stability稳定性、safeguard stability维护稳定、unstable不稳定的
staff全体职员(铁打的算盘流水的兵)、stuff塞满(吃太多塞住了)
state国家(政府意义上的国家)/陈述/状态、country国家(地理位置上的国家)、nation民族(人民意义上的国家)、a stable state稳定的状态、statement说明(陈述说明)、statesman政治家(国家元首)、status地位(稳定的地位)
station车站(停下来)、stationery文具(常驻工具,停在桌上)
statue雕像(在那不动的)、statue of freedom自由女神像、sculpture雕塑(sc分割,刻画出来的)
stupid傻的(呆子)、silly愚蠢/傻(呆子)、still仍然(一直是这样)/静止不动的
stuck困住(困住不能动)、struck罢工(扭曲到一起不干活)
staunch忠诚的、stubborn顽固的、stern严厉的(非常严厉冥顽不化)、stifle窒息(窒息不能动)
stink臭/糟糕透了(东西放了很久不动就臭了,流水不腐户枢不蠹)、stale恶臭的/无生机的/发霉的、stalemate僵局、impasse僵局、stain弄脏/污点(污渍弄上去不会动)、static静态的/停滞的(不动的)
stipulate约定/规定(定好了就不要动)、regular遵守、regulation规定、rule尺子
stop停住、store商店/仓储(货品放在哪不要动)/存储(把货物放在那)、stall货摊(把货物放上去不动)/栏杆/停住(不动)、not stall不要拖延、install安装(在栏杆里装)
stack堆叠(堆一堆东西不动)、stock股票/存货(钱货物放在那不要动)、stock market股票市场、stocking长袜子(圣诞礼物都存在长袜子里)、sock短袜子
stone石头(不动如山)/吓到(瞬间把我石化了)、shock惊吓、startle惊吓、stun惊吓到晕过去/休克、stool凳子(动不了)
stout牢固的/建议的(出来不要动)、stuck困住(困住不能动)、stick棒子、a stick in mud形容老顽固(插在泥里的棍子,茅坑里的石头又臭又硬stink and stuck)
stereotype刻板印象(一直不动的想法)、stereo立体声(声原是在空间内不动的)
steam蒸汽、stream流水
3.str-扭曲、扭转(曲线逻辑)
slim苗条的、sexy性感的、sex性(身材S曲线)
strike打击/罢工(扭转身体打出去有力气)、strife冲突/纷争(体现力量感的扭曲)、political strife政治冲突、strive努力/奋斗(努力的时候肌肉扭曲)、strive to do sth努力做、strive for justice力争正义、China-US trade row中美贸易战
striking引人注目的、seduce勾引(分离到另外一个管道)、abduct诱拐/拐卖(引导走了并且远离)
struck罢工(扭到一起不干活)、strong强壮的(肌肉扭曲的)、strength力气/力量、strengthen加强
strangle绞死(特别扭曲的angle角度,三角锁死)/抑制(勒死)、strange奇怪的(扭曲的想法)
stray迷路/走失(思想蜿蜒扭曲到不知道什么地方去了)、lost密室
strap绑带/腰带(扭曲的带子)、stripe条纹/线条(曲线) 、strip条/带、stripper脱衣舞女、strapless无肩带的、streak条纹(弯曲的条纹)、streaky pork五花肉
strategy策略/战略(迂回的作战方式)、strategic战略性的、strategist战略家
stress压力、pressure压力(挤压的扭曲感)、stress拉紧、distress苦恼
stream溪流/流动(蜿蜒的溪流)、steam蒸汽、street街道(蜿蜒的街道)
==strain(train训练)、strict、string(to draw tight)==
strain拉紧/过劳、constrain约束(共同拉紧)、restrain抑制(反复拉紧,来回拉紧)、distrain束缚、overstrain过劳(过度拉紧)
strict严格的(被约束的很紧)、constrict压迫收缩(共同拉紧)、restrict限制(反复拉紧,来回拉紧)、district区域(划分区域)
string绳/琴弦(曲线)、stringent严厉的、stern严厉的
4.sub-向下的、sur-向上的(分割线向上向下)
subway地铁、subagent下级代理(下级agent机构)、subscribe订阅(苹果手机里的写下来,下单)、submit提交(从下往上交)
subtitle副标题(下一级的标题)/字幕、subsurface地下的(表面下的)
subnormal次正常(有点神经)、abnormal不正常、subconscious潜意识/下意识(下conscious意识)
subject学科/主题/主观的、object宾语/客观的
submerge沉没(向下merge合到一起)、submarine潜水艇(向下marine海洋的)
subdivide细分(向下divide分配,分配到下级)、subsection细分
5.-sens-、-sent-感觉
sense感觉/意义、sensibility感觉、senseless无情的/糊涂的(没有意义)、nonsense废话(没有意义)、consensus共识(共同感觉到)
sensitive敏感的(有感觉的)、insensitive不敏感的(没有感觉的)、insensible麻木的/无知觉的(没有感觉的)、oversensitive超敏感的(超过感觉的)、hypersensitive过敏的/过敏症(超高级敏感,过敏了)、photosensitive光敏的(photo对光敏感的)
assent同意(as-与ad-表示靠近,靠近某种感觉有同感)、accede加入/同意、assert声称/断言(靠近插入进去sert插入,把别人谈话打破插入进去)、asset资产
consent同意、dissent不同意/异议(dis分开的感觉)、dissent反对者/反对派、resent懊恼/愤恨(反复思来想去的感觉)
sentiment情绪(现在的感觉)、presentiment预感/预知(提前的感觉)、sententious感性的(随着感觉走的)
6.-scrib-、-script-写
scrib写下/记下、ascribe归因于(给谁记下荣耀)、describe描绘(写下来)、prescribe规定/开药方(提前写下来stipulate约定/规定、regulation规定)、proscribe禁止(提前写)、subscribe订阅、inscribe雕刻/题字(写到里面去)
transcribe抄写(把一个本子写到另一个本子)、translate转译/翻译、transcript副本(写下来另一个脚本)
script写作/脚本、scripture签名、description描绘(写下来)、prescription药方、conscript征募(把士兵名字都写下来)、superscription标题(手稿最上面)、headline标题
manuscript手稿(手写体)、manu手写、postscript附言(后面写的)、subscription订阅、rescript重抄/法令(法令多抄几遍)
7.-spec-、-spic-、-spect-看
special特别的(特别好看的)、especially特别的(出去来特别好看的)、specimen样品
species种类(早期人对物种判断就是看)、endangered species濒危物种
specious体面的(可以看的)、specific具体的(看的很具体的)、conspecious显眼的(共同体面的)、perspective透视(透过去看)
expect期待(向外看)、aspect方面(向一个方面看)、inspect检查(向内看)、introspect内省(交叉审视)、prospect展望(向未来看)、respect尊重、retrospect回顾(向以前看)、suspect疑似(真相扭曲)
suspicious可疑的、despicable鄙视(向下看)、perspicacious敏锐的、perspicuous显眼的
8.一词多记
(1)sequence序列
sequent顺序的、consequent结果、inconsequent无关紧要的(非重要结果,不需要排列的)、subsequent随后的(下面顺序的=>向后顺序的)、consequence后果/结果(共同的序列集合=>结果)
(2)sert插入
assert断言(插入进去)、reassert重新断言、desert沙漠/背离(向下插入过去=>背离初衷)、insert插入(向内插入)
(3)satisfy满足
satisfy满足、satisfaction满足、satiable满足的、insatiate永不知足的(in不satiate满足的)、satisfactory满意的、satiation饱足感、saturate饱和的、supersaturate过饱和的(超过饱和)
(4)scend攀爬
ascend上升(a朝一方向,scend攀爬,向上攀爬)、ascendancy优势(向上的优越)、ascent上升(与ascend相同)、descend下降/后代(向下攀爬)、descendant后裔(向下养育ant人)、condescend屈服(共同向下)、transcend超越(交叉攀爬)、
(5)serve服务/留心
conserve保守(共同留心)、deserve应得(向下服务)、observe观察(细致服务)、reserve保留(再次服务)、preserve保存(提前服务)、server服务器、servant服务员(ant人)
· E词:出去、向外
1.比较级、最高级(出去、向外)
tall高的、taller比较高的(er出来一点)、tallest最高的(e出来st停止了,出来到停住了,最出来的)
2.e-向外
eccentric古怪的(超出central中心的)、wried古怪的
elastic有弹性的、bounce弹跳、flex灵活的
elicit引出、emit发出(mit交)、submit提交(从下往上交)
3.ex-出去、向外
enumerate列举(把number数字拿出来排列)、eradicate根除(从根本上排除,radical根本的)
England英国(e向外、land土地,英国在地图上是欧洲多出来的一块)
exam考试(把水平检查出来)、examine检查(把水平检查出来)、exchange交换(拿出来换)、exit出口
example例子(从很多事物中举一个例子出来)、except除..之外(把东西放在外面)、apart from除..之外还有、exception例外、exceptional例外的
excel超越(比其他人好)/表格、excellent优异的/杰出的、excellence杰出性
exhibit展览(放到住的外面)、exhibition展览会、exhibitor参展商、exhibitionist展现欲很强的/表演欲很强的、inhabit定居、habit习惯
expand扩张/膨胀(pand方位向外)、expandsion扩张、explode爆炸(向外膨胀的)、bomb爆炸、burst爆炸
extend扩展/延伸(tend倾向)、extended family四世同堂、intend打算(内在倾向去做什么)、pretend假装(提前假装做什么)、contend竞争(共同延伸两边争夺资源)、attend参加(朝某个方向延伸过去)
extent范围(tent帐篷)、to…extent在…程度上、extensive广泛的、extension延伸
expend花费(spend花费,把钱花出去)、expendable可花费的、expenditure开支、expense花费、expensive昂贵的(花了很多钱)
expect期待(向外看,望眼欲穿)、respect尊重(反复看)、unexpected意想不到的(没想到的)、out of expectation
experience经验(向外走实践经验)、experienced老练的(经验完成的)、experiment实验(把经验做出来)
expert专家(经验远超别人之外的)
export出口(ex向外port港口)、manufacturing export制造业出口、import进口(im向内port港口)、transport交通(trans相交prot港口,多条路口相交)
expose曝光/暴露(把东西放到外面)、exposure曝光(真相曝光)、exposition展览会(把东西放到外面)、exhibition展览会
explain解释(把话说出来)、explicit清楚明白的(pli折叠翻转,折叠后展开让人明白)、implicit含蓄的(折叠后向内关起来不让人明白)
express表达(说出来)/快速(快递业务出去)、expression表达、expressway高速公路(快速的路)
explore探险(向外去看看)、explorer探险家
exclude排除(关在房间外)、exclusive独家的/唯一的(放在外面的)、exclusive interview独家专访、exclusively唯一、include包括(关在房间里)、seclude隐居/隔离(分开之后关起来)、close关闭
excavate挖掘(向外cave山洞,挖出来一个山洞)、excavator挖掘机、exhume挖掘(hum泥土,从泥土中挖掘出来尸体)
exceed超越(走出去了)、exceeds supply供不应求、proceed向前走、exceedingly尤其/特别的、especially特别地
excess超过/过量、excessive多余的(超过太多了)/过分的
exclaim呼喊(向外claim喊出来的)、claim声称、acclaim称赞/欢呼(朝向喝彩)、proclaim宣告(提前声称)、reclaim召回(往回召唤)、disclaim否认(不承认)
expel开除(放到外面去)
exhaust耗尽(haust消耗,都耗出来了)、exhausted感觉精疲力尽(主观感觉)、exhausting令人感觉精疲力尽(客观感觉)、exhale呼出/呼气(向外hale精神矍铄的呼气)、inhale呼入
expire到期/死亡(把spire气吐出去了、spirit精神,精气神)、inspire吸气(把气往里吸入)/产生灵感/鼓励、encourage鼓励、inspiration灵感
external外部的、external factors外部因素、internal内部的、internal factors内部因素、exterior外部(建筑物的外观)、interior内部(建筑物/空间的里面)
extract提取(-tract拉扯,拉扯出来)、extractor抽油烟机、tractor拖拉机、trace跟踪、track跟踪、contract合同(相互拉扯将合同一分为二)、absract摘要
4.en-、em-用力(产生力量)
(1)en-用力
enter入口(用力进去的)、exit出口
encourage鼓励(使产生courage勇气)、discourage泄气(否定勇气)、courage勇气
enjoy享受(使爱上它)、enjoyable令人愉快的
enlarge扩张(使变大)、expand扩张
enslave奴役(使奴隶)、slave奴隶
endanger危及(使遭到危险)、endear受欢迎的(使dear喜爱的)
endure忍受(使during熬过一段时间)、stand忍受、temper脾气
engage参加/订婚(使gage得到)、enhance提高(使hance向上了)
enlighten大彻大悟(使人前后都发光)、enlightened开明的
enlist征募/入伍(使名字到名单上)、conscript征募(把士兵名字都写下来)
enquire询问(使question疑问)、inquiry询问(美式询问)
enrage暴怒(使得rage激怒)、enrich使富裕(使rich富裕)
entitle为..命名/使有权利(使title命名)、enable使能够、enact扮演(使actor演员)
encircle包围(使围绕着)、encase包住(使在case箱子里)、encode编码(动词,使代码code编辑)
enforce加强(使力量用上去)、strengthen加强
enchant使着迷/使迷惑(使chant音律迷住、chat聊天)、encounter遭遇(使对立面counter遇见)
ensure确保(使确保,确保事情真的发生)、insure投保(保险投保)、assure向保证/使确信(使某人相信什么事情,不一定发生)
(2)em-用力
empty空的(使都倒出去了)、evacuate清空(使都vac空出来了,vacation空出来的假期)、vacuum真空
employ雇佣(使ploy工作)、employee雇员、employer雇主/老板、employment职业/雇佣
emphasis强调(使explain解释的清楚)、express表达、explain解释
empire帝国(使帝王的spire气息扩张出来的)、imperialism帝国主义、expire到期/死亡(把spire气吐出去了)、inspire吸气(把气往里吸入)/产生灵感/鼓励
embody体现(从人的身上体现出来)、embed植入(使用培植器/床)、embedded嵌入式、embedded system嵌入式系统
embrace拥抱(用力brace支起,棍子支起)、bra胸罩(支撑起胸部)
embarrass尴尬(使尴尬)
emboss凸出/浮雕(使你成为老板,凸出出来)
· Z词:之,表示曲折
zigzag曲折的、flex弯曲/弹性、flexible可弯曲的/灵活的、inflexible顽固的/不可弯曲的(不可弯曲的)
flexion弯曲、inflexion拐点(弯到不能弯了)、influence影响
go zigzag走之字形(形容喝酒后东倒西歪)、why are you still zigzaging?为何你仍然徘徊犹豫不定?
zombie僵尸(东倒西歪着走)
zoo动物园(动物园的路曲折的)、zebra斑马(斑马身上的图案曲折)
zest热情/激情、zeal热情/激情、zealous狂热的(例如背单词的激情,上上下下曲曲折折)、zealots狂热者
zoom伸缩(来回曲折)、zoom in缩回、zoom out伸出去、air-zoom气垫(可伸缩有弹性的)
golden zoom-stick金箍棒(金色的可伸可缩的棒子)
zip拉链(上上下下曲曲折折)、zipless放纵的(不拉拉链的)
· M词:手
1.手
manufacture生产/制造=produce、manipulate操作、master、masterbate手淫
manual使用手册=handbook、manuscript手稿、inscribe雕刻、describe描写
masterpiece杰作
manifest表明/明显的(举手表明态度)、demonstrate说明、indicate说明、explain解释、illustrate说明、illusion错觉
2.动mov-、mot-、mob-
move、movement运动、remove拿开
mote尘埃(随风飘动)、motor马达、motive动机、motion运动、motto格言、remote遥远的、promote促进
mob暴民、mobile移动、China mobile中国移动、China unicom中国联通、moblize动员
maintain维护、mend修理(抓住、握住)
3.数量逻辑相关(数数)
monster大怪兽(数量之大)、many、much、math、meter米、centimeter厘米、mile英里、modest适度的/谦虚的
minibus、minibar、miniskirt迷你小裙摆、miniature微型的、max
micro微观的、microsoft微软、macro宏观的、macro-economy、middle中间
multi-多的、multiply乘法、multimedia多媒体、multipurpose多目的、multifunctional多功能、multiple多人的
magnify放大/扩大、magnificent华丽的、thrive繁荣的
merge融合(加法)、submerge沉没(向下加)、plus加、add加、magazine杂志/弹夹(加到一起)
mass团/块/群众(多人的)、mass shooting大规模枪击事件、member成员、massive巨大的
mess混乱的(多导致混乱)
medi-中间、media媒体(中间的媒介)、Mediterranean地中海、meditate深思/考虑
mega兆、megalopolis特大城市(北京/上海/广州/武汉)
mean意思/小气(数量上斤斤计较)/平均值、meansure衡量
25 Mar 2020
最近拜入名师门下学英语,虽然说是学英语用的却是算法逻辑。本文将整理该套课程(《逻辑英语》钟平)的核心内容,帮助NLP算法师真正了解自然语言。
· 中英文切换完整公式
1.举一个例子
中文:由于通信网络的快速发展,中国智能手机用户数量近年来以惊人速度增长。
英文:According to the rapid development of communication network, the number of chinese smartphone users has increased at an alarming rate in recent years.
中文拆分:由于通信网络的快速发展(状语1),中国智能手机用户(定语1)数量(主语)近年来以惊人速度(状语2)增长(谓语)。
英文拆分: According to the rapid development of communication network(状语1), the number(主语) of chinese smartphone users(定语1) has increased(谓语) at an alarming rate in recent years(状语2).
2.基础公式
中文公式:(状1\定1)主(状2)谓(定2)宾(状1)
英文公式:(状1)主(定1)谓(状2)宾(定2\状1)
思考:中文属于神仙语体系,英文属于形式逻辑,中文是前重审美,英文是后重审美
3.升级版公式R1+R2:针对状语、定语
(1)R1:状语、定语内部倒序
中文拆分:由于通信网络的(顺序1)快速发展(顺序2)
英文拆分:According to the rapid development(顺序2) of communication network(顺序1)
(2)R2:状语、定语并列不变序
问题1:什么是并列不变序?
例如:1,2 and 3=>2 and 3,1或者1,2 and 3,4=>2,1 and 3,4
问题2:并列关联词有哪些?
表示起承转合的词语,例如表递进moreover、also、and,表转折however、but、although,表层次first、finally,表强调in fact,actually等,详细参考(有道逻辑英语公共号)
4.升级版公式单黄蛋+双黄蛋:针对句子
(1)双黄蛋:句子+并列词+句子
I love you and I hate you.
(2)蛋黄蛋:主谓宾并列
You and I are friends.主语+并列词+主语
I love and hate you.谓语+并列词+谓语
I love you and her.宾语+并列词+宾语
5.想要用好公式的注意事项
(1)学会找主干
中文主干(中译英):标准模型(“的”字后面)、非标准模型(中文四大金刚律)
中文四大金刚律:主语补全;谓语补全;关联词补全;被动补全
例如:想要用好公式的人(主语补全)需要(谓语补全)注意的事项
Who want to good at use logical formula should pay more attention.
英文主干(英译中):主语(句首第1个独立名词),谓语(排除被短语包含的动词),宾语(谓语后第1个独立名词)
主语:开头不是状语就是主语,标准模型(the+n\a+n\adj+n\全大写\it代词)、非标准模型(动名词,句子做主语(非常少):主语从句,形式主语it\there)
例如:Who want to good at use logical formula should pay more attention.
It should pay more attention that people want to good at use logical formula.
谓语:排除被短语包含的动词v
(2)分清定语和状语
定语用来修饰、限定名词范围,状语描述所说内容的条件
中文公式:(状1\定1)主语=>中文状语1带“逗号\停顿”,定语在“的”前面
英文公式:宾语(定2\状1)=>后重审美,宾语无定语,状语需后置
例如:I love the girl in the end of the world.(宾无定,状后置)
(3)考虑状语应该放在哪
英文公式:(状1)主(定1)谓(状2)宾(定2\状1)
状1与状2可调整位置,但宾语无定语,无定2,状1需后置
(4)熟悉R1与R2
(5)理清R2与单/双黄蛋联系与区别
联系:都需要有关联词(并列词)例如and、but
区别:R2针对状语、定语,单黄蛋针对主谓宾,双黄蛋针对句子与句子
(6)了解主系表:主语+是(系)+什么样子(表)
(7)了解插入语:一般插入语(位置随意,in my opinion),特殊插入语(同位语,位置固定,主语后面,表示对同一个人的描述)
同位语与主并单黄蛋的区别(前者描述的是同一个人,后者描述的是不同两个人)
(8)了解英汉互译双宾语:中文出现“把、使 ”必然出现双宾语
例如:I give the book to her.我把这本书给她(双宾语the book这本书、her她)
6.公式破解英汉互译
中文:在中国海南文昌卫星发射基地,代表全球领先水平的名为长征5号的新型重型火箭在昨天被成功发射进入了太空。这是一次吸引全球关注的发射,并且打破了两年前因上一次发射失败造成的僵局。
英文:In Wenchang rocket launching base in Hainan of China,a new type of heavy rocket named LongMarch5 that represents the high level technology of world was launched sucessfully into space yesterday.It is a launching event that attacts world attention,and also broks the deadlock caused by a former launching failure two years ago.
中译英公式:在中国海南文昌卫星发射基地(状1+R1),代表全球领先水平的名为长征5号的(定1+R1)新型重型火箭(主)在昨天被成功(状2)发射(谓)进入了太空(宾)。这是(主)一次吸引全球关注的(状2)发射(谓),并且(双黄蛋)(补主语)打破了(谓)两年前因上一次发射失败造成的(定2+R1)僵局(宾)。
· 语法革命
1.重建时态:共9大基础时态,7大杂交时态,共16种
(1)9大基础时态:分为点时态和段时态
点时态(粗点)
一般过去时:V-ed
一般现在时:V
一般将来时:will V或者是be going to do
点时态(精点)
过去进行时:was/were v-ing
现在进行时:am/is/are v-ing
将来进行时:will be v-ing
段时态
过去完成时:had v-ed
现在完成时:have/has v-ed
将来完成时:will have v-ed
(2)7大杂交时态:点段杂交、点点杂交
点段杂交(精点+段时态)
过去完成进行时:had been v-ing
现在完成进行时:have/has been v-ing
将来完成进行时:will have been v-ing
点点杂交(一般过去+点时态)
一般过去将来时(一般过去+一般将来):would v
过去将来进行时(一般过去+将来进行):would be v-ing
过去将来完成时(一般过去+将来完成):would have v-ed
过去将来完成进行时(一般过去+将来完成进行时):would have been v-ing
2.虚拟语气:不可能的假设,表达一种情绪
时间
从句谓语形式(虚拟的条件)
主句谓语形式(虚拟的结果)
将来
动词过去式(be、were)、should+动词原形、were to+动词原形
would/should/might/could+动词原形
现在
动词过去式(be、were)
would/should/might/could+动词原形
过去
had+动词过去分词(had done)
would/should/might/could have+动词过去分词
注意:(1)虚拟一般是对过去(因为懊悔),主句谓语看主句的事件是否已经发生,例如If I had not lied, She would not have left.
(2)杂交主句与从句分开看,一般为虚拟条件(过去)+虚拟主句(现在)、 虚拟条件(现在)+虚拟主句(将来)
3.常用介词:
简约之美:To have a government that is of people, for people, by people. 三民主义
Life is full ups and down.生活充满起起伏伏
(1)第一梯队:at、in、on
at表示1定点定位(@符),例如laugh at嘲笑(针对性笑)、laugh to面朝微笑、laugh off一笑了之(笑到脱离)
at表示2刻度(指针具体到哪个位置了),例如He is droving at 200 miles an hours.
in表示在里面
on表示1接触,例如turn on打开(接触上开关)、turn off关掉(脱离开关)、on the border在边界(接触上边界)、on-again,off-again strategy若即若离的政策
on表示2依靠(接触上靠着),例如rely on依靠、it’s on me这顿饭我请(这顿饭靠我)
on表示3进入一种可持续状态(接触上了)onlookers吃瓜群众(持续不停给的看)、on fire着火(持续着火)、on holiday在假期(在假期中)
注意:时间上区别
非一天之内:on对应一天,on monday;in大于一天,in weekends;at小于一天具体到时刻,at six o’clock
一天之内:on对应具体一段,on morning of your birth你出生的那天早上;in长时间一段in the morning(6点到12点)、in the afternoon;at精确点定位at night、at noon
on time准时、in time及时
(2)第二梯队F4:of、off、for、from
of表示从属、内含,be afraid of怕什么东西内含、be made of被什么制造出来(内含什么东西)
from表示过程感,from tip to toe从头到脚、from monday to friday从周一到周五
off表示脱离(溜走了),take off脱掉、see sb off送别
for表示1为了(表目的,接词),for honor为了荣耀
for表示2因为(表原因,接句子),I didn’t return, for I didn’t know he was there.我不能回去,因为我不知道他在哪
for表示3一段时间(用这段时间来干嘛),I have been here for 5 days.
(3)第三梯队:around、about、over转圈圈
around表示转圈圈,around the clock夜以继日(连轴转)、money around闲钱(可周转的钱)
about表示转圈圈,talk about谈论(围绕一个话题转圈)、about-face态度完全改变(脸转了180度)、standing about/around闲着(四处转圈圈)
about vs of:I know of you.我知道你一些属性、I konw about you我对你知根知底(你全方位我都了解)
about vs on:about泛泛而谈、on紧密接触(关于什么议题的会议、关于什么论点的论文)
over表示翻转、跨越(带贬义),over the worst跨过艰难、through the worst挤出艰难、game over游戏结束(游戏翻过来了)、turn things over翻来覆去的想
around vs over:turning the company around/over is not easy.前者around盘活/后者over盘垮
(4)第四梯队:between表示两者之间、among表示好多个中间
(5)第五梯队:up表示向上,上传up主、up in the air悬而未决、stay up熬夜(站着不睡)
介词特训:get+介词
get about/around四处走动(人转圈圈)、新闻传开(新闻转圈圈)、get around绕开/回避/克服(回避问题problem、回避规章制度rules)、get around to sth终于去做(转了半天圈圈去做了)
get across观点传达(从表面穿过去、目的性一对一)
get ahead工作学习出人头地(头部选手/领先)
get along相处融洽(沿着一起走,人与人并肩前行)、应付进展(人与事情)
get on/along相处融洽、进展顺利、get on 继续做
get at够着(艰难地点定位)、查明/发现(艰难地够着真相find out)、到某个地方、get at sb(批评/指责某人)
get away离开(drag on开个没完,拖拖拉拉紧密一个接一个)、逃离、休假(离开工作岗位)、别胡扯(别人说话让人走开),away+from=off,get away from me/get off me、get away with做了坏事而不受惩罚(get away with murder无法无天/逍遥法外)
get back回到(get back to the main point)、get back to回头再答复、get back at报复(回头找你算账)
get behind落后/拖延、get behind with和什么东西一起落后、get behind sb支持
get by钱勉强够花(by依靠)
get down下桌子(小孩子说下桌子)、让人沮丧、get down to开始做很花精力做某事(事必躬亲)
get off不要碰、动身(脱离某地点)、下班,等于get away from没受惩罚
get over忘记某人/翻篇、从疾病中康复、走出来、克服困难
get up起床、特意装扮(重要等级上升)
4.常用链接词(conjunction):
(1)并列连词and
(2)转折连词but、however
(3)因果连词because、so(英文因为所以不能同时出现)
(4)选择连词or
23 Mar 2020
· PPT制作技能
PPT的作用:辅助主讲人信息表达
优秀PPT的定义:信息被整洁、美观、合理的可视化呈现
如何制作优秀PPT:4个方面(好的模板、好的素材、3大排版神技、4大设计套路)
第一讲:好的模板
微软官方模板www.officeplus.cn
第二讲:好的素材
1.字体
思源宋体+微软雅黑(党政风)
喜鹊在山林体+思源黑体(时尚综艺)
字魂龙吟手书+微软雅黑(大气封面)
思源黑体BOLD+思源黑体LIGHT(科技类)
2.免费高清图库
pixabay数量全www.pixabay.com
Pexels质量高www.pexels.com
GRATISO视觉冲击强www.gratisography.com
FoodiesFeed各种美食大片www.foodiesfeed.com
NewOldStock复古历史照片nos.twnsnd.co
3.图标
PPT插件www.islide.cc
火柴人图标库www.islide.cc
第三讲:3大排版神技
神技1:拯救文字多的页面(文字分级=>转换为SmartArt)
神技2:多图片排版(全选=>图片格式=>图片板式;设计=>设计灵感=>设计理念)
神技3:插入图形=>复制=>粘贴;填充模式:伸展/重叠
第四讲:4大设计套路
套路1:用大图,图片越大,格调越高
套路2:用星空图,大气、科技、未来
套路3:图文搭配,匹配PPT文字关键词
套路4:加蒙版,图片加半透明黑色
· 文案写作技能
《注意力写作》Spenser
第一讲:注意力写作的底层思维
底层思维:用户思维,以用户为中心去思考问题
例子:我是一个北大毕业生,但在开淘宝店;不是一般的淘宝店,销售额已经有3000万;虽然有3000万,但我非常不快乐
用户思维:抓住好奇心和自我表达
文字需要制造好奇
高度认同或密切相关话题,满足读者自我表达需要(你写的东西和他有什么关系)
手机屏阅读最主流的阅读场景:表达克制,切忌冗长(语句精炼、结构紧凑);尽量多给刺激点(故事刺激、金句刺激,两屏就有一个刺激点);
总结:建立用户思维=>满足阅读动机(好奇心,自我表达)=>适应阅读场景(表达克制,多给刺激点)
第二讲:如何起一个好的标题
四个套路:引人共鸣(标题决定打开率,内容决定转发率),悬念式标题,争议式标题,颠覆固有认知
标题里提到的人们更加熟悉的事物,让读者感到这篇文章,与我有关
三个步骤练习:观察和分析;学习和模仿;重视市场反馈
总结:好标题评判标准(引人共鸣、悬念、争议、颠覆式),好标题提取步骤(思考用户关注关键词=>对关键词进行检索=>观察模仿其他文章标题=>整理一堆标题带入评判标准)
第三讲:如何设计行文节奏
斯蒂芬·平克:写作之难,在于把网状的思考,用树状结构,体现在线性展开的语句里。
四个方法:讲故事、设悬念、给带入、有反转
1.讲故事:怎么开头(时间、地点、人物)、应该讲谁的故事(自己认识的故事)、故事情节是故事主体(丰富情节)、加金句(适合时候抛出一个高能观点,故事+道理)
2.设置悬念:通过对材料选取、呈现顺序的调整,讲出悬念感
3.给代入感:制造熟悉感,描述一个普通人的熟悉场景,表达一种普通人的感受(用户思维)。(第一步制造熟悉问题,第二部顺着对方意愿解释发生原因,第三夹带自己的私货给出观点和对策)
4.反转预期:铺垫越长,落差越大
第四讲:如何有效提升文采
什么是文采:语言带给人审美上的愉悦感,愉悦感来自画面感和音律感,即看和听,这属于形象化信息。
好的作者,就该降低读者理解的成本。
1.语言尽量简单化、口语化(修改:过长的逻辑、多层的逻辑、连锁的形容词),一口气一般不超过10个字。
2.用文字在读者心里画画(多用动词、名词,少用形容词,善于抓住细节,善于使用比喻)
3.把抽象的概念具体化(戏剧冲突:软心肠的刺客、诚实的小偷)
第五讲:注意力写作日常训练
1.持续输入(大量阅读:优先选择符合注意力写作标准的读物=>每天听本书;积累习惯:标题、金句,能够打动你的也能够打动别人)
2.刻意练习(发朋友圈或微博)
3.坚持写作(控制不住自己,完美主义心理:完成比完美更重要,缺乏反馈和激励)
《互联网销售文案指南》小马宋
13 Mar 2020
NPDP知识框架:
新产品战略
新产品执行(产品组合、具体流程、组织文化、工具与度量、市场研究)
产品生命周期
问题:与软件工程体系如何对应?
1.需求收集(问题域)
2.需求分析:从用况到类图(需求层)
3.产品定义:背景介绍、产品目标、总体结构、总体流程、用户角色、产品功能、数据字典、非功能性需求(设计层)
4.研发设计:概要设计、详细设计(实现层)
5.测试:功能测试、集成测试、单元测试(实现层)
新产品战略
1.战略层级:使命陈述、实现使命的行动规划、支撑整体战略的创新战略
使命陈述:愿景、使命、核心价值观
实现使命行动规划:公司战略、经营战略
支撑整体战略的创新战略:创新战略、新产品开发组合战略、新产品开发项目战略
总结:使命陈述=>使命行动规划=>创新战略=>支撑创新战略的战略
2.使命陈述
组织关键特征:核心的、持久的、独特的
组织愿景:描述组织最期望未来的状态(想成为什么样子)
组织使命:有关组织信仰、哲学、目的商业准则和公司信息陈述(干什么事情)
组织核心价值观:个人和组织情感上遵守的原则(道德、情感原则)
组织认同:各层级对组织方向的认同
3.使命行动规划
公司战略:我们应该在哪个业务领域竞争?如何使不同的业务协同,提升整体竞争优势
经营战略:如何选择一组行动以提供一份独一无二的价值
4.创新战略:为组织的所有创新提供目标、方向和架构
优秀创新战略特点:协同一致、项目优先级排序、项目权衡取舍
创新战略框架:
(1)波特的战略框架(成本领先:宽市场低成本、客户关注价格;差异化战略:宽市场差异功能、客户关注品质性能;细分市场战略:窄市场、客户关注特殊需求)
(2)迈尔斯·斯诺的战略框架(探索者:最先上市甘冒风险、最新技术;分析者:快速跟随产品通常更好、分析再造技术;防御者:稳定市场维护市场份额、单一核心技术;回应者:只有在遭遇威胁时才做出反应、无明确技术)
(3)克里斯坦森的战略框架(持续式创新、颠覆式创新,区别:是否创造一个新的市场、价值网络)
(4)皮萨诺的战略框架(常规创新:现有商业模式,宝马N系;颠覆式创新:新的商业模式,宝马改成出租车运营;突破式创新:聚焦于纯技术,宝马电动车;架构式创新:技术+商业,电动出租车运营)
5.支撑战略:平台战略(高效开发产品)、技术战略(未来产品开发)、能力战略(开发成功能力)、营销战略(获得更高销售额)、知识产权战略
(1)平台战略:提供一系列子系统及其接口,由此建立一个通用性框架,继而高效开发
(2)技术战略:有关技术维护和技术发展的计划,有助于组织未来发展,技术预见方法(头脑风暴法、专家小组法、德尔菲法、SWOT分析法、专利分析法和趋势分析法)
技术S曲线,引入期(技术进展缓慢)、成长期(技术得到显著提升,市场竞争激烈)、成熟期(技术遇到瓶颈)
技术路线图:以时间为节点技术展示或技术计划的示意图,技术规划的发展与整体规划协同一致
(3)知识产权战略:主要类型专利、版权、商标、植物品种权,回应型(事后、简单、回应)、主动型(主动、自由、监控)、战略型(与公司战略一致、保护)、优化型(战略优势)
(4)营销战略:将组织有限资源集中,目的是提高销售额,需与业务目标保持一致
业务目标=>营销战略(提供什么产品、目标客户是谁、客户如何了解该产品、产品如何达到客户面前)=>营销组合(4P 产品、定价:渗透定价和撇脂定价、促销、地点)=>营销计划
产品三个层次:核心利益(价值主张的清晰程度决定新产品市场是否成功)=>有形性能(品牌、包装、性能、质量)=>附加性能(安装、质保、送货)
波士顿产品组合分析框架(明星产品、现金牛产品:增长率低份额大,撇脂或功能改进、问题产品:增长率高份额小,决定是否成为明星或瘦狗产品、瘦狗产品:放弃或改变价值定位)
产品路线图:将短期和长期业务目标和产品创新方案进行匹配,以实现这些目标的一份计划
(5)能力战略:建立起一组执行战略所需的能力,聚焦内部能力(现有能力、培训)、部分或全部依靠外部能力(兼并、开放式创新)、结合内外部能力
开放式创新:通过有目的知识流入和流出加速内部创新
组合管理
1.产品组合:战略性权衡取舍一系列项目或产品
2.组合管理:目标是完成正确的项目(财务稳健、价值最大化、项目平衡:维持正确项目间的正确平衡、管道平衡:量力而行、战略协同);两个活动:由组合选择、组合审查组成
3.产品组合与战略关系
(1)战略协同:战略匹配、战略贡献、战略优先级
项目选择和持续审查方法
自上而下:明确组织战略(战略匹配)=>可用于整合的项目组合资源=>排列产品类别的优先顺序(战略优先级)=>按照产品类别比例分配到战略桶
自下而上:确定潜在的项目=>定义评估项目的战略标准(战略匹配)=>依据标准对每个项目进行评估(战略贡献)=>项目决策主要取决于项目是否满足该标准
二者结合:列出业务单元或各类产品费用战略优先级=>依据战略标准对每个项目进行估计和排序(战略匹配)=>综合考虑单个项目优先级预算,以及各类业务产品的优先级,由此将项目分配至对应的战略桶中(战略优先级)
区别:自上而下(类别),自下而上(单个),二者结合(综合+费用)
(2)价值最大化
What:选什么?促进新产品成功的因素
拥有一个独特、优越的产品(差异化);瞄准一个吸引人的市场(细分市场);利用组织内部优势(成本领先)
Where:哪里选?新产品机会来自
分析当前产品组合,确定产品改进或延伸的领域;借助创造性思维工具
How:怎么选?产品机会评估工具
非财务类:定性方法,主观判定新产品成功/失败的潜在可能性(战略一致、技术可行、风险水平、法律法规、上市时间)
方法:通过/失败方法(跨职能代表);评分方法(提供参考描述)
应用:项目前期,大量创意或机会评估
财务类:定量方法,决定新产品在财务上是否可行,排列产品优先级(净现值、内部收益率、投资回报率、投资回收期)
方法:收入回报、成本、资金成本
应用:从粗略财务分析到细致财务分析
(3)财务稳健
(4)项目平衡
突破性项目=>颠覆式创新、突破式创新、架构式创新=>勘探者/探索者=>风险4
平台型项目=>颠覆式创新=>分析者/防御者=>风险3
衍生性项目=>常规创新=>分析者/防御者=>风险2
支持性项目=>常规创新=>回应者=>风险1
气泡图组合分析(起泡大小=资金投入,XY轴风险与回报,技术风险与市场风险,技术新颖性与市场新颖性)
(5)管道平衡
资源配置,量力而行
方法:基于项目资源需求(项目清单)=>基于新业务目标(项目与业务目标贡献)=>将资源配置做为一个流程(项目经理、项目主管、规划负责人)=>资源配置的支持工具
管理制度化=>制度流程化=>流程表单化=>表单电子化
总结:选择新产品=>创意生成评估=>管道、能力、财务规划=>执行=>上市=>市场内分析=>生命结束
新产品流程
1.新产品成功=>提升新产品成功率=>取决于企业是否正确的新产品开发流程(用好流程)=>开发流程正确取决于正确的决策上(正确决策)=>在前端做正确决策是最重要的(重视前端)
重视前端:
(1)模糊前端(创意生成=>初始概念开发=>高级业务阶段=>BRD文档/PIC产品创新章程)
(2)产品创新章程PIC:是一份关键性的战略文件,是组织推动新产品商业化过程的核心。包括背景(为什么做?)、重点舞台(凭什么做?目标市场、关键技术、营销方法、市场规模、竞争对手)、目标和目的(匹配经营战略)、特别准则(工作关系、项目汇报、预算监管)
正确决策:
(1)决策知识来源:组织记录、员工、外部顾问、发表文献、专利、竞争对手、客户需求。知识能够改进决策,降低不确定性。
(2)决策框架流程:识别问题或机会=>收集信息=>分析情况=>识别解决方案选项=>评估选项=>选择最佳选项=>基于决策行动
用好流程:为将公司想法转化为可销售产品和服务,公司所开展的一系列条理化任务和工作流程
(1)6个阶段:探索、筛选、商业评估、开发、测试、商业化
(2)新产品流程:门径管理、集成开发、精益产品开发、敏捷产品开发、设计思维
2.用好流程——常用流程
(1)门径管理流程
阶段:活动、综合分析、可交付成果
关口:一个需要做出有关项目未来关键决策的确定节点,包括可交付成果(输入)、标准、输出
主要阶段:发现(寻找新的机会、新的创意)=>筛选(初步评估市场机会、技术需求)=>立项分析(更为深入的技术、市场、可行性分析,BRP/MRD/PIC)=>开发(产品设计PRD、原型、可制造设计:概要设计,详细设计、制造准备、上市计划)=>测试与修正:功能测试、集成测试、单元测试=>上市
优势:为产品开发提供准则约束;强调有质量的决策;对有所参与者而言都是透明的;适用于多种类型的组织;
劣势:过度官僚化;在没完全理解的情况下,可能引起过于僵化和成本昂贵;可能一定程度上扼杀创造力
(2)集成产品开发
前身是瀑布流程:需求=>设计=>实施=>验证=>维护
改进是并行工程(喷泉模型):是一种集成、并行设计产品及相关过程的系统方法,设计活动应同时进行,即并行
发展是集成产品开发:系统综合地应用不同职能体系的成果和理念(瀑布+并行)
集成组合管理团队IPMT,包括产品开发团队PDT、供应团队OT
主要阶段:概念阶段=>计划阶段=>合同=>开发和质量确保阶段=>上市阶段=>生命周期阶段
特别注重学习和持续改进
(3)精益产品开发
核心TPS:提升生产率(每个单元产生的利润,设计者开发者有效利用,更短上市时间,单位时间完成更多项目,更短时间积累更多满意客户);去掉浪费源(混乱环境,缺乏优先级,不同职能沟通障碍,糟糕产品定义,无效会议,太多电子邮件)
优势:事件驱动方法简化合作,优化设计;用于记录学习、判定有限级的工具是简单的、可视化的;重视进度、成本、绩效积极管控;适用于各种规模;(简单高效)
劣势:参与人员敬业且经验丰富;需要强有力供应商;需要改变组织结构文化;
知识增长,精益流,管理持续改进
(4)敏捷产品开发
敏捷方法是在合作环境下由组织的团队进行产品迭代开发的过程。
敏捷开发宣言:个体和交互胜过过程和工具(沟通);可运行软件胜过面面俱到文档;客户合作胜过合同谈判;响应变化胜过遵循计划;
关键要素:产品待办列表(优先次序排列);敏捷流程;冲刺(完成特定任务,使得开发进入审查环节的一段时期)
关键人员:产品主管(代表甲方客户,决定待办列表内容);敏捷教练(代表乙方项目经理,团队与主管进行协调);敏捷团队(通常由7个人组成,正负2个)
优势:快速应对、快速解决、运营成本最小
劣势:范围蔓延、成本和时间预估不准、受人员影响较大、适用于快速变化小型项目
关键原则:目标是尽早和持续交付,交付时间间隔越短越好;招揽积极主动人员,业务和开发者共同工作;可运行软件;先进技术和优秀设计,令待办工作最小化;团队定期反思、做出最好的架构和设计;
3.用好流程——选择流程
对比类型
敏捷
精益
设计目标
频繁互动、迅速响应
提高效率、减少浪费
适用于
快速开发软件
重复性任务
主要内容
明确结构、流程和角色定义
不是确定的流程,而是核心原则和指导方针
对比类型
门径管理
敏捷
方法类型
宏观
微观
范围
从创意到上市
开发+测试
团队
跨职能:技术、市场
技术人员
重点
发展一个新产品
开发测试后的软件产品
决策模式
生杀模式、高层管理者参与
下一次冲刺行为
流程类型
特点
总结
门径管理
宏观规划、阶段管控
大而全
集成开发
学习型组织,注重学习和持续改进
又好又强
精益
提高效率、减少浪费
又快又省
敏捷
微观规划、灵活应对
小而美
注意:各流程模式是潜在可互补的,实际项目中可对多种开发流程进行融合
4.用好流程——治理流程
定义:用来指导项目、程序和项目组合管理中的活动的框架、功能和流程(战略级问题,非日常运营)
人员:高级经理、管理团队保证新产品开发流程整体有效性
问题:整个组织是否很好的沟通、理解和接收这一流程?度量指标、权责、决策?
5.流程总结
所有流程模型遵循以下共同原则:战略一致性;基于知识决策;降低产品失败风险,提高产品成功率;强调利益相关者输入信息融入决策;应用跨职能团队;是一个结构化框架,要被整个组织所理解和应用;
问题类型
门径管理
集成产品
精益
敏捷
是否对整个产品开发流程进行管理?
是
是
是
否
是否专注于跨职能团队使用?
是
是
是
否
能快速上市么?
是
是
是
是
如何降低产品失败风险?
关口
持续学习
减少浪费
快速
是线性还是迭代的?
线性
线性
线性+迭代
迭代
文化、组织和团队
文化、组织(角色职责、矩阵结构)和团队(组成、特征、阶段、领导、绩效)
1.文化:组织中人们拥有共同的信念、核心价值观、假设和期望
氛围:员工可直接或间接感知到工作环境特点的集合,对员工行为有重大影响,包括领导力水平、沟通、员工参与
成功创新文化:清晰的方向和目标、个人绩效与组织绩效密切相关、鼓励内外部有效沟通、鼓励建设性冲突、让工作愉悦且有回报
2.组织:角色职责、矩阵结构
(1)角色职责:战略管理阶段=>流程管理阶段=>组织和团队阶段=>产品管理阶段
战略管理阶段:整体使命、愿景(公司高管和关键职能部门负责人)=>业务战略(业务单位负责人)=>职能战略(职能部门负责人)=>产品战略(高级产品经理)=>创新战略(跨职能高级经理)
流程管理阶段:流程拥护人(负责推动组织内商业流程日常工作,考委会)=>流程主管(对新产品开发流程的战略性结果负责,巡考老师)=>流程经理(确保流程中创意和项目按时有序进行,监考老师)=>项目经理(负责管理特定的产品开发项目,班主任)
流程类型
流程主管
流程经理
门径管理
业务流程主管
业务流程经理
敏捷
认证流程主管、产品主管、敏捷教练
产品主管
组织和团队阶段:建立氛围和文化(首席执行官)=>推动积极氛围(职能经理、各团队、项目经理)=>团队开发(高级产品经理负责整体开发、项目或团队领导负责团队成员选拔和持续培训)
产品管理阶段:落实产品开发战略、跨职能合作;产品管理负责定义和发现范围,项目管理负责范围执行和交付;向CEO汇报、监控管理产品营销与开发(首席产品官)=>领导大型产品经理团队,确保开发中的产品正确有序(高级副总裁)=>为产品团队提供指导、负责一款产品或一条产品线(产品群管理)
(2)矩阵结构
团队类型
团队领导
团队成员
团队能力
适合产品/项目
项目类型
其他
职能型
无专属
分散
最弱
改进的、轻微变化
支持性项目
难以形成合力
轻量型
名义上、无实权
兼职
弱
概念的、衍生的
衍生性项目
项目聚焦不足、个体有挫败
重量型
有实权、高层兼任
临时专职
强
新领域、新分类
平台型项目
对员工有难度、要打破部门壁垒
自主型
像创业CEO
专职
最强
全新的、高风险
突破性项目
独立、与其他组织分离
3.团队:组成、特征、阶段、领导、绩效
为同一个目的而努力的少数几个人,拥有彼此互补的技能,遵循共同的目标和路线,并肩作战。
高绩效团队对产品开发成功的重要性,一般是跨职能团队,包括营销、研发、制造、采购
团队组成:发起倡议者(观音);企业家(唐太宗);项目领导者(唐僧);有创造力的产品开发者(孙悟空);信息处理者(沙和尚:大师兄师傅被妖怪抓走了);氛围制造者(猪八戒)
团队特征:战略协调一致、高参与度授权,凝聚的核心是信任
团队阶段:创建(有积极、有焦虑)=>激荡(开始挑战边界、发生碰撞冲突)=>规范(开始解决彼此之间的分歧、欣赏优点)=>执行(通过无摩擦努力来实现团队目标,开始干活)=>解散
团队领导:为达到一定目标,为一群人提供方向、说明和指导。高层管理者需要在前期介入,以此降低不确定性。
团队绩效:内部因素(组织文化环境、组织结构、组织流程、组织人员、领导参与度)、外部因素(组织声誉、合作关系、竞争压力、保密要求)
4.总结
使组织成功的最终要素还是人,文化氛围提供最终框架,战略流程在该框架中实现
高级管理层在组织文化发展和建立中起着重要作用
跨职能团队被普遍认为是最有效的产品开发团队模式
团队结构取决于组织结构和项目具体性质,包括职能型、轻量型、重量型、自主型
团队持续运作中识别出特定技能和个性
工具与度量
创意开发、商业评估;概念开发、产品设计(工具);项目管理、风险管理、绩效度量(工具)
1.创意开发:生成、发展、交流新创意的创造性过程,早期产生产品概念=>中期解决实施问题=>后期用于规划上市
两种思考方法:发散思维(以创造力为中心,寻找新创意和新机会),聚合思维(通过各种途径收集数据,运用逻辑寻找解决方案,寻找问题最终解决方案)
常用创意工具:
(1)Scamper策略:subsitude替代、combine合并、adapt改造、modify调整、put to another use改变用途、eliminate去除、reverse逆向操作
(2)SWOT分析:优势、劣势、机会、威胁
(3)PESTLE分析:political、economic、social、techological、legal、environment
(4)头脑风暴法:6-10人,鼓励人们提出创意,共同发言(电子头脑风暴:利用计算机进行思想交流,各地远程;名义小组:先写自己的意见,再分组讨论)
(5)头脑书写法:不通过口头表达,而是写下具体解决问题的创意(写一个纸条,不断传给下一个)
(6)思维导图:在信息和创意之间建立思维连接的图形化方法(亲和图法/卡片卡:相近的进行分类)
(7)六顶思考帽:六种明确的职能和角色,白色(聚焦事实)、黑色(寻找问题)、黄色(积极价值)、绿色(寻找创造力)、红色(表示感情)、蓝色(控制流程)
(8)故事板:从用户如何使用产品,以便更好的理解
(9)德尔菲法:一组专家反复征询对发开的共识
2.商业评估:可行性分析,分析一个项目或新产品成功可能性的流程(PIC产品创新章程:重点舞台、目标和目的/BRD商业需求文档)
市场潜力:市场存在么?(公司战略)
财务潜力(投资要求):成本、利润、投资回报率?
技术能力(制造能力):有能力开发、制造么?(平台战略、技术战略、能力战略)
营销能力:有能力促销、分销该产品么?(营销战略)
知识产权:有知识产权么?(知识产权战略)
法规影响:哪些法律有影响?
核心要素:财务分析,评估单个投资的真实回报率;比较多个可选的投资项目(产品组合与战略关系:价值最大化、财务稳健);
财务指标:产品潜力=净现值、内部收益率、盈亏平衡点=投资成本、年度现金流=投资成本、总收入、总成本=投资成本、销售量*单价、固定成本+变动成本
成本:固定成本(指在相关时间段或生产规模内,不与业务活动成比例变化的费用)、可变成本(与企业活动成比例变化的费用)、资本成本(土地、设备的资产成本)、工作成本(企业用于制造所需要的成本,包括资本成本中的设备成本、可变成本中的材料成本),总成本=固定成本+可变成本
收入:销售预测(ATAR知晓-试用-可获得性-重复购买)、售价
投资:投资回报率=投资获得回报/投资成本(高风险高回报)、投资回收期、现值:未来的钱在今天的价值=未来价值/(1+利率)^期间数、净现值NPV:收益累积现值-成本累积现值、内部收益率IRR:净现值为0时的折现率
计算公式:
未来价值=原始金额*(1+利率)^期间数
现值=未来价值/(1+利率)^期间数
净现值(NPV)=收益的累积现值-成本的累积现值
折线系数=1/(1+利率)^期间数
3.概念开发:产品概念描述,产品设计规格
产品概念描述:提供产品概念的优点和特征定性的表述
产品设计规格:阐明产品设计,提供定量的客观标准
概念描述(定性描述,BRD\MRD)=>设计规格(定量描述,PRD)=>技术规格(概要设计、详细设计)
4.产品设计:设计思维、质量概念展开、六西格玛、创造性解决问题TRIZ
(1)设计思维(D-Thinking\深潜):是一种创造性的问题解决方法,以更全面、系统的方式发现并解决问题的非线性的方法,设计者通过提出解决方案、制造简单原型、获得客户反馈并重新设计、重新建立原型,从而最终解决问题。
设计思维框架:识别(发现和定义:迭代过程统一需求)=>解决(创建和评估:迭代过程设计原型)
(2)质量功能展开(QFD):运用矩阵方式将市场需求与开发工作相结合,将客户需求与产品细节特征联系起来。
应用:零部件特征,系统特征,服务流程
优势:促进跨职能讨论;产品开发团队聚焦于客户需求;从需求出发,质量功能展开为产品设计提供了结构化基础
劣势:表格巨大且繁琐;极为冗杂
建立质量屋:识别客户属性=>识别设计属性=>链接客户属性与设计属性=>对竞争产品进行评估=>评估设计属性和开发目标=>确定接下来流程中开发的设计属性
(3)六西格玛(Six Sigma):质量尺度或目标;工具和管理方法(DMAIC改善和DFSS设计);经营管理策略(提高组织核心的运营质量,提高客户满意度的同事降低经营成本)
重点:工具和管理方法
DMAIC与DFSS区别:前者改进现有流程,后者设计新的产品和流程
DMAIC阶段:定义define,测量measure,分析analyze,改进imporve,控制control(改进现有流程)
DFSS(IDOV)阶段:识别identify,设计design,优化optimize,验证validate(设计新产品和流程)
(4)创造性解决问题TRIZ:基于大量专利技术汇集的解决方法(可重点关注,用于实践)
理论基础:各个行业学科,问题和解决方法是重复的、技术演进范式是重复的,创新经常借助开发领域之外的科学成果
基于TRIZ活动:功能(引起了怎么样的变化);资源(所有东西都是有用资源);理想解(只寻找有利益的和减少损害的方法);矛盾(一方面改善会影响另一方面);趋势(单个特性增加很小的复杂度可获得多少自由度)
应用:TRIZ范式(重复范式)你的具体问题=>TRIZ通用问题=>TRIZ通用解=>你的具体解
工具:40个问题解决原则(分割、局部质量、多用途、嵌套、新维度);76个标准解
5.项目管理
定义:为创造独特的产品、服务而进行的临时性工作
5个步骤:启动=>规划=>执行=>监控=>收尾
3重约束:范围、预算(成本)、进度(时间)
范围:项目范围(需要完成的工作);产品范围(产品的特性和功能),都应该写入产品创新章程PIC
进度:目标所需活动和关键里程碑(条形图或甘特图),关键路径(完成项目所需最短的时间),进度压缩(添加成本、并行执行)
预算:自下而上(识别所有单个成本要素,加总);参照法(根据过去已经完成类似项目,经验);历史数据(过往项目特定的数据作为基础);公司自有方法(大型公司预算的具体模型和方法)
6.风险管理
风险定义:可能发生的未知事件或情况,影响项目完成
风险管理定义:项目中识别、评估、减控商业风险的过程
风险评估要素:影响和概率
风险反应:规避(影响大、概率大,不做冒险行为);接受(影响小、概率小);转移(影响大、概率小,购买保险设立合同);减轻(影响小、概率大,做出改变以降低可能性)
风险管理步骤:风险管理规划=>风险识别=>定性风险分析(概率、影响、排序)=>定量风险分析=>风险应对计划=>风险监控和控制
风险管理方法:决策树
7.绩效管理
定义:一套跟踪产品开发的测量指标KPI
度量指标:与战略紧密关联;形成学习和持续改进的基础;
成功度量6个关键:适合就是最好的、监控并行动
常用度量指标(高层):活力指数、研发费用占比、盈亏平衡时间、专利数量、新产品发布数量
使用成功因素作为贡献度量指标:建立新产品开发学习型团队;基于关键成功要素,认真评估现有新产品开发管理;识别将改善新产品开发绩效关键因素
8.总结:创意开发=>商业评估=>概念开发=>产品设计;项目管理、风险管理、绩效管理;
了解通用工具,还有一些产品开发工具(FMEA失效模型与影响分析;CAD计算机辅助设计;原型、模拟、建模和实验设计)
市场研究
市场研究作用、步骤、工具与方法、具体应用
1.市场研究作用:市场研究为新产品开发流程中的正确决策提供基础信息
新产品开发是基于前端信息收集的“风险与回报”的决策流程:新产品开发想要成功=>用好新产品开发流程=>流程需要正确决策=>重视前端(市场调研获取基础信息)
正确决策需要获取的信息(6方面);获取信息的方式(客户心声)
2.市场研究步骤:定义问题、确定结果精度水平、收集数据、分析和解释、得出结论、应用(与统计分析方法类似)
3.市场研究方法:次级研究(资料检索法、专家研究法);一级研究(定性研究:焦点小组、深度访谈、实地考察;定量研究:抽样调查、实验、普及)
(1)次级研究和一级研究
次级研究(二手资料):政府统计报告、公开出版物、报纸和杂志、商品展会、专利
价值:提供趋势信息;为一级市场研究奠定基础;特别适用于低风险、低成本的信息决策
优点:成本低,数据来源广泛
缺点:数据准确性不确定,缺少具体重点,经常过期
一级研究(一级资料):专门针对现有目标进行数据收集的初始研究
(2)定性研究与定量研究
定性研究:针对一小部分人群(抽样),了解他们的想法(文字描述)
定量研究:通过大量用户调查可信的数据结果(数据描述)
定性研究解读消费者购买原因,定量研究提示购买产品消费者数量
定量研究基础:置信区间(误差范围)、置信水平、方差=>置信区间越小、方差越大则样本量越大
4.市场研究工具:定性方法(焦点小组、客户现场访问、人种学);定量方法(抽样方法、多变量分析、大数据);定性+定量(问卷调查、消费者检测组)
(1)焦点小组:将8-12人组织起来,在一位主持人引导下讨论定性市场研究方法
注意事项:三次以上;专业主持人;周密计划和管理;警惕焦点小组常客
价值:为新产品流程全部阶段提供洞见(发掘机会、了解客户显性需求、明确新产品价值主张、更易于接收产品改进)
优点:引发讨论;第一手资料;迅速响应参与者意见;观察参与者行为
缺点:抑制活跃度;评论是开放的;结果不一定适用于所有人群;受主持人技巧影响
头脑风暴VS焦点小组:前者尽可能多的想法,全开放;后者观察调研人员找出有价值评价,半开放
(2)客户现场访问:到客户现场,观察客户如何解决需求问题,并考虑为什么做、如何做(B2B)
注意事项:获取客户名单;受访者是决策者;直接观看并向客户提问;更清晰的沟通方法
价值:收集详尽的市场和技术信息
优点:面对面;产品使用清形;跨职能团队;
缺点:向正确的人问正确的事;访谈者能力不足;建议不具有代表性
(3)人种学研究:描述客户及相关环境的定性的市场描述方法
优点:了解客户看重的东西;识别客户想要的产品特性和利益;挖掘隐性需求
缺点:花费时间较长;依赖研究者;缺乏统计信度
(4)社交媒体:基于计算机媒介工具,获得想法
在线领先用户可持续测试或提供输入信息
优点:直接联系;特定的客户建立联系;有机会接触领先用户
缺点:受偏见的影响极大;很难聚焦;无法保证结果置信度
(5)问卷调查:根据客户投票,以确定他们对现有产品的满意程度及新产品需求
(6)消费者检测组:研究公司或机构招募的某类消费者群体(未经训练的定性评测、训练有素的定量评测)
(7)阿尔法、贝塔、伽马测试:用于在开发流程中和上市前期测试新产品
阿尔法测试:由内部开发人员完成,发现消除明显产品缺陷不足,可用性测试(单元测试)
贝塔测试:产品交付前由一部分最终用户完成,获得不同客户群体的反馈,及产品兼容性,性能测试(集成测试)
伽马测试:跳过所有内部测试,直接进行伽马测试,测试后几乎是上市最终版本(功能测试)
(8)试销:将新产品投放到一个或多个有限区域
销售波研究:可重复5次,为曾经免费获得某产品的客户群,提供另一款价格略低的竞争对手的产品(产品忠诚度研究)
模拟试销:选出30-40位客户,调查品牌熟悉度和偏好,用于测试促销材料的有效性
控制试销:选出一组商店,在真实市场下摆放新产品,获得反馈
试销:选择一个特定区域或一个代表性城市的样本
(9)抽样方法:统计人中的一个子集,其中每个成员被抽取的概率相等。
随机抽样、分层抽样(层内变异越小越好,层间变异越大越好)、整群抽样(群内差异要大,群间差异要小)
(10)多变量分析:探讨因变量与自变量的关系(因子分析、聚类分析、多维尺度分析、联合分析、多元回归分析)
因子分析:找关键要素
聚类分析:亲和图,事先未知,分类
多维尺度分析:研究可替换性/相似度,例如波士顿矩阵图
联合分析:交叉分析,属性组合
多元回归:相关性、表达式、影响性
(11)众包:大量征集他人解决方案,并将其用于特定任务或项目的一系列工具(众包核心包含与用户共同创造价值的理念)
(12)大数据:数量、速度、类型
5.市场研究工具具体应用
创意开发:机会识别阶段(焦点小组、社交媒体、客户现场访问、人种学调查、多变量分析)
商业评估:机会评估阶段(次级研究、焦点小组、客户现场访问、面对面/在线调查)
概念开发:概念开发阶段(焦点小组、领先用户群、在线论坛、客户现场访问、问卷调查、多变量技术)关键利益、属性和功能
产品设计:原型开发与产品测试阶段(问卷调查、阿尔法测试、消费者监控组、客户现场访问、焦点小组)从概念推进到物理形式
产品上市:上市前测试阶段(贝塔测试、伽马测试、试销)权衡市场需求和上市速度
随着风险水平提高,从定性到定量研究。从而提高决策正确性,降低风险。
产品生命周期管理
产品生命周期(有哪些阶段、如何不同阶段进行管理)、可持续性(产品创新、产品管理、评估认证)
1.产品生命周期(引入期、成长期、成熟期、衰退期)
(1)引入阶段:建立品牌知晓度,开发市场(最重要=>跨越鸿沟:领先消费者/创新者/技术爱好者/专业人士所支配的早期市场向主流市场的过程,鸿沟前引入阶段、鸿沟后成长阶段)
走向上市(老派线性流程:什么、谁、如何、哪里;新派迭代流程:价值主张、解决方案、市场细分、目标市场、抢滩战略、渠道、促销计划、沟通信息)
(2)成长阶段:建立品牌偏好,增加市场份额(早期接受者:依靠直觉和想象购买新产品)
(3)成熟阶段:维护市场份额,实现利润最大化(早期大众:大多数顾客接收、购买新产品)
(4)衰退阶段:销售额开始下降(晚期大众、落后者)
2.产品生命周期管理
营销组合
引入期
成长期
成熟期
衰退期
Product
建立品牌知晓度、开发市场
可能增加产品特性,建立品牌偏好,增加市场份额
增加产品特性,维护市场份额
维护产品或重新定位该产品
Price
渗透定价(低价位)、撇脂定价(高价位)
维持定价
出现竞争、价格下降
降低成本、收割产品
Place
慎重选择渠道
随着需求增长而增长
强化分销渠道
退出市场、卖给别的公司(风险对策:降低风险、回避风险、转移风险)
Promotion
瞄准早期采用者
早期接受者、早期大众
强调产品差异化
只投入忠诚的利基市场
用户类型
创新者、领先消费者、技术爱好者、领域专家、早期采用者
(跨越鸿沟)早期接受者、部分早期大众
早期大众
晚期大众、落后者
目的:更新和延长产品寿命(新产品、产品线延伸、成本降低、产品改进)、维持组合整体盈利增长
3.可持续创新:产品创新
可持续开发:一种发展模式,既能满足当代人需求,又不损害后代利益。
可持续创新:新产品开发或服务的过程,全球化思考的角度,影响所有利益相关者。
最佳实践:循环经济,目标是在产品生命周期中创造闭环(少用资源、优化资源、减少浪费)
绩效评价:三重底线(财务、社会、环境)(利润、人类、星球)
可持续成熟度模型
可持续性程度
三重底线
法律法规
新产品目标
供应商管理
绩效指标
初始
不认可
最低
不考虑
不考虑
不制定
改进
初步建立
积极了解
检查
有一部分
工厂层面
成功
提升
努力做更好
鼓励
理解改进
公司层面
领先
定期研讨迭代
认证
扩大影响
战略层面
4.可持续创新:产品管理
战略管理:将可持续性引入公司运营标准之中
产品组合:成为项目一个关键准则(财务、社会、环境)
新产品流程:概念开发、产品设计、营销组合各流程影响
概念开发:客户对可持续性看法
产品设计:可持续对材料、可制造、生命周期影响
营销组合:食品公里数(食物从生产地抵达消费者所经过的距离)
产品定价:真实价格=所有外部因素+影子价格(碳信用额、碳税)
5.可持续创新:评估认证
为何评估:杜绝漂绿(说一套做一套);绿色宣言(既说也做)
评估什么:环境影响,环保宣言EPD总结了产品或服务的影响
评估过程:目标范围定义;生命周期清单;生命周期影响评估;解读
评估模型:从资源开采、材料生产、产品制造与使用等
07 Mar 2020
1. 下载镜像文件office2016 iso
如果你安装office2016,提供大家一个下载地址:https://pan.baidu.com/s/1nb7v4U8XriJCIcsRjmfzeQ,提取码:jicu,至于什么时候过期我就不知道了。
下载完成后,不要解压安装,而是右键点击装载,资源管理器中会出现一个虚拟光驱,如下图:
2. 下载office 2016Deployment Tool工具
下载地址:https://www.microsoft.com/en-us/download/details.aspx?id=49117
3. 安装ODT工具并进行配置
这点很重要,在E盘下新建文件夹tool,将下载好的ODT工具解压到该目录下,这时我们根据安装系统,选择编辑configuration文件。
文件名替换为configuration,文件内容修改如下:
<Configuration>
<Add SourcePath="D:\\" OfficeClientEdition="64" Channel="Current">
<Product ID="VisioProRetail">
<Language ID="zh-cn" />
</Product>
<Product ID="proplusretail">
<Language ID="zh-cn" />
</Product>
</Add>
<!-- <Updates Enabled="TRUE" Channel="Monthly" /> -->
<!-- <Display Level="None" AcceptEULA="TRUE" /> -->
<!-- <Property Name="AUTOACTIVATE" Value="1" /> -->
</Configuration>
需要注意:SourcePath=”D:",D盘是我步骤1装载后的虚拟光驱路径
4. 打开cmd命令窗进行安装
打开cmd命令窗,进入到E:/tool目录下,执行以下命令进行安装:
setup.exe /configure configuration.xml
5. 借助KMSpico进行激活
安装完成后,下载KMSpico进行激活
06 Mar 2020
现实中,文本分类的准确性直接影响到业务指标的高低,以呼叫中心催收场景为例,如果错误的将恶意拖欠的客户意图分到承诺还款中,可能使得催收员跟进不到位,导致回款率下降。又例如在电销场景中,如果将需要跟踪的客户标记为失败,可能会误导电销员后续不要再对该客户跟进,导致潜在客户丢失,成单率下降。既然分类的准确性如此重要,那么如何提高准确性呢?其中一个很关键的因素就在于训练样本量是否充足。
传统获取训练样本的方式有两种:①收集未标注的语料,交给标注师进行标注;②找多个人,针对同一句话进行改写。第一种方式确实能获得更多整理好的样本,但我们不能保证每一篇语料中正巧都能找到我们想要标注的句子,也不能保证我们在新语料中标注的样本与之前的样本不会有重复,因此我们想通过这种方式进行语料补充,可能需要投入难以想象的人力资源。第二种方式同样能够获得更多的样本,但同样有明显的缺陷,首先不同的人对同一句话改写方式可能出现重复,其次人的主观随意性可能导致改写后的句子词意不搭、文法不通等,因此通过这种方式获得的语料我们后续需要进行二次加工才能使用。
那么是否可以借助自然语言处理技术去扩充训练样本量呢?答案是肯定的。假如我们有这样一句话“很高兴为您服务”,我们可以借助NLP技术将其改写为“为您服务很高兴”、“竭诚为您服务”、“很高兴为您效劳”等等。如此表述“很高兴为您服务”这个意图,我们很快便有了4个训练样本。借助机器实现自动样本扩充有三点突出优势:节省大量标注人力;扩充后的文本无明显错误;非常高的执行效率。
基于上述考虑,中金智汇为解决训练样本量不足的问题,推出了基于句式和语义的文本扩充技术。用户使用文本扩充功能时,只需要准备一批表示同一个意图的文本即可,系统会自动根据文本中句子的结构和上下文语义进行文本扩充。文本扩充技术可解决来电原因分类场景下,部分类别样本稀少的问题,也可以解决客户意图识别场景下,由于客户表述复杂多变导致意图识别不准确的问题,为企业更精细化的细分业务问题、挖掘客户心声,提供前期的数据保障。
05 Mar 2020
最近看了一本《天才主厨的绝对温度》深受启发,原本只打算记录《邱岳的产品手记》,现在改为听完之后自己总结产品经理手记。正如专栏所言,产品特性好坏没有一个明确的判断标准,越是在自己产品里横刀立马的人,越不敢对别人的产品指手画脚。但产品的思维方式、理论方法却有一定的共通性,这便是在产品经理生涯中需要建立的思考方式。
简介
对原专栏进行分类后,主要还是从以下几个方面去整理:
产品基本功:产品文档、需求评审会、管理产品节奏、做用户调研
产品实战:项目管理、建立数据意识、协同开发/运营/业务工作
产品思考:如何定义抄袭、剖析产品价值、如何看待需求变更
产品案例:现有产品试用体验分析
产品基本功
1.产品经理工作时需要借助一些工具,例如用思维导图考虑整体结构、用纸笔画出草图、用UML工具做用况、用Axure等工具做动态交互Demo等。
这里需要注意的是,一方面,工具只是一种手段,产品内容才是硬核,切勿一味的追求工具体验。另一方面,为了减少后期需求变更的成本,产品经理最好能够在前期给研发、测试更直观的了解,因此Demo做的越逼真暴露出来的问题越多,越好控制变更风险。
2.需求变更其实变更的不是需求本身,而是实现方式。因此在一开始就需要学着挖掘需求背后的需求,可借助5问法、Y需求模型等工具。
3.学会借鉴灵感而不是像素及抄袭,借鉴时需要知其所以然,也可以跨领域、跨行业借鉴
4.产品文档需要考虑用户、场景、体验,首先明确用户是领导层(PPT规划PRD)、研发测试(Word需求文档BRD),其次注意描述项目背景以建立宏观印象,后续注意金字塔的撰写方式,从整体用况图到各功能拆分,最后先厚再薄,中间给时间让文档发酵。
5.BRD商业需求文档(该不该做,商业决策)、MRD市场需求文档(要怎么做,对业务和运营部门)、PRD产品需求文档(实现什么特性,并简明扼要交代商业背景),MRD可以融到BRD或PRD中,需求评审针对不同的部分介绍不同的内容
6.做产品原型注意给原型图做引导,可以数字标记或者在下方做注释,不要想着把原型做的过于逼真,交互设计师会更加专业,原型制作可借鉴如何写交互说明文档
7.设计概念模型(类图)=>流程图/泳道图/时序图=>状态图=>用例图
产品实战
1.AI产品经理需要学会算法,从而知道AI的能力边界在哪,并设计出恰如其分的产品,同时管理好用户期望值
2.AI产品经理要重视工程的力量,而不是一味追求纯净算法输出,做好规划、收集以及组织所需要的数据
3.产品规划从自下而上开始,从自上而下结束,项目规划和交付时间尽量模糊,将空间和时间留白,定期回顾和更新产品规划
4.内部产品:公司内部员工使用的产品,资源显性化、项目流程化、用户研究的最佳试验场
跳过方案寻找最终诉求(5问法),统一战线成本收益一致(需要非常了解业务),发挥强项用技术帮助业务(主动出击做数据分析)
5.产品经理不依靠权利和汇报关系建立影响力,而是靠建立信任。从小事一点点积累信任,对于所有尝试都要进行提前沟通,要重视承诺。
6.产品分析需要考虑利益相关者、解决什么问题、如何解决问题,利益相关者除了最终用户还要考虑谁购买、谁掏钱研发,解决问题要借助5问法、明确问题的最终目的,解决问题时要学会借鉴、学会使用多种工具、注意首因效应和简化版可用测试方法。
7.因为存在机会成本需求要考虑优先级,判断需求优先级的方法TAM模型(规模、频率、强度)、需求价值曲线(用户感知和服务价值),评价需求时考虑“不做会死人吗?”
8.需求评审面向2个角色(业务需求方,研发设计人员)、做4件事情(讲清需求背景;详述需求的理解和分析;向需求方交代产品解决方案:每个功能后续在业务场景中作用;向研发团队交代产品解决方案:制造什么东西、长什么样子、怎么运转)
9.需求评审需预先进行小范围沟通,与业务部门、研发工程师,可借助具体案例来讲述相关功能和流程
产品思考
1.验证码是因为服务提供方无法静默区分人和机器,导致把责任推给用户,这是有效的设计但却不一定是好的设计。
2.用户体验需要与产品利益结合,找到平衡点,借助现有AI算法,例如人脸识别,或许可以带来一系列革命性的用户体验进化。
3.给用户持续实时反馈、学会操作人性(排名机制)、与社群建立联系
4.精巧的、处心积虑的功能性设计,远不如关键性机制来的重要
产品案例
· 产品案例分析:Trigraphy设计哲学
1.利用设计,来管理用户对于进度的认知
Facebook先加载条形框,在方格内容,最后出实际内容,让用户感觉可控
假如加载超过6秒钟,用户就会感觉失控,因此要思考如何保持对用户的反馈,让用户对系统更有掌控感
2.如何将两个目的不同的页面,更顺滑链接起来
将工具页面通过滑动变为运营页面,例如微信广告
3.通过一个随机效果去处理不同级别用户
点击骰子可以帮助用户选择一个随机参数组合
快速展示产品功能,减少用户进入下一步的门槛
· 产品案例分析:The Guardian的文本之美
· 产品案例分析:Hopper的人工智能
1.从场景出发,没有任何目的和时间的旅行者,有目的没确定时间的旅行者
2.前者根据大数据计算目的地和时间进行推荐
3.后者重视文案的艺术,例如这不是最好的价格,但如果你继续等,你有可能会要付更多钱。
23 Feb 2020
以前总是考虑精力的问题,所以不愿意涉猎太多学科。自从读完《穷查理宝典》后,真的是让人豁然开朗,里面有一个重点我相信会受益一生——要形成自己的T字型知识框架。如何理解T字型呢,就是你要有一门学科研究的特别深入,然后横向发展众多学科。这样的好处是你在观察任何现象时,都可以通过学科间的交叉看到其多面性。因此我开始对自己的知识体系进行布局,选择了如下几门学科:数学、统计学、软件科学、计算机科学、经济学、心理学和英文。在此打算借助“薛兆丰老师的经济学课”和“曼昆的经济学原理”为自己后续经济学思维打下基础。
《经济学课》目录及关键点:
1.人性与稀缺
1.1经济学视角
战俘营里的经济组织:经济规律普遍存在(经济学建立在稀缺的基础上,而非理性/自私)
马粪争夺战:世间各种制度的安排,重要的不是看过去,而是看它怎么样指导未来社会和经济的发展
看得见和看不见的手:经济学训练人去看那些看不见的东西,通过想象力来进行合理的比较和选择
经济学不关心阴谋论:经济学关注的重点,是事与愿违的现象和规律
注意:这四点是统帅整个课程基本的方法论,需要反复进行思考和运用。
1.2人的本性
不确定性,进化与经济理论:经济学规律不因理性而转移
亚当·斯密的人性观:人性都是自私的=>他有爱心=>爱心有限不能扩张=>需要一个陌生的互助平台,就是市场
铅笔的故事:市场经济会加强人之间合作
商业是最大的慈善:帮助弱者是慈善,帮助强者是投资
笔者总结:资助笨学生还是穷学生?资金本身是稀缺的,因此资助人必须得做出选择,这就导致了歧视,而我无论歧视哪一方都是对另一方的不公平。因此这个题根本是无解的,那么从经济学角度其实也就否认了慈善。
1.3稀缺与选择
稀缺(为什么会稀缺?1.你想要的东西别人也想要;2.人的需求是无限的)
选择和歧视(稀缺、选择、区别对待、歧视这四个概念是一体的)
凡歧视必得付出代价(对人歧视越多,自己代价越大,因此市场竞争让人减少歧视,代价越大,歧视越少)
歧视的作用和限制歧视
笔者总结:经济规律普遍存在,稀缺是经济学的基础,不是理性/自私,稀缺会导致让人需要作出选择,有了选择就有了区别对待和歧视,一当产生歧视我们就必须要为歧视付出相应代价。
2.成本的深义
2.1成本初探
一句话给成本下定义(成本就是放弃了的最大代价)
你的成本由别人决定
别只盯着钱
核心:沉没成本不是成本(沉没成本知易行难,边际成本决定行动:要投诉多少,才能够获得多少回报,投资回报率)
2.2成本进阶
从成本角度理解盈利与亏损(1.企业内部,一门生意赚钱,寻找那些额外收益的要素,并确定下来,亏损则会进行调整;2.企业外部一旦出现旱涝保收的生意,其他竞争者就会争相提供替代品;3.一旦人们发现这份工作是铁饭碗,进入门槛就会逐步抬高,成本会高到再进去的人已经得不到额外的好处)
最终产品的供需决定原材料成本(经济因果关系:供需影响成本,世界上并不存在合理的利润率和亏损率)
“租”是对资产的付费(定义:一份资源,如果它提供的服务跟它的收费没有关系的时候,它体现出来的就是租。)
寻租——乞丐没有白拿施舍
核心:竞争让静态格局变成动态格局,竞争逼着将旱涝保收的资本逐渐变成成本,让本来可以懈怠的做法(租),从长远看都要付出代价。
笔者总结:有同学说在国企工作,虽然工资不高却享受一定的租,看是一份难得的工作。薛教授就指出,需要估量潜在的工作机会,如果把自己看得很低,则目前是在享受这份工作的租,相反则是在付出成本。这句话是不是表示只要存在竞争,我们当前享受的租,实际就是未来需要付出的成本,换句话说完全享受租在竞争中是不可能存在的。就好比之前导演享受租的案例,假设他享受租而潜规则了女演员,而正巧是因为女演员导致电影在后续票房中失利,那这位导演是不是其实也是在为未来付出高额的成本?
2.3科斯定律
社会成本问题——伤害与被伤害(社会中有众多交互案例,一般看来都是一方在伤害另一方,都需要限制加害于人的一方)
社会成本问题——值得与不值得(所有的伤害都是相互的,是双方都在争夺稀缺的资源。在这样的事件中,谁避免伤害的成本最低,谁就应该承担最大责任,从而使得整个社会为避免意外要付出的总成本最小)
谁用得好归谁(科斯定律:只要交易费用足够低,无论资源归谁所有,资源的用途都应该是谁用的好就归谁)
越富足越健康(环保是双方或者多方在抢夺一些稀缺资源,需要从中取得一个平衡)
笔者总结:科斯定律其实在说资源分配,一当出现稀缺资源就会产生选择和歧视,那么这个时候把资源分配给能够更高效产出的人,其实社会所需要付出的代价也就是越小的。那么如果我资助学生的话,当然应该资助更聪明的那个,因为他对学习资源使用效率更高,而笨的学生可以尝试去务农、做手艺活,这样使得整体社会资源效率达到最优化。
2.4交易费用
有人群就有交易费用(凡是在一个人的社会里不存在,而多个人社会里存在的成本,就是交易费用,法院、律师、公证处、警察局都是高额的交易费用)
征地的权衡
寻求合作解(很多问题,不要讲理,要讲数,例如黄石公园,狼群的配比)
成本概念的递进:
(1)成本就是放弃了的最大代价(机会成本、非货币成本、时间成本、边际成本、沉没成本)
(2)产品价格与成本无关,是有供需决定的
(3)所有的盈利和亏损都是一次性的,因为资源使用价值、使用成本都发生了变化
(4)租的概念,如果预期收益不如当前收益,当前则在享受租
(5)社会成本引发科斯定律
(6)交易费用永远为正,交易费用也是成本
(7)交易费用越低越好
(8)所有的交易费用加起来,称为制度成本
(9)想象中的体制成本
3.需求的规律
4.价格的作用
5.权利的安排
6.耐心的回报
7.生产的规划
8.信任的建设
9.依存与对抗
10.公司的结构
11.竞争的逻辑
12.趋势与调控
13.政治与法律
14.读厚与读薄
16 Feb 2020
随着个人收入的增多,储蓄也是越来越厚。那么如何科学的进行理财,便是大多数人头疼的一件事情。这里用数学的方法给大家提供一个钱生钱的思路。
主要思路包括以下3个要点:
1.人为刀俎我为鱼肉,不要妄想靠钱生钱过日子
2.有人在桌子上分蛋糕,一定要坚定的坐上去
3.借助黄金比例分割,让自己吃得饱吃得好
· 人为刀俎我为鱼肉
1.你是个普通人,但在很多事情上你又觉得自己超过平均水平,投资也不例外,这时要调整心态,接受自己是普通人的事实。
2.对于普通人来说,投资不是为了进攻,而是为了防守,保证自己的钱不受通胀影响。
3.从收入结构来看,个人收入中有73%来自劳务所得,即使美国富豪也有50%来自劳务所得。
4.从成功概率来看,找到一份工作自食其力的成功率95%,中国失业率只有5%,反过来说靠钱生钱为生不到1%
总结:不要妄想靠钱生钱过日子,逆天改命最好的办法就是提升技能,把工作做得更好,步步攀升。
推荐阅读:《二战股市风云》
· 坐上桌子吃蛋糕
股市这张桌子一定要坐上去,不坐上就错过市场给所有玩家发的钱。但想要拿到这部分钱,需要有几个前提:
1.之前说到的,你有一技之长,你靠工作挣钱,而不是靠投资收益过日子。
2.投资用的钱是你自己的钱,也就是所谓的“长钱”。
3.这时候时间是你唯一的优势,却是基金经理的敌人。
4.找一只跟着大盘波动的股票,然后牢牢的坐上去,然后用屁股挣钱而不是手挣钱。
总结:选择那些均值回归、覆盖面广、经受时长考验时间长的指数,做定投。如果你还想优化,那就估值过高时减少定投,估值过低时增加定投。要注意,估值高低不是你拍脑袋想的,而是根据历史估值均值比较得出的。
推荐阅读:《不落俗套的成功——最好的个人投资方法》、《美国增长的起落》
· 黄金比例吃得饱吃得好
假设资金盘子大了,如何再防守的基础上再攻击一下——多元化的投资组合。世界上任何令人赏心悦目的事物,都是按照黄金比例0.618进行分割的,例如斐波那契数列、断臂的维纳斯、星云图等,因此按照0.618法则进行配比可以极大减少错误风险,即使发生风险也是在可承受能力范围内。
这篇博文写于2020年02月19日,2025年让我们拭目以待!
09 Feb 2020
《数学之美》读书笔记
“这个世界术语科学范畴的各种知识,它的底层逻辑几乎都离不开数学”
第一,数学的用处都有什么?
解决文字校验问题:
犹太人抄写圣经,每个希伯来字母都对应一个数字,每行或每列加起来就对应一个数(校验码)。
自然语言处理方法:
上世纪70年代,仿生学=>学会语法
(问题1语法太多,没办法穷举;问题2各语法之间存在矛盾之处)
现今:判断一个句子正不正确=>判断一个句子可能出现的大小=>计算一个句子是句子的概率
(马尔科夫假设:句子中每个词出现的概率,只和前一个词有关,例如涨停与股票,只要给机器量足够大的机读文本,计算机就能算出,在一个特定次后面出现某个词的概率,把一句话中的概率想成,就是这个句子出现的概率)
计算机新闻分类:
提取文本特征向量,借助余弦定理判断新闻的类别
技术分为道(做事的原理和原则)和术(做事的具体方法)
第二,数学为什么这么有用?
只有正确的数学模型,才能把一个大问题的计算复杂度降低,让它变得简单。而经验给我们的模型,常常是错误的,那由它总结出来的结论,也就是错误的。
数学能够帮助我们发现仅凭经验无法发现的规律,找到仅凭经验无法总结出来的办法,比如发现行星围绕恒星运转的试试,比如大幅优化全拼输入法。
第三,为什么说数学之美就是简单之美?
计算机的道:布尔代数(与、或、非)
谷歌早期算法根本没有系统的模型和理论基础,大部分软件工程师都靠直觉来解决问题。
书中有延伸阅读,教会读者如何用数学的方法看世界
《启示录》读书笔记
第一,如何定位开发团队成员的角色?
明确各自职责,才不会出现企业内耗的情况。
产品经理,评估产品机会、产品解决方案,确保产品价值
用户体验设计师:确保产品具有可用性
项目管理人员:制定计划和跟踪进度
运维团员:维护产品
产品营销人员:卖产品的人
第二,如何才能开发出一个受用户喜爱的产品?
方法分为四个阶段:
第一阶段评估产品机会与产品探索
1.产品要解决什么?(产品价值)
2.为谁解决这个问题?(产品受众人群)
3.成功的机会有多大?
4.怎样判断产品是否成功?
5.有哪些同类型产品?
6.为什么我们最适合做这个产品?
7.时机合适吗?
8.如何把产品推向市场?
9.成功的必要条件是什么?
10.根据以上问题,给出结论,继续或者放弃。
产品原则是团队信仰和价值观的总结,什么是重要的,什么是不重要的。
第一类:原则过于空泛,失去指导作用
第二类:误把设计原则当做产品原则
第二阶段用户研究
1.寻找特约用户
2.创建产品人物角色,产品通常会设计3~6个角色代表所有的用户群体。
第三阶段合理运用敏捷开发方法
用户需求进化为核心,采用迭代、循序渐进的方法进行软件开发。
第四阶段产品验证
在正式开发、部署产品前,验证产品需求文档中描述的产品是否符合预期要求。
1.可行性测试
2.可用性测试
3.价值测试
第三,用户喜爱的产品特性是什么?
产品情感化细节,成为产品与用户之间情感传递的桥梁(情感化设计)
产品可用性、美观
《俞军产品方法论》读书笔记
第一,什么是产品经理?
注重品牌营销:最早的产品经理其实是品牌经理,类似于卡玫尔香皂。
注重项目体验:20世纪90年代,计算机软件行业,B端用户需求相对明确,产品经理主要任务是通过与客户沟通,明确客户需求,再把客户需求转化为软件功能,推动研发进度和实施部署。
注重需求洞察:2012年,标准化工具是的产品经理入门门槛变得更低了。
产品大年需要突破认知边界,成为各学科领域的跨界高手,尤其是经济学、心理学等领域洞见。
抖音、快手、小红书等网红经济,一种以个人为节点的新连接方式崛起,他们所使用的互联网产品以及背后的产品经理,就是帮助他们匹配资源的高效“连接器”。这时产品经理实际成为了社会新基础设施的建设者。
第二,产品经理需要掌握什么样的知识模型?
两类重要模型:用户模型(合格线)和交易模型(进阶期)
用户模型:指用户的个人偏好和行为模式,经验集合而不是抽象公式(用户不是人而是需求的集合)
一个产品能满足用户在更多场景中的细分需求,就能增加用户使用产品的次数,也就相当于获得了更多的用户,实现用户增长。
积累用户模型,基于每个场景、每个行为背后的每次需求来思考。
交易模型:产品经理发现和设计的合理机制,他能够促成用户做出某种行为,且可持续。
第一,搞清楚各利益相关方在交易中的利害得失
第二,创造有利可图的用户价值
用户价值=新体验-旧体验-替换成本
产品经理不是追求用户价值最大化,而是有选择地创造有利可图的用户价值。
第三,产品经理的职业成长路线图是什么?
前5年,从新人到熟手的成长期,重要性排序:带你的人>业务>平台
产品能力:从0到1的能力,把一个细分场景做深做透的能力,以及兼顾各产品做宽做杂的能力。
5年之后,进入高阶阶段
顶尖产品高手,不要创业,加入C轮或D轮的业务
产品天赋一般,走管理路线
产品天赋一般,管理一般,选择TB业务长期耕耘
俞军产品经理12条:
1.产品经理首先是用户
2.站在用户角度看待问题
3.用户体验是一个完整的过程
4.追求效果、不做没用过得东西
5.发现需求,而不是创造需求
6.决定不做什么,往往比决定做什么更重要
7.用户是很难被教育的,要迎合用户,而不是改变用户
8.关注最大多数用户,在关键点上超越竞争对手,快速上线,在实践中不断改进
9.给用户稳定的体验预期
10.如果不确定该怎么做,就先学别人是怎么做的
11.把用户当做傻瓜,不要让用户思考和选择,替用户预先想好
12.不要给用户不想要的东西,任何没用的东西对用户都是一种伤害
《浪潮之巅》读书笔记
产业角度:
摩尔定律:计算机升级(晶体管5纳米极限)
更新迭代速度快,约18个月,例如网速、存储量
软件跟着硬件走
面向未来
安迪-比尔定律:
安迪给的比尔全要拿走
软件提升会逼着硬件性能提升
公司角度:
诺维格定律:当一家公司市场占有率超过50%,市场占有率不会翻翻,得找出新的市场
反摩尔定律(得18个月更新一次,才有可能获得收益)
方法:横向扩展、转型
基因定律:开阔新领域用习惯性的公司风格
09 Jan 2020
软件工程是北京大学在Coursera上发布的一套学习课程,该课程系统性的讲述了软件工程相关知识,有意向往数据产品经理发展的朋友可以学习一下。
课程介绍
知识结构:
软件开发本质=>软件生存周期过程=>软件生存周期模型=>项目生存周期过程(选择软件开发方法,例如结构化、面向对象,选择相应的支持和管理技术与方法)
课程内容安排:
1.软件工程概论:软件与程序的关系,如何从问题域中的问题,映射到运行平台上的软件。
2.软件过程:软件生存周期过程(软件开发有哪些活动),软件生存周期模型(如何组织这类活动)
3.软件需求与软件需求规约:需求定义、需求描述(产品需求文档),项目需求与软件需求区别
4.结构化分析:结构化分析的软件需求规约(产品需求约束文档)
5.结构化设计:软件体系结构设计(概要设计),设计每一模块内部的算法及数据结构(详细设计)
6.面向对象方法:UML概念,面向对象设计编程
7.敏捷开发方法:SCRUM
8.软件测试:软件测试方法及软件测试步骤
9.软件项目管理:项目管理目标、体系和框架
10.软件开发工具
参考书目:
《软件工程》北京大学
《软件工程》 Sommervile
《软件工程实践者的指南》Pressman
《面向对象的分析和设计》
《IT 项目管理》施瓦尔贝
《软件测试》Patton
软件工程概论
软件工程定义及特点
软件定义:程序+文档(软件需求规约、软件设计规约、软件测试文档);特定人群 or 特定市场开发
软件特点:无形的、不可见的逻辑实体;设计开发的、不是生产制造的 ;软件是复杂的;软件开发成本很高;软件易于复制;成本集中在软件测试和维护
软件种类:系统软件、支撑软件(平台软件)、应用软件
软件工程的起源和概念
微电子基础,计算机网络是载体,软件是核心
软件开发阶段:个人程序时期(硬件价格昂贵,软件作为附属品);软件作坊时期(高级程序设计语言,软件独立存在);软件工程(70年至今,危机:软件质量差、开发成本难以控制、维护费用很高)
软件工程定义:
应用计算机科学、 数学及管理科学等原理,以工程化方法制作软件的工程;
是用来建立和使用合理的工程原则,以经济地获取可靠的且在真实机器上可高效工作的软件;
将系统化、规范的、可量化的方法应用到软件开发中;
软件开发的本质和基本手段
软件开发本质:问题域=>需求层=>设计层=>实现层,自下而上的映射
软件开发基本手段:系统建模(从问题域中的概念和处理逻辑到需求分析和设计层次的概念和处理逻辑的映射)、应用框架(更好的设计软件)、设计模型(设计质量和效率)
软件工程框架
软件工程可定义为三元组:目标、活动、原则
软件工程目标:正确性,可用性(文档规范易读),开销
软件工程活动:需求(需求获取、需求定义、需求规约、需求验证)、设计(总体设计、详细设计)、实现(设计结果=>程序代码)、确认(整个开发过程,需求、设计复审)、支持(完善性、纠错性、适应性维护)等活动
软件工程原则:选择适宜开发模型、提供高质量工程支持、重视开发过程的管理
软件过程
软件生存周期过程的概念
软件开发有哪些活动,要做哪些映射?
应如何正确组织开发活动?
软件周期:从概念开始,历经开发、交付使用,在使用中不断修订、演化最终淘汰。
软件开发需要做什么:过程是活动的集合,活动是任务的集合,任务是把输入转化成输出的操作
软件生存周期过程的分类
ISO软件生命周期过程:基本过程(软件生产直接相关的活动集:开发、获取、维护)、支持过程(各方面人员、开发组织、客户)、组织过程(软件生产组织有关的活动集:管理)
基本过程:获取过程(定义客户要求的所需的产品);供应过程(供应商提供满足需求的产品);开发过程(软件需求转化为系统);运行过程(运行并测试);维护过程(纠错性修改、完善性修改)
开发过程:系统需求分析(哪些软件、哪些硬件)、系统结构设计、软件需求分析、软件体系结构设计、软件编码、测试、安装及验收
支持过程:文档、配置管理、质量保证、验证、确认(评价产品状态)、联合评审(评价活动/产品状态)、审计、问题解决
组织过程:管理、基础设施、人力资源、改进、资产管理、复用程序管理、领域软件工程
各类过程之间的关系:需求及供应方(获取、供应过程)、管理者(管理过程)、运行者(运行过程)、开发及维护者(开发/维护过程、支持过程、组织过程)
软件生存周期模型的概念
一个包括软件产品开发、运行和维护中有关过程、活动和任务的框架,覆盖从系统需求定义到系统使用终止
软件过程、活动、任务的结构框架。(过程是活动的集合、活动是任务的集合,任务是输入转化为输出)
常见的软件生存周期模型
瀑布模型:系统需求、软件需求、需求分析、设计、编码、测试、运行(P为真,Q为真,那么P且Q为真)
优点:
(1)存在需求阶段,鼓励对系统“做什么”进行规约
(2)存在设计极端,鼓励规划系统结构
(3)在每一阶段进行复审
(4)前一工作产品可作为下一步认可的基线
缺点:
(1)必须完整、清晰表达需求
(2)缺乏灵活性
(3)浪费文档资源
(4)直到项目结束前,都不能演示
增量模型:增量规约、增量设计、增量实现、纠错性分析
优点:
(1)第一个可交付版本成本和时间很少
(2)开发由增量小系统承担风险
(3)用户需求变更限制
(4)增量投资
缺点:
(1)初始增量可能造成后续不稳定
(2)需求早期不完整,增量重新开发、发布
(3)管理成本、进度、配置复杂
演化模型:需求不明确,先做一个小版本反馈修改需求,再做一个小版本反馈修改,以此迭代输出。
喷泉模型:无缝迭代,两个阶段无严格界限(例如面向对象需求分析、系统设计)
软件需求与软件需求规约
软件需求的定义?在项目开展过程中处于什么位置?怎么样去捕获需求?捕获需求过程中有哪些手段?捕获后的需求如何描述?
软件需求作用:控制作用,耦合作用,利用自身提供服务
系统分析=>系统设计=>系统测试=>系统集成测试
系统规约中分配给软件的需求,软件规约中的软件需求进行细化
软件开发:自顶向下(瀑布模型:需求=>规约=>解决方案=>详细设计=>编码=>测试)和自底向上(软件单元构件=>满足目标)
需求定义:一个需求呢是一个有关要义构造的这个陈述,包括功能、性能、设计约束
需求性质:必要的、无歧义的、可测的、可跟踪的(从一个开发阶段到另一个开发阶段可跟踪么)、可测量的
需求分类:功能、性能、外部接口、设计约束、质量属性
功能:功能需求是整个需求的主体;非功能需求对功能需求而言可以一对多
性能需求:规约一个系统具有的性能特性
外部接口:系统与系统构建之间交互的硬件、软件和数据库元素(包括系统接口:应用如何与其他系统进行交互;用户接口:软件产品与用户间交互;硬件接口;软件接口;通讯接口)
设计约束:限制系统设计方案
质量属性:可靠性、存活性、可维护性、友好性、安全性、可移植性
需求发现:自悟(用户视角)、交谈(提出问题、回答问题)、观察(执行任务的过程)、小组会(客户、开发人员联合会议)、提炼(需求陈述)、综合运用
需求规约的概念和格式:需求规约是软件产品正式文档,也是软件产品概念模型
基本性质:重要性和稳定性程度,可修改,完整的,一致的
需求规约格式:
引言:目的、范围、定义、参考文献、概述(项目范围)
总体描述:产品概念、产品功能、用户特性、约束、假设和依赖
特定需求:重要非功能性需求
附录和索引
需求规约作用:
(1)软件开发组织和用户之间的技术合同
(2)一个管理控制点
(3)一个正式、受控的起始点
(4)创建验收测试计划和用户指南的基础
软件测试计划:(单元测试:详细设计)=>(集成测试:总体设计)=>(有效性测试:需求分析)
用户系统操作描述:初步用户使用手册
项目需求及需求规约:项目范围
结构化分析
结构化分析方法概论:结构化分析方法(需求分析、需求规约)、结构化设计方法(总体设计、详细设计)、结构化描述方法
软件需求与需求规约的区别?获取到的需求叫软件需求陈述,需求规范性的描述叫做软件需求规约。
结构化分析模型:
基本术语:数据流、加工(数据变化的单元)、数据存储(数据静态结构)、数据源、数据潭
注:数据流、数据存储(数据抽象),数据源、数据潭(系统边界抽象)
模型表达工具:数据流图(DFD图,表达系统功能模型的工具,包括基本术语)、数据字典(定义数据流与数据存储,例:现金额=余额,销售文件={销售商品})、加工小说明(描述底层叶子加工,例如结构化自然语言:if 20<订票量 then 订票折扣为10%,判定表:类别、条件组合,判定树)
结构化分析过程:顶层数据流图(确立系统边界)=>自顶向下逐层分解=>建立数据字典>给出加工小说明
自顶向下:按人和部门的功能要求=>“分派”数据流=>引入文件,形成有机整体
数据字典:数据流、数据存储、数据项
加工小说明
注意:结构化分析方法是半形式化的规约方法,在表达上必须遵守一些约定
(1)模型平衡的问题(父图、子图边界一致,数据流、数据字典一致,叶加工与小说明一致)
(2)信息组织复杂性控制(上层数据可打包,一幅图应控制在7+-2以内)
需求规格说明书:引言、概述、数据流图、数据字典、加工小说明、接口、性能需求、属性、其他需求
引言:编写目的(需求说明书的编写目的),背景说明(待开发软件名称、本项目提出者、开发者及用户、软件将做什么、不做什么),术语定义(领域相关术语),参考文献
概述:功能概述(待开发产品主要功能)、约束(对系统设计产生影响的限制条件,管理模式、硬件限制、安全等),数据流图与数据字典加工说明
数据字典:文件说明、数据项说明
接口:用户接口、硬件接口、软件接口
性能需求:精度(输入及输出数据精度)、时间特征(响应时间、更新处理时间)、灵活性(操作环境、运行环境、时间特征)
属性:可使用性、保密性、可维护性、可移植性
数据库:数据库、操作、故障及处理
需求验证: 正确性、无二义性、完整性、可验证性、一致性、可理解性、可修改性、可跟踪、可被跟踪、设计无关性、注释
结构化设计
结构化设计概念:一种软件开发活动,定义实现需求规约所需的软件结构,包括总体设计(概要设计)和详细设计。
总体设计:体系结构设计(包括哪些模块、模块之间的关系)、接口设计(外部接口、内部接口)、数据设计
详细设计:模块内部设计(算法和数据结构)
总体设计阶段:初始设计(将DFD转化成MSD);精华设计(高内聚低耦合);设计复审
初始模块结构图设计:
数据流图分类:变化型DFD(物理输入/输出需要进行转换),事务性DFD
变化设计基本步骤:设计准备(复审并精化系统模型),确定输入、变化、输出三部分界限,第一层分解(系统模块结构图顶层和第一层设计),第二层分解(自顶向下,逐步求精)
事物设计基本步骤:设计准备(复审并精化系统模型),确定事物处理中心,第一级分解,第二级分解
初始模块结构图精华原则:模块、模块化、高内聚低耦合
模块(执行一个特殊任务的一组例程和数据结构)和模块化(把系统分解成若干模块的过程)
基本原则:高内聚(一个模块之内各成分之间相互依赖程度,由低到高:偶然内聚、逻辑内聚、时间内聚、过程内聚、通信内聚、顺序内聚、功能内聚)、低耦合(不同模块之间相互依赖程度度量,由强到弱:内容耦合、公共耦合、控制耦合、标记耦合、数据耦合,尽量使用数据耦合,少用控制耦合,限制公共耦合,避免内容耦合)
初始模块结构化精细启发式规则:高内聚、低耦合;模块最好能够写在一页内(60行);进一步分解过大模块,频繁调用小模块到上级中;深度、宽度、扇入(表示有多少个上级模块直接调用)和扇出(一个模块直接控制下级模块数目)适中;
输入部分精化、输出部分精化(将相似或类似的物理输出合并为一个模块)、变化部分精化(根据设计准则,根据实践经验)
接口设计:内部接口设计、外部接口设计,穿越系统边界的数据流定义
人机交互界面:必须根据需求把交互细节加入到用户界面设计中,包括人机交互所必须的实际显示和输入。
用户界面特性:可使用性(简单、界面一致、help帮助、快速系统响应、低系统成本、具有容错能力)、灵活性(满足不同的用户要求)、可靠性(无故障使用的间隔时间)
用户类型:外行型、初学型(需要很多界面支持)、熟练型(需要较少界面,不能处理意外错误)、专家型(需要为他们提供能够修改和扩充系统能力的复杂界面)。
界面设计类型:使用的难易程度、学习的难易程度、操作速度、复杂程度、控制、开发的难易程度。
设计原则:一致性、操作步骤少、不要“哑播放”(表明系统运行)、提供Undo功能(回溯功能)、减少人脑的记忆负担、提高学习效率(help帮助格式设计)
数据格式设计:文件设计、数据库设计
文件设计:数据量大非结构化数据、数据量大信息松散(历史记录、档案文件)、非关系层次数据(系统配置文件)、对数据存储速度要求极高
数据库设计:数据对象映射、关系的映射
详细设计工具:定义每一个模块
结构化程序设计概念:一个程序代码块仅通过顺序、选择和循环3种基本控制结构进行连接,并且每个代码块只有一个入口和一个出口。
伪代码:外部采用形式语言定义控制结构和数据结构,内部使用自然语言
程序流程图:顺序、选择、循环
PAD图:顺序、选择、循环(支持逐步求精设计:def)
N-S图(盒图):顺序、选择、循环(支持自顶向下逐步求精)
判定表、判定树
软件设计规约:对软件组织或其组成部分内部结构描述,满足系统需求规约所指定的全部功能和性能需求。
概要设计规约:系统环境(硬件、软件接口和人机界面、外部定义数据库、设计有关的限定条件)、设计描述(数据流、模块结构、模块接口)、对每个模块的描述、文件结构和全局数据、软件测试方面要求和说明(集成测试)
详细设计规约:对软件各组成部分内部属性描述,概要设计的细化,软件设计人员与程序员之间交流的媒体。
设计规约格式:
引言:编写目的、背景说明、术语定义、参考资料
总体设计:需求规定、运行环境、处理流程、软件结构(在DFD图基础上,用模块结构图来划分)
运行设计:运行模块组合、运行控制
系统出错处理:出错/故障状况、出错处理方法及补救措施(后备技术、性能降级、恢复和再启动)
模块设计说明
结构化设计方法总结:一切系统都是由信息流组成的,每个信息流都有自己的起点-数据源,归宿-数据潭,有驱动信息流动的加工。
基本原则:自顶向下功能分解、数据抽象、功能/过程抽象、模块化
结构化方法是一种系统化的软件系统建模方法,例如:需求分析层=>设计层=>实现层
软件设计评审:
软件设计评审方法:非正式评审、正式技术评审
软件设计评审指南:概要设计评审、详细设计评审分开来做,建立一个议事日程,评审设计文档,评审提出问题应详细记录。
概要设计评审检查表:软件体系结构是否反映软件需求?模块功能独立?模块与外部接口定义?数据结构与软件需求一致么?考虑系统可维护性?是否直接评价了质量因素?
详细设计评审检查表:算法能否完成功能?算法逻辑正确?接口与体系结构设计一致?逻辑复杂性合理么?错误处理与反错误处理?
面向对象概念
面向对象的概念:以对象,对象之间关系构造软件的系统化的方法(面向对象的设计方法),包括:UML统一建模语言、USDP统一软件开发过程。
面向对象不仅是一种程序开发方法,面向对象是一种软件方法学。
例如:现实世界看到一辆车,计算机世界发动机、底盘、开关车门、启动…
面向对象方法主要特点:系统基本构成单位(对象),对象具有静态特征(属性),动态特征(操作)
对象属性和操作合为一体,构成一个独立的实体(封装)
对事物进行分类,相同属性相同操作封为一类
通过不同抽象原则,较多或较少忽视事物之间的差异
复杂的对象可以用简单的对象聚合
对象之间只能通过消息进行通信
用关联表达类之间的静态关系
基本思想:从现实世界中客观存在的事物出发建立软件系统;充分运用人类日常的思维方法。
面向对象方法意义适合解决分析与设计期间的复杂性并实现分析与设计的复用。
学习内容:
1.基本知识:概念、分析设计原则
2.面向对象分析(OOA)
3.面向对象设计(OOD)
4.面向对象程序设计(OOP)
UML概念:可视化语言,规约系统的制品(UML适用于对所有重要的分析、设计和实现决策进行详细描述),构造系统的制品(UML描述的模型可与各种编程语言直接关联)
需求获取层(USE-CASE图)
需求分析层(类图、交互图)
设计层(类图、交互图)
面向对象方法术语/符号:表达客观事物的术语、客观事物相互影响的术语
表达客观的术语表——类:类与对象,体现数据抽象
类:一组具有相同属性、操作的对象的描述;
对象:对象是类的一个实例;
属性:类的一个静态特征,属性相同属性值可不同;
操作:一个类所有对象要做的事情得抽象;
表达客观事物术语——接口和其他
接口:模型化系统中的“接缝”,接口只能被其他类目使用,而本身不能访问其他项目
协作:一组类、接口和其他元素的群体,共同工作以提供比各组成部分总和更强的合作行为。
用况:是对一组动作序列的描述
主动类:一种至少具有一个进程或线程的类
构件:系统中逻辑可替换的部分
制品:
节点:物理元素
基本模型化元素:接口、协作、用况、主动类、构件、制品、节点
类的变体:参与者、信号、实用程序
主动类的变体:进程和线程
制品的变体:应用、文档、库、页和表等
在UML中,把以上结构化概念统称为类目
控制复杂性术语——包
包之间关系:访问依赖、引入依赖(较多,第三个包引入源包,但不能够输出)
对成组的元素建模策略
表达关系的术语
关联:一组具有相同结构、相同语义的量,包括关联名、角色名、多重性、聚合(组合)、限定符
泛化:一般性事物和特殊父类
实现(细化):类目之间的一种语义关系
依赖:用于描述一个事物使用另一个事物的信息和服务,有向虚线表示
UML基本关系的一般用法:
模型化简单依赖:一个类与另一个人就一种关系
模型化单继承:一组类,共同责任、属性和操作放到一个层次中,画出泛化关系
模型化结构关系:标识关联、标识的每一个关联添加描述、标识“整体/部分”
UML关系遵循策略:
仅当要建模的关系不是结构关系时,才使用依赖
仅当是“is-a-kind-of”关系时,才使用泛化
一般不要引入循环的泛化关系
应保持泛化关系的平衡,继承层次不要多深,不要多宽
UML的模型表达工具概述
系统静态部分建模工具:系统相对稳定的骨架,例如房屋的静态方面是墙、门、窗户等组成
一共有6种静态部分建模工具
类图:显示类、类的内部结构及与其他类的关系,最重要的工具
构件图:表达了系统有哪些构建,构建有哪些依赖关系
组合结构图:类和协作内部结构
对象图:一组对象及对象之间的关系,事物实例包含的数据结构
部署图:运行时要处理节点及制品的对应关系
制品图:一组制品之间的依赖关系
系统动态部分建模工具 :系统变化的部分,如房屋动态包含了气流和人在房间走动。
一共有7种动态部分建模工具
用况图:需求模型
状态图:对象状态及对象状态间转移关系
活动图:从活动到活动控制流,特别像流程图,例如用户业务流程
顺序图:消息的时序,对象之间的交互情况
通信图:注重哪些对象之间有交互关系
交互概率图:非常少,描述用户宏观行为
定时图:消息跨越不同对象角色实际的时间
UML的模型表达工具——静态工具-类图:显示类、类的内部结构及与其他类的关系,最重要的工具
类图作用:可视化的表达系统的静态结构模型
类图内容:类、接口、依赖、泛化和关联关系,还包含注解、约束以及包和子系统
类图用法:
1.对系统中的概念建模,形成类图中的基本元素
2.对待建系统中的各种关系建模,形成该系统的初始类图
关联关系
依赖关系是使用关系,类与类之间具有操作关系
泛化关系“is-a-kind-of”关系,特殊类继承一般类
3.模型化系统中的协作,给出该系统的最终类图
UML的模型表达工具——动态工具-用况图:对行为的抽象
用况图内容:主题、用况、参与者、依赖、泛化、关联
用况图术语:例如做一次拼写检查、对一个文档建立索引
1.是系统分析和设计阶段的输入之一
2.是制定开发计划、测试计划的依据之一
3.可以划分系统与外部实体的界限
参与者:可以是人或其他的软硬件
关系:关联关系(操作者和use case之间唯一联系),扩展、包含、泛化
用况图使用:
1.对系统语境建模:任意一个系统,均有其内部事务和外部事务
基本策略:
(1)区分系统内部和外部执行者,划分系统边界,并定义主题
(2)考虑谁需要得到系统帮助,谁执行系统功能,系统与哪些硬件交互,谁负责进行维护
(3)将相似的参与者放到一个结构中
(4)需要加深理解的地方,提供一个衍型
2.对需求建模:
基本策略:
(1)标识参与者建立语境
(2)考虑每个参与者系统提供的功能、行为
(3)分解公共行为,形成必要泛化关系
(4)模型化用况图中各种关系
(5)通过注解和约束给出非功能需求
UML的模型表达工具——动态工具-顺序图:交互图,一组对象以及这些对象之间的关系组成
顺序图内容:对象生命线、消息、控制结构
顺序图控制类型:选择执行、条件执行、并发执行、迭代执行
UML的模型表达工具——动态工具-状态图:强调一个状态到另一个状态的控制流
状态图包含:简单状态和组合状态、事件、转换
状态规约:命名、事件(内部事件、外部事件)、效应、目标状态
状态图用法:
1.建立一个系统动态方面的模型
2.建立一个场景的模型
UML总结:
UML作用:
1.从上到下,问题和解之间、产品与开发之间认知保持一致
2.提供相应的模型表示工具
需求描述:use case图
需求细化:类图(静态组织结构)、交互图(顺序图,对象间复杂关系)、活动图、状态机图(状态之间的关系)
具体来看:
8个基本术语:类、接口、协作、用况、主动类、构件、制品、结点(过程抽象、数据抽象)
关系4种术语:关联、泛化、细化、依赖,以及一些变体
控制信息复杂性:包
可使用注解、约束进行辅助说明
面向对象分析与设计
面向对象分析概述:OOA对问题域和系统责任进行分析和理解
OOA模型:需求模型(用况图)=>基本模型(类图:对象层、特征层、关系层)=>辅助模型(包图、顺序图、状态图)
OOA过程:定义use case=>发现对象=>定义属性与操作=>建立对象之间的关系=>划分包=>建立顺序图、状态机图、活动图等
识别类:
1.研究问题域和用户需求
(1)研究用户需求,明确系统责任
(2)研究问题域
(3)确定系统边界
2.策略和启发
(1)考虑问题域:人员、组织、物品、设备、抽象事物、事件、文件、结构
(2)考虑系统边界:启发分析员发现一些系统边界以外的参与者,包括人员、设备、外系统
(3)考虑系统责任:每一项需求是否有相应的对象提供
3.审查与筛选
(1)舍弃无用的对象:通过属性判断、通过操作判断
(2)对象的精简:只有一个属性的对象、只有一个操作的对象
(3)与实现条件有关的对象
4.识别主动对象
5.对象分类,建立类图中的类
(1)对象分类
(2)异常情况的检查和调整
识别属性和操作:
识别属性:
1.策略与启发
按常识这个对象应该有哪些属性,例如人的姓名、职业
当前域,对象应该有哪些属性,例如商品条形码
根据系统责任,这些对象需要有哪些属性,例如持卡人地点
对象为了实现操作,需要增设哪些属性?
2.审查与筛选
是否体现了以系统责任为目标的对象
是否描述对象本身的特征
是否破坏了对象特征的原子性
是否可通过继承得到
可以从其他属性中导出属性
3.与实现条件有关的问题都推迟到OOD考虑
4.属性的命名
5.属性的详细说明
识别操作:
1.区分对象行为的类型 :系统行为、读写属性值、复杂操作计算
2.发现操作的策略与启发:考虑系统责任、问题域、分析对象状态、追踪操作的执行路线
3.审查与调整:是否真的有用(取消无效操作),是不是高内聚(拆分、合并)
4.认识对象的主动行为:考虑问题域,与系统外界进行交互的对象操作
5.操作的命名和定位
6.操作的详细说明:文字解释、操作名、输入及输出、消息发送、约束条件、操作流程
识别对象之间的关系:
识别继承(泛化):
1.策略:当前领域的分类学知识,按常识考虑事物的分类,使用继承的定义(把每个类看作是一个对象集合,或者看一个类是不是具有另一个类全部的特征),考察属性和操作的适用范围,考虑领域范围内的复用
2.审查与调整:问题域中是否需要这样的分类,系统责任是否需要这样的分类,是否符合分类学的常识
3.继承关系的简化
4.调整对象层和特征层
识别关联:
1.策略
2.命名与定位命名:关联可用动词或动宾结构命名
3.调整对象层和特征层
识别聚合:
1.策略
2.审查和筛选
3.调整对象层和属性层
识别依赖:依赖是一种使用关系,用于描述一个事物使用另一事物的信息和服务。
面向对象的设计概述:OOD模型四个部分:问题域部分、人机交互部分、控制驱动部分、数据接口部分
目的是产生一个符合实现要求的面向对象的设计模型,提高软件生产效率和软件质量
面向对象分析是考虑做什么,面向对象的设计是考虑怎么做
面向对象分析考虑是问题域和系统责任,面向对象设计进一步考虑与实现有关的因素
OOD:按实现条件对OOA模型进行调整,并补充几个新的组成部分(也是由对象构成)
与实现相关:图形用户界面、硬件、操作系统、数据管理
OOA与OOD是调整和增补,不是简单的细化关系
问题域部分的设计:在OOA模型基础上,按实现条件进行必要的修改、调整和细节补充
为什么?
1.OOA只考虑问题域和系统责任,OOD则考虑具体实现有关的问题;
2.稳定部分和可变部分分开
3.有利于不同的设计与实现
4.使一个成功的系统具有其超过生存期的可拓展性
怎么做?
(1)为复用设计与编程的类而增加结构(尽可能复用的成分多,新开发的成分少)
(2)增加一般类以建立共同协议
(3)按编程语言调整继承和多态
(4)提高性能
(5)为实现对象永久存储所做的修改
(6)为编程方便增加底层细节
人机交互部分的设计:满足人机交互基本需求,同时让人具有更好的体验感
OOA:人机界面反应需求
OOD:设计人机交互的细节
1.使用人员的细化
区分人员的类型:熟练程度、职业、与系统关系、年龄
统计各类人员的比例
2.输入输出的细化
3.容错性的考虑
4.体验感好的用户界面
控制驱动部分的设计:是OOD模型组成部分之一,该部分由系统全部主动类构成
数据管理部分的设计:是OOD模型中负责与具体数据管理系统衔接外围的组成部分
1.选择数据管理系统
2.数据存放设计
为了存储自己,对象要知道:本类对象属性数据结构;本类对象对应哪个数据库表;对象实例对应数据库表的哪一行
面向对象编程:OOPL
如何选择编程语言?语言选择从实际出发,提供类和对象,提供封装机制
C++是一种混合OOPL,保持C语言高效、可移植
JAVA纯面向对象
敏捷开发
敏捷开发概念:是一种应对快速变化的需求的一种软件开发能力,强调程序员团队和业务专家之间、客户与团队之间的紧密合作,需要简洁的开发和设计。
敏捷联盟:个体和交互胜过过程和工具;可工作软件胜过面面俱到文档;客户合作胜过合同谈判;响应变化胜过遵循计划;
敏捷原则:获取有质量软件的理念;关于态度的声明;项目规划的理念(交付时间短);团队组成和精神问题(业务+研发);激励开发人员;获取开发信息的途径;进度度量的概念;项目“持续发展”的能力(反对快速拖向疲倦,保持恒定持续开发速度);提高敏捷能力(设计能力);自我调整和适应;
极限编程:XP通过一系列的实践去落实这样一个过程。
极限编程包含的实践:
(1)客户作为团队的成员,定义产品的特征,并对这些特征进行排序
(2)“用户素材” 一种规划工具
(3)短的交付周期
(4)验收测试
(5)结对编程
(6)测试驱动开发
(7)集体所有权(新代码与已有代码合并;和检入的程序员进行协商)
XP编程过程:包含策划(用户故事、验收测试标准)、设计(开发人员+客户:简单的CRC)、编码(结对编程、连续集成)、测试(单元测试、验收测试)4个阶段
敏捷设计:
避免问题:僵化性(难以对软件设计进行改动)、脆弱性(改动一个地方,其他地方出现问题,高耦合)、粘固性(设计难以复用)、粘滞性(软件、环境)、不必要复杂性、不必要复制
基本途径:
1.不需要一个完全成熟的初始设计,尽量简单的设计
2.团队通过多次单元/验收测试反复对设计进行优化
3.设计有一个持续改进的过程
敏捷过程模型Scrum:
Scrum三个阶段:规划纲要阶段;一系列的冲刺循环;项目结束总结项目;
Scrum过程流:30天内完成,待定项(为用户提供商业价值的项目需求)、冲刺(达到待定项所需的一些工作单元)、演示(向客户交付软件增量)
重要性:强调中间小组会议的控制,强调对于整体工作的划分,从而控制整个项目的复杂性。
项目管理
项目管理的概念:有开始结束时间,独特的生命周期,有自己的目的,项目包含不确定性。
《现在可以说了》曼哈顿计划:组织管理、人员配备、工程建设、保全保密措施、军事和科技情报
CPM关键路径法、统筹法=>PERT(引入风险分析,最乐观、最悲观、正常)
项目管理的定义:在项目活动中运用专门的知识、技能、工具和方法,使项目能够实现或超过项目干系人的需要和预期。
项目管理的框架:范围、时间、成本、质量、人力、沟通、风险、采购
项目干系人:项目经理、客户、执行组织、团队、赞助者、竞争对手
知识领域:核心(范围、时间、成本、质量),辅助(人力、沟通、风险、采购),整体管理(项目计划制定、计划执行、整体变更控制)
管理工具和技术:WBS工作分解结构、甘特图、网络图值法、净值图、关键路径法
项目管理要素:范围、进度、成本、质量
项目生命周期:概念期、开发期、实施期、验收期
软件项目管理的概念:项目全过程和相应管理内容
管理工具和技术:集成管理:项目管理软件、变更请求,四大核心(范围:范围说明、工作分解结构、需求分析、时间:甘特图、成本:净限值、质量),人力资源,沟通,风险,采购
CMM和ISO9000
CMM概念:软件质量包括人员、技术设备、软件过程(持续)
CMM是软件能力成熟度模型,软件过程的评估模型
CMM基本内容:整个软件任务可以看做是一个过程,该过程可以予以控制、测量和改进。
CMM基本概念:
过程:通过该手段把人、规程、方法、设备以及工具进行集成
过程能力:高过程:定义了过程、开发管理遵循一个确定路径、过程得到很好的控制、过程制度化并不断改进
过程性能:一个是能够实现预期结果的程度,一个是得到实际结果;一个项目的实际过程性能,并不充分反应组织过程能力
过程成熟度:一个特定软件过程被明确和有效定义、管理、测量和控制的程度
组织成熟度
能力成熟度
CMM五级标准:初始级=>可重复级(严格过程)=>已定义级(标准的过程)=>已管理级(可预言的过程)=>持续优化级(持续改善)
初始级:没有提供开发和软件维护的稳定环境,过程能力不可预测
可重复级:软件项目有效管理过程制度化,组织可重复以前项目中的实践,过程能力可重复、基本可控、有效、稳定的、有纪律的
实现关键过程域:软件配置管理、软件质量保证、软件子合同管理、软件项目跟踪和监督、软件项目规划、需求管理
已定义级:过程域:过程焦点、过程定义、培训大纲、集成软件管理
定量管理级:定量过程管理和软件质量管理,过程能力:可预言、受控稳定、可定量估计、可定量预测
持续优化级:缺陷预防、技术变化管理、过程变化管理
ISO9000标准:质量保证体系,用于实现质量管理的组织结构、责任、规划、过程和资源
ISO9000标准是独立开发的,与CMM相比是一种完全不同的控制软件过程质量的途径。
ISO9000核心过程:产品交付过程(业务获取、设计和开发、测试、生产和交付、服务和支持),支持过程(业务管理、供应商管理、库存管理、配置管理)
软件测试
软件测试的概念:检测和评价软件,以确定其质量的过程和方法。软件测试可分为静态分析(检查和审阅)和动态测试(运行和使用软件)
软件测试的目标:预防错误、发现错误(未达到说明书的功能、说明书上指明的错误、超出说明书范围、虽未指出但应达到的目标、最终用户认为不好)
软件调试与软件测试区别:
(1)测试证明程序员“失败”,而调试是为了证明程序员正确;
(2)测试以已知条件开始,预先定义程序,预知结果;
(3)测试是有计划的;
(4)测试是一个发现、修改、重新测试过程;
(5)测试执行有规律;
(6)测试由测试组独立完成;
(7)大多数测试执行和设计可由工具完成;
软件测试过程模型:环境(硬件、固件、软件)、被测对象(控制结构-白盒测试,处理过程-黑盒测试)、错误模型(统一认识,定义什么是错误)
关键性概念:错误、失效、故障(一个或多个错误表现)
软件测试原则:
(1)所有测试都应该追溯到用户需求;
(2) 测试工作开始前,要进行测试计划的设计;
(3)测试应从小模块开始,逐步转向大规模;
(4)穷举测试是不可能的;
(5)为了尽可能发现错误,应由独立第三方来测试;
(6)测试只能保证尽可能发现错误,无法保证能够发现所有错误;
白盒测试:结构测试或逻辑驱动测试,检测产品内部动作是否按照规格说明书的规定正常运行。
(1)建立被测对象模型:控制流程图
(2)路径测试,严格限制所有可能的入口/出口路径
(3)语句测试:至少执行程序中所有语句一次
(4)分支测试:至少执行程序中每一分支一次
(5)条件组合测试:设计足够测试用例,使每个判定中所有可能条件取值组合至少执行一次。
语句覆盖<分支覆盖<条件组合覆盖<路径覆盖
(6)循环测试:主要功能路径、没有功能路径、最短路径
黑盒测试:功能测试或数据驱动测试,已知产品所应具有的功能,通过测试来检测每个功能是否正常使用。
测试方法:等价类划分、边界值分析、因果图、错误推测等,主要用于软件确认测试。
五大错误:功能不对或遗漏;界面错误;性能错误;初始化终止错误;数据结构或外部数据访问错误
事物流测试:用户角度所见的一个单元,步骤:获取事物流程图,浏览与复审,用例设计,测试设备开发,测试执行,测试结果比较
等价类划分:等价类、有效等价类、无效等价类,为每一个等价类规定唯一的编号;设计一个新的用例,使其尽可能多的覆盖尚未覆盖的有效等价类;设计一个新的用户,使其仅覆盖一个尚未覆盖的无效等价类(一个错误只对一个);
边界值分析:边界值和超出边界值测试、第一个元素和最后一个元素
软件测试步骤:单元测试(采用白盒技术,参考详细设计文档)、集成测试(参考总体设计文档)、确认测试(采用黑盒技术,有效性测试,参考定义文档)、系统测试
单元测试:在代码编写完成后完成单元测试计划;代码审查(checklist);静态测试(代码走查);动态测试(单元测试用例);执行单元测试;书写《缺陷跟踪报告》;书写《测试总结报告》;
集成测试:各模块链接,穿越模块接口数据是否丢失;一个模块功能是否对另一个模块功能产生影响;各子功能组合能否达到预期要求父功能;全局数据结构是否有问题;单个模块误差累加是否达到不可接受;
确认测试:验证软件有效性测试、软件配置审查、用户验证测试
系统测试:功能测试、恢复测试、安全性测试、强度测试、性能测试、可用性测试、部署测试
软件开发工具
软件开发工具及环境定义:计算机辅助软件工程CASE=软件工程+自动化工具
CASE狭义:一类特殊的软件工具,用于辅助开发、分析、测试、维护另一计算机程序或文档
CASE广义:除OS外所有软件工具的总称
CASE工具:工具(编辑器、编译器、文件比较器)、工作台(分析和设计、编程、测试)、环境(集成环境、以过程为中心环境)
工作台:程序设计工作台、分析工作台、测试工作台
软件开发环境SED与软件开发环境SEE
工具集成模型:
1.五级模型:平台集成、数据集成、表示集成(用户界面集成)、控制集成(工具之间相互调用)、过程集成(过程活动、约束和支持活动所需的工具)
2.APSE模型:基本上是一个程序设计工作台
3.层次模型:根据项目需要,提供不同支持,则环境需要接纳更多的case工具
平台服务:文件服务、进程管理服务、网络通信服务、窗口管理服务、打印服务
框架服务:建立在平台服务至上,支持CASE工具集成,包括数据仓库服务、数据集成服务、消息服务、用户界面
4.PCTE模型
常用的软件开发工具及环境:
主流应用软件:桌面应用、web应用、移动应用、其他工程领域
主流软件开发平台:windows,linux,安卓,ios
05 Jan 2020
1. 什么是中国经济的基本盘
论点:我辈正在处于一个持续上升的经济通道中
论句:
(1)容易赚的钱没有了,往后大家得做更辛苦的事情(改造传统产业)
(2)市场人口换代,有人还在刻舟求剑(改革开放之后的人口,超过改革开放之前的人口)
(3)典型的“悖论之年”(同时看到两个好的和坏的方面)
(4)不是克服困难,而是习惯困难(从电梯模式到攀岩模式)
报告:《中国经济报告》何帆
超大规模=>复杂性=>好时代的标志:走在街上不敢小瞧任何一个人的时代
苟且红利=>找到任何一个小抓手
预测未来的最好方法,就是把它创造出来
2. 中国的消费市场到底有什么机会?
论点:中国即将成为全球第一大消费市场
论句:
最大的供给、最大的需求、最快的效率提升(经济现象、经济物种的大爆发)
报告:《中国消费产业报告》黄海
多点爆发(年轻人和老年人消费、高端和低端消费)
机会一:中国新基础设施带来的红利(所有放心交给别人干的事情,物流成本、就地致富)
机会二:中国红利(所有的消费品类,都有机会让中国红利再做一遍)
机会三:世界级品牌(品牌,你愿意跟他自拍就是品牌,建设品牌,建设一组最真实的社会关系)
利用中国红利和新基础设施,创造一个世界级品牌
3. 钱从哪里来?
论点:一年可支配收入,73%来自劳动所得。
论句:
有钱人都是因为胡乱投资把自己搞破产的。
凭运气转来的钱,全凭实力亏光。
三个当家人(人际关系的连接能力),一门穷亲戚(人际关系的扩展能力)
不要辜负这个时代给女性的机会(“脱不花”女性连接人和人的能力)
报告:《中国财富报告》香帅
钱从自己的劳动中来(73%劳动所得)
钱从人与人的连接来(人和人连接的财富机会,人和人决定社会财富的创造、分配和转移)
五层嵌入能力:你是谁?你干啥?你为谁干?别人需要你么?社会更好了么?
4. 教育在发生什么变化
教育与焦虑
世界不是按照领域来划分的,而是围绕挑战组织起来的
跨组织的“翻译”和整合
5. 中国科技创新下一步?
报告:《创新生态报告》王煜全
中国公司的技术存在感在持续增加
创新不是向上取经,而是全球编程
中国制造有规模,有速度(物流速度),成本控制能力,分工
竞争意识损害竞争力
微观层面的互动,决定真实世界的样子
6. 中国制造的优势会消失么?
报告:《中国制造报告》施展
结束:迎接我们的2020年
跟上这个时代,跟上这群人。
一个人的梦想只是梦想,一群人的梦想就能成真。
04 Jan 2020
预备知识:
1.手工计算一个神经网络
2.Python手工编写神经网络算法
实验数据:
训练集mnist_train_100
测试集mnist_test_10
· 手工编写一个神经网络
import numpy
# scipy.special for the sigmoid function expit()
import scipy.special
# library for plotting arrays
import matplotlib.pyplot
# ensure the plots are inside this notebook, not an external window
%matplotlib inline
# neural network class definition
class neuralNetwork:
# initialise the neural network
def __init__(self, inputnodes, hiddennodes, outputnodes, learningrate):
# set number of nodes in each input, hidden, output layer
self.inodes = inputnodes
self.hnodes = hiddennodes
self.onodes = outputnodes
# link weight matrices, wih and who
# weights inside the arrays are w_i_j, where link is from node i to node j in the next layer
# w11 w21
# w12 w22 etc
self.wih = numpy.random.normal(0.0, pow(self.inodes, -0.5), (self.hnodes, self.inodes))
self.who = numpy.random.normal(0.0, pow(self.hnodes, -0.5), (self.onodes, self.hnodes))
# learning rate
self.lr = learningrate
# activation function is the sigmoid function
self.activation_function = lambda x: scipy.special.expit(x)
pass
# train the neural network
def train(self, inputs_list, targets_list):
# convert inputs list to 2d array
inputs = numpy.array(inputs_list, ndmin=2).T
targets = numpy.array(targets_list, ndmin=2).T
# calculate signals into hidden layer
hidden_inputs = numpy.dot(self.wih, inputs)
# calculate the signals emerging from hidden layer
hidden_outputs = self.activation_function(hidden_inputs)
# calculate signals into final output layer
final_inputs = numpy.dot(self.who, hidden_outputs)
# calculate the signals emerging from final output layer
final_outputs = self.activation_function(final_inputs)
# output layer error is the (target - actual)
output_errors = targets - final_outputs
# hidden layer error is the output_errors, split by weights, recombined at hidden nodes
hidden_errors = numpy.dot(self.who.T, output_errors)
# update the weights for the links between the hidden and output layers
self.who += self.lr * numpy.dot((output_errors * final_outputs * (1.0 - final_outputs)), numpy.transpose(hidden_outputs))
# update the weights for the links between the input and hidden layers
self.wih += self.lr * numpy.dot((hidden_errors * hidden_outputs * (1.0 - hidden_outputs)), numpy.transpose(inputs))
pass
# query the neural network
def query(self, inputs_list):
# convert inputs list to 2d array
inputs = numpy.array(inputs_list, ndmin=2).T
# calculate signals into hidden layer
hidden_inputs = numpy.dot(self.wih, inputs)
# calculate the signals emerging from hidden layer
hidden_outputs = self.activation_function(hidden_inputs)
# calculate signals into final output layer
final_inputs = numpy.dot(self.who, hidden_outputs)
# calculate the signals emerging from final output layer
final_outputs = self.activation_function(final_inputs)
return final_outputs
· 训练这个神经网络
# number of input, hidden and output nodes
input_nodes = 784
hidden_nodes = 200
output_nodes = 10
# learning rate
learning_rate = 0.1
# create instance of neural network
n = neuralNetwork(input_nodes,hidden_nodes,output_nodes, learning_rate)
# load the mnist training data CSV file into a list
training_data_file = open("d:/mnist_train_100.csv", 'r')
training_data_list = training_data_file.readlines()
training_data_file.close()
# train the neural network
# epochs is the number of times the training data set is used for training
epochs = 5
for e in range(epochs):
# go through all records in the training data set
for record in training_data_list:
# split the record by the ',' commas
all_values = record.split(',')
# scale and shift the inputs
inputs = (numpy.asfarray(all_values[1:]) / 255.0 * 0.99) + 0.01
# create the target output values (all 0.01, except the desired label which is 0.99)
targets = numpy.zeros(output_nodes) + 0.01
# all_values[0] is the target label for this record
targets[int(all_values[0])] = 0.99
n.train(inputs, targets)
pass
pass
测试这个神经网络
# load the mnist test data CSV file into a list
test_data_file = open("d:\\mnist_test_10.csv", 'r')
test_data_list = test_data_file.readlines()
test_data_file.close()
# test the neural network
# scorecard for how well the network performs, initially empty
scorecard = []
# go through all the records in the test data set
for record in test_data_list:
# split the record by the ',' commas
all_values = record.split(',')
# correct answer is first value
correct_label = int(all_values[0])
# scale and shift the inputs
inputs = (numpy.asfarray(all_values[1:]) / 255.0 * 0.99) + 0.01
# query the network
outputs = n.query(inputs)
# the index of the highest value corresponds to the label
label = numpy.argmax(outputs)
# append correct or incorrect to list
if (label == correct_label):
# network's answer matches correct answer, add 1 to scorecard
scorecard.append(1)
else:
# network's answer doesn't match correct answer, add 0 to scorecard
scorecard.append(0)
pass
pass
# calculate the performance score, the fraction of correct answers
scorecard_array = numpy.asarray(scorecard)
print ("performance = ", scorecard_array.sum() / scorecard_array.size)
all_values = test_data_list[0].split(",")
print(all_values[0])
n.query((numpy.asfarray(all_values[1:])/255.0*0.99) + 0.01)
## ====输出结果(第7行最大)====
array([[0.09974942],
[0.03166885],
[0.06538583],
[0.0988961 ],
[0.09711381],
[0.05002152],
[0.01467066],
[0.73531968],
[0.08138323],
[0.08918561]])
04 Jan 2020
之前写过手工计算一个神经网络,那么如何用python编写一个神经网络呢?接下来便试着一步步实现。神经网络一共分为三块,初始网络、训练网络、查询网络,由此所编写的代码框架如下:
# 神经网络框架
class neuralNetwork:
# 初始网络
def __int__():
pass
# 训练网络
def train():
pass
# 查询网络
def query():
pass
· 完整的神经网络代码
import scipy.special
import numpy
class neuralNetwork:
# 初始网络
def __init__(self,inputnodes,hiddennodes,outputnodes,learningrate):
# 设置输入、输出、隐藏层
self.inodes = inputnodes
self.hnodes = hiddennodes
self.onodes = outputnodes
# 设置权重
self.wih = numpy.random.normal(0.0, pow(self.hnodes, -0.5),(self.hnodes,self.inodes))
self.who = numpy.random.normal(0.0, pow(self.onodes, -0.5),(self.onodes,self.hnodes))
# 设置学习率
self.lr = learningrate
# 构建sigmiod函数
self.activation_function = lambda x: scipy.special.expit(x)
pass
# 训练网络
def train(self, inputs_list, targets_list):
# 第一层输入
inputs = numpy.array(inputs_list,ndmin=2).T
targets= numpy.array(targets_list,ndmin=2).T
# 隐藏层输入
# X隐含 = W权重 * I输入
hidden_inputs = numpy.dot(self.wih, inputs)
# 隐藏层输出
hidden_outputs = self.activation_function(hidden_inputs)
# 最终层输入
final_inputs = numpy.dot(self.wih, hidden_outputs)
# 最终层输出
final_outputs = self.activation_function(final_inputs)
# 误差值
output_errors = targets- final_outputs
# 反向传播 error隐藏 = WT隐藏 * error输出
hidden_errors = numpy.dot(self.who.T,output_errors)
# 传播隐藏到输出
self.who = self.who + self.lr* numpy.dot((output_errors*final_outputs*(1.0-final_outputs)),numpy.transpose(hidden_outputs))
# 传播输入到隐藏
self.wih = self.wih + self.lr* numpy.dot((output_errors*hidden_outputs*(1.0-hidden_outputs)),numpy.transpose(inputs))
pass
# 输出网络
def query(self, inputs_list):
# 第一层输入
inputs = numpy.array(inputs_list,ndmin=2).T
# 隐藏层输入
# X隐含 = W权重 * I输入
hidden_inputs = numpy.dot(self.wih, inputs)
# 隐藏层输出
hidden_outputs = self.activation_function(hidden_inputs)
# 最终层输入
final_inputs = numpy.dot(self.wih, hidden_outputs)
# 最终层输出
final_outputs = self.activation_function(final_inputs)
return final_outputs
· 训练这个神经网络,并输出相应结果
# 输入层、隐含层、输出层节点数
input_nodes =3
hidden_nodes =3
output_nodes =3
# 学习率
learningrate = 0.3
# 训练一个神经网络
n = neuralNetwork(input_nodes,hidden_nodes,output_nodes,learningrate)
# 查询网络
n.query([1,0.5,-1.5])
# ====最终输出结果(数值可能不相同)====
array([[0.40511455],
[0.40580834],
[0.50113563]])
19 Dec 2019
记得以前某个大牛曾说过,人之所以无趣是因为对整个世界的认知不够,但每天让我去网上找资料或者看纸质书感觉都是不太现实的事情,今天偶然想到如果每天都花点时间看看TED的视频是不是也挺有趣的,遂在此记录每一场TED演讲的观后感。
TED:如何掌控你的自由时间
例子:1个非常忙的职场女性,认为自己根本没有时间去锻炼,但因为家里热水器坏掉而耗费了7个小时去修理,相当于一周每天抽出1个小时。
论点:时间管理并不是通过节省时间创造想要的生活,而是通过创造想要的生活(安排好自己重要的事情),时间自动的就节省出来了(充分利用)。
方法:现在就列举出,如果明年这个时候绩效特别好或者让自己特别开心,自己需要达成哪几项目标;每周五下午去规划下周想要做的几件事情,包括工作、感情、生活等等。
TED:如何让自己和他人更自信
例子:用两个例子明确指出自信的重要性
论点:缺少自信会从根本上摧毁一个人,让人不相信自己的能力,让人成天担心自己做不到、不会做和不可能。
方法:三个因素:自信诞生于允许、成长于团体和增强于好奇心
TED:提升自信的技巧
定义:自信是相信自己有在任何困难情况下完成任务的能力。
方法:一遍又一遍不厌其烦的练习;自我激励(意识影响行为);对他人适当的夸赞;
结束语:除非你做到了,否则没人会相信你
TED:爱情应有的样子
论题:谈论爱情的时候,到底哪里出错了
论点:希望爱情能让我们疯狂,又希望它永远不会消失
结论:爱情无关赢得或者失去谁的爱慕,而是要求你信任另外一半,不去想从爱情中得到什么,而是想能够给予什么
TED:抑郁与焦虑
引言:科学证明形成抑郁的原因一共有9种,生理问题只占2种,有7中是生活方式的问题。
论点:如果你抑郁或焦虑,你不是脆弱或疯,不是身体零部件坏了,你是需求未被满足的人。
结论:把抑郁当做一种信号,将自己和团队绑到一起。
TED:你有拖延症吗
例子:做了一个计划冗长的计划,结果很长时间都没有启动。
问题:为什么会拖延?正常的人在掌舵,有一个捣乱的猴子,还有一个惊恐怪兽(截止日期)。
论点:拖延分两种:第一种有截止日期,另一种没有截止日期。把生命划成多个格子,其实没有多少,那到底在拖延什么。
TED:你有拖延症吗(续)
论点:适度的拖延有助于创新,创新会产生怀疑和焦虑。怀疑包括对自我的怀疑和对主意的怀疑,前者会冻结自己的思维,而后者可以有更多的激励和行动。
方法:迅速开始,慢慢完成会激发人的创造性,可以怀疑自己的主意来激发自己,拥抱对尝试失败的恐惧,只有有了一堆坏主意,才会有一堆好主意。
TED:如何成为一个更好的交谈者
现状:现在的人立场更明确,更少的倾听彼此。交流需要平衡讲述和倾听,但这种平衡却在消失。
方法:如何去谈话?如何去倾听?
1.不要三心二意,就在当下的场景里,不要去想晚上吃什么或者今天和谁发生了不愉快
2.不要好为人师 ,假定自己在每一次交流中都能学习到东西
3.使用开放式问题,不要变成“是”或“不是”
4.顺其自然,所思即所说
5.如果你不知道,就直接说不知道
6.不要把自己的经历和别人比较,如果别人聊工作烦,不要顺势去说
7.尽量别重复自己说的话,咄咄逼人而且很无趣
8.别说废话
9.学会倾听(最重要),人更喜欢去说
10.简明扼要,尽量少说话,开放自己的思想,永远准备大吃一惊。
TED:如何获得好的点子
问题:如何获得好的点子?
结论:这些奇思妙想并不是想出来的,更像是发现出来的。保持好奇心、细心观察,投入一些小的资源去亲身体验,才能获得好的想法。
TED:只需20个小时,你就能学会任何东西
论点:10000个小时专家级水平,而只需要20个小时就能学会任何想学的东西,以学习曲线为例。
方法:4个注意事项:
1.将一个大目标,分解成多个小目标和任务,越快找到学习某项技能的关键所在,将越有可能短时间提升成效;
2.学会自我矫正,准备3-5个正在学习东西的资源,学会让自己单独练习并自我矫正;
3.移除任何在学习时让自己分心的东西;
4.练习超过20个小时,克服挫折和障碍;
TED:破解语言学习之谜
例子:在西班牙常驻6个月却还是不会西班牙语,语言学习和环境无关。
论点:学习语言最重要的是动机是什么?不是考试、不是为了去秀,而是对它富有激情。
方法:
1.不要说自己没有天赋;
2.不要说自己年纪太大;
3.没有学习的环境;
4.记不住那些单词;
5.完美主义是学习语言的大敌;
TED:学习一门新语言的秘密
问题:多语言学者有什么共同点,使得他们学习语言比别人更快?有一些例子:从第一天就开始学习说话,在社交软件上加许多母语者,等等
共同点:找到享受学习语言这一过程的方法,学会如何将一种语言课程,转变为每天都做的有趣的活动。
方法:
1.找到学习语言的兴趣;
2.找到有效的方法,例如间隔重复法、黄金列表;
3.制定自己的学习体系,提前计划挤出时间;
4.更多的耐心;
笔者语录:该方法不止对学习语言有效,学习任何知识都有效
TED:只需专注10分钟
问题:仅仅10分钟什么都不做去审视心灵?没有邮件、电视,不去想过去和未来。
论点:心灵是我们最珍贵的东西,我们通过它去感受幸福、满足、情感稳定,依靠它我们能够专注、有创意、发挥才能。
方法:每天10分钟,让我们心情更加健康、更加专注、更少分神。不能改变发生在生活中的每一件事情,但我们可以改变感受它的方式。
TED:时间心理学
例子:给小孩各分一块棉花糖,如果能忍住今天不吃,明天可以获得两块。实验发现能忍住不吃的小孩14年后SAT平均分比前者高250多。
论点:基于现在而做决定的人(面向现在),基于过去经验来决定的事情(观望过去),专注于预期结果(展望未来)。引入积极和消极态度,从而划分成六种时间洞察力。
方法:什么是最佳的时间洞察力?
高度依赖于积极经历,适度依赖于未来,适度依赖于享受现在,永远不考虑消极经济和宿命论。
由积极经历奠定基础,未来获得目标和挑战,从享受现在获得动力。
TED:求助是一种能力
例子:一个侏儒症患者的童年
论点:你无法懂得我,我也没办法了解你,但我们可以相互帮助。
方法:每个人都有一套支持系统,选择求助是一种能力,而不是弱点。我们一生中需要许多帮助,同样重要的是我们也学着去帮助别人。
TED:想找工作?强调你的能力,而不是你的经验
例子:只有四分之一的大学毕业生,到和自己学位相关的领域去工作。
论点:别再把经验当做一种能力,把证书当做一种技能。
方法:
1.扩展你的搜索,绝对没有哪一种型的人是人才,更聚焦于设计师的作品而不是背景;
2.针对绩效来雇佣,雇佣人在雇佣前需要展示他们的能力;
3.了解更宏观的局势;
让世界因为自己真实的才能而被看见,并有机会去了解自己的全部潜力。
TED:李开复:人工智能如何拯救人类
论点:人工智能和人类如何能够共存
思考:
第一,人工智能将代替我们承担重复性工作。
第二,人工智能工具将帮助科学家和艺术家提升创造力。
第三,对于非创造性、关爱型工作,人工智能将进行分析思考,人类以温暖和同情心相辅相成。
第四,人类将以其独一无二的头脑和心灵,做着只有人类擅长、以人类创造力和同情心取胜的工作。
TED:为什么对同事友善对业绩有益?
问题:你想成为什么样的人,无论你知道或不知道,你都在用每天的行动去回答它。
论点:不文明的行为会消减人的行动力;不文明是一种传染病,会影响到周围的人;不文明甚至会影响到注意力和剥夺一些脑力;
思考:
真正文明代表做好每一个小细节,例如在过道微笑或者打个招呼,当别人讲话时注意倾听,尊重别人的前提下提出不同意见 ,谦虚提问
文明不仅可以激励别人,也可以激励自己
文明与领导力息息相关:学会尊重
TED:怎样的人生更有意义?
论点:追求快乐会让人不快乐,寻找人生意义才更能让人满足。
问题:如何让人生活的有意义?
1.归属感,真正的归属感源自于爱,反例:从认识的人旁边走过却没打招呼,用语言去诋毁别人而不是赞赏,当人和我说话的时候我却在看手机。
2.目的,目的的重点不是你想要什么,而是你能给予什么。
3.超然,超脱日常生活的喧闹,能与更多的现实缔结。
4.说故事,用自己的人生去创造一个故事
TED:成功、失败和不断创造的动力
论点:成功和失败都会把人从正常的状态中拉出来,进入到一个异常状态下,这个时候我们要清晰的认识到自己最想要的是什么(找到“家”),然后沉下心、投入精力、坚持不懈,一切都会好起来。
TED:科技读心时代该如何保护隐私
例子:
1.癫痫病发病前监控
2.截肢病人仅凭思想就可以打字
3.汽车枕头看驾驶员的精神注意力
4.看同一个电影不同的结局
论点:认知自由革命
TED:为什么MOOC很重要
论点:MOOC:massive open online courses,教育需要改革,借助科技变成更广泛的教育
方法:混合教学方式:通过视频学习相关知识,在网上建立讨论社区,来到课堂上面对面互动;
1.主动学习,5-7分钟视频,紧跟一个互动练习
2.自己控制速度
3.立即反馈,把教学过程变成了学习结果
4.游戏化,建立在线实验室
TED:将每日聚会变革创新的三个步骤
论点:改变日常的聚会,专注于通过人与人的联系来创造意义。
方法:聚会的新规则:
(1)包含一个特别有争议的目标
(2)引起良好的争端
(3)创造一个有意义的每日聚会
最好的聚会,让别人看见我们是谁,也让我们认识别人
TED:恋爱中的大脑
例子:对37个恋爱中的人进行核磁共振实验
论点:爱情让你只对一个人产生配对的冲动,并节制的使用它。
问题:为什么你会爱上他而不是爱别人?
女人倾向于面对面交谈,而男人倾向于侧对侧交谈。
TED:内心喧哗
例子:内心不安、不快乐、害怕却被隐藏起来,导致后续出现幻听,更多人给了力量让自己去战胜自己,改变看待自己的方式
论点:自重之人不会为人所羞辱,无所畏惧之人不会受人压迫;不要告诉我别人怎么看你,告诉我你自己如何看待自己;
TED:注意力无法集中?
问题:非常专注于某件事情,不是特别容易?
论点:两种方式主导注意力:外显注意力(眼睛会随着事物移动);内隐注意力(无需移动眼睛,就能专注于某事情)
方法:运动可治疗ADD注意力缺失症
TED:如何驯服你走神的大脑
例子:人类只使用了大脑10%的潜力(这句话是错误的),人的大脑是一个已经完全开发极其高效且耗能的器官,即使这样还面临信息过载的问题。为了解决信息过载问题,我们人类进化产生了注意力系统。注意力系统类似于指挥官,它到哪我们大脑的其他部分就跟到哪。
问题:
1.我们的注意力如何控制我们的认知能力?
外部压力会对注意力产生影响,例如痛苦或暴力的新闻
内部干扰,例如走神
注意力影响对认知影响是巨大的,注意力能带来强大的正面效益,但它也很脆弱,很容易受影响,例如走神或者压力
2.为什么注意力会出问题,例如我们的大脑有时变得不清醒或走神?
演讲时间越长,越容易走神
原因1:思维是一位时间旅行大师,会想之前也会考虑以后,例如看一页书却什么都不记得(无意识走神),压力下会回忆过去或者担心未来
3.当我们大脑不够清醒的时候,我们应该如何应对,该如何训练注意力?
专注帮助我们把注意力集中到现在,并排除不良情绪的影响
专注力练习实践方法,坚持8周以上会有很大的专注力提升:留心你的注意力,让专注练习变成日常练习。
TED:诠释数字统计
例子:
随着时间推移,西方世界(家庭小,寿命长)的数据被打破,类似中国(家庭大)也由寿命短变为寿命长,越南也变成家庭小、寿命长的国家。
贫穷20%人数2%资产,中等60%人数24%资产,富裕20%人数74%资产,绝对贫穷的人在中间,而分不同板块,贫穷的人在亚洲
世界发展需要因地制宜,但大量的数据却被关在数据库中,没有被共享
论点:需要数据检索系统、数据共享系统、数据展示系统
相关软件:D3、PROCESSING、R、google doc
TED:助人者助己
例子:帮助别人帮助自己(形象生动)
TED:疫情爆发能否像地震一样被预测?
问题:
1.能否预测下一次疾病的时间和地点加以预防?
2.疫苗通常只能是创可贴,控制伤害范围,能否从源头减少伤害?
借助狂犬病毒找到一种从源头消灭病毒的方法:对病源头(蝙蝠)进行疫苗接种,然后让他们自行交配从而使所有蝙蝠都获得疫苗。
02 Dec 2019
斯坦福的课程中讲到命名实体识别HER,在学术界中认为命名实体识别是NLP已经解决的问题,其解决方式的原理便是采用条件随机场CRF。这里借助封装好的CRF++工具包实现中文命名实体识别。
环境准备:
Windows crf++下载地址
案例1数据下载地址
案例2数据下载地址
· 训练CRF模型
打开cmd命令框,进入CRF目录
crf_learn crf.template train_data.txt model_test
# crf.template用来修改CRF模型
# train_data.txt训练语料
# model_test训练出来的模型名称
· 使用CRF模型预测
crf_test -m model_test test_data.txt> output_data.txt
# model_test模型名称
# test_data.txt测试语料
# output_data.txt结果语料
参考文献:
用CRF++开源工具做文本序列标注教程
CRF++使用简介
CRF++官方文档
02 Dec 2019
之前写过Word2vec的实现方式,现在用gensim实现doc2vec,由于调用机制很像,就直接用nltk_data的数据,该数据包安装方式可参考win10环境下python3无法下载nltk_data的问题。
Python代码如下
from gensim.models.doc2vec import Doc2Vec, TaggedDocument
from nltk.tokenize import word_tokenize
data = ["I love machine learning, its awesome",
"I love coding in python",
"I love building chatbots",
"they chat anything well"]
tagged_data = [TaggedDocument(words=word_tokenize(_d.lower()),tags=['SENT_%s' %str(i)]) for i,_d in enumerate(data)]
model = Doc2Vec(size=100,alpha=0.01,min_count=2,dn=1)
model.build_vocab(tagged_data) # 训练词库
for epoch in range(10):
print('iteration{0}'.format(epoch))
model.train(tagged_data,total_examples=model.corpus_count,epochs=model.iter)
model["SENT_0"] # 句向量
model.docvecs.most_similar(0) # 相似句子
26 Nov 2019
神经网络算法作为深度学习的基础,其重要性不言而喻。然而大部分同学,在实际学习过程中却总不得其门而入。某天受高人指点尝试去手工计算一个三层神经网络,于是一通百通,不仅了解了神经网络工作原理的本质、调优的方法,还用python自写了一套基础版的神经网络算法。本篇博文便一步步的将整个推导过程重现一遍。
1. 了解Sigmoid函数
Sigmoid函数(简称S函数) 对于大家来说并不陌生,其公式为:y = 1/1+E(-x)。当x趋近无穷大时,y趋近于1;当x趋近无穷小时,y趋近于0。因此S函数的输入x可以为任意数,而输出y必介于0到1之间。
那么S函数在神经网络中起什么作用呢,大家可以想象一下神经网络是由多个神经元共同作用而成,而神经元的工作方式是在接受输入到达一定量级的时候,才产生相应的输出。因此我们用S函数模拟神经元的工作方式,即当输入x到达一定界值时,S函数(神经元)就激发了。
我们举个例子计算一个神经元的输入及输出
例:假设x1=0.05,x2=0.25,x3=0.75求S函数的解
x = x1+x2+x3 = 0.05+0.25+0.75 = 1.05
y = 1/1+E(-x) = 1/1+E(-1.05) = 0.7488
2. 了解W权重
图1中可以看到,神经网络每个神经元之间都会有连接,而每个连接上都会有相应的权重W,那么神经网络前后层之间为什么要相互连接呢?第一,这种完全连接的方式可以相对容易编辑成计算机指令,第二,神经网络在迭代学习过程中自身会弱化不需要的链接,即权重趋近于0。在这里我们需要注意初始权重是随机值,神经网络需要做的就是不断调整权重以最大降低预测值与真实值之间的误差。加入权重后,单个神经元的计算方式如下图:
# 第2层第1个神经元输入x
x = (x1*w1,1)+(x2*w1,2)+(x3*w1,3) = 1*0.9+0.5*0.2+0.5*0.1 = 1.05
# 第2层第1个神经元输出y
y = 1/1+E(-x) = 1/1+E(-1.05) = 0.7488
3. 计算一个三层神经网络
这里我们先用最基础的方法去计算三层神经网络的输出结果,由于第三层(输出层)每个神经元的计算方式不尽相同,因此我们只计算第三层第一个神经元的输出,如下图:
这样我们就成功计算了一个三层神经网络的输出结果,是不是挺容易的?!
4. 借助矩阵计算神经网络
这里我们借助矩阵的方式去实现3中三层神经网络的计算,如下图:
这里我们极大的简化了神经网络的计算方式,并获得了相同的输出结果。后续用Python实现神经网络算法,
5. 如何计算反向传播误差
误差代表的是我们实际值与预测值之间的差异,即误差e=实际值t-预测值o。在误差反向传播的过程中,我们按照W权重来分配每个神经元的误差,如下图:
这里我们也可以借助矩阵来计算误差,图中e(hidden)=W(hidden_output)的转置矩阵*e(output)
6. 如何使用误差来调整权重
计算误差的目的,就是告诉神经网络如何去调整矩阵权重,以使得迭代计算出的预测值不断趋近于真实值。这里直接给出权重计算的公式,如下图:
这样我们整个神经网络的已经计算完成,最后强烈推荐一本书《Python神经网络编程》塔里克·拉希德著,接下来我们再试着用Python来实现一遍。
20 Nov 2019
最近在看2019斯坦福NLP公开课,突然萌生一个想法,准备把课程所有涉及到的知识点,都用python实现一遍。由于第一课讲到word2vec,遂写下用gensim实现word2vec和fasttext的方法。其实gensim库官方文档已经介绍的很详细,想追根溯源的同学可参考gensim官方文档,本博文只记录具体的实现路径。
1.导入python所需要的包
from gensim.models import fasttext
from gensim.models import word2vec
import pandas as pd
import logging
import jieba
其中gensim和jieba需要单独安装,使用anaconda的同学可以参考Anaconda安装其他第三方库
2.数据导入与预处理
data = pd.read_csv("d:\\test.csv",sep="\t",encoding='gbk',header=None)
sentance = list(data[0])
# 对每行句子进行中文分词
def segment_sen(sen):
sen_list = []
try:
# 可以考虑添加业务词库、去停用词,具体参考jieba官方文档
sen_list = jieba.lcut(sen)
except:
pass
return sen_list
# 将数据变成gensim中,word2wec函数的数据格式
sens_list = [segment_sen(i) for i in sentance]
数据集test.csv下载地址
3.训练word2vec模型
logging.basicConfig(format='%(asctime)s : %(levelname)s : %(message)s', level=logging.INFO)
model = word2vec.Word2Vec(sens_list,min_count=1,iter=20)
model.save("word2vec.model")
4.调用word2vec模型
model.wv.most_similar("手续费")
5.fasttext模型训练及调用
word2vec和fasttext算法最大的差异在,前者无法识别模型中未训练过的词,而后者可以解决未登录词的问题。
# 训练fasttext模型
logging.basicConfig(format='%(asctime)s : %(levelname)s : %(message)s', level=logging.INFO)
model1 = fasttext.FastText(sens_list,min_count=1,iter=20)
model1.save("fast_text.model")
# 调用fasttext模型
model1.wv.most_similar("账单分期")
附1.Gensim模型参数及再训练
# Gensim模型参数调整
model = gensim.models.Word2Vec(sentences, #输入语料
window=2, #窗口大小
size=100, #维度
alpha=0.03, #学习率
negative=20, #负采样数量
min_count=2, #最小出现次数
workers=10) #进程数量
# Gensim模型再训练
new_model = gensim.models.Word2Vec.load('mymodel')
new_model.train(more_sentences)
参考代码:Gensim模型参数及再训练
附2.模型调优思路
1.保证训练数据集的量足够大,且文本中没有过多错误的词汇,例如手续费被翻译成水费;
2.数据预处理分词阶段,需要整理好对应的业务词库和停用词库;
3.若没有大量数据或高性能GUP去构建模型,可考虑已训练好的词向量模型,例如腾讯词向量模型;
20 Nov 2019
· 导论
数学通识教育前提:数学从体系到研究方法,再到应用方法是共通的。
第一模块:数学从猜想=>推论=>实际应用
第二模块:“数的概念”从抽象到具体
第三、四模块:已知几何与代数
第五、六模块:微积分、概率统计
第七模块:数学在其他领域的应用
第七模块
1.数学与哲学:数学如果是最基础的学科,哲学就是最顶头的学科。(一头一尾)
数学对哲学的影响:
笛卡尔《谈谈方法》人是如何获得知识的,人能否通过自身努力获得知识。
靠经验积累有两大问题:一是来的太慢,二是直接经验常常是不可靠的。
解决方法:第一层面是今天所谓的实证,第二层面的理性,就是要用符合逻辑的数学方法去替代测量从而获得真知。
莱布尼茨第一个相对的因果时空观,第二个是离散的世界的理解。
用数学中建立公里化体系的方法,建立自己的哲学体系,就成为了在认知上通用的方法。
哲学对数学的影响:
哲学讲的是宇宙万物的本质,《西方哲学史》罗素
苏格拉底把自己看成主人,就需要在认知层面有所提高,了解数学和哲学都有助于帮助我们做到这一点。
哲学(最顶)=>各种自然科学=>数学(最底)
2.数学与自然科学:一种科学只有在成功运用数学时,才算达到真正完善的地步。(自然科学+数学)
天文学+数学(地心说+几何学)
博物学+数学(分门别类+集合论)
物理学+数学(实验方法+数学方法)
化学+数学(燃素说、氧化说+量化)
自然科学升华过程:
从简单的观察上升到理性的分析
从给出原则性结论到量化的结论
将自然科学公式化
3.数学与逻辑学
同一律:偷换概念、个体换成集合、限量版(所有的商品都是有限的)
矛盾律:不可能即是A又是A
排中律:任何事物,都要有“是”或“非”的判断
充分条件律:因果原理
4.数学与其他学科
运筹学:运用图论、线性代数改进现有系统的效率。
管理学+数学(使命、价值观和文化)
历史学+数学(大历史史书)
· 演讲内容《数学之美》
· 前言
吴军老师写过一本《数学之美》,其中包括傅里叶级数、马尔科夫假设、自然语言处理方法等,这些数学知识比较专业,很难联系非专业人士的知识,这里期望利用更简单的方法,例如我们会讲到小学数学鸡兔同笼问题讲到初中的等比数列再到大学的线性代数,我们会从数学猜想讲到推论再讲到应用,带领大家感受五大类数学之美。该演讲需要储备以下知识:线性方程组求解、无穷大与无穷小的定义、等比数列计算公式、矩阵乘法。
· 从鸡兔同笼问题开始
在一个笼子里有鸡和兔子,一共35个头,94只脚,试问鸡和兔子各有几只?
解1:《孙子算经》将所有动物的脚数除以2,一共94/2=47对,每只鸡有一堆脚,兔子有两对脚;假设所有动物都是鸡的话,应该有35对脚,这时需要将鸡换成兔子,47-35=12,说明有12只鸡要换成兔子,兔子数目12,鸡数目23只。
解2:假定笼子里都是鸡,应有35/*2=70条腿,但现在有94条,多出24条,应该是兔子造成的,一只兔子换一只鸡多出2条腿,24/2=12,于是就有12只兔子,其他的都是鸡。
解3:美国小学的教法
兔子的数量
鸡的数量
脚的数量
23
12
116
22
13
114
21
14
112
20
15
110
···
···
···
13
22
96
12
23
94
解4:二元一次方程
设鸡有x只,兔子有y只
x+y=35
2x+4y=94
数学之美:美在针对同一个问题,有多种不同的解法,但即使解法千变万化,正确的答案有且只有一个。
· 毕达哥拉斯定理(勾股定理)
勾股定理讲的是直角三角形两条直角边的平方之和等于斜边的平方,写出来就是x^2+y^2=z^2。这个定理在国外都被称为毕达哥拉斯定理,接下来有两个疑点:
疑点1.这个定理是否在毕达哥拉斯之前就发现了?
我们过去教科书里,汉朝数学书《周髀算经》记载,早在公元前1000年,周公和商高就两人就谈到了“勾三股四弦五”,比毕达哥拉斯早了500年,于是教科书中认为中国人高商最早提出这个定理,于是被称为勾股定理或高商定理。但如果只是记录了一组勾股数,早在公元前2500年,古埃及人在建造大金字塔时就已经按照勾股数在设计墓室尺寸了,再往前推,美索不达米亚人早在公元前18世纪左右就知道很多勾股数,并留下实物证据。
疑点2.古埃及和美索不达米亚为什么不争夺定理的发现权?
所有这些古代文明不过是举出一些特例而已,甚至没有提出假说,但在数学体系中,光举例是不够的,还需要做出一个明确的规律性的描述,即该定理是需要被证明的而不是例举的,这就是数学与实验科学的不同之处,前者需要依靠严谨的逻辑证明,而后者只需要实验证实就行。
那么勾股定理如何证明呢?
更多证明方法,可参考勾股定理16种证明方法
接下来,我们看看证法1,其中我们要知道直角三角形面积公式和正方形面积公式,再看证法2,我们不仅要知道前者,还需要知道三角形总和为180度,全等三角形角度相等等。
数学之美:美在数学需要经过严格的逻辑推理,公式与公式之间具有强关联性。
既然如此由毕达哥拉斯定理又推理出了什么其他的定理公式么?
· 无理数与黄金分割
毕达哥拉斯有个很怪的想法,他坚信世界的本源是数字,但数字必须是完美的。整数很完美,而分数的分子分母也都是整数,因此也很完美。整数和分数所构成的有理数让毕达哥拉斯一直坚信自己的想法。
然而毕达哥拉斯定理被证明以后,就有麻烦了。假设某一直角三角形的两条直角边都是1,那么斜边该是多少呢?根据定理算一下,斜边的平方是2,换句话说就是自己乘以自己等于2的数,这个数是否是完美的有理数呢?
如果它是有理数,那么假定存在一个数字是R,它能够写成R=A/B的形式,数字R^2=2。
由此可以看出需满足3个条件:A、B都是整数,A、B不可再约分(互素),A/B的平方等于2。
从第三个条件出发R^2=A^2/B^2=2,则A^2=2*B^2,这时候A应该是偶数,那么可以写成A=2*C的形式。A^2=4*C^2=2*B^2则2*C^2=B^2,这个时候B也应该是偶数对吧,这下问题来了,A和B都是偶数那不是还可以再约分么?
推导没错,勾股定理没错,我们的认知出了问题。世界上存在一种数,它无法写成有理数的形式,它是无限不循环小数,我们今天把它称为无理数,写成根号2。无理数中有名的除了π,还有黄金分割点1.618(根号5-1除以2)。例如雅典卫城帕特农神庙、断臂的维纳斯、蒙娜丽莎等。
那为什么黄金分割看起来这么顺眼呢?它的美感来自几何图形的相似性。我们拿一个满足黄金比例的长方形,不断减去一个正方形,然后把圆弧连起来,就有了一个等螺线,类似于蜗牛的壳,或者龙卷风的中心点,或者星云图。其实黄金分割反映了宇宙自身的一个常数,人作为宇宙的个体,耳蜗的形状,虹膜纹路都遵循这个常数。因此悦耳的音乐、动人的风景、好看的脸都是符合这个黄金比例的。
优选法中0.618法:
例:钢中加多少碳,馒头中加多少碱,假设每吨加入量在1000克,以1%迭代实验到2000克需要1000次,由此得用0.618黄金分割法。
第一次加入(2000-1000)×0.618+1000=1618克
第二次加入2000-1618+1000=1382克
第三次加入1682-1382+1000=1236克
第四次加入1618-1382+1236=1472克
5次实验可限制在9%以内,6次实验可到6%以内,根据优选法效率可以提高2~3倍。
数学之美:美在它从现实世界中抽象出来再被应用到现实世界中去。
· 数列与级数
某传销公司提成方式,每个人入会缴纳1万元,发展一个直接下线,从后者身上提成20%,直接下线每发展一个下线,可以从下线身上再提成20%的20%。
问题1:张三入会了,他在什么情况下可挣到钱?
情况1:张三找5个朋友加入这个会,他付出1万元,从每个直接下线获得2000元,类似的每个直接下线再发展5个下线,最终获得共计20000元,赚10000元
情况2:张三找4个朋友加入这个会,他付出1万元,从每个直接下线获得2000元,类似的每个直接线下再发展5个下线,最终获得共计16000元,赚6000元,每少一个直接下线少4000元
情况3:张三找5个朋友加入这个会,他付出1万元,从每个直接下线获得2000元,类似的每个直接下线再发展4个下线,最终获得共计18000元,赚8000元,下线的下线每少一个少2000元
这是很理想的假设,首先张三得找出3个及以上的朋友,每个朋友又得找到5个及以上的下线,才可能获利400元,但朋友之间有很大的交集,通常张三想发展的人,和他朋友想发展的人是一群人。
问题2:张三如果真的发展了5个人,真能拿到无限多的钱么?
再来看情况1,第一层获得2000*5=1万元,第二层获得400*25=1万元,第三层获得80*125=1万元,第四层获得16*625=1万元,第五层获得3.2*3125=1万元,以此类推
期望获得10万元,需要多少人?
An=a1*q^(n-1)
a1=5
q=5
A10=5*5^9=9765625
总数需要12,207,030人,20万元总数需要119,209,289,550,780。最后后接近无穷大,完全不可能实现。
问题3:那我如果少几个人行不行?
情况4:张三找3个朋友加入这个会,他付出1万元,从每个直接下线获得2000元,类似的每个直接下线再发展3个下线,以此类推
第一层获得2000*3=6000元,第二层获得400*9=3600元,第三层获得80*27=2160元,第四层获得16*81=1296元,第五层获得3.2*243=777.6元,第六层获得0.64*729=466.56元,第七层获得0.128*2187=279.936元,以此类推
级数迅速的收敛,最终无限趋近于1.5万,这便是无穷小的概念。
所以我们在日常理财或者工作中,不能仅仅看到现在的状态,而是看它未来发展的趋势,是发散的还是收敛的,就类似于我们这次的疫情为什么会封城,就是期望将其由发散的趋势迅速转向收敛的趋势,由无穷大转变为无穷小。
数学之美:美在它帮你由静态的感知世界到动态的感知世界,从而看清现实世界中无法看清的问题。
· 线性代数
回到鸡兔同笼问题,在一个笼子里有鸡和兔子,一共35个头,94只脚,试问鸡和兔子各有几只?
解4:二元一次方程
设鸡有x只,兔子有y只
x+y=35
2x+4y=94
也可写成线性代数形式:
[1 1 35]
[2 4 94]
向量变化
[1 1 35]
[0 2 24]
线性代数中一个很重要的概念便是矩阵,矩阵是一个M行N列,例如上述就是2行3列
假如做资产配置,第一家银行股票基金、债券基金、高风险基金投资回报分别是7%、3%和10%,第二家分别是8%、2%和9%,现在有1万元,你投第一家还是第二家?
矩阵R=([7%,3%,10%],[8%,2%,9%])
假设资产配比P=[3000,2000,5000]
数乘:
7%*3000+3%*2000+10%*1000=650
8%*3000+2%*2000+9%*1000=690
矩阵乘法:
R*P=[650,690]
若是不同的资产配比
P=([3000,2000,5000],[7000,2000,1000],[…])
R*P=([650,690],[770,730],[…])
由此,我们将单个计算变成大批量处理,也是我们今天所处信息时代需要有的思维方式。
数学之美:美在它为你提供一个方便的工具,帮你由单点问题到批量问题的解决。
· 结束语
我们常常依靠经验和直觉来认识世界,而数学作为一切科学的基础,它化繁为简可以帮助我们思考事物的本质,从而达到一通百通的效果。希望这次演讲能够抛砖引玉,让大家从过去惧怕、讨厌、漠视数学,到理解、喜欢、应用数学,从而感受到真正的数学之美。
19 Nov 2019
Anaconda集成了许多科学计算所需要的包,例如numpy,scipy等,那么如何查看anaconda中有哪些第三方包,并且如何去安装那些没有覆盖的包?首先得了解一下,anaconda有一个命令行编辑窗口,名为anaconda powershell prompt,我们可以在开始菜单中找到它,如下图:
· 查看anaconda中已经安装好的包有哪些?
conda list
· 如何安装anaconda中没有覆盖的第三方包?
pip install package_name
15 Nov 2019
在自然语言应用过程中,计算相似度是我们常见的问题,其准确率直接影响到文本聚类、文本泛化、QA检索等一系列问题,这里尝试复现我爱自然语言处理中基于genism的相似度计算方法。
Part1. 基础知识点
在实现相似度计算前,需要了解以下知识点,如果已有扎实基础的同学可以直接跳到Part2。
TF-IDF、余弦相似度、向量空间模型
参考资料:
(1)TF-IDF与余弦相似性的应用(一):自动提取关键词
(2)TF-IDF与余弦相似性的应用(二):找出相似文章
(3)现代信息检索第6讲向量空间模型 王斌
SVD和LSI
SVD(Singular value decomposition)奇异值分解,这里需要扎实的线性代数知识,基础比较弱的同学可以先从麻省理工公开课:线性代数开始学起,基础好的同学可以看一下Singular Value Decomposition
了解完SVD后,再看LSI就轻松多了。
Part2. 了解gensim库
Part3. 使用gensim计算相似度
15 Nov 2019
清晨起床说一句“打开窗帘”,煦暖阳光撒进卧室,走进厨房说一句“来杯美式咖啡,无糖加奶”,咖啡机启动工作,咖啡香味充满整个房间,端起咖啡走入客厅,说一句“来点轻音乐吧”,柔和的音乐开始在房间内飘荡。多么美好的智能化生活图景!然而实际很可能是窗帘虽然打开了,但咖啡里没有牛奶,音响播放的是嘈杂的爵士乐,而非柔和的轻音乐。这都是因为机器在识别自然语言时,常常会“听岔”、“听不懂”,因此也就无法指挥咖啡机、音响完成正确的指令。
机器理解人的自然语言,要靠“听见”+“听懂”两个步骤,也就是语音识别和语义理解两个环节。这两个环节会互相制约,从而影响交互效果。和人理解对话类似,机器想要理解一句话也并不需要弄清楚句中每一个词语和它们的排列组合,而是靠关键词获得主要的信息量。例如“今天天气真的太舒服了”,机器提取到“今天”、“天气”、“舒服”三个关键词,就可以基本准确理解用户谈论的话题。那么假设语音翻译的过程中将原句翻译成“今天天气真的太束缚了”,机器该如何理解这句话?所以说,关键词的准确识别在自然语言处理的过程中具有至关重要的意义。
在语音转译的过程中,关键词转译错误的问题主要集中在少量不常用的词汇上:不同领域专业术语,不同企业之间产品、业务名称等等。这种情况下,直接面向语音识别引擎,通过大量语音标注训练语言模型从而优化关键词识别率的方式,在实际工程应用中存在周期长、成本高的问题,难以适应复杂多变的业务需求,我们需要一套实时性更高、针对性更强、操作更便利的关键词优化方法。基于这样的考虑,智汇文本分析平台以优化不同应用环境中的意图识别效果为目的,推出了不依赖于语音引擎的关键词文本纠错技术,以下简称文本纠错。
用户使用文本纠错功能,只需要准备一批原始场景文本(如语音识别结果)和指定关键词即可,系统会自动从大量文本中找出可能出现的转译错误的内容,并根据人工校验结果对后续导入的文本进行自动的文本纠错。经过长期、大量、持续的反馈训练,文本纠错功能能够持续不断的帮助企业提升文本数据的关键词识别率,从而优化企业的数据资产价值。现基于关键词的文本纠错技术已集成到中金智汇的各类应用型产品中,并为金融、保险、电商等多个行业客户提供价值。
14 Nov 2019
Coursera作为国外一个最大的在线学习课堂,受到越来越多国内学习者的关注。但在观看课程初期会遇到能够登陆网站,却无法播放视频的问题。这里教大家一个不需要借助VPN就能快速解决的方法。
1.以管理员权限打开hosts文件
进入C:\Windows\System32\drivers\etc打开hosts文件,注意以管理员方式打开,如下图
2.将如下内容复制到hosts文件末尾并保存
52.84.246.90 d3c33hcgiwev3.cloudfront.net
52.84.246.252 d3c33hcgiwev3.cloudfront.net
52.84.246.144 d3c33hcgiwev3.cloudfront.net
52.84.246.72 d3c33hcgiwev3.cloudfront.net
52.84.246.106 d3c33hcgiwev3.cloudfront.net
52.84.246.135 d3c33hcgiwev3.cloudfront.net
52.84.246.114 d3c33hcgiwev3.cloudfront.net
52.84.246.90 d3c33hcgiwev3.cloudfront.net
52.84.246.227 d3c33hcgiwev3.cloudfront.net
3.按住windows+r,输入cmd打开命令行窗口
4.在命令行窗口中输入如下信息
ipconfig/flushdns
31 Oct 2019
数据转换是将数据从一种表现形式转换为另一种表现形式的过程。不同的数据挖掘方法对于数据格式都有相应的要求,而同一份原始数据集并不能适用于所有的挖掘方法,因此我们需要对原始数据进行转换。但数据转换一定要把握力度,一味的追求数据转换后的结果可能会严重扭曲原始数据本身的内涵 。本节将介绍如何用MySQL进行数据转换,主要包括数据标准化和数据离散化。
4.3.1 数据标准化
由于原始数据中常常会具有不同的量纲和变异程度,因此在进行数据分析之前,我们需要先将数据进行标准化。数据标准化一方面能够消除量纲的影响,解决数据可比性的问题,另一方面能够弱化数据本身的变异程度,使得数据分布状态更加均匀。关于数据标准化常用处理方法包括:min-max标准化、z-score标准化、按小数定标标准化。
本节使用样例表order_inf1,表结构及创建语句如下:
字段名称
数据类型
备注
ordercode
varchar(20)
订单编号
username
varchar(20)
用户名
consignee
varchar(20)
收货人
pay_date
varchar(20)
支付日期
province
varchar(20)
收货省份
city
varchar(20)
收货城市
total_amount
float(20)
订单金额
carriage
float(20)
运费
remark
varchar(20)
备注
MySQL输入语句如下:
这时我们查看order_inf1表中所有的字段。MySQL输入及输出如下:
接下来将数据插入order_inf1表中,再执行查询语句。MySQL输入及输出如下:
接下来,让我们对上述数据进行标准化。
(1)min-max标准化
min-max标准化是借助最小值和最大值对原始数据进行线性变化,其计算公式为:
min-max标准化 =(原数据-最小值)/(最大值-最小值)
MySQL中使用select语句处理min-max标准化的问题,MySQL输入及输出如下:
(2)z-score标准化
z-score标准化是基于原始数据的均值和标准差进行数据标准化,其计算公式为:
z-score标准化 =(原数据-均值)/ 标准差
MySQL中使用select语句处理z-score标准化的问题。
【例】用z-score标准化方法处理total_amount订单金额,MySQL输入及输出如下:
(3)小数定标标准化
小数定标标准化是通过移动数据小数点的位置来进行标准化。MySQL中使用select语句处理小数定标标准化的问题。
【例】将total_amount订单金额向左移动3个小数点,MySQL输入及输出如下:
4.3.2 数据离散化
数据离散化是指将连续型数据进行分段,使数据分布在不同的离散化区间中。由于实际数据库中存在较多的连续型数据,而很多数据挖掘算法只能处理离散型的数据,因此数据离散化是应用这些算法的前提。
有效的数据离散化能够减少算法时间和空间的开销、提高系统对样本的聚类能力、增强系统抗数据噪音的能力并提高算法学习的精确度。MySQL中使用条件判断函数处理数据离散化的问题。
【例】以均值为标准将total_amount订单金额离散化,大于等于均值为大额订单,记为“1”,小于均值为小额订单,记为“0”,MySQL输入及输出如下:
31 Oct 2019
现实世界中的数据通常是不完整的、有噪声的和不一致的。因此每拿到一批原始数据,我们首先需要对数据进行清洗。数据清洗是对数据进行重新审查和校验的过程,目的在于删除重复信息、纠正错误信息、保证数据的一致性。本节将介绍用MySQL进行数据清洗的方法,其中包括:处理缺失值、剔除重复值、识别异常值、发现数据不一致。
4.2.1处理缺失值
缺失值是指原始数据中缺少部分信息而造成某个变量或某些属性值不完整。缺失值产生的原因主要分为机器原因和人为原因。前者是由于机器导致的数据收集或记录失败造成的数据缺失,后者是由于人主观失误或有意隐瞒造成的数据缺失。对于缺失值的处理,常用方法主要包括:估算填充、样本删除、字段删除。
本节使用样例表order_inf,表结构及创建语句如下:
字段名称
数据类型
备注
ordercode
varchar(20)
订单编号
username
varchar(20)
用户名
consignee
varchar(20)
收货人
pay_date
varchar(20)
支付日期
province
varchar(20)
收货省份
city
varchar(20)
收货城市
total_amount
float(20)
订单金额
carriage
float(20)
运费
remark
varchar(20)
备注
我们查看order_inf表中所有的字段,MySQL输入及输出如下:
接下来将数据插入order_inf表中,再执行查询语句,MySQL输入及输出如下:
(1)估算填充
估算填充是指用估算值填充变量缺失数据的部分。估算值一般会选择变量的均值、中位数或者众数,这种填充方法能够使得数据分布较为均匀,但同时也会产生已有数据信息失真的问题。MySQL中使用select语句和update语句处理估算填充的问题。
【例】用众数填充carriage运费字段缺失部分,MySQL输入及输出如下:
(2)样本删除
样本删除是指剔除缺失值较多的样本,这种方法比较适合整体样本量较大,且含有多个缺失值的样本比重较小的情况。MySQL中使用delete from语句处理整例删除的问题。
【例】删除缺失值过多的样本数据,MySQL输入及输出如下:
(3)字段删除
如果某个字段的缺失值特别多,且该字段对于所研究的问题不是特别重要,则可以考虑将该字段删除。MySQL中使用alter table语句处理字段删除的问题。
【例】删除缺失值过多的字段,MySQL输入及输出如下:
4.2.2 剔除重复值
重复值是指同一数据被多次记录在数据库中。重复值的出现会导致数据冗余并影响统计结果的精确性,因此在进行数据分析前,需要根据业务需求考虑是否剔除重复值。MySQL中使用distinct关键字剔除重复值。
【例】剔除order_inf表中具有重复数据的记录,MySQL输入及输出如下:
4.2.3 识别异常值
异常值是指一组数据中与平均值偏差超过两倍标准差以上的数据。异常值的出现会使得该组数据分布不均匀,从而导致估算偏误。但异常值并不一定是错误值,它可能反映了某个特定节点的突发性状况。因此我们需要识别异常值,然后根据具体业务信息判断异常值的取舍。
MySQL中使用聚合函数识别异常值,输入及输出如下:
【例】查询total_amount中的异常信息。
4.2.4 发现数据不一致
数据不一致是指各类数据之间具有不相容性,具体体现为单组数据之间数据编码格式不同,或者是多组数据之间数据记录相互矛盾。MySQL使用update语句修改数据不一致的情况,输入与输出如下:
【例】更新pay_date字段使得日期格式一致。
【例】更新province字段使得收货城市与省份数据一致。
31 Oct 2019
数据集成是把不同来源、格式的数据整合到一起,从而为企业提供系统化的数据检索、数据挖掘和建模功能。企业通常会采用联邦式、基于中间件模型和数据仓库等技术手段来构造数据集成系统。为了把不同来源、格式的数据存入到MySQL数据库中,本节将介绍以下数据集成方法:使用load data语句导入数据以及使用Workbench菜单式导入数据。
4.1.1 使用load data语句导入数据
MySQL中提供了load data语句来将不同格式的数据表集成到数据库中,常用存储结构化数据的格式包括Excel、CSV和TXT。
MySQL中load data导入数据基本语法形式为:
load data [local] infile ‘filename’ into table table_name;
注意:往MySQL中导入数据前,我们需要先使用create table语句构建一张用来存储该文件数据的表空间。
本节将继续使用样例表emp,表结构及创建语句如下:
字段名称
数据类型
备注
empno
int(10)
员工编号
ename
varchar(20)
员工姓名
job
varchar(20)
员工职位
leader
int(10)
直系领导
hiredate
datetime(6)
雇佣时间
sal
float(20)
员工薪资
comm
float(20)
员工津贴
deptno
int(10)
部门编号
接下来将表中数据分别以CSV、TXT格式进行存储,表数据及存储结果如下:
① CSV文件格式
【例】将emp.csv文件数据导入emp表中,MySQL输入及输出如下:
小贴士:实际操作中若遇到Excel格式的数据,我们通常会将其另存为成CSV格式文件再导入到MySQL数据库中。
② TXT文件格式
【例】将emp.txt文件数据导入emp表中,MySQL输入及输出如下:
4.1.2 使用Workbench菜单式导入数据
Workbench可视化工具中也提供了菜单化的MySQL数据导入方法,具体的操作步骤如下:
① 在test01数据库中创建好emp表空间,左侧Schemas中选择test01数据库,找到emp表空间。
② 右键点击emp表,选择Table Data Import Wizard,弹出Table Data Import界面。
③ 在Table Data Import界面中,点击Browse选择emp.csv文件并打开。
④ 点击Next后,在Use existing table中选择test01.emp。
⑤ 点击Next后可以看到emp表的数据状态。
⑥ 继续点击Next直到数据导入成功。
⑦ 点击Finsh完成数据导入。
⑧ 最后用select语句查看导入的数据表emp。MySQL输入及输出如下:
26 Oct 2019
MySQL提供了众多功能强大、方便易用的高级查询功能,例如函数的运算、正则表达式等。灵活地使用高级查询能够极大提高数据库查询效率,并完成复杂的业务需求。本节将介绍MySQL中函数的运算和正则表达式查询方法,包括:数学函数、字符串函数、日期和时间函数、条件判断函数、正则表达式查询。
3.4.1 函数的运算
函数也称为函数关系式,假定输入参数值A,函数关系式会返回一个特定的关系值B。MySQL中提供了大量的函数,借助函数对数据进行处理可以满足各种复杂的业务需求。本节将使用样例表emp介绍数学函数、字符串函数、日期和时间函数、条件判断函数的主要作用和使用方法。
(1)数学函数
数学函数主要用来处理数值型数据,日常业务中经常会遇到求均值、求总数的问题,这时就要借助数学函数。
【例】查询emp表中每个部门的部门人数、平均薪资、最大薪资、最小薪资、薪资合计,输入及输出如下:
函数的作用:
函数符号
函数名称
函数作用
count()
计数函数
计算字段值出现的个数
avg()
平均值函数
计算字段所有值的平均数
max()
最大值函数
查找字段中的最大值
min()
最小值函数
查找字段中的最小值
sum()
求和函数
计算字段所有值的总和
【例】查询emp表中每个部门的人均津贴,输入及输出如下:
字段中包含null空值的处理方法:由于comm员工津贴中包含null空值,而使用平均值函数会直接跳过空值记性计算,所以将导致计算结果失真。因此需要利用coalesce()函数对空值进行转化,从而使得平均值函数能够读取该值并进行计算。
(2)字符串函数
字符串函数主要用来处理字符型数据,日常业务中若遇到截取字符、替换字符、合并字符串、数值转字符等问题都需要借助字符串函数,MySQL中常用字符串函数实例如下:
① 截取字符串
【例】查询emp表中每个员工姓名的首字母,输入及输出如下:
② 替换字符串
【例】将emp表中为manager的职位名称替换为leader,输入及输出如下:
③ 合并字符串
【例】将emp表中员工姓名和员工职位合并到一个字段中,输入及输出如下:
小贴士:
concat()不仅能够合并字符串,还能够合并字符串与数值,合并后的新字段为字符串类型。
【例】将emp表中员工编号、员工姓名、员工职位合并到一个字段中。
④ 数值转字符
【例】将emp表中员工编号数值型字段转为字符型字段,输入及输出如下:
(3)日期和时间函数
日期和时间函数主要用来处理日期和时间值,日常业务中若遇到查询当前日期、查询年月日、加减日期等问题都需要借助日期和时间函数,MySQL中常用日期和时间函数实例如下:
【例】获取系统当前日期和时间,输入及输出如下:
【例】查询emp表中hiredate雇佣时间的年、月和日,输入及输出如下:
【例】将emp表中hiredate雇佣时间增加1天,输入及输出如下:
小贴士:date_add()函数也能用于减少日期。
【例】将emp表中hiredate雇佣时间减少1天,输入及输出如下:
(4)条件判断函数
条件判断函数也称为控制流程函数,程序根据不同条件执行不同的流程,MySQL中条件判断函数包括if、ifnull和case。
① if函数
if函数的基本形式为if(express,d1,d2),若表达式express成立则返回值为d1,否则返回值为d2。
【例】新建一个字段名为薪资状态,薪资大于20000的员工设定为“较高”,否则为“正常”,输入及输出如下:
② ifnull函数
ifnull函数的基本形式为ifnull(d1,d2),若d1不为空,则返回值为d1,否则返回值为d2。
【例】新建一个字段名为津贴状态,津贴为空的员工显示津贴状态为0,输入及输出如下:
③ case函数
case函数的基本形式为
case when express1 then d1 [when express2 then d2] [else dn] end
若表达式express1成立则返回值为d1,若表达式express2成立则返回值为d2,依次类推,最后返回值为dn。
【例】新建一个字段名为薪资状态,薪资大于20000的员工设定为“较高”,薪资介于8000到20000之间为“正常”,否则为“较低”,输入及输出如下:
3.4.2 正则表达式
问题A:正则表达式的含义及作用是什么?
回答A:正则表达式(Regular Expression)又称规则表达式,是计算机科学的一个概念。正则表达式通常被用来检索或替换那些符合某个规则的文本内容。例如从文本文件中提取特有信息或者替换敏感词等。
问题B:正则表达式常用匹配字符有哪些?
回答B:MySQL中正则表达式常用匹配字符如下:
选项
说明
实例
^
匹配每行开始的字符串
“^a”匹配以a开头的字符串
$
匹配每行结束的字符串
“b$”匹配以b结尾的字符串
.
匹配任意单个字符
“a.b”匹配任何a和b之间有一个字符的字符串
*
匹配任意多个字符
“a.b”匹配任何a和b之间有多个字符的字符串
+
匹配前一个字符一次或多次
“a+”匹配a一次或多次
[]
匹配括号中任意一个字符
“[ab]”匹配a或者b
问题C:如何使用正则表达式查询?
回答C:MySQL中使用regexp作为正则表达式查询语句的固定语法格式,基本SQL语法格式为:
select column_name from table_name where column_name regexp 查询条件;
【例】查询emp表中员工姓名开头为a的数据,输入及输出如下:
【例】查询emp表中员工姓名结尾为a的数据,输入及输出如下:
【例】查询emp表中员工姓名包含an的数据,输入及输出如下:
【例】查询emp表中员工姓名不包含an的数据,输入及输出如下:
【例】查询emp表中员工姓名包含a或n的数据,输入及输出如下:
练习
1、查询emp表中每个职位的职位人数、平均薪资、平均津贴、最大薪资、最小薪资、薪资合计。
2、新建一个字段名为雇佣状态,将emp表中1990年以后雇佣的员工设定为“新员工”,1990年以前的员工为“老员工”。
3、查询emp表中员工职位包含sale的数据。
练习答案
1、第一题的语句如下:
2、第二题的语句如下:
3、第三题的语句如下:
25 Oct 2019
子查询指的是一条查询语句嵌套在另一条查询语句内部,即在一条select语句的from或where子句中包含另一条select语句。在查询语句中,外层select语句称为主查询,from或where子句中包含的select语句称为子查询,也称嵌套查询。理论上子查询可以出现在select语句的任何位置,但实际开发中,子查询经常出现在from和where子句中。本节将介绍SQL子查询方法,其中包括:from型子查询和where型子查询。
3.3.1 from型子查询
from型子查询也称为表子查询,子查询语句位置在from后,用来返回多行多列的数据记录,返回的数据记录可以当作一张临时表。MySQL中from型子查询基本语法形式为:
select column_name from (select column_name from table_name) as table_name_new;
小贴士:使用from型子查询必须给内层select语句所生成的临时表提供一个新表名!
本节将使用样例表player和penalty,数据表结构、创建及插入数据语句如下:
表 player球员信息表
字段名称
数据类型
约束
备注
id
int(10)
主键约束
球员编号
name
varchar(20)
/
球员姓名
birthday
datetime(6)
/
出生日期
sex
varchar(20)
/
球员性别
town
varchar(20)
/
居住城市
player表数据如下:
id
name
birthday
sex
town
1
Dempsey
1982-9-1
M
Stratford
2
Aldrich
1981-6-25
M
Stratford
7
Alex
1983-5-11
M
Stratford
8
Nic
1986-11-1
F
Inglewood
27
Devin
1982-12-28
F
Eltham
28
Dick
1981-6-22
F
Midhurst
39
Fitch
1986-10-29
M
Stratford
44
Mason
1983-1-9
M
Inglewood
57
Noah
1978-8-17
M
Stratford
83
Hope
1986-11-11
M
Stratford
95
Cumberland
1983-5-14
M
Douglas
100
Parmenter
1983-2-28
M
Stratford
104
Esther
1975-5-10
F
Eltham
112
Conrad
1983-10-1
F
Plymouth
表 penalty球员信息表
字段名称
数据类型
约束
备注
p_id
int(10)
外键约束
球员编号
pay_no
int(10)
主键约束
罚款编号
pay_date
datetime(6)
/
罚款时间
amount
float(10)
/
罚款金额
penalty表数据如下:
p_id
pay_no
pay_date
amount
44
2
1991-5-5
75000
27
3
1983-9-10
10000
104
4
1984-12-8
50000
44
5
1991-12-8
25000
8
6
1991-11-12
25000
44
7
1992-12-30
30000
27
8
1984-11-12
75000
player球员信息表的代码输入如下:
结果输出如下:
penalty罚款信息表的代码输入如下:
结果输出如下:
【例】查询球员编号小于10的男性球员姓名,上述需求可拆解成以下几个部分:
· 编号小于10的球员
· 性别为男性的球员
可以看出这是一个单表查询的问题,实际上我们可以用多条件查询解决,MySQL输入及输出如下:
但我们也可以将上述多条件查询改写成子查询的方法,MySQL输入及输出如下:
3.3.2 where型子查询
where型子查询包括行子查询和列子查询两种,其子查询语句位置在where后,行子查询用来返回单行的数据记录,而列子查询用来返回多行的数据记录。
(1)行子查询
行子查询主要包括单行单列和单行多列的情况,MySQL基本语法形式为:
select column_name from table_name where column_name 逻辑操作符 (
select column_name from table_name where 查询条件);
① 单行单列
【例】查询与100号球员性别相同的球员编号和姓名。
② 单行多列
【例】查询与100号球员性别相同且居住城市相同的球员编号和姓名。
小贴士:当用where进行多条件判断时,也可以用in关键字来简化代码量,即上述语句可写为:
(2)列子查询
行子查询主要面对多行单列的情况,通常会包含in、any、all、exists等关键字。
① 带有in关键字的列子查询
当主查询的条件存在于子查询的结果中时,可以通过关键字in进行判断。相反如果想实现主查询的条件不存在于子查询的结果中时,可以通过关键字not in进行判断,MySQL基本语法形式为:
select column_name from table_name where column_name in (select column_name from table_name where 查询条件);
【例】查询所有有过罚款记录的球员编号和球员姓名。
② 带有any关键字的列子查询
当主查询的条件满足子查询返回结果中任意一条数据记录时,可以通过关键字any进行判断,MySQL基本语法形式为:
select column_name from table_name where column_name 逻辑操作符
any(select column_name from table_name where 查询条件);
【例】查询至少比另一个球员年轻且居住在同一城市的球员编号和球员姓名。
上述需求可拆解成以下2个部分:
·居住城市相同的球员;
·至少比另一个球员年轻的球员。
MySQL输入及输出如下:
③ 带有all关键字的列子查询
当主查询的条件满足子查询返回结果中所有数据记录,可以通过关键字all进行判断,MySQL基本语法形式为:
select column_name from table_name where column_name 逻辑操作符 all(
select column_name from table_name where 查询条件);
【例】查询最年轻的球员编号和球员姓名,MySQL输入及输出如下:
④ 带有exists关键字的列子查询
关键字exists是一个布尔类型,当有返回结果时为True,不能返回结果时为False,MySQL基本语法形式为:
select column_name from table_name where exists (
select column_name from table_name where 查询条件);
【例】查询至少支付了一次罚款的球员编号和球员姓名,MySQL输入及输出如下:
小贴士:
exists表示返回结果为True,如果想要查询返回结果为False时,可以使用not exists关键字
【例】查询没有支付过罚款的球员编号和球员姓名。
练习
1.用子查询方法,从emp表中查询姓名首字母为c,薪资高于6000,津贴不为空的员工;
2.从player表中查询与27号球员性别相同且居住城市相同的球员编号和姓名;
3.从player表中查询最年长的球员编号和球员姓名。
练习答案
1.第一题的语句如下:
2.第二题的语句如下:
方法1
方法2
3.第三题的语句如下:
25 Oct 2019
表连接是关系型数据库最突出的特性,通过连接运算符能够实现多表连接查询,查询方式主要包括纵向连接和横向连接。当实际进行MySQL数据库查询时,通常会遇到以下两种情况:① 纵向合并多个表中具有相同字段的数据;② 横向合并多个表中描述同一类事物不同的字段。本章将介绍MySQL多表联合查询方法,其中包括:纵向内连接、纵向全连接、横向内连接、横向左/右连接、横向全连接。
3.2.1 多表纵向连接
多表纵向连接的作用是将数据表中相同的数据合并到一起,因此纵向连接也可以称为行连接。纵向连接主要有两种连接方式:内连接和全连接,前者将数据合并到一起后剔除整行重复的数据,后者直接将所有数据合并到一起不再去重。本节将使用样例表emp01、emp02进行讲解,数据表创建及插入数据语句如下:
(1)纵向内连接
MySQL中使用union实现纵向内连接,基本语法形式为:
select 字段1,字段2,```,字段n from table_name1
union
select 字段1,字段2,```,字段n from table_name2;
【例】查询emp01和emp02中所有不重复的员工信息,输入及输出如下:
小贴士:
MySQL进行纵向连接时也能加入其他子句,下面举两个例子:
【例】查询emp01和emp02中所有comm津贴小于8000的员工编号和员工姓名,输入及输出结果如下:
【例】查询emp表中各部门薪资排名前三的员工姓名、员工薪资、部门编号,输入及输出如下:
注意:MySQL进行多表纵向连接时,若只包含where子句可有选择性的添加括号,若包含group by或order by子句则必须添加括号。
(2)纵向全连接
MySQL中使用union all实现纵向全连接,基本语法形式为:
select 字段1,字段2,```,字段n from table_name1
union all
select 字段1,字段2,```,字段n from table_name2;
【例】查询emp01和emp02中所有的数据,输入及输出如下:
小贴士:纵向内连接和全连接最大的区别就在于合并后的数据去不去重的问题,句法本身除了union和union all关键字不同,基本可以复用。
3.2.2 多表横向连接
问题A:多表横向连接的作用及常见类型有哪些?
回答A:多表横向连接的作用是将分在不同数据表中描述同一类事物的多个字段合并在一起,因此横向连接也可以称为列连接。横向连接主要有四种连接方式:内连接、左连接、右连接、全连接,连接方式如下图所示:
小贴士:日常工作中有80%的概率会碰到需要横向连接的场景,因此我们日常交流中提及的内连接、全连接默认指的是横向内连接、横向全连接。
问题B:如何编写多表横向连接SQL语句?
回答B:编写多表横向连接SQL语句,将使用样例表manager和employee,数据表结构、创建及插入数据语句如下:
表 manager领导信息表
字段名称
数据类型
约束
备注
id
int(10)
主键约束
领导编号
name
varchar(20)
/
领导姓名
表 employee员工信息表
字段名称
数据类型
约束
备注
m_id
int(10)
外键约束
领导编号
empno
int(10)
主键约束
员工编号
ename
varchar(20)
/
员工姓名
(1)横向内连接
MySQL中一共有3种方法可以实现横向内连接,基本语法形式为:
# 方法1
select 字段1,字段2,```,字段n from table_name1 join table_name2 on 匹配条件;
# 方法2
select 字段1,字段2,```,字段n from table_name1 inner join table_name2 on 匹配条件;
# 方法3
select 字段1,字段2,```,字段n from table_name1,table_name2 where 匹配条件;
注意事项:只有横向内连接-方法3是用where作为匹配条件的语法,其它所有横向连接全以on作为匹配条件的语法。
【例】对表manager和表employee进行横向内连接,输入及输出如下:
小贴士:当遇到较长的表名称时,通常会给数据表起一个临时的别名,MySQL输入及输出如下:
另外两个方法的输入及输出如下:
(2)横向左连接
MySQL中使用left join实现横向左连接,基本语法形式为:
select 字段1,字段2,```,字段n from table_name1 left join table_name2 on 匹配条件;
【例】对表manager和表employee进行横向左连接,输入及输出如下:
(3)横向右连接
MySQL中使用right join实现横向右连接,基本语法形式为:
select 字段1,字段2,```,字段n from table_name1 right join table_name2 on 匹配条件;
【例】对表manager和表employee进行横向右连接,输入及输出如下:
小贴士:在日常编写SQL查询语句时,大部分程序员会采用将两张表前后位置颠倒的方法,达到用左连接代替右连接的目标,因此我们很少会看到SQL语句里有右连接的情况。
(4)横向全连接
MySQL中不支持使用full join实现横向全连接,但可以通过将左连接与右连接纵向拼接的方式达到横向全连接的效果。
【例】对表manager和表employee进行横向全连接,输入及输出如下:
问题C:如何理解多表横向连接查询?
回答C:想要理解多表横向连接查询的原理,首先得了解笛卡尔积。
小贴士:笛卡尔积又称为笛卡尔乘积,是两个集合相乘的结果。假设存在集合A{a1,a2,a3}和集合B{b1,b2},那么集合A与B的笛卡尔积为{(a1,b1),(a1,b2),(a2,b1),(a2,b2),(a3,b1),(a3,b2)}。
数据库在进行多表横向连接查询时,就是先计算作为匹配条件字段的笛卡尔积,然后筛选出符合规则的元素组合。下面我们举一个横向内连接的例子。
【例】对表manager和表employee进行横向内连接,输入如下:
select * from manager join employee on manager.id=employee.m_id;
基于笛卡尔积的计算方式为:
① 计算作为匹配条件字段id和m_id的笛卡尔积
集合id{1002,2001,3001}
集合m_id{2001,3001}
集合A与B的笛卡尔积为
{(1002,2001),(1002,3001),(2001,2001),(2001,3001),(3001,2001),(3001,3001)}
② 内连接要求筛选出字段id等于m_id的元素组合
{(2001,2001),(3001,3001)}
③ 显示上述结果所查询的字段
再举个横向左连接的实例:
【例】对表manager和表employee进行横向左连接,输入如下:
select * from manager left join employee on manager.id=employee.m_id;
基于笛卡尔积的计算方式为:
① 计算作为匹配条件字段id和m_id的笛卡尔积
集合id{1002,2001,3001}
集合m_id{2001,3001}
集合A与B的笛卡尔积为
{(1002,2001),(1002,3001),(2001,2001),(2001,3001),(3001,2001),(3001,3001)}
② 左连接要求筛选出字段id等于m_id的元素组合,并且保留包含字段id的所有元素
{(2001,2001),(3001,3001)}和{(1002,null)}
③ 显示上述结果所查询的字段
练习
1.查询emp表中各部门薪资小于10000的员工姓名、员工薪资、部门编号
2.查询employee表中所有员工的领导编号和领导姓名
3.基于笛卡尔积描述【例】对表manager和表employee进行横向右连接的数据库计算方式
练习答案
1.第一题的语句如下:
2.第二题的语句如下:
方法1
方法2
方法3
3.第三题的描述如下:
基于笛卡尔积的计算方式为:
(1)计算作为匹配条件字段id和m_id的笛卡尔积
集合id{1002,2001,3001}
集合m_id{2001,3001}
集合A与B的笛卡尔积为
{(1002,2001),(1002,3001),(2001,2001),(2001,3001),(3001,3001),(3001,3001)}
(2)右连接要求筛选出字段id等于m_id的元素组合,并且保留包含字段m_id的所有元素
{(2001,2001),(3001,3001)}
(3)显示上述结果所查询的字段
24 Oct 2019
数据库管理系统最重要的功能就是数据查询,数据查询不仅仅是简单的从数据库中提取数据,还需要根据业务要求对查询的数据进行清洗及整理。而MySQL提供了一系列功能强大、灵活的SQL语句来实现查询操作,本节作为数据库查询的起始章节,将介绍如何使用select语句进行单表查询,并且在单表查询中如何实现筛选、分组、排序等操作。
3.1.1 select查询框架需牢记
使用select语句从数据库中查询数据是数据分析师日常最基本的工作内容,那么select语句的基础框架是怎样的?该如何利用select语句进行数据表查询?编译select语句需要注意哪些细节?接下来,将逐一为大家答疑解惑。
(1)select语句长啥样
select column_name from table_name
注意:实际操作中我们经常会看到类似select * from table_name; 其中*是通配符,表示查询数据表中所有字段。
本节将使用样例表emp,表结构及创建语句如下:
字段名称
数据类型
备注
empno
int(10)
员工编号
ename
varchar(20)
员工姓名
job
varchar(20)
员工职位
leader
int(10)
直系领导
hiredate
datetime(6)
雇佣时间
sal
float(20)
员工薪资
comm
float(20)
员工津贴
deptno
int(10)
部门编号
这时我们查看emp表中所有的字段。
MySQL输入及输出如下:
接下来将数据插入emp表中,再执行查询语句,emp表数据如下:
empno
ename
job
leader
hiredate
sal
comm
deptno
3005
chloe
salesman
3001
1987-02-20
5600
6000
3
3002
danae
salesman
3001
1987-02-24
6000
10000
3
3005
chloe
salesman
3001
1987-02-20
5600
6000
3
3002
danae
salesman
3001
1987-02-24
6000
10000
3
1001
blanche
persident
1980-11-17
50000
1
2001
an
manager
1001
1982-09-02
35000
5000
2
3003
snow
salesman
3001
1991-11-28
5500
5400
3
3004
celina
manager
1001
1982-07-01
30000
5000
3
1002
sicily
manager
1001
1981-06-09
25000
5000
1
2002
claudia
analyst
2001
1985-11-17
30000
2
2003
elina
analyst
2001
1987-04-19
24000
2
3001
dolores
salesman
3001
1985-07-08
5500
2000
3
1011
claudia
clerk
2001
1987-05-23
9000
2
3006
laraine
clerk
3001
1992-12-03
9500
3
2004
gina
analyst
2001
1991-12-03
18000
2
1003
nana
clerk
1002
1992-01-23
8000
1
MySQL输入及输出如下:
(2)select语句及它的四个子句
select column_name from table_name
where
group by
having
order by
注意事项:
① 四个子句使用顺序不能颠倒;
② 四个子句可少用但不可多用或重复使用;
③ having子句与group by子句连用,没有group by不能用having,但没有having仍可使用group by。
接下来我们尝试利用这四个子句完成一个比较复杂的业务需求:
查询单个员工薪资高于20000且总人数大于1的职位,按照总人数由小到大进行排序。当我们拿到比较复杂的业务需求时,首先要学会对业务需求进行拆解,上述需求可以拆解为以下几个部分:
① 筛选出薪资高于20000的员工——条件查询where
② 按职位进行分组并计算总人数——分组查询group by
③ 筛选出总人数大于1的职位——分组后筛选having
④ 按照总人数由小到大进行排序——排序查询order by
根据我们的分析,MySQL输入及输出如下:
3.1.1 select查询框架需牢记
条件查询作为select语句中第一条子句,在数据库日常查询过程中使用率大概达到了80%以上,例如提取某个地区的用户表或者是某一天的订单表等。MySQL中使用where对数据进行条件查询,基本语法形式为:
select column_name from table_name
where 查询条件;
(1)查询指定行
【例】查询emp表中所有salesman销售人员的数据,MySQL输入及输出如下:
逻辑操作符
备注
=
相等
!=,<>
不相等
>
大于
>=
大于等于
<
小于
<=
小于等于
between …and …
介于两者之间
(2)查询空值
【例】查询emp表中comm津贴为空的员工,MySQL输入及输出如下:
注意:MySQL中null空值不属于任何数据类型,有且只能与is连用,其中is null表示为空,is not null表示非空。
(3)多条件查询
【例】查询emp表中部门编号为1和2的员工,MySQL输入及输出如下:
注意:MySQL进行多条件判断时,如果字段相同,可以用in来减少代码冗余,上述句式可改写成:
【例】查询emp表中部门编号为1和部门编号为2中薪资大于20000的员工
上述需求可以拆解为以下几个部分:
① 查询部门编号为1的员工
② 查询部门编号为2且薪资大于20000的员工
根据我们的分析,MySQL输入及输出如下:
注意:MySQL做多条件查询时会用到and/or作为连接符,and表示且,or表示或。当判断条件多于两个时,我们需要注意判断条件的先后顺序,必要时可添加括号。
(4)模糊查询
【例】查询emp表中员工姓名第二个字母为a的数据,MySQL输入及输出如下:
注意:模糊查询通常用于检索字符串类型数据。
3.2.3 数据分组巧用group by
数据查询时经常会遇到分组的情况,分组查询是对数据按照单个或多个字段进行分组,通常会与count()、sum()等集合函数一起使用,MySQL中使用group by对数据进行分组,基本语法格式为:
select column_name from table_name
group by 字段;
(1)单字段分组
【例】查询emp表中各部门薪资总和,MySQL输入及输出如下:
(2)多字段分组
【例】查询emp表中各部门、各职位薪资总和,MySQL输入及输出如下:
(3)条件判断与数据分组
【例】查询emp表中各部门员工薪资大于10000的人数
上述需求可以拆解为以下几个部分:
① 员工薪资大于10000
② 各部门员工人数
根据我们的分析,MySQL输入及输出如下:
3.2.4 分组后筛选别忘having
having子句用来筛选满足条件的分组,因此只有当数据分组后才会使用having子句,MySQL基本语法格式为:
select column_name from table_name
group by 字段
having 条件表达式;
【例】查询emp表中各部门、各职位薪资总和大于20000的数据,MySQL输入及输出如下:
3.2.5 整齐排序还看order by
通常情况下为了更清晰的展示数据集,我们需要对查询的数据结果进行排序,MySQL中使用order by进行数据排序,基本语法格式为:
select column_name from table_name
order by 字段;
(1)单字段排序
【例】查询emp表中所有数据,并按sal薪资由小到大升序排列,MySQL输入及输出如下:
注意:MySQL也支持数据由大到小进行降序排列,只需在字段后加desc固定语法即可。
【例】查询emp表中所有数据,并按sal薪资由大到小降序排列,MySQL输入及输出如下:
(2)多字段排序
【例】查询emp表中所有数据,并按deptno部门编号升序,sal薪资降序排列,MySQL输入及输出如下:
多字段排序时需要注意:
① 多个需要排序的字段间用逗号分隔;
② 字段前后位置要与业务需求一致;
③ 哪个字段需要降序排列则desc紧随其后;
(3)分组排序
【例】查询emp表中各部门薪资总和,按薪资总和降序排列,MySQL输入及输出如下:
练习
根据样例表emp,我们来尝试以下练习:
1、查询姓名首字母为c,薪资高于6000,津贴不为空的员工。
2、查询人数超过1个的职位,并按照人数升序排列。
3、尝试用两种方法查询职位为analyst分析师的员工人数。
练习答案
1、第一题的语句如下:
2、第二题的语句如下:
3、第三题的语句如下:
方法1
方法2
27 Aug 2019
最近总是遇到录音转译文本格式化的问题,遂写下该博文,以便后续应用:
原始语料下载地址:dataformat文件夹
Python文本格式化程序如下:
# ==== 单个文本格式化 ====
infile = open("d:\\811901011508591.txt","r",encoding="gbk").readlines()
outfile = "d:\\test1.txt"
print(infile)
datas=[]
# 去除文本第一行
for i in infile[1:]:
# 对数组每一个元素再切分
row = i.strip().split(" ")
datas.append(" ".join(row[2:]))
# 数组打印输出
print("\n".join(datas),file=open(outfile,"w",encoding="utf-8"))
# ==== 批量文本格式化 ====
import os
root = "d:\\test\\"
for root,dirs,files in os.walk(root):
for n in files:
n = root + n
infile = open(n,"r",encoding="gbk").readlines()
datas = []
for i in infile[1:]:
row = i.strip().split(" ")
datas.append(" ".join(row[2:]))
print("\n".join(datas), file=open(n, "w", encoding="utf-8"))
02 Aug 2019
之前有同学在讲关键词的时候,有同学提出热词怎么计算,遂将热词统计方法分享出来。
Python热词统计程序如下:
import jieba
text="小明硕士毕业于中国科学院计算所"
seg_list = jieba.cut(text, cut_all = False)
content = " ".join(seg_list)
print(content)
# 将文本拆分成列表
c = content.split(" ")
print(c)
# 读取列表,并计数
for i in c:
print(i,c.count(i))
Python热词统计结果如下:
小明 1
硕士 1
毕业 1
于 1
中国科学院 1
计算所 1
02 Jul 2019
近期项目总遇到csv格式文件,遂记录一下该文件的读取、清洗及写入方式,供大家参考:
原始数据下载地址:test_new.csv
Python实现代码如下:
import csv
infile = "d:\\test_csv.csv"
outfile = "d:\\test_new.csv"
datas = []
with open(infile, "r") as f:
reader = csv.reader(f)
header = next(reader) # 跳过表头
for row in reader:
row = [_.replace(",", ",") for _ in row] # 替换文本中的关键字
if row[3] and row[4]: # 字段不为空
datas.append(",".join(row[0:-1]).replace("\n", ""))
print("\n".join(datas), file=open(outfile, "w", encoding="gbk"))
18 Jun 2019
最近遇到了需要批量剔除某列字段的需求,虽然很简单,但想着今后可能还会复用,遂在此记录一下。
原始数据下载地址:test_dir.zip
Python实现代码如下:
# ==== 单个文件提取任意字段 ====
import os
ftxt = "D:\\test_dir\\test01.txt"
contents = []
with open(ftxt, "r", encoding="utf-8") as f:
mylist = list(f) # 将字符串转化为数组
for i in mylist:
content = i.replace("\n", "").split("\t") # 将数据划分为不同的列
s = "".join(content[2]+"\t"+content[3]) # 提取/剔除任意列
contents.append(s)
with open(ftxt, "w", encoding="utf-8") as f: # 将结果写入文件
if isinstance(contents, list):
for content in contents:
f.write("{0}{1}".format(content, os.linesep))
else:
f.write(contents)
# ==== 批量提取任意字段 ====
import os
ftxts = "D:\\test_dir\\"
for root, dirs, files in os.walk(ftxts):
for n in files:
ftxt = root + n
contents = [] # 注意contents位置
with open(ftxt, "r", encoding="utf-8") as f:
mylist = list(f) # 将字符串转化为数组
for i in mylist:
content = i.replace("\n", "").split("\t") # 对数据进行划分
s = "".join(content[-2] + "\t" + content[-1]) # 提取任意字段
contents.append(s)
with open(ftxt, "w", encoding="utf-8") as f:
if isinstance(contents, list):
for content in contents:
f.write("{0}{1}".format(content, os.linesep))
else:
f.write(contents)
10 Jun 2019
最近在跟进项目的时候,遇到了一个数据清洗的需求,该需求要求按照双引号成行,以竖线分隔,将txt文件转换成csv文件。
原始数据下载地址:1.txt
Python实现代码如下:
fpath = "d:\\1.txt"
with open(fpath, "r", encoding="utf-8") as f:
datas = [_.replace("\n","") for _ in f.readlines()]
datas = "".join(datas).split("\"\"")
print(len(datas))
tmp = []
for i, data in enumerate(datas):
data = data.replace("\"","").split("|")
data_num = len(data)
if data_num >= 3:
tmp.append(",".join(["",data[0],"","",data[1],data[2],""]))
else:
print("line:{0}, context:{1}".format(i + 1,data))
datas = ["序号, id号, 时间, 电话, 标题, 摘要, 反馈内容"] + tmp
print("\n".join(datas), file=open("d:\\1.csv","w",encoding="gbk"))
16 Apr 2019
最近总遇到一些由传统产品经理转向AI产品经理的同僚,大部分由于缺少AI普适性的概念导致日常工作进展缓慢,遂整理一些自己筛选过的文章以供大家尽快了解这个行业。
1.《人工智障 2 : 你看到的AI与智能无关》
整篇分为6个Part,其中Part1~3分别讲述的是AI的现状、成因及愿景,Part4~5讲述AI与产品,Part6是结束语。核心论点:单靠深度学习搞不定自然语言,更需要从产品设计角度去弥补现有技术的缺陷。
2.《基于知识图谱的问答在美团智能交互场景中的应用和演进》
该篇主要阐述智能交互三个方面:检索式交互、 任务式交互、闲聊式交互,适合期望了解对话机器人的初学者阅读。
3.《Deep Learning for Natural Language Processing》
这是一套斯坦福的课程,建议有一定NLP基础的同学去学习,会有很多新的启发
25 Mar 2019
索引类似于一本书的目录,它记录了数据在数据库中存放的位置,创建索引可以帮助用户快速找出某个字段中特定值的行,由此提高MySQL查询数据的速度。视图是由一个或多个数据表组合而成的一张虚拟表,用户可以从这张虚拟表中查询到需要的数据,但其本身不存储数据。本节将详细介绍索引和视图,主要内容包括:创建索引、修改索引、查看索引、删除索引、创建视图、查看视图、修改视图、删除视图。
2.5.1 索引
问题A:索引的含义及作用是什么?
回答A:索引是对数据表中一个或多个字段的值进行排序的一种数据结构,使用索引可以提高数据库中特定数据的查询效率。例如一张有3万条记录的学生信息表,现在想要查询id编号为10000的学员信息,如果没有对id列建立索引,则计算机需要逐行遍历整个数据表,直到找出id等于10000这一行为止,相反如果已经在id列上创建索引,则MySQL不需要逐行遍历全表,而是直接在索引字段里找到10000,从而得知这一行的位置。
问题B:索引的存储类型及常见分类有哪些?
回答B:MySQL中索引的存储类型包括B-Tree和HASH两种,具体和表的存储引擎相关,例如MyISAM、InnoDB存储引擎只支持B-Tree索引,而Memory存储引擎可以同时支持B-Tree和HASH索引。
索引类型
索引名称
相关代码块
备注
普通索引
Index
index(column_name)
基本索引类型,没有任何限制
唯一索引
Unique
unique index(column_name)
索引列的值必须唯一,但允许有空值
主键索引
Primary
primary key(column_name)
索引列的值必须唯一,且不允许有空值
组合索引
MultiIdx
Index(column_name1,column_name2```)
多个字段组合创建一个索引,遵循“最左前缀”原则
全文索引
Fulltext
fulltext index(column_name)
仅支持MyISAM存储引擎,用于检索文本信息
约束与索引
(1)约束与索引到底有什么联系和区别?
约束与索引是两种不同的概念,前者是为了维护数据库的完整性,后者是为了提高数据库查询效率,但在创建约束的同时相当于在指定列上创建了一个索引。
(2)唯一约束与唯一索引又有什么关系?
创建唯一约束时,系统会自动创建唯一索引,都要求唯一字段不重复但可以为空,程序实现起来并没有任何区别。
(3)主键约束与主键索引有什么关系?
同理,创建主键约束时,系统也会自动创建主键索引,都要求主键字段不重复且不为空,程序实现起来同样没有任何区别。
注意:索引能够有效缩短数据检索、分组和排序的时间,加速多表连接的查询速度,但过多的索引会占用大量磁盘空间,并降低数据表增删改的效率,因此在设计数据库时,需要合理的添加索引,避免索引的滥用。
问题C:索引创建、查看、删除的方法有哪些?
回答C:MySQL提供多样化的索引创建、查看、删除方法,具体方法如下:
(1)创建索引
MySQL支持3种索引创建的方式:
① 创建表create table时指定索引字段,基本SQL语法格式如下:
create table table_name(
column_name column_type [key_type],
index_type(column_name)
);
【例】创建一张名为stu_inf4的学员信息表,在id列上创建普通索引,输入语句如下:
【例】创建一张名为stu_inf5的学员信息表,在id列上创建唯一索引,输入语句如下:
【例】创建一张名为stu_inf6的学员信息表,在id列上创建主键索引,输入语句如下:
创建索引注意事项
(1)同一张表中,用户自定义创建的索引名称不能一样;
(2)同一张表中,有且只能创建一个主键索引;
(3)同一张表中,可以创建多个唯一索引;
(4)同一个字段,若已设置索引则需要删除后再创建索引,而不能直接覆盖;
② 修改表alter table时创建索引字段,基本SQL语法格式如下:
alter table table_name add index_type index_name(column_name);
【例】修改名为stu_inf4的学员信息表,在stu_name列上创建普通索引,输入语句如下:
【例】修改名为stu_inf5的学员信息表,在stu_name列上创建唯一索引,输入语句如下:
【例】创建一张名为stu_inf7的学员信息表,修改表时在id列上创建主键索引,输入语句如下:
③ 使用create index语句添加索引,基本SQL语法格式如下:
create index_type index_name on table_name (column_name);
【例】在stu_inf4的学员信息表中stu_sex列上创建普通索引,输入语句如下:
【例】在stu_inf5的学员信息表中stu_sex列上创建唯一索引,输入语句如下:
(2)查看索引
上述例子中都采用查看表结构的方法来查看索引,其实查看索引有标准的SQL语法:
show index from table_name;
【例】查看stu_inf4的学员信息表中已创建的索引,输入语句如下:
(3)删除索引
MySQL支持2种索引的删除方式:
① 修改表alter table时删除索引字段,基本SQL语法格式如下:
alter table table_name drop index index_name;
【例】删除stu_inf4的学员信息表中名为idx的索引,输入语句如下:
② 使用drop index语句删除索引,基本SQL语法格式如下:
drop index index_name on table_name;
【例】删除stu_inf4的学员信息表中名为idx1的索引,输入语句如下:
2.5.2 “增删改查”视图
视图是由数据库中一个或多个表中组合而成的虚拟表,视图一经定义便存储在数据库,但与其对应的数据并没有再复制一份,而是存储在原始数据表中。如果把数据库比作一间房子,那么视图就是这间房子上的一扇窗户,我们可以从窗户外看到房内的设施,但具体的设施还在摆在房间里。因此想要修改视图中看到的数据,必须修改原始数据表,换句话说原始表中数据发生变化会自动地反映到视图中。
(1)创建视图
MySQL既支持单个数据表上创建视图,也支持在多个表上创建视图,基本SQL语法格式如下:
create view view_name as select column_name from table_name;
① 单表上创建视图
【例】在order_sale订单表上创建一张名为view_t的视图,输入语句如下:
注意:默认情况下创建的视图与原始表的字段名称是一样的,但也可以在创建视图的同时修改视图字段名称,输入语句如下:
② 多表上创建视图
【例】在order订单表和product产品表上创建一张名为view_sum的视图,输入语句如下:
(2)查看视图
MySQL支持多样化的视图查看方式,本书介绍2种常用的视图查看方法:
① 使用describe语句查看视图基本信息,基本SQL语法格式如下:
describe view_name;
【例】查看名为view_t视图的基本信息,输入语句如下:
② 使用show create view语句查看视图详细信息,基本SQL语法格式如下:
show create view view_name;
【例】查看名为view_t视图的详细信息,输入语句如下:
(3)修改视图
MySQL支持2种视图修改方法:
① 使用create or replace view语句修改视图,基本SQL语法格式如下:
create or replace view view_name as select column_name from table_name;
注意:修改视图本质上是创建新视图然后覆盖原始视图的过程。
【例】修改视图view_t,令该视图字段与原始表字段保持一致,输入语句如下:
② 使用alter语句修改视图,基本SQL语法格式如下:
alter view view_name as select column_name from table_name;
【例】修改视图view_t1,令该视图字段与原始表字段保持一致,输入语句如下:
(4)删除视图
删除视图与删除数据表SQL语法类似:
drop view view_name;
【例】删除名为view_t的视图,输入语句如下:
练习
练习使用数据表store库存信息表,表结构如下:
表 store表结构
字段名称
数据类型
备注
p_name
varchar(20)
商品名称
quantity
int(10)
库存数量
trade_price
float(20)
批发价格
retail_price
float(20)
零售价格
(1)利用3种不同的方式,在store库存信息表中p_name字段上创建普通索引。
(2)基于store库存信息表创建视图,视图名为view_store。
练习答案
(1)利用3种不同的方式,在store库存信息表中p_name字段上创建普通索引,输入语句如下:
(2)基于store库存信息表创建视图,视图名为view_store,输入语句如下:
15 Mar 2019
在MySQL中创建表空间时,我们还可以对表字段进行约束设置,不同的约束条件所要求的数据存储也有所不同。当用户创建好表空间后,我们需要将数据值插入到表空间使其成为完整的数据表。本节将详细介绍数据表约束和数据表管理,其中包括:约束设置、数据表关联、添加表数据、修改表数据、删除表数据。
2.4.1 数据表约束
问题A:什么是SQL约束?
回答A:约束是在数据表中定义的用于维护数据库完整性的条件规则,通过对数据表中的字段定义约束条件不仅可以防止将错误数据插入数据表,还可以保持表之间数据的一致性。
问题B:SQL中的约束有哪些?
回答B:SQL中的约束一般分为列级约束和表级约束,
列级约束共6种类型,包括:主键、外键、唯一、检查、默认和非空;
表级约束共4种类型,包括:主键、外键、唯一、检查。
约束名称
约束类型
是否支持列级
是否支持表级
primary key
主键约束
√
√
foreign key
外键约束
√
√
unique
唯一约束
√
√
check
检查约束
√
√
not null
非空约束
√
×
default
默认约束
√
×
问题C:SQL中列级约束和表级约束的区别?
回答C:
(1)列级约束只作用于一个字段,表级约束能够同时作用于多个字段;
(2)列级约束设置时用空格分隔、不必指定要约束的字段名,
表级约束设置时用逗号分隔、必须指定要约束的字段名;
问题D:SQL中设置列级约束和表级约束的语法格式?
回答D: 数据表约束设置一般在创建表空间时,因此可以将MySQL中创建数据表的基本SQL语法格式修改为:
create table table_name(
column_name1 column_type key_type, #列级约束
column_name2 column_type key_type, #列级约束
···
constraint key_name key_type(column_name1,column_name2) #表级约束
);
表级约束也可以不定义约束名称,即去掉constarint key_name,直接写成key_type(column_name)的语法格式。
【例】在test01数据库中,创建一张名为stu_inf1的学员信息表,要求主键约束用表级约束方法设置,其它约束用列级约束方法设置,表结构如图所示:
字段名称
数据类型
约束
备注
Id
int(10)
主键约束
学员编号
stu_name
varchar(20)
唯一约束
学员姓名
stu_sex
varchar(20)
非空约束
学员性别
stu_score
float(10)
/
学员成绩
输入语句如下:
问题E:SQL中设置不同类型约束的作用及语法格式是什么?
回答E:SQL中约束类型共6大类:主键、外键、唯一、检查、非空、默认,设置主键与外键约束的主要作用是保证表与表之间数据的完整性和一致性,设置其它约束的主要作用是防止将错误数据插入数据表。
下面介绍主键约束和外键约束,具体作用及语法格式如下:
(1)主键约束
主键(Primary key)是最常见的约束类型,通常结合外键约束来定义不同数据表之间的关联关系。主键要求被约束的字段数据唯一且不包含空值,一般分为单字段主键和多字段联合主键两种类型。
① 单字段主键约束
单字段主键由一个字段组成,支持列级或表级约束设置方法,MySQL中设置单字段主键的基本SQL语法格式为:
# 列级约束方法设置主键
create table table_name(
column_name column_type primary key
);
# 表级约束方法设置主键
create table table_name(
column_name column_type,
constraint key_name primary key(column_name)
);
【例】创建一张名为stu_inf2的学员信息表,其主键为id列,输入语句如下:
# 列级约束方法设置主键
create table stu_inf2(
id int(10) primary key,
stu_name varchar(20),
stu_sex varchar(20),
stu_score float(10)
);
# 表级约束方法设置主键
create table stu_inf2(
id int(10),
stu_name varchar(20),
stu_sex varchar(20),
stu_score float(10),
constraint pk_1 primary key(id)
);
② 多字段主键约束
多字段主键由多个字段联合组成,仅支持表级约束设置方法,MySQL中设置多字段主键的基本SQL语法格式为:
create table table_name(
column_name1 column_type,
column_name2 cloumn_type,
primary key(column_name1,column_name2)
);
MySQL中设置多字段主键约束时,不需要使用contraint语法定义约束名称。
主键约束注意事项:
(1)每张数据表只能设置一个主键约束,但数据库中很少有不设置主键的数据表;
(2)多字段主键约束是数据表中多个字段联合作为一个主键约束,并不是数据表中多个字段分别作
【例】创建一张名为emp_inf的员工表,表结构如下图所示,表中没有主键id,为了确定唯一一个员工,将name、dept_id联合起来做主键
字段名称
数据类型
备注
Name
varchar(20)
员工姓名
dept_id
int(10)
部门编号
Exp
float(10)
工作年限
Salary
float(10)
员工薪资
输入语句如下:
(2)外键约束
外键(Foreign key)主要用来建立表与表之间的关联关系,一个表中的外键通常会指向另一个表中的主键。那么对于两个具有关联关系的数据表而言,主键所在的那张表被称为主表/父表,外键所在的那张表被称为从表/子表。外键约束建立好后,不允许删除父表中具有关联关系的行,并且若不先删除子表,父表也不允许被删除,由此保证数据引用的完整性和一致性。MySQL中设置外键约束的基本SQL语法格式为:
create table table_name(
column_name column_type,
constraint key_name foreign key(column_name) references master_table_name(master_column_name)
);
【例】创建一张名为stu_inf3的学员信息表,其主键为id列,输入语句如下:
create table stu_inf3(
id int(10) primary key,
stu_name varchar(20),
stu_sex varchar(20),
stu_score float(10)
);
【例】再创建一张名为teacher的教师信息表,表结构如图所示:
字段名称
数据类型
备注
id
int(10)
教师编号
s_id
int(10)
学员编号
c_name
varchar(20)
课程名称
t_name
varchar(20)
教师姓名
将名为s_id的字段作为外键关联到stu_inf3的主键id,输入语句如下:
E-R图
E-R图也称实体关联图(Entity Relationship Diagram),它提供了展示实体、属性和关系的方法,是用来描述现实世界的概念模型。E-R图由四个部分绘制而成:
(1)矩形框:表示实体,在框中记录实体名;
(2)椭圆形框:表示属性,在框中记录属性名;
(3)菱形框:表示关系,在框中记录关系名;
(4)连线:将各框之间连接起来,并标注连接类型(1:1、1:n、n:m);
在MySQL中,E-R图可以用来描述表与表之间的关联关系,以上述stu_inf3和teacher表为例,E-R图为:
2.4.2 数据表管理
数据存储是数据库存在的核心价值,MySQL中提供了功能丰富的数据操作语句,用户可以使用INSERT语句往表空间中插入数据,也可以使用UPDATE语句更新数据或者使用DELETE语句删除数据。
(1)插入数据
在查询数据表之前,数据表中必须要有数据,MySQL中插入数据的基本SQL语法格式为:
insert into table_name(column_name1,column_name2```) values(value1,value2```);
【例】往表名为stu_inf1的学员信息表中添加数据,表数据如图所示:
id
stu_name
stu_sex
stu_score
1
张三
男
83.5
2
李四
男
80
3
王五
女
90.5
4
熊六
男
77.5
方法一:逐行插入数据
insert into stu_inf1(id,stu_name,stu_sex,stu_score) values(1,"张三","男",83.5);
insert into stu_inf1(id,stu_name,stu_sex,stu_score) values(2,"李四","男",80);
insert into stu_inf1(id,stu_name,stu_sex,stu_score) values(3,"王五","女",90.5);
insert into stu_inf1(id,stu_name,stu_sex,stu_score) values(4,"熊六","男",77.5);
方法二:同时插入多行数据
insert into stu_inf1(id,stu_name,stu_sex,stu_score)
values(1,"张三","男",83.5),
(2,"李四","男",80),
(3,"王五","女",90.5),
(4,"熊六","男",77.5);
插入数据时要保证每列插入的数据值与字段的数据类型相一致,如果数据类型不一致MySQL会报错且无法插入数据。
小贴士:为数据表中所有字段都插入数据时,可以不需要指定字段名,基本SQL语法格式为:
insert into table_name values(value1,value2```);
【例】往表名为stu_inf1的学员信息表中添加数据,输入语句如下:
# 逐行插入数据
insert into stu_inf1 values(1,"张三","男",83.5);
insert into stu_inf1 values(2,"李四","男",80);
insert into stu_inf1 values(3,"王五","女",90.5);
insert into stu_inf1 values(4,"熊六","男",77.5);
# 同时插入多行数据
insert into stu_inf1 values(1,"张三","男",83.5),
(2,"李四","男",80),
(3,"王五","女",90.5),
(4,"熊六","男",77.5);
(2)更新数据
当表中有数据之后,可以对数据进行更新操作,MySQL中更新数据的基本SQL语法格式为:
update table_name set column_name=new_value where column_name=value;
【例】将stu_inf1学员信息表中,学员姓名为张三的成绩修改为85分,输入语句如下:
论数据类型的重要性:
在MySQL中定位数据时,一定要注意数据所在字段的数据类型,若遇到字符型数据必须在数据前后加上单引号或双引号。不同数据类型的使用方法,将在3.4高级查询中详细展开。
(3)删除数据
当数据不在使用时,用户也可以对数据进行删除操作,MySQL中删除数据的基本SQL语法格式为:
delete from table_name where column_name=value;
【例】删除stu_inf1学员信息表中,学员姓名为张三的信息,输入语句如下:
注意:删除数据时,删除的是用户指定数据值所在数据表的某一行,而不是数据值所在的单元格。
练习
(1)在test_stu数据库中,分别创建student学生信息表、score学生成绩表和teacher教师信息表,表结构和约束设置如下:
表 student学员信息表
字段名称
数据类型
约束
备注
id
int(10)
主键约束
学员编号
s_name
varchar(20)
/
学员姓名
s_age
int(10)
/
学员年龄
s_sex
varchar(20)
/
学员性别
表 score学员信息表
字段名称
数据类型
约束
备注
s_id
int(10)
外键约束
学员编号
c_name
varchar(20)
/
课程名称
c_score
float(10)
/
课程成绩
表 teacher学员信息表
字段名称
数据类型
约束
备注
id
int(10)
主键约束
教师编号
s_id
int(10)
外键约束
学员编号
c_name
varchar(20)
/
课程名称
t_name
varchar(20)
/
教师姓名
(2)绘制student学生信息表、score学生成绩表和teacher教师信息表的E-R图:
(3)分别往student学生信息表、score学生成绩表和teacher教师信息表中插入数据,表数据如下:
表 student学员信息表
id
s_name
s_age
s_sex
101
张三
17
男
102
李四
18
男
103
王五
17
女
104
熊六
18
男
表 score学员信息表
s_id
c_name
c_score
101
语文
95
101
数学
75
101
英语
73.5
102
语文
89
102
数学
85
102
英语
86
103
语文
65
103
数学
93.5
103
英语
90.5
104
语文
89
104
数学
92.5
104
英语
94
表 teacher学员信息表
id
s_id
c_name
t_name
1
101
语文
张玲
2
102
语文
张玲
3
103
语文
张玲
4
104
语文
张玲
5
101
数学
杨猛
6
102
数学
杨猛
7
103
数学
杨猛
8
104
数学
杨猛
9
101
英语
王爽
10
102
英语
王爽
11
103
英语
王爽
12
104
英语
王爽
练习答案
(1)分别创建student学生信息表、score学生成绩表和teacher教师信息表,输入语句如下 :
(2)绘制student学生信息表、score学生成绩表和teacher教师信息表的E-R图,如下图所示:
(3)往student学生信息表、score学生成绩表和teacher教师信息表中插入数据,输入代码如下:
14 Mar 2019
MySQL数据库管理系统安装好之后,首先需要用户创建数据库和表空间,数据库是存储数据表的容器,数据表是数据库的基本操作对象。本章将详细介绍数据库的基本操作,主要内容包括:创建数据库、查看数据库、选择数据库、删除数据库、创建表空间、查看表空间、修改表空间、删除表空间。
2.3.1 “增删选查”数据库
每次使用MySQL数据库前,我们都需要将MySQL连接到对应的服务器DBMS上。远程连接服务器时一般会要求我们输入用户名和密码,但如果使用的是本地服务器,直接在MySQL Workbench中单击Local instance MySQL进行本地连接即可。
(1)创建数据库
最初连接到MySQL时,除存放系统配置文件的数据库外,没有任何其他可供用户操作的数据库。因此在执行数据库操作前,需要我们自行创建并选择一个数据库,即在系统磁盘上划分一块区域用来存储和管理数据。MySQL中创建数据库的基本SQL语法格式为:
create database database_name;
【例】创建库名为test01的数据库,输入语句如下:
create database test01;
create database是固定语法格式,表示创建数据库,database_name是用户自定义创建的数据库名称,该名称不能与已存在的数据库重名。
(2)查看数据库
数据库创建好之后,我们可以通过固定命令来查看所有的数据库名称,MySQL中查看数据库的基本SQL语法格式为:
show databases;
MySQL输出结果如下:
(3)选择数据库
每当用户登录MySQL时,都需要先选择一个数据库,才能对该数据库中的数据表进行相关操作,MySQL中选择数据库的基本SQL语法格式为:
use database_name;
【例】选择库名为test01的数据库,输入语句如下:
use test01;
为什么要选择数据库?
把数据库想象为Windows操作系统下的文件夹,数据表想象为文件夹中的文件。当我们想要在Windows下编辑某个文件的时候,必须先打开对应的文件夹,同理,当我们想要操作数据表的时候,必须先选择对应的数据库才行。
(4)删除数据库
删除数据库是将已存在的数据库从系统磁盘上清除,清除之后,数据库包括数据库中所有的数据都会被一同清除,删除数据库命令和创建数据库命令基本类似,MySQL中删除数据库的基本SQL语法格式为:
drop database database_name;
【例】删除库名为test01的数据库,输入语句如下:
drop database test01;
2.3.2 “增删改查”表空间
数据表是数据库中最基本也是最重要的操作对象,是数据存储的基本单位。由于MySQL属于结构化数据库,因此其所存储的数据表也多为结构化数据表,即按照行和列的格式进行存储。
(1)创建表空间
MySQL中创建数据表的基本SQL语法格式为:
create table table_name( column_name1 column_type );
【例】在test01数据库中,创建一张名为stu_inf的学员信息表,表结构如下:
字段名称
数据类型
备注
id
int(10)
学员编号
stu_name
varchar(20)
学员姓名
stu_sex
varchar(20)
学员性别
stu_score
float(10)
学员成绩
括号+数字表示字段长度,可以想象成在Excel表格中设置列宽,但由于部分数据类型有默认字段长度,若无特殊需求也可以省略,例如int(10)可以直接写int。
输入语句如下:
想要对数据表进行操作,首先得选择一个数据库,因此我们在创建表空间前,应该使用use database_name语句指定数据库,否则会出现No database selected的错误。
MySQL创建数据表注意事项:
1.同一数据库中表名称不能重复;
2.创建的表名称,不区分大小写,不能使用SQL语言中drop、alter等关键字;
3.数据表中每一个字段名必须配上相应的数据类型;
MySQL数据类型:
问题A:SQL中的数据类型是什么?
回答A:数据类型是数据的一种属性,它表示数据信息的类型。每张数据表都包含一个到多个字段,每个字段由字段名和数据类型组合而成,不同数据类型的存储及展现方式都有所不同。
问题B:SQL中的数据类型有哪些?
回答B:数据类型共3大类,包括数值型、字符型和日期型
数值型:int整数、float浮点数
字符型:char固定长度字符串、varchar可变长度字符串
日期型:datetime日期和时间组合,格式“YYYY-MM-DD hh:mm:ss”
更多详细数据类型可参考:MySQL数据类型详解
(2)查看表空间
数据表创建好之后,我们可以使用SQL语句列出所有数据表的名称,也可以根据数据表名称,查看该表中所包含的字段及数据类型等详细信息,MySQL中查看表空间的基本SQL语法格式如下:
① 查看所有数据表名称
【例】查看test01数据库所有表名称,输入语句如下:
② 查看单个数据表结构
【例】查看表名为stu_inf的学员信息表,输入语句如下:
(3)修改表空间
修改表指的是修改数据库中已经存在的数据表结构,MySQL支持多样化数据表修改操作,包括修改表名称、添加表中字段、修改表中字段、删除表中字段。MySQL中修改数据表的SQL语句全部以alter table作为开头,表示用户当前需要进行修改表的操作。
① 修改表名称
alter table table_name_old rename table_name_new;
【例】将stu_inf学员信息表名称修改为student_inf,输入语句如下:
② 添加表中字段
alter table table_name add column column_name column_type;
【例】在student_inf学员信息表中添加字段名为stu_class、数据类型为varchar(20)的字段,输入语句如下:
③ 修改表中字段
alter table table_name change column column_name_old column_name_new column_type_new;
【例】修改student_inf学员信息表中stu_class字段,修改后的字段名为class、数据类型为char(20),输入语句如下:
④ 删除表中字段
alter table table_name drop column column_name;
【例】删除student_inf学员信息表中class字段,输入语句如下:
(4)删除表空间
MySQL中删除数据表的基本SQL语法格式为:
drop table table_name;
【例】删除test01数据库中,表名为student_inf的学员信息表,输入语句如下:
drop table student_inf;
删除数据表时,若该数据表作为父表被其他子表关联,则需要先删除子表后才能删除父表,父表与子表的概念将在下个章节中详细展开。
练习
(1)创建一个库名为test_stu的数据库;
(2)查看所有已存在的数据库;
(3)进入数据库test_stu;
(4)在test_stu数据库中,创建emp_inf员工信息表,表结构如下:
表 emp_inf员工信息表
字段名称
数据类型
备注
id
int(10)
员工编号
e_name
varchar(20)
员工姓名
e_age
int(10)
员工年龄
e_sex
varchar(20)
员工性别
14 Mar 2019
MySQL具有多种版本且支持多平台操作,不同版本在不同平台下的安装与配置过程也不尽相同。在Windows平台下可以使用二进制安装包或免安装包进行安装,二进制的安装包提供了图形化的安装向导过程,而免安装包直接解压缩即可使用,Linux平台下则可以直接使用命令行进行安装。本节将以Windows平台下的二进制安装包为例,详细讲解MySQL下载和安装过程。
2.2.1 下载MySQL安装包
MySQL是完全网络化的跨平台关系型数据库系统,分为社区版(Community)、企业版(Enterprise)和集群版(Cluster)等多个版本,MySQL各版本之间的区别如下图所示:
MySQL版本
版本名
费用情况
技术支持
适用人群
Mysql Community Editon
社区版
开源免费
不提供
大多数普通用户
Mysql Enterprise Edition
企业版
付费,试用30天
官方提供
企业级用户
Mysql Cluster CGE
高级集群版
付费
官方提供
大型企业级用户
本书使用当前最新的MySQL 5.7社区版作为教学版本,具体下载步骤如下:
(1)访问MySQL的官方网站(www.mysql.com),如图2.1所示
图2.1 MySQL首页
(2)打开MySQL官方网站后,点击Downloads导航栏进入MySQL产品下载页面,该页面包括以下三个版本如图2.2所示:Mysql Enterprise Edition企业版;Mysql Cluster CGE集群版;Mysql Community Editon社区版
图2.2 MySQL下载页面
(3)单击MySQL Community Edition下载链接跳转到社区版下载页面,如图2.3所示
图2.3 MySQL下载页面
(4)点击Mysql Community Server下的Download超链接跳转到最终的下载页面,如图2.4所示
图2.4 MySQL下载页面
(5)在Select Platform下拉菜单中选择Microsoft Windows,然后点击Download按钮,跳转到文件下载页面,单击Windows(x86,32-bit)右边Download按钮,如图2.5所示
图2.5 MySQL下载页面
(6)单击Windows(x86,32-bit)右边Download按钮,如图2.5,跳转到最终下载页面,点击No thanks, just start my download直接下载
图2.5 MySQL下载页面
2.2.2 安装MySQL数据库
上文介绍了下载MySQL数据库的详细步骤,那么如何安装我们的第一个数据库呢?具体步骤如下:
(1)双击安装程序Setup.exe文件,开始安装MySQL数据库,如图2.7所示
图2.7 MySQL初始界面
(2)点击Next按钮进入到Choose a Setup Type窗口,如图2.8所示,选择Custom自定义安装类型
图2.8 MySQL安装界面
(3)点击Next按钮进入到Select Products and Features窗口,如图2.9所示,在MySQL Server下选择安装对应的Windows操作系统(x64对应64位,x86对应32位),随后在Applications下选择相同操作系统安装MySQL Workbench
图2.9 MySQL安装界面
MySQL Workbench简介
MySQL Workbench是MySQL官方发布的一款可视化的数据库设计软件,它为数据库管理员、程序开发者、系统规划师提供了SQL开发(SQL Development)、模型建立(Data Modeling)和数据库管理(Server Administration)等各种强大的功能。
(4)点击Next按钮进入到Path Conflits窗口,如图2.10所示,选择安装路径
图2.10 MySQL安装界面
(5)连续点击Next按钮3次进入到Accounts and Roles窗口,如图2.11所示,设定MySQL本地登录密码
图2.11 MySQL安装界面
(6)继续多次点击Next按钮进入到最终Apply Server Configuration窗口,当Configuration Steps下所有任务都执行成功,如图2.12所示,最后点击Finish完成安装。
图2.12 MySQL安装界面
14 Mar 2019
数据库是由一批存放在数据表里的原始数据堆积而成,这些数据表之间相互关联,记录了客观事物日常的运动规律。如今我们的生活中无时无刻不在使用着数据库,例如在因特网上进行搜索,或者是在电商网站上进行购物,甚至是在自动取款机上使用银行卡,背后都是利用数据库对各类数据进行存储、修改和查询。本节将介绍数据库的一些基本概念,首先介绍数据库的发展历程,其次介绍数据库、数据库管理系统及SQL之间的联系,最后介绍我们后续要用到的MySQL数据库管理系统。
2.1.1 数据库历史发展阶段
所谓数据库,可以想象成一个容器中存放着各种数据集。若把这个容器比作书架,书架上的每一本书就相当于一个数据集,若把这个容器比作文件夹,文件夹里的每一个文件就相当于一个数据集。据此,我们能够对数据库内的数据进行存储、分类、检索、提取和维护。发展到现在,数据库已经完成了由人工存储到机器存储的蜕变,共经历了三个阶段:人工管理阶段、文件系统阶段、数据库管理系统阶段。
(1)人工管理阶段
时间:20世纪50年代以前
事件:计算机主要用于科学计算。从硬件层面看,当时没有直接用于存储的设备,仅能借助卡片、磁带等外存达到数据存储的目的;从软件层面看,当时也没有完整的操作系统以及专门管理数据的软件;从数据层面看,当时数据量非常小且有没固定的数据结构,所有数据都直接由用户管理。
特点:数据不能长期保存,没有对数据进行管理的软件系统,数据不能共享,数据不具有独立性。
(2)文件系统阶段
时间:50年代后期到60年代中期
事件:计算机不仅用于科学计算,还运用到信息管理方面。从硬件层面看,这时出现了磁盘等数据存储设备;从软件层面看,系统可以按照文件的名称对其进行检索和访问,并可以实现文件内容的增加、修改与删除;从数据层面看,实现了文本内数据的结构化,即单个文本中各数据之间具有一定的关系,但从整体来看每个文件中的数据却是无结构的。
特点:数据可以长期保存,由文件系统管理数据,数据具有一定的共享性和独立性。
(3)数据库管理系统阶段
时间:60年代后期
事件:数据库系统克服了文件系统的缺陷,提供了对数据更高级、更有效的管理,这个阶段程序与数据的联系通过数据库管理系统(DBMS)来实现,因此计算机可以用来存储和处理规模庞大的数据集。
特点:数据实现结构化,共享性高、独立性强。
2.1.2 数据库、数据库管理系统与SQL语言
问题A:数据库与数据库管理系统是一回事么?
答案A:不是哦,数据库是用于存储数据的地方,它提供了一个数据存储的空间,而数据库管理系统是用于管理数据库的软件,它是用户创建、管理和查询数据库时所使用的软件。如果把数据库想象成一个装有Excel表格的文件夹,那么数据库管理系统就是管理这个文件夹的软件。
问题B:当今主流的数据库管理系统有哪些?
答案B:关系型数据库包括:MySQL,Oracle,SQL server,PostgreSQL等
非关系型数据库包括:MongoDB,Hbase等
要点B:关系型数据库与非关系型数据库的区别?
区别1:关系型数据库中存放的是结构化数据集,类似于Excel表格,即行与列组合而成的二维表;非关系型数据库中存放的是非结构化数据集,例如用户得聊天记录、拍摄的图片等。
区别2:关系型数据库有且只能存放结构化数据集,但非关系型数据库不仅能存放非结构化数据集,还能存放结构化数据集。
问题C:那SQL语言又是什么呢?
答案C:SQL是Structure Query Language(结构化查询语言)的缩写,是目前广泛使用于关系型数据库的标准语言,是执行数据库管理系统的程序语言。
要点C:SQL语言包含以下4个部分:
(1)数据定义语言(DDL):Drop,Create,Alter等语句
(2)数据操作语言(DML):Insert,Update,Delete等语句
(3)数据查询语言(DQL):Select语句
(4)数据控制语言(DCL):Grant,Revoke,Commit等语句
作为数据分析师,我们需要集中精力攻克查询语言(DQL)。下面简单列举几条常用的SQL语言,期望能给读者留下一个直观的印象:
(1)数据定义语言(DDL):
【例】创建一张学生信息表,表名为student,输入语句如下:
create table student(
stu_id int(10),
name char(20),
sex char(20),
birthday datetime(5)
);
(2)数据操作语言(DML):
【例】往student表中插入一条学生信息数据,输入语句如下:
insert into student(stu_id,name,sex,birthday) values(1001,"张三","男","1989-11-11");
(3)数据查询语言(DQL):
select * from student;
# MySQL输出结果如下
+--------+------+-----+---------------------+
| stu_id | name | sex | birthday |
+--------+------+-----+---------------------+
| 1001 | 张三 | 男 | 1989-11-11 00:00:00 |
+--------+------+-----+---------------------+
问题D:数据库、数据库管理系统与SQL语言之间有什么联系?
答案D:
2.1.3 MySQL数据库管理系统
问题A:什么是MySQL?
答案A:MySQL是一个轻量级的关系型数据库管理系统,与Oracle、SQL server等大型数据库管理系统相比,MySQL规模较小、功能有限,但正是因为它规模小,所以速度快、成本低,并且从实际应用角度来看,它所提供的功能完全可以满足于大部分业务功能,诸如此类的特性使得MySQL成为全世界最受欢迎的开源的数据库。
问题B:MySQL的优势在哪?
答案B:MySQL数据库管理系统的优势主要表现在以下几个方面:
优势
详细描述
效率高
轻量级关系型数据库,运行速度极快
成本低
对于大多数个人而言免费开源
易用性
数据库设置复杂程度低,易于学习
规范性
国际公认的标准SQL语法
兼容性
兼容数种不同的系统平台,例如Windows、Linux、Mac OS等
安全性
允许主机验证,所有密码传输均采用加密形式
接口丰富
提供C、C++、JAVA、Python等语言的API接口
问题C:MySQL相关工具有哪些?
答案C:MySQL数据库管理系统提供了许多命令行工具,也提供了可视化的管理工具。命令行工具能够用来管理MySQL服务器、登录用户以及数据库备份和恢复等,而可视化工具Workbench使得用户操作数据库更加快捷。
命令行工具实用小程序:
# 1.启动MySQL服务
net start mysql
# 2.登录MySQL
mysql -u root -p
# 回车后输入密码,例如1234
# 3.导出数据
mysqldump --opt test > mysql.test
Workbench主要功能:
1.数据库设计和模型建立
2.SQL开发(取代MySQL Query Browser)
3.数据库管理(取代MySQL Administrator)
11 Feb 2019
在对系统进行压力测试的时候,时常会遇到造数据的需求,所谓造数据其实就是将一小批数据不断的复制从而变成一个大的集合。由于之前看到一些造数据的小脚本过于笨拙,遂给大家介绍一种简易批量复制数据的方法。
原始数据下载地址:copyfile_test.rar
Python实现代码如下:
import os
import shutil
rootdir="d:\\test\\" #原文件路径
for file in os.listdir(rootdir): #批量读取文件
count = 0
while count < 30: #需要复制的份数
count += 1
shutil.copyfile(rootdir+file,rootdir+str(count)+file) #批量复制文件
16 Nov 2018
最近拿到一批TAG格式的文件,需要对其进行预处理以得到我们想要的标准TXT文本格式。TAG文件与TXT文件内容如下:
.TAG文件
<Speaker 1> male
<Speaker 2> male
<Speaker 0> <[ENS]> 0 1.571 [ENS]
<Speaker 0> <[MUSIC]> 1.571 4.485 [MUSIC]
<Speaker 0> <[BELL]> 4.485 15.535 [BELL]
<Speaker 0> <[ENS]> 15.535 21.091 [ENS]
<Speaker 1> <Chinese-talk> 21.091 21.731 喂你好
<Speaker 2> <Chinese-talk> 21.731 22.73 喂喂
<Speaker 1> <Chinese-talk> 22.73 29.867 嗯您好,呃广发银行信用卡中心,我姓韩工号b s一七八九,呃请问一下是段光润段先生吗
<Speaker 0> <[ENS]> 29.867 30.507 [ENS]
<Speaker 2> <Chinese-talk> 30.507 30.982 对
<Speaker 0> <[ENS]> 30.982 31.719 [ENS]
<Speaker 1> <Chinese-talk> 31.719 33.193 您好啊,不好意思打扰您了
<Speaker 0> <[ENS]> 33.193 33.736 [ENS]
<Speaker 1> <Chinese-talk> 33.736 41.678 呃这边从系统啊留意到段先生您近期使用广发银行信用卡,这边在三月七号到三月二十四号有三笔刷卡消费
====转换后的文件样例====
.TXT文件
坐席 喂你好 21.091 21.731
客户 喂喂 21.731 22.73
坐席 嗯您好,呃广发银行信用卡中心,我姓韩工号b 22.73 29.867
客户 对 30.507 30.982
坐席 您好啊,不好意思打扰您了 31.719 33.193
坐席 呃这边从系统啊留意到段先生您近期使用广发银行信用卡,这边在三月七号到三月二十四号有三笔刷卡消费 33.736 41.678
07 Nov 2018
鉴于最近BERT在人工智能领域特别火,但相关中文资料却很少,因此将BERT论文理论部分(1-3节)翻译成中文以方便大家后续研究。
· 摘要
本文主要介绍一个名为BERT的模型。与现有语言模型不同的是,BERT旨在通过调节所有层中的上下文来进行深度双向的预训练。因此,预训练的BERT表示可以通过另外的输出层进行调整,以创建用于广泛任务的状态模型,例如问题转换和语言参考,而无需实质的任务特定体系结构修改。
BERT在概念上简单且经验丰富。 它在11项自然语言处理任务中获得了最新的最新成果,包括将GLUE基准推至80.4%(绝对改进率7.6%),MultiNLI精度达到86.7%(绝对改进5.6%)和SQuAD v1.1 问题回答测试F1到93.2。
1 引言
语言模型预训练已证明可有效改进许多自然语言处理任务。这些任务包括句子级任务,如自然语言推理和释义,旨在通过整体分析句子来预测句子之间的关系,以及token级任务,如命名实体识别和SQuAD问答,其中模型需要在token级别产生细粒度输出。
将预训练语言表示应用于下游任务有两种现有策略:基于特征和微调。基于特征的方法使用任务特定的体系结构,其包括预先训练的表示作为附加特征。基于微调的方法引入了最小的任务特定参数,并通过简单地调整预训练参数来训练下游任务。 在以前的工作中,两种方法在预训练期间共享相同的目标函数,其中使用单向语言模型来学习一般语言表示。
我们认为当前的技术严重限制了预训练表示的力量,特别是对于微调方法。 主要限制是标准语言模型是单向的,这限制了在预训练期间可以使用的体系结构的选择。 例如,在OpenAI GPT中,作者使用左右架构,其中每个token只能处理Transformer的自我关注层中的先前token。 这些限制对于句子级别的任务来说是次优的,并且在应用基于调整的语言级别任务(例如SQuAD问答)时可能是毁灭性的,其中从两个方向合并上下文是至关重要的。
在本文中,我们通过提出BERT来改进基于微调的方法。BERT受到完形填空任务的启发提出“掩盖语言模型(MLM)”,该模型是通过一个新的预训练目标来解决前面提到的单向约束。被掩盖的语言模型从输入中随机地掩盖一些标记,并且客观主义者仅基于其上下文来预测被掩盖的单词的原始词汇。 与从左到右的语言模型预训练不同,MLM目标允许表示融合左右上下文,这允许我们预训练深度双向变换器。除了掩盖语言模型,我们还引入了一个“下一句预测”任务,它共同预先训练文本对表示。
本文主要贡献如下:
· 证明了双向预训练对语言表达的重要性。与使用单向语言模型进行预训练不同,BERT使用掩蔽语言模型来实现预训练的深度双向表示。
· 预先训练的表示消除了许多重型工程任务特定结构的需求。BERT是第一个基于调整的表示模型,它在大量句子级和token级任务上实现了最先进的性能,优于许多具有任务特定体系结构的系统。
· BERT刷新了11项NLP任务的性能记录。本文还报告了 BERT 的模型简化研究(ablation study),表明模型的双向性是一项重要的新成果。
2 文献回顾
语言表达的预训练经过很长一段历史,在本节我们简要回顾一下。(注: 本节为预备知识,想深入了解的同学可自行研究一下。)
2.1 基于特征的方法 Feature-basedApproaches
预训练的word embedding被认为是现代 NLP 系统中不可或缺的一部分,与从头学习的 embedding 相比提供了显着的改进。基于 word embedding 这些方法,已经推广出了 sentence embedding,paragraph embedding 等多种方法。与传统的word embedding一样,这些学习的表示通常也用作下游模型中的特征。 ELMo将传统的word embedding研究概括为不同的维度。 他们建议从语言模型中提取上下文敏感特征。当将上下文词嵌入与现有的任务特定体系结构集成时,ELMo推进了几个主要NLP基准测试的最新技术,包括SQUAD上的问题回答,情感分析和命名实体识别。
2.2 基于微调的方法 Fine-tuningApproaches
从语言模型(LMs)转移学习的最新趋势是在对用于监督下游任务的相同模型进行微调之前,在LM目标上预先训练一些模型架构。 这些方法的优点是需要从头开始学习参数。 至少部分由于这一优势,OpenAI GPT在GLUE基准测试的许多句子级别任务中获得了先前最先进的结果。
2.3 从监督数据转移学习 TransferLearningfromSupervisedData
虽然无监督预训练的优势在于可用数据几乎无限,但也有工作表明从具有大数据集的监督任务中有效转移,例如自然语言推断和机器翻译。 在NLP之外,计算机视觉研究也证明了从大型预训练模型转移学习的重要性,其中一个有效的方法是对在ImageNet上预训练的模型进行微调。
3 BERT
论文在本节介绍BERT及其详细实现。首先介绍BERT的模型架构和输入表示。 然后,我们将在3.3节中介绍预培训任务,即本文的核心创新。 预训练程序和微调程序分别在第3.4节和第3.5节中详述。 最后,第3.6节讨论了BERT和OpenAI GPT之间的差异。
3.1 模型架构 Model Architecture
BERT的模型架构是基于Vaswani等人描述的原始实现的多层双向变换器编码器,并发布于tensor2tensor库。由于Transformer的使用最近变得无处不在,论文中的实现与原始实现完全相同,因此这里将省略对模型结构的详细描述。
在这项工作中,我们将层数(即Transformer blocks)表示为L,将隐藏大小表示为H,将self-attention heads的数量表示为A. 在所有情况下,将feed-forward/filter 的大小设置为 4H,即H = 768时为3072,H = 1024时为4096。论文主要报告了两种模型大小的结果:
BERT_BASE: L=12, H=768, A=12, Total Parameters=110M
BERT_LARGE: L=24, H=1024, A=16, Total Parameters=340M
为了进行比较,选择与BERT_BASE具有相同的模型大小的OpenAI GPT。 然而,重要的是,BERT变换器使用双向self-attention,而GPT变换器使用受限制的self-attention,其中每个token只能处理其左侧的上下文。 我们注意到,在文献中,双向 Transformer通常被称为“Transformer encoder”,而左上下文仅被称为“Transformer encoder”,因为它可以用于文本生成。 BERT,OpenAI GPT和ELMo之间的比较如图1所示。
图1:训练前模型架构的差异。 BERT使用双向变换器。 OpenAI GPT使用从左到右的变换器。 ELMo使用经过独立训练的从左到右和从右到左LSTM的串联来生成下游任务的功能。 在三个中,只有BERT表示在所有层中共同依赖于左右上下文。
3.2 输入表示 Input Representation
我们的输入表示能够在一个标记序列中明确地表示单个文本句子或一对文本句子(例如,[Question, Answer])。对于给定token,其输入表示通过对相应的token、segment和position embeddings进行求和来构造。图2是输入表示的直观表示:
图2:BERT输入表示。 输入嵌入是token embeddings, segmentation embeddings 和position embeddings 的总和。
具体如下:
· 使用WordPiece嵌入(Wu et al., 2016)和30,000个token的词汇表。用##表示分词。
· 使用学习的positional embeddings,支持的序列长度最多为512个token。
· 每个序列的第一个token始终是特殊分类嵌入([CLS])。对应于该token的最终隐藏状态(即,Transformer的输出)被用作分类任务的聚合序列表示。对于非分类任务,将忽略此向量。
· 句子对被打包成一个序列。以两种方式区分句子。首先,用特殊标记([SEP])将它们分开。其次,添加一个learned sentence A嵌入到第一个句子的每个token中,一个sentence B嵌入到第二个句子的每个token中。
· 对于单个句子输入,只使用 sentence A嵌入。
3.3 预训练任务
与众不同的是,我们不使用传统的从左到右或从右到左的语言模型来预训练BERT。相反,我们使用两个新的无监督预测任务预训练BERT。
3.3.1 任务1:遮掩语言模型 Masked LM
从直觉上看,研究团队有理由相信,深度双向模型比left-to-right模型或left-to-right and right-to-left模型的浅层连接更强大。遗憾的是,标准条件语言模型只能从左到右或从右到左进行训练,因为双向条件作用将允许每个单词在多层上下文中间接地“see itself”。
为了训练一个深度双向表示(deep bidirectional representation),研究团队采用了一种简单的方法,即随机屏蔽(masking)部分输入token,然后只预测那些被屏蔽的token。论文将这个过程称为“masked LM”(MLM),尽管在文献中它经常被称为Cloze任务(Taylor, 1953)。
在这个例子中,与masked token对应的最终隐藏向量被输入到词汇表上的输出softmax中,就像在标准LM中一样。在团队所有实验中,随机地屏蔽了每个序列中15%的WordPiece token。与去噪的自动编码器(Vincent et al., 2008)相反,只预测masked words而不是重建整个输入。
虽然这确实能让团队获得双向预训练模型,但这种方法有两个缺点。首先,预训练和finetuning之间不匹配,因为在finetuning期间从未看到[MASK]token。为了解决这个问题,团队并不总是用实际的[MASK]token替换被“masked”的词汇。相反,训练数据生成器随机选择15%的token。例如在这个句子“my dog is hairy”中,它选择的token是“hairy”。然后,执行以下过程:
数据生成器将执行以下操作,而不是始终用[MASK]替换所选单词:
· 80%的时间:用[MASK]标记替换单词,例如,my dog is hairy → my dog is [MASK]
· 10%的时间:用一个随机的单词替换该单词,例如,my dog is hairy → my dog is apple
· 10%的时间:保持单词不变,例如,my dog is hairy → my dog is hairy.这样做的目的是将表示偏向于实际观察到的单词。
ransformer encoder不知道它将被要求预测哪些单词或哪些单词已被随机单词替换,因此它被迫保持每个输入token的分布式上下文表示。此外,因为随机替换只发生在所有token的1.5%(即15%的10%),这似乎不会损害模型的语言理解能力。
使用MLM的第二个缺点是每个batch只预测了15%的token,这表明模型可能需要更多的预训练步骤才能收敛。团队证明MLM的收敛速度略慢于 left-to-right的模型(预测每个token),但MLM模型在实验上获得的提升远远超过增加的训练成本。
3.3.2 任务2:下一句预测 Next Sentence Prediction
许多重要的下游任务,如问答(QA)和自然语言推理(NLI)都是基于理解两个句子之间的关系,这并没有通过语言建模直接获得。
在为了训练一个理解句子的模型关系,预先训练一个二进制化的下一句测任务,这一任务可以从任何单语语料库中生成。具体地说,当选择句子A和B作为预训练样本时,B有50%的可能是A的下一个句子,也有50%的可能是来自语料库的随机句子。例如:
Input = [CLS] the man went to [MASK] store [SEP]
he bought a gallon [MASK] milk [SEP]
Label = IsNext
Input = [CLS] the man [MASK] to the store [SEP]
penguin [MASK] are flight ##less birds [SEP]
Label = NotNext
团队完全随机地选择了NotNext语句,最终的预训练模型在此任务上实现了97%-98%的准确率。
3.4 预训练程序
预训练程序主要遵循现有的语言模型预训练文献。对于训练前语料库,我们使用BooksCorpus(800M单词)和英语维基百科(2,500M单词)的串联。对于维基百科,我们只提取文本段落并忽略列表,表格和标题。使用文档级语料库而不是诸如Billion Word Benchmark之类的句子级语料库以提取长的连续序列是至关重要的。
为了生成每个训练输入序列,我们从语料库中采样两个文本跨度,我们将其称为“句子”,即使它们通常比单个句子长得多(但也可以更短)。第一个句子接收A嵌入,第二个句子接收B嵌入。 50%的时间B是跟随A的实际下一个句子,50%的时间是随机句子,这是为“下一句话预测”任务完成的。对它们进行采样,使得组合长度≤512个token。在WordPiece标记化之后应用LM掩蔽,具有15%的统一掩蔽率,并且不特别考虑部分字块。
我们训练批量大小为256个序列(256个序列* 512个token= 128,000个token/批次),持续1,000,000个步骤,这比33亿个词语料库大约40个时期。我们使用Adam的学习率为1e-4,β1= 0.9,β2= 0.999,L2权重衰减为0.01,学习率在前10,000步的预热,以及线性衰减的学习率。在所有层上的Weuseadropout概率为0.1。在OpenAI GPT之后,我们使用gelu激活(Hendrycks和Gimpel,2016)而不是标准relu。
训练损失是平均掩盖的LM可能性和下一次遗传预测可能性的总和。在Pod配置中的4个云TPU上进行BERTBASE训练(总共16个TPU芯片).5在16个CloudTPU(64TPUchipstotal)上进行BERTLARGE训练。每次预训需要4天才能完成。
3.5 微调程序
对于序列级分类任务,BERT微调很简单。为了获得输入序列的固定维度合并表示,对输入中的第一个标记进行最终隐藏状态(即变换器的输出),其结构对应于特殊的[CLS]字嵌入。我们将该向量表示为C∈RH。在微调期间添加的唯一新参数是分类层W∈RK×H,其中K是分类器标签的数量。标准概率P∈RK用标准softmax,P = softmax(CWT)计算。BERT和W的所有参数都经过联合调整,以最大化正确标签的对数概率。对于跨度级和token级预测任务,必须以任务特定方式稍微修改上述过程。详情见第4节的相应小节。
对于微调,大多数模型超参数与预训练相同,但批量大小,学习率和训练时期数除外。辍学概率始终保持在0.1。最佳超参数值是任务特定的,但我们发现以下范围的可能值可以在所有任务中很好地工作:
批量大小:16,32
学习率:5e-5,3e-5,2e-5
时期数量:3,4
我们还观察到,大数据集(例如,100k +标记的训练示例)对于较高参数的热带数据集的敏感性要小得多。微调通常非常快,因此简单地对上述参数进行详尽搜索并选择在开发集上表现最佳的模型是合理的。
3.6 BERT和OpenAI GPT的比较
BERT最具可比性的预训练方法是OpenAI GPT,它在一个大型文本语料库中训练一个左转的Transformer LM。实际上,BERT中的许多设计决策都被有意地选择为尽可能接近GPT,以便可以最小化地比较这两种方法。 这项工作的核心论点是3.3节中提出的两个新的预训练任务占了大多数经验改进,但我们注意到BERT和GPT如何训练之间还存在其他一些差异:
GPT接受了BooksCorpus(800M字)的培训; BERT受过BooksCorpus(800M字)和维基百科(2,500M字)的培训。
GPT使用句子分隔符([SEP])和分类符号([CLS]),它们仅在微调时引入; BERT在预训练期间学习[SEP],[CLS]和句子A / B嵌入。
GPT接受了1M步骤的培训,批量为32,000字; BERT接受了1Mstepswithabatchsizeof128,000字的培训。
GPT对所有的调整实验使用相同的5e-5学习率; BERT选择任务特定的微调学习速率,该速率在开发集上表现最佳。
为了解决这些差异的影响,我们在第5.1节中进行了消融实验,证明了这些改进的大部分来自新的预训练任务。
· 结论
BERT是一个语言表征模型(language representation model),通过超大数据、巨大模型、和极大的计算开销训练而成,在11个自然语言处理的任务中取得了最优(state-of-the-art, SOTA)结果。或许你已经猜到了此模型出自何方,没错,它产自谷歌。估计不少人会调侃这种规模的实验已经基本让一般的实验室和研究员望尘莫及了,但它确实给我们提供了很多宝贵的经验:
· 深度学习就是表征学习(Deep learning is representation learning)”We show that pre-trained representations eliminate the needs of many heavily engineered task-specific architectures”. 在11项BERT刷出新境界的任务中,大多只在预训练表征(pre-trained representation)微调(fine-tuning)的基础上加一个线性层作为输出(linear output layer)。在序列标注的任务里(e.g. NER),甚至连序列输出的依赖关系都先不管(i.e. non-autoregressive and no CRF),照样秒杀之前的SOTA,可见其表征学习能力之强大。
· 训练规模很重要(Scale matters)”One of our core claims is that the deep bidirectionality of BERT, which is enabled by masked LM pre-training, is the single most important improvement of BERT compared to previous work”. 这种遮掩(mask)在语言模型上的应用对很多人来说已经不新鲜了,但确是BERT的作者在如此超大规模的数据+模型+算力的基础上验证了其强大的表征学习能力。这样的模型,甚至可以延伸到很多其他的模型,可能之前都被不同的实验室提出和试验过,只是由于规模的局限没能充分挖掘这些模型的潜力,而遗憾地让它们被淹没在了滚滚的paper洪流之中。
· 预训练价值很大(Pre-training is important)”We believe that this is the first work to demonstrate that scaling to extreme model sizes also leads to large improvements on very small-scale tasks, provided that the model has been sufficiently pre-trained”. 预训练已经被广泛应用在各个领域了(例如:ImageNet for CV, Word2Vec in NLP),多是通过大模型大数据,这样的大模型给小规模任务能带来的提升有几何,作者也给出了自己的答案。BERT模型的预训练是用Transformer做的,但我想换做LSTM或者GRU的话应该不会有太大性能上的差别,当然训练计算时的并行能力就另当别论了。
17 Oct 2018
协同过滤指的是关联推荐的一种思路,而不是指的某种特定的算法。它的思路非常简单,首先我将具有相同特征的客户放到一个类中,例如客户A与B相似,然后将客户A所购买过的产品直接推荐给客户B,反之亦然。
本文抛砖引玉,主要实现一个基于用户的协同过滤模型,若有兴趣的同学,后续可以从以下几个方面进行延伸:
1.如何用相同的方法实现基于产品的协同过滤模型;
2.如何利用其他相似度计算方法(余弦距离、聚类等)改进协同过滤模型;
协同过滤需要两份数据,包括用户特征信息表UserandFeature和用户产品关联表UserandLabel
· 基于用户协同过滤python程序
import csv
import math
import pandas as pd
import numpy as np
from sklearn.preprocessing import MinMaxScaler
# ==== 1.数据预处理 ====
data = pd.read_csv('d:\\UserandFeature.csv',sep=',',encoding='gbk')
# fillna()是pandas函数,用于数据填充(向前填充)
data = data.fillna(method = 'ffill', axis = 1).values
# MinMaxScaler最大最小标准化公式:X_std = (X - X.min(axis=0)) / (X.max(axis=0) - X.min(axis=0))
scaler = MinMaxScaler(feature_range=(0,1))
dataset = scaler.fit_transform(data)
# DataFrame是pandas表格框架,目的是为了打出UserandFeature表格
# dataset1 = pd.DataFrame(dataset)
# dataset1.to_csv('d:\\UserandFeature1.csv', mode='w', header=False)
# ==== 2.相似度计算 ====
def Pearson(vec1, vec2):
vec1_ = vec1 - np.mean(vec1)
vec2_ = vec2 - np.mean(vec2)
sum = np.dot(vec1_, vec2_) / (np.linalg.norm(vec1_) * np.linalg.norm(vec2_))
return sum
# dataset.shape[0]表示array的行数
for i in range(dataset.shape[0]):
vec1 = dataset[i-1]
corr=[]
for j in range(dataset.shape[0]):
vec2 = dataset[j-1]
corr.append(Pearson(vec1, vec2))
# 将结果打印到SimilarityofUsers表中
with open('d:\\SimilarityofUsers.csv','a',newline='') as csvfile:
writer = csv.writer(csvfile)
writer.writerow(corr)
# ==== 3.基于用户的推荐 ====
similarity = pd.read_csv('d:\\SimilarityofUsers.csv').values
# 导入用户产品关联列表,第一列表示用户,第二列表示产品(无表头)
label = pd.read_csv('d:\\UserandLabel.csv').values.tolist()
# 读取相似度列表
for m in range(similarity.shape[0]):
a=[m+1]
for n in range(similarity.shape[0]):
if similarity[m,n] > 0.85:
a.append(label[n-1])
else:
continue
# 将结果打印到recommend表中
with open('d:\\recommend.csv','a',newline='') as csvfile:
writer = csv.writer(csvfile)
writer.writerow(a)
10 Oct 2018
最近偶得一个Python的练习题库,感觉有必要的同学可以通过刷题进一步了解python处理技巧。这里提供习题的相关链接及解决程序,供大家参考。
· 编号867:转置矩阵
给定一个矩阵 A, 返回 A 的转置矩阵。
# 输入:[[1,2,3],[4,5,6],[7,8,9]]
# 输出:[[1,4,7],[2,5,8],[3,6,9]]
# 相关程序:
import numpy as np
np.transpose([[1,2,3],[4,5,6],[7,8,9]]).tolist()
# 注意:输入需要是个完整的矩阵,内容可以是数字或字符串
30 Aug 2018
目前正在进行的数据分析革命有可能改变公司组织运营、人才管理和价值创造的方式,这种情况已经发生在一些成功借助数据分析并从中获得重大回报的公司,例如Facebook、Google、腾讯等。有效的数据分析往往是一连串典型的业务问题,这意味着公司高级管理人员必须能够明确目标,然后将其转化为行动并用数据进行量化,由此加强公司内部和外部每个流程节点的管控。本文将从以下六个方面阐述有效数据分析的关键要素:
· 提出明确的问题
许多公司都试图尽可能多的收集数据,然后看看数据呈现出了什么样的状态。这可能会陷入一个数据分析的误区,正确的方法应该是先明确清晰的业务目标,例如“我们如何降低实施环节的成本”、“我们如何才能提高团队中每个成员的生产力”等等。然后想想如何将数据指标与业务需求结合起来,从而迭代实际的业务示例,并探究突破点所在的位置。在对资金和时间有严格限制的现实世界中,在数据收集之前提出明确的问题,即使最后只有部分的数据被开采也能收到更加立竿见影的效果。
· 从细节开始改进
大数据分析的影响通常表现为成千上万渐进式的小改进,即最小的改变也可能产生最大的差异。如果公司将单个流程划分为多个的小区间并尽可能的量化,或者系统地将较小的改进结合到更多的流程中,那么收益将会是指数级的增长,例如GE在其飞机发动机中嵌入传感器,以实时跟踪其每个部件的动态数据,从而可以更快地进行调整并大大减少维护停机时间,又例如某家餐饮公司将整个制造过程进行分解,通过比对每个制造过程的数据发现烤箱烘烤温度调整不仅能使产品口感更佳,还能够降低生产成本。
· 全面的数据组合
很多时候公司会不断挖掘单个数据集的价值,却没能考虑不同数据集之间的组合价值。例如,人力资源部可能拥有全面的员工绩效数据,运营有特定资产的综合信息,财务有全公司的财务信息。全面查看不同的数据源,可能会发现额外的位于不同数据集之间沟渠中的价值。这种方法类似于维恩图,通过对两个或以上的数据集叠加查看可以更清楚地看到关键问题。
· 确保数据循环运行
循环运行的宗旨是观察、定位、制定周期并采取行动。例如Google长期坚持以数据为中心的决策,将消费者反馈建立在解决方案中,并迅速迭代出人们不仅使用而且喜爱的产品。数字化使得反馈周期不断加快,通过分析每个新输入而改进的机器学习算法能够使得公司循环迭代的次数越来越快,从而保证公司在市场上获得更大的竞争优势。
· 保证输出的易用性
虽然好的算法可以创造奇迹,但其本身并不会阐述问题。大量的数据反馈结果往往需要进行二次包装才能面向用户,毕竟用户直接对数据解读具有一定的局限性。这就是为什么一个简单易用的界面会增加用户粘性,而不是展现更具有不平衡个性的详细计算公式。
· 建立一支多技能团队
数据分析是一项团队运动,关于采用哪种分析方法、数据来源以及如何提出问题需要基于团队判断。组建一个强大的团队有点像创造美食,需要混合精细的成分和激情。主要团队成员包括数据科学家,他们帮助开发和应用复杂的分析方法,具有数据集成和分布式计算等领域技能的工程师,以及用户界面开发人员和创意设计人员,确保产品在视觉上美观且直观有用,最后还需要一名“翻译人员”将IT、数据分析学科与业务决策联系起来。
27 Aug 2018
在处理数据的过程中,我们会遇到各种各样关于转置的问题,今天讲一种特殊的分组转置需求:按行进行分组转置,要求从每行第2个词开始,与每行第1个词拼接成一个新行。
数据样例如下:
#==== 原始数据样例 ====
人 士 人物 人氏
人手 人员 人口
#==== 转置后数据样例 ====
人 士
人 人物
人 人氏
人手 人员
人手 人口
原始数据下载地址:synonyms.txt
Python实现代码如下:
infile=open("d:\\test.txt","r",encoding="utf-8").readlines()
for i in infile:
_s = "\ufeff"
if i.startswith(_s):
i = i[len(_s):]
_arr = i.strip().split("\t")
for _s in _arr[1:]: #从每行第2个词开始循环遍历
print("{0} {1}".format(_arr[0], _s)) #输出每行第1个词及对应词
06 Aug 2018
文本纠错作为重新封装的文本分析平台核心功能,一直受到公司各层的广泛关注。说到文本纠错最简单的莫过于英文单词纠错,也是我们word中常见的检查功能。纠错概率计量方法可参考NLP单词纠错和中文自动纠错讲解,这里不再赘述。
语料下载地址:big.txt
Python英文单词纠错程序如下:
import re
from collections import Counter
#==== 训练一个带有概率的词库 ====
def words(text):
return re.findall(r'\w+', text.lower())
WORDS = Counter(words(open('d:\\big.txt').read()))
def P(word, N=sum(WORDS.values())):
"Probability of `word`."
return WORDS[word] / N
#==== 给定单词A,枚举所有可能正确的拼写 ====
def edits1(word):
"All edits that are one edit away from `word`."
letters = 'abcdefghijklmnopqrstuvwxyz'
splits = [(word[:i], word[i:]) for i in range(len(word) + 1)]
deletes = [L + R[1:] for L, R in splits if R]
transposes = [L + R[1] + R[0] + R[2:] for L, R in splits if len(R)>1]
replaces = [L + c + R[1:] for L, R in splits if R for c in letters]
inserts = [L + c + R for L, R in splits for c in letters]
return set(deletes + transposes + replaces + inserts)
def edits2(word):
"All edits that are two edits away from `word`."
return (e2 for e1 in edits1(word) for e2 in edits1(e1))
#==== 返回候选词 ====
def candidates(word):
"Generate possible spelling corrections for word."
return (known([word]) or known(edits1(word)) or known(edits2(word)) or [word])
def known(words):
"The subset of `words` that appear in the dictionary of WORDS."
return set(w for w in words if w in WORDS)
#==== 输出概率最大的纠正词 ====
def correction(word):
"Most probable spelling correction for word."
return max(candidates(word), key=P)
程序结果如下:
correction('corrected')
# 'connected'
correction('speling')
# 'seeing'
23 Jun 2018
Workbench可视化工具中提供了菜单化的MySQL数据导入方法,具体步骤如下:
1.在test01数据库中创建emp表空间
# 进入test01数据库
use test01;
# 创建emp表空间
create table emp(
empno int(10),
ename varchar(20),
job varchar(20),
leader int(10),
hiredate datetime(6),
sal float(20),
comm float(20),
deptno int(10)
);
2.左侧Schemas中选择test01数据库,找到emp表空间
3.右键点击emp表,选择Table Data Import Wizard,弹出Table Data Import界面
4.在Table Data Import界面中,点击Browse选择emp.csv文件并打开
5.点击next后,在use existing table中选择test01.emp
6.点击next后可以看到emp表的数据状态
7.继续点击next直到数据导入成功
8.点击Finsh完成数据导入
9.最后用select语句查看导入的数据表emp,MySQL输入及输出如下
22 Jun 2018
在处理文件时经常需要对文件进行转码,文件编码类型如下表:
编码类型
编码描述
ANSI码
多用于英文字母及数字(存储汉字容易报错)
Unicode
包含:汉字、英文字母、数字及各国通用语言
UTF-8
可变长度的Unicode(最常用)
GBK编码
面向汉字的编码(最少用)
大家可先创建几个ANSI编码类型的测试文件,我们试图将ANSI文件转换为utf-8,相关代码如下:
import os
import pandas as pd
# 最终转换的文件编码格式
coding = 'utf-8'
# 需要修改的文件夹路径
file_dir = 'D:\\test\\'
def run_coding():
for root, dirs, files in os.walk(file_dir, topdown=False):
for i in files:
files_name = os.path.join(root, i)
try:
df1 = pd.read_csv(files_name, encoding='utf-8')
except:
df1 = pd.read_csv(files_name, encoding='gbk')
df1.to_csv(files_name, encoding=coding,index=None)
if __name__ == '__main__':
run_coding()
print("Finish translate")
22 Jun 2018
本文将分别介绍以下几种帆软报表的开发技巧,以达到数分系统能够支持用户交互点击的目的:
1.帆软报表之多页签/自定义布局
2.帆软报表之下钻/筛选功能
· 下钻功能
下钻是指从一级分类切换到二级分类,从概览表切换到明细表的过程。下钻功能展示结果如下:
实现下钻功能步骤如下:
(1)编辑图表选择特效
(2)超级链接中添加JavaScript
(3)在JavaScript脚本中添加代码
var tabPan0=_g().getWidgetByName("tabpane0"); #tabpane0表示要跳转的页签名称
tabPan0.showCardByIndex(1);
var cb_status=_g().getWidgetByName("status"); #status表示需要联动的参数
cb_status.setValue(status);
(4)定义参数status中对应的数据
· 筛选功能
筛选是指依据筛选框内容,图表联动切换。筛选功能展示结果如下:
实现筛选功能步骤如下:
(1)拖动下拉框按钮
(2)设置下拉框控件名称和空间值
(3)创建表格选择数据集时,SQL语句中添加与控件名称一致的参数
22 Jun 2018
由于研发资源紧张,作为产品负责人只有撸起袖子自己做一套可演示的小型数分系统。这时就需要一套报表工具、一个数据库和些许JS基础,博主选择帆软报表作为主要开发工具,基础功能在此不再赘述,大家可以自行注册观看帆软学习教程。
本文将分别介绍以下几种帆软报表的开发技巧,以达到数分系统能够支持用户交互点击的目的:
1.帆软报表之多页签/自定义布局
2.帆软报表之下钻/筛选功能
· 多页签
多页签是指同一张报表中有多个页签可以来回切换。实现多页签的目的主要在于同一个分析主题往往需要多张报表组合而成,因此这些报表需要以页签的方式分布在同一张报表中。多页签展示结果如下:
创建多页签步骤如下:
(1)选择文件-新建决策报表
(2)将tab块拖拽到白色方框内,选择+按钮新增页签
· 自定义布局
自定义布局是指数据图/表及筛选框可以自定义设置大小并安放在不同的位置。创建自定义布局方式如下:
(1)将绝对画布拖拽到白色方框内
(2)点击编辑,在绝对画布中就可以自由的编辑图/表了!
24 May 2018
最近分析客户偏好的时候用到了因子分析,感觉是NLP与机器学习一个不错的结合点,遂在此记录一下。
因子分析的主要目的就是为了降维,意思是将多个字段的值按照不同的权重合为一个字段,其前提条件是需要合并的几个字段具有相关性,百度上有很多关于因子分析的计算公式,大家可以自行搜索一下,本文只给出因子分析的python计算程序。
这是借助因子分子做的客户偏好雷达图:
原始数据集下载地址:yinzifenxi.csv
· 因子分析python程序
import csv
import numpy as np
from sklearn.decomposition import FactorAnalysis
# ==== 读取原始数据集 ====
with open("d:\\yinzifenxi.csv","r") as f: # 读取原始CSV文件路径
data1 = np.loadtxt(f,delimiter=",",skiprows=1)
f = open("d:\\yinzifenxi.csv","r")
rows_dict = csv.DictReader(f)
# print(data1) # 打印原文件数据
# ==== 创建空白的CSV文件 ====
fieldnames = ['frequency','avg','coverage','yinzifenxi']
f1 = open("d:\\yinzifenxi1.csv","w",newline='') # 创建一个空白新的CSV文件
writer = csv.DictWriter(f1,fieldnames=fieldnames)
# ==== 因子分析 ====
data = np.array(data1[1:], dtype = np.float64) # 从第二行开始
fa = FactorAnalysis(n_components = 1) # 因子分析参数设置 1表示一维
fa.fit(data) # 因子分子数据输入
tran_data = fa.transform(data)
tran_data1=tran_data[:,0]
# print (tran_data1) # 打印因子分析结果
# ==== 将结果输入到CSV文件 ====
writer.writeheader()
for i,row in enumerate(rows_dict): # 将结果写入CSV
row['yinzifenxi'] = tran_data1[i-1]
writer.writerow(row)
· 因子分析结果
19 May 2018
接下来讲一个分组添加序号的问题,场景需求是依据每个文件名分组标识序号,标识以后可以根据序号筛选出每个文件组的前几行,具体形式如下:
上述表格转化为:
想要分组添加序号,需要利用MySQL中@变量功能,具体语句如下:
select * from
(select IF(@file=filename,@rank:=@rank+1,@rank:=1) as topic_rank,
@file:=filename as filename,
a.topic
from transposition a) b;
-- 注意:@file变量需要先赋值
transposition数据表创建及导入代码:
-- 创建数据表
create table transposition(
filename varchar(100),
topic varchar(100)
);
-- 往表中插入数据
insert into transposition values("0849053.txt","临时调额-操作-卡片");
insert into transposition values("0849053.txt","卡片-状态-正常");
insert into transposition values("0849053.txt","卡片-属性-固定额度");
insert into transposition values("0849053.txt","卡片-包含-分期");
insert into transposition values("0849053.txt","卡片-包含-分期");
insert into transposition values("0907432.txt","还款金额-依赖-账单");
insert into transposition values("0907432.txt","账单-条件-正常还款");
insert into transposition values("0907432.txt","账单-条件-全额还款");
insert into transposition values("0907432.txt","账单-条件-全额还款");
insert into transposition values("0907432.txt","账单-依赖-还款");
insert into transposition values("0907432.txt","核实-操作-信息");
insert into transposition values("0907432.txt","卡片-属性-账单分期");
insert into transposition values("0909268.txt","调整-操作-额度");
insert into transposition values("0909268.txt","释放-操作-额度");
insert into transposition values("0909268.txt","额度-依赖-还款");
insert into transposition values("0909268.txt","核实-操作-身份");
insert into transposition values("0909268.txt","账单-依赖-还款");
insert into transposition values("0909268.txt","账单-依赖-还款");
19 May 2018
近期在做光大POC项目的时候,遇到了分组转置的问题,场景需求是将每个文件名对应的多行合并到一行,具体形式如下:
上述表格转化为:
想要达到分组转置的效果,需要使用group_concat()函数,具体语句如下:
select filename,
group_concat(topic) as trans_topic
from transposition group by filename;
-- 注意:必须使用group by分组
transposition数据表创建及导入代码:
-- 创建数据表
create table transposition(
filename varchar(100),
topic varchar(100)
);
-- 往表中插入数据
insert into transposition values("0849053.txt","临时调额-操作-卡片");
insert into transposition values("0849053.txt","卡片-状态-正常");
insert into transposition values("0849053.txt","卡片-属性-固定额度");
insert into transposition values("0849053.txt","卡片-包含-分期");
insert into transposition values("0849053.txt","卡片-包含-分期");
insert into transposition values("0907432.txt","还款金额-依赖-账单");
insert into transposition values("0907432.txt","账单-条件-正常还款");
insert into transposition values("0907432.txt","账单-条件-全额还款");
insert into transposition values("0907432.txt","账单-条件-全额还款");
insert into transposition values("0907432.txt","账单-依赖-还款");
insert into transposition values("0907432.txt","核实-操作-信息");
insert into transposition values("0907432.txt","卡片-属性-账单分期");
insert into transposition values("0909268.txt","调整-操作-额度");
insert into transposition values("0909268.txt","释放-操作-额度");
insert into transposition values("0909268.txt","额度-依赖-还款");
insert into transposition values("0909268.txt","核实-操作-身份");
insert into transposition values("0909268.txt","账单-依赖-还款");
insert into transposition values("0909268.txt","账单-依赖-还款");
28 Apr 2018
最近在整理聚类算法的时候偶然发现一个指标——轮廓系数,仔细研究之后发现是一个易于理解的用来评估聚类效果好坏的指标,因此在这里和大家分享一样。轮廓系数的值介于[-1,1]之间,越趋于1代表聚类效果越好,具体计算方法如下:
1. 计算样本i到同簇其他所有样本的平均距离,记为a(i)。a(i)越接近0则表示样本i聚类效果越好。
2. 计算样本i到其他每个簇中所有样本的平均距离,选取平均距离最小的值记为b(i)。b(i)越大则表示样本i聚类效果越好。
3. 计算b(i)与a(i)的极差,除以max{a(i),b(i)},这时就会出现以下3种场景:
4. 判别结果:
若s(i)接近1,则说明样本i聚类合理;
若s(i)接近-1,则样本i更应该分类到另外的簇;
若s(i)接近0,则说明样本i在两个簇的边界上;
注意:轮廓系数相关程序已在Python之 文本聚类中给出,大家可自行研究。
27 Apr 2018
文本聚类/分类算法在自然语言处理中是非常基础但又重要的,其实聚类和分类最大的区别就是需不需要训练样本,因此我们也可以把聚类想象成是一种无监督的分类问题。文本聚类算法相较于结构化数据聚类算法最大的差异就是需要从文本数据中提取关键词,然后将关键词向量化后形成可计算相似度的文本向量矩阵。
语料下载地址:任选部分语料放在D盘yuliao文件夹(新建文件夹)中
Python文本聚类(K-means)程序如下:
import re
import os
import string
import jieba
import logging
import sys
import codecs
import traceback
import pandas as pd
import numpy as np
from sklearn import feature_extraction
from sklearn.feature_extraction.text import TfidfTransformer
from sklearn.feature_extraction.text import CountVectorizer
from sklearn.cluster import KMeans
from collections import Counter
from sklearn import metrics
# ======== 数据编码格式转化 ========
def get_text():
base_path = "D:\\yuliao\\"
filelist = os.listdir(base_path) #功能相当于在base_path目录下执行dir命令,返回为list类型
data_dict = {}
f2 = open('D:\\data.txt', 'w',encoding='utf-8')
for files in filelist:
f = open(base_path + files, 'r',encoding='utf-8')
text = f.read().replace('\n', '')
#data_temp = text # 转换为unicode编码形式
data = ''.join(re.findall(u'[\u4e00-\u9fff]+', text)) # 必须为unicode类型,取出所有中文字符
f2.write(data + '\n')
f2.close()
class TextCluster(object):
# 初始化函数,重写父类函数
def __init__(self):
pass
def seg_words(self, sentence):
seg_list = jieba.cut(sentence) # 默认是精确模式
return " ".join(seg_list) # 分词,然后将结果列表形式转换为字符串
# 加载用户词典
def load_userdictfile(self, dict_file):
jieba.load_userdict(dict_file)
def load_processfile(self, process_file):
corpus_list = []
try:
fp = open(process_file, "r",encoding='utf-8')
for line in fp:
conline = line.strip()
corpus_list.append(conline)
return True, corpus_list
except:
logging.error(traceback.format_exc())
return False, "get process file fail"
def output_file(self, out_file, item):
try:
fw = open(out_file, "a")
fw.write('%s' % (item),encoding='utf-8')
fw.close()
except:
logging.error(traceback.format_exc())
return False, "out file fail"
# 释放内存资源
def __del__(self):
pass
def process(self, process_file, tf_ResFileName, tfidf_ResFileName, num_clusters, cluster_ResFileName):
try:
sen_seg_list = []
flag, lines = self.load_processfile(process_file)
if flag == False:
logging.error("load error")
return False, "load error"
for line in lines:
sen_seg_list.append(self.seg_words(line))
# 该类会将文本中的词语转换为词频矩阵,矩阵元素a[i][j] 表示j词在i类文本下的词频
tf_vectorizer = CountVectorizer()
# fit_transform是将文本转为词频矩阵
tf_matrix = tf_vectorizer.fit_transform(sen_seg_list)
tf_weight = tf_matrix.toarray()
# print tf_weight
# 该类会统计每个词语的tf-idf权值
tfidf_transformer = TfidfTransformer()
# fit_transform是计算tf-idf
tfidf_matrix = tfidf_transformer.fit_transform(tf_matrix)
# 获取词袋模型中的所有词语
word_list = tf_vectorizer.get_feature_names()
# 将tf-idf矩阵抽取出来,元素a[i][j]表示j词在i类文本中的tf-idf权重
tfidf_weight = tfidf_matrix.toarray()
# 打印特征向量文本内容
# print 'Features length: ' + str(len(word_list))
tf_Res = codecs.open(tf_ResFileName, 'w', 'utf-8')
word_list_len = len(word_list)
for num in range(word_list_len):
if num == word_list_len - 1:
tf_Res.write(word_list[num])
else:
tf_Res.write(word_list[num] + '\t')
tf_Res.write('\r\n')
# 打印每类文本的tf-idf词语权重,第一个for遍历所有文本,第二个for便利某一类文本下的词语权重
for i in range(len(tf_weight)):
# print u"-------这里输出第", i, u"类文本的词语tf-idf权重------"
for j in range(word_list_len):
if j == word_list_len - 1:
tf_Res.write(str(tf_weight[i][j]))
else:
tf_Res.write(str(tf_weight[i][j]) + '\t')
tf_Res.write('\r\n')
tf_Res.close()
# 输出tfidf矩阵
tfidf_Res = codecs.open(tfidf_ResFileName, 'w', 'utf-8')
for num in range(word_list_len):
if num == word_list_len - 1:
tfidf_Res.write(word_list[num])
else:
tfidf_Res.write(word_list[num] + '\t')
tfidf_Res.write('\r\n')
# 打印每类文本的tf-idf词语权重,第一个for遍历所有文本,第二个for便利某一类文本下的词语权重
for i in range(len(tfidf_weight)):
for j in range(len(word_list)):
if j == word_list_len - 1:
tfidf_Res.write(str(tfidf_weight[i][j]))
else:
tfidf_Res.write(str(tfidf_weight[i][j]) + '\t')
tfidf_Res.write('\r\n')
tfidf_Res.close()
# ======== 聚类分析 =========
km = KMeans(n_clusters=num_clusters)
km.fit(tfidf_matrix)
print ("===== 总体轮廓系数 =====")
print (metrics.silhouette_score(tfidf_matrix, km.labels_, metric='euclidean')) #轮廓系数[-1,1]
kas=metrics.silhouette_samples(tfidf_matrix, km.labels_, metric='euclidean') #生成每个文件轮廓系数
print ("===== 每类样本个数 =====")
print (Counter(km.labels_)) # 每类分到多少样本
# 中心点
# print(km.cluster_centers_)
# 每个样本所属的簇
clusterRes = codecs.open(cluster_ResFileName, 'w', 'utf-8')
# 将数据写入文件
count = 1
a=os.listdir("D:\\yuliao\\")
kas1=kas.tolist()
while count <= len(km.labels_):
clusterRes.write(str(count) +'\t'+a[count-1]+'\t'+str(km.labels_[count - 1])+'\t'+str(kas1[count-1]))
clusterRes.write('\r\n')
count = count + 1
clusterRes.close()
except:
logging.error(traceback.format_exc())
return False, "process fail"
# 输出聚类结果
if __name__ == "__main__":
rootdir = "D:\\"
get_text()
tc = TextCluster()
tc.process(rootdir+"data.txt", rootdir+"tf_Result.txt", rootdir+"tfidf_Result.txt",3, rootdir+"cluster_Result.txt")
# data.txt记录所有数据集,一行是一个文本
# tf_Result.txt记录关键词及对应文本出现频数
# tfidf_Result.txt记录关键词及对应文本重要性
# cluster_Result.txt记录聚类结果文件名+对应类别
程序结果如下:
轮廓系数评估指标可查看:机器学习之聚类评估指标(轮廓系数)
25 Apr 2018
人工智能技术(Artificial Intelligence, AI)的迅猛发展将对我们的生活和工作产生重大影响,许多企业为了在这个快速增长的市场中占有一席之地,不断改变公司发展战略,加大对人工智能技术的投入。尽管现有AI技术仍存在许多不确定性,但关注以下几点企业将会更好地获得盈利:
· AI初期盈利暂时受限
第一批AI产品具有共同特点:它们附加在产品功能上,但不直接创造效益。例如一些在线翻译和照片标记服务,或者手机上的数据语音助手,这样的产品功能会增加消费者对于产品的粘性,但不会直接提高或增加收入。未来可能并不是这样,因为更新的收费服务正在进入市场,例如自动汽车,一些消费者可能满足于AI能够实现自动制动的车辆,而另一些消费者则需要更多的功能,例如完全自驾车,即使他们为此必须支付额外的费用。
· 把重点放在AI成型的行业
政府可以使用AI来扫描监控并识别公共场所的可疑活动,或者使用AI算法来检测潜在的网络攻击。包括无人机在内的许多军事应用也依赖于人工智能。除了安全性之外,AI在交通控制中发挥着重要作用,包括传感器和摄像头,使得光信号根据道路上的汽车数量改变其时间和顺序。与公共部门一样,银行也开始使用AI来检测可疑行为,例如提示洗钱的模式。人工智能算法也可以帮助处理交易和做出决定,通常比人力雇员更为准确。例如,AI算法可能会揭示某些被忽略的特征增加了某个特定交易是欺诈的可能性。在零售方面,人工智能已经在帮助进行盗窃检测,并可能进一步增强自动结账功能。一些零售商正在试行使用照相机和传感器来检测顾客什么时候从商店取货或退货的系统。正如AI价值因行业而异,当供应商计算他们的AI策略时,还是应该把投资集中在哪些愿意成为第一个多米诺骨牌的AI解决方法的潜在消费者身上。
· 公司需要有端到端的AI解决方案
为了赢得人工智能,企业必须提供跨多个技术层面端到端的解决方案,例如,一家医院宁愿购买一台包含MRI设备和人工智能软件的诊断系统,而不是分别购买这些组件,然后将它们组合在一起工作。除了提高销售额之外,采用端到端解决方案的供应商还可以与客户建立战略立足点,大型硬件和软件公司往往通过收购其他公司来扩大他们的人工智能投资组合,以此完善端到端的解决方案。
· AI大部分价值将来自硬件和解决方案
虽然硬件在许多其他领域已经商品化,但这种趋势不会很快达到人工智能,因为在考虑成本的情况下,针对每个AI问题进行优化的硬件将提供更高的性能。例如,针对卷积神经网络优化的加速器对于图像识别是最好的,而针对长短期记忆网络进行优化的加速器更适合语音识别和语言翻译。每个用例的要求稍有不同,都会导致每个用例需要部分定制的硬件。AI解决方案的价值将来自服务,其中包括解决方案和用例。系统集成商通常可以直接访问客户,通过将解决方案集中在所有层次上来获取大部分收益。
· 特定的硬件体系结构将是云计算和边缘计算的关键区别
随着人工智能的发展,硬件再次被捧上热潮,鉴于数据量的规模,云将继续成为许多应用程序青睐的选择。在云硬件中,客户和供应商在图形处理单元(GPU)上偏好专用集成电路(ASIC)技术,市场可能已然分散。在这方面,ASIC将赢得消费者的青睐,因为它们为许多应用提供了更优质的用户体验,更低的功耗和更高的处理能力。
如果企业延迟两到三年再来建立一套完善的人工智能战略,便很难在这个快速发展的市场中获得一席之地。大多数企业都知道风险的价值,愿意开拓进取,但缺乏强有力的战略。相信以上几个方面将为众多期望进军AI的公司带来全新的视野。
参考文献:
Artificial intelligence: The time to act is now
23 Apr 2018
在清洗数据的时候,经常会遇到剔除多余列/行的问题,行剔除在文本拆分的时候已经教给大家,这里主要来说一下剔除多余列。
原始数据下载地址:t93012254_20150605_120224.wav
Python 剔除多余列程序如下:
filepath = "d:/t93012254_20150605_120224.wav"
file = open(filepath, "r", encoding="utf-8").readlines()
for line in file:
a = [line.strip().split("\t")[-2:]]
# [-2:]表示保留倒数两行,注意加[]形成列表,方便后续遍历
# print(a)
for l in a: # 修正列表格式
print("\t".join(l))
# 输出结果如下
您 坐席
可能 客户
要先办不回来十三 坐席
啊那个 客户
账单还有一个因为广发卡还一共是工商的好像可以然后点击一下如果是将那个他他维修刚才那个我们一个月二千股具体到您以后可以高一点是到期还也可以块八的分期给您的然后这个啊这个案子完了小而专一张保单给人对都是暗提升网站了刚办人家有新一百万咱们能改 坐席
嗯嘛这个什么时候的啊 客户
因为因为想要办你帮我点进去还是三个三笔赔到位就行财网在看了 坐席
啊麻烦所以 客户
您因为您这个块钱其他方面的呢 坐席
嗯我想想确认一下这张卡嘛我都这样啊 客户
21 Apr 2018
工作中经常会遇到用split()函数切分字符串的问题,但有时我们会看到一段话中有多种符号用来分隔,例如”字段1,字段2*字段3|字段4”,这时我们就需要借助re正则表达式包来实现多分隔符切割原始数据的方法。
Python 多分隔符切分数据程序如下:
import re
text = "字段1,字段2*字段3|字段4"
list = re.split("[,*|]",text)
print(list)
# 输出结果如下
['字段1', '字段2', '字段3', '字段4']
# 若需要剔除字段1,可直接写
import re
text = "字段1,字段2*字段3|字段4"
list = re.split("[,*|]",text)
print(list[1:4])
# 输出结果如下
['字段2', '字段3', '字段4']
21 Apr 2018
关于摘要抽取共有两种研究方向:抽取式摘要和生成式摘要,现阶段市面上接触到的大多是抽取式摘要,而生成式摘要还属于实验室阶段。因此这里只介绍抽取式摘要的一种算法TextRank,我们之前了解过TextRank基于投票机制可以提取关键词,而这里我们可以想象利用投票机制提取关键句子从而形成摘要。
语料下载地址:textrank_test.txt
Python抽取式摘要(TextRank)程序如下:
from textrank4zh import TextRank4Sentence
text = open("d:\\textrank_test.txt","r",encoding="utf-8").read()
sentence = TextRank4Sentence()
sentence.analyze(text,lower = True)
s_list = sentence.get_key_sentences(num = 3,sentence_min_len = 5)
print('====== 抽取式摘要 ======')
for s in s_list:
print(s.sentence,s.weight)
21 Apr 2018
最近受邀去帮广发银行的高层培训NLP相关知识,既定的任务是教会他们如何用Python实现自然语言处理。想着既然要备课,就顺带着将NLP相关的知识梳理一下,放到博客中。
自然语言处理说简单些就是程序员将自然语言(英语、汉语等)编译为程序语言(Python、Java等)最后让机器解析成汇编语言的过程。那么就自然语言本身来看,其中就包括单个词、短语、句子、段落和篇章,不同的切词、提词的方法都会影响到后续句子级以上的处理,而不同句子、段落、篇章的算法也会各有优势和劣势,这里分别列举一些常用算法以帮助期望快速了解NLP的朋友。
关键词提取这里主要列举两种常用的计算方法TF-IDF和TextRank,TF-IDF表示在本文档中经常出现,且在其他文档中很少出现的词,TextRank则是基于图排序的算法(根据投票原理,让每个单词给它相邻的词投赞成票,票的权重取决于词自身的票数)。
Python关键词提取(TF-IDF)程序如下:
from sklearn import feature_extraction
from sklearn.feature_extraction.text import TfidfTransformer
from sklearn.feature_extraction.text import CountVectorizer
if __name__ == "__main__":
corpus=["鲜花 多少钱",#第一类文本切词后的结果,词之间以空格隔开
"白百合 多少钱",#第二类文本的切词结果
"水仙花 多少钱",#第三类文本的切词结果
"水果 多少钱"]#第四类文本的切词结果
vectorizer=CountVectorizer()#该类会将文本中的词语转换为词频矩阵,矩阵元素a[i][j] 表示j词在i类文本下的词频
transformer=TfidfTransformer()#该类会统计每个词语的tf-idf权值
tfidf=transformer.fit_transform(vectorizer.fit_transform(corpus))#第一个fit_transform是计算tf-idf,第二个fit_transform是将文本转为词频矩阵
word=vectorizer.get_feature_names()#获取词袋模型中的所有词语
weight=tfidf.toarray()#将tf-idf矩阵抽取出来,元素a[i][j]表示j词在i类文本中的tf-idf权重
for i in range(len(weight)):#打印每类文本的tf-idf词语权重,第一个for遍历所有文本,第二个for便利某一类文本下的词语权重
print ("-------这里输出第",i,u"类文本的词语tf-idf权重------")
for j in range(len(word)):
print (word[j],weight[i][j])
Python关键词提取(TF-IDF)结果如下:
从结果中可以看出,程序没有问题,但深究文本会发现,我希望提取的关键词是“多少钱”而并非商品名称,因此面对这类文本时TF-IDF算法失效,这时我们可以采用TextRank提取关键词。
from textrank4zh import TextRank4Keyword
text = "鲜花 多少钱 白百合 多少钱 水仙花 多少钱 水果 多少钱"
word = TextRank4Keyword()
word.analyze(text,window = 2,lower = True)
w_list = word.get_keywords(num = 20,word_min_len = 1)
print ('关键词:')
for w in w_list:
print(w.word,w.weight)
Python关键词提取(TextRank)结果如下:
01 Apr 2018
经过好几次POC项目发现分类关系图展示内容具有很强的局限性,所以一直在考虑要不要将这种样式发上来。直到最近看Echart官网发现分类关系图的样式已经下架,想着还是留个纪念吧。
分类关系图代码如下所示:
var size = 100;
var size1 = 10;
var yy = 200;
var yy1 = 250;
option = {
title: {
text: "分类关系图",
top: "top",
top: 10,
left: "left",
left: 5,
textStyle: {
fontSize: 24,
color: '#464646'
}
},
tooltip: {
formatter: '{b}'
},
backgroundColor: '#FFFCE8',
animationDuration: 1000,
animationEasingUpdate: 'quinticInOut',
// 图底部的图示
legend: [{
formatter: function (name) {
return echarts.format.truncateText(name, 40, '14px Microsoft Yahei', '…');
},
tooltip: {
show: true
},
selectedMode: 'false',
top: 20,
right: 0,
textStyle: {
color: '#464646'
},
data: ['购车咨询', '车贷业务', '费用咨询', '车辆检测', '看车咨询', '售后服务', '车源状态', '还款咨询', '配套服务', '售后服务', '费用咨询业务']
}],
series: [{
name: '知识体系',
type: 'graph',
layout: 'force',
force: {
repulsion: 80,
gravity: 0.1,
edgeLength: 30,
layoutAnimation: true,
},
// 名称及对应位置
data: [{
"name": " ",
symbol: 'image://../app_themes/assets/img/1.jpg',
x: 0,
y: yy,
"symbolSize": 150,
"draggable": "true"
}, {
"name": "购车咨询",
x: 10,
y: yy,
"symbolSize": size,
"category": "购车咨询",
"draggable": "true",
label: {
normal: {
position: 'inside',
fontSize: 14,
color: '#fff',
}
},
}, {
"name": "费用计算",
x: 30,
y: yy,
"symbolSize": size1,
"category": "购车咨询",
"draggable": "true"
}, {
x: 30,
y: yy1,
"name": "价格优惠",
"symbolSize": size1,
"category": "购车咨询",
"draggable": "true"
}, {
x: 40,
y: yy,
"name": "购车流程",
"symbolSize": size1,
"category": "购车咨询",
"draggable": "true",
"value": 1
}, {
x: 40,
y: yy,
"name": "全款买车",
"symbolSize": size1,
"category": "购车咨询",
"draggable": "true",
"value": 1
}, {
x: 40,
y: yy,
"name": "手续办理",
"symbolSize": size1,
"category": "购车咨询",
"draggable": "true",
"value": 1
}, {
x: 40,
y: yy,
"name": "合同签订",
"symbolSize": size1,
"category": "购车咨询",
"draggable": "true",
"value": 1
}, {
x: 40,
y: yy,
"name": "车辆出险证明",
"symbolSize": size1,
"category": "购车咨询",
"draggable": "true",
"value": 1
}, {
x: 40,
y: yy,
"name": "车辆落户",
"symbolSize": size1,
"category": "购车咨询",
"draggable": "true",
"value": 1
}, {
x: 40,
y: yy,
"name": "牌照问题",
"symbolSize": size1,
"category": "购车咨询",
"draggable": "true",
"value": 1
}, {
x: 50,
y: yy,
"name": "车贷业务",
"symbolSize": size,
"category": "车贷业务",
"draggable": "true",
label: {
normal: {
position: 'inside',
fontSize: 14,
color: '#fff',
}
},
}, {
x: 60,
y: yy1,
"name": "付一半产品",
"symbolSize": size1,
"category": "车贷业务",
"draggable": "true"
}, {
x: 70,
y: yy,
"name": "指定险种",
"symbolSize": size1,
"category": "车贷业务",
"draggable": "true"
}, {
x: 80,
y: yy1,
"name": "尾款支付",
"symbolSize": size1,
"category": "车贷业务",
"draggable": "true"
}, {
x: 80,
y: yy1,
"name": "信审申请",
"symbolSize": size1,
"category": "车贷业务",
"draggable": "true"
}, {
x: 80,
y: yy1,
"name": "贷款分期",
"symbolSize": size1,
"category": "车贷业务",
"draggable": "true"
}, {
x: 80,
y: yy1,
"name": "第三方金融",
"symbolSize": size1,
"category": "车贷业务",
"draggable": "true"
}, {
x: 80,
y: yy1,
"name": "一车一分期方案",
"symbolSize": size1,
"category": "车贷业务",
"draggable": "true"
}, {
x: 80,
y: yy1,
"name": "提前还款",
"symbolSize": size1,
"category": "车贷业务",
"draggable": "true"
}, {
x: 90,
y: yy1,
"name": "费用咨询",
"symbolSize": size,
"category": "费用咨询",
"draggable": "true",
label: {
normal: {
position: 'inside',
fontSize: 14,
color: '#fff',
}
},
}, {
x: 100,
y: yy1,
"name": "GPS费用",
"symbolSize": size1,
"category": "费用咨询",
"draggable": "true"
}, {
x: 110,
y: yy1,
"name": "定金",
"symbolSize": size1,
"category": "费用咨询",
"draggable": "true"
}, {
x: 120,
y: yy1,
"name": "其他费用",
"symbolSize": size1,
"category": "费用咨询",
"draggable": "true"
}, {
x: 120,
y: yy1,
"name": "年费率",
"symbolSize": size1,
"category": "费用咨询",
"draggable": "true"
}, {
x: 120,
y: yy1,
"name": "违约金",
"symbolSize": size1,
"category": "费用咨询",
"draggable": "true"
}, {
x: 120,
y: yy1,
"name": "风险保证金",
"symbolSize": size1,
"category": "费用咨询",
"draggable": "true"
}, {
x: 130,
y: yy,
"name": "车辆检测",
"symbolSize": size,
"category": "车辆检测",
"draggable": "true",
label: {
normal: {
position: 'inside',
fontSize: 14,
color: '#fff',
}
},
}, {
x: 140,
y: yy,
"name": "初步检测",
"symbolSize": size1,
"category": "车辆检测",
"draggable": "true"
}, {
x: 150,
y: yy1,
"name": "检测报告",
"symbolSize": size1,
"category": "车辆检测",
"draggable": "true"
}, {
x: 160,
y: yy1,
"name": "重大事故排查",
"symbolSize": size1,
"category": "车辆检测",
"draggable": "true"
}, {
x: 160,
y: yy1,
"name": "158项排查",
"symbolSize": size1,
"category": "车辆检测",
"draggable": "true"
}, {
x: 160,
y: yy1,
"name": "双重检测",
"symbolSize": size1,
"category": "车辆检测",
"draggable": "true"
}, {
x: 160,
y: yy1,
"name": "看车咨询",
"symbolSize": size,
"category": "看车咨询",
"draggable": "true",
label: {
normal: {
position: 'inside',
fontSize: 14,
color: '#fff',
}
},
}, {
x: 170,
y: yy1,
"name": "看车费用",
"symbolSize": size1,
"category": "看车咨询",
"draggable": "true"
}, {
x: 180,
y: yy1,
"name": "异地看车",
"symbolSize": size1,
"category": "看车咨询",
"draggable": "true"
}, {
x: 190,
y: yy1,
"name": "视频看车",
"symbolSize": size1,
"category": "看车咨询",
"draggable": "true"
}, {
x: 190,
y: yy1,
"name": "实地看车",
"symbolSize": size1,
"category": "看车咨询",
"draggable": "true"
}, {
x: 190,
y: yy1,
"name": "预约看车",
"symbolSize": size1,
"category": "看车咨询",
"draggable": "true"
}, {
x: 200,
y: yy,
"name": "售后服务",
"symbolSize": size,
"category": "售后服务",
"draggable": "true",
label: {
normal: {
position: 'inside',
fontSize: 14,
color: '#fff',
}
},
}, {
x: 210,
y: yy1,
"name": "一年两万公里保修",
"symbolSize": size1,
"category": "售后服务",
"draggable": "true"
}, {
x: 220,
y: yy,
"name": "三十天包退",
"symbolSize": size1,
"category": "售后服务",
"draggable": "true"
}, {
x: 230,
y: yy1,
"name": "无理由退款",
"symbolSize": size1,
"category": "售后服务",
"draggable": "true"
}, {
x: 240,
y: yy1,
"name": "预约退款",
"symbolSize": size1,
"category": "售后服务",
"draggable": "true"
}, {
"name": "车源状态",
x: 250,
y: yy1,
"symbolSize": size,
"category": "车源状态",
"draggable": "true",
label: {
normal: {
position: 'inside',
fontSize: 14,
color: '#fff',
}
},
}, {
"name": "个人车源",
x: 260,
y: yy1,
"symbolSize": size1,
"category": "车源状态",
"draggable": "true"
}, {
"name": "确认在售车辆",
x: 270,
y: yy1,
"symbolSize": size1,
"category": "车源状态",
"draggable": "true"
}, {
x: 280,
y: yy1,
"name": "相关业务",
"symbolSize": size,
"category": "相关业务",
"draggable": "true",
label: {
normal: {
position: 'inside',
fontSize: 14,
color: '#fff',
}
},
}, {
"name": "委托卖车",
x: 290,
y: yy1,
"symbolSize": size1,
"category": "相关业务",
"draggable": "true"
}, {
"name": "车辆置换",
x: 290,
y: yy1,
"symbolSize": size1,
"category": "相关业务",
"draggable": "true"
}, {
"name": "到期还车",
x: 300,
y: yy1,
"symbolSize": size1,
"category": "相关业务",
"draggable": "true"
}],
// 对应关系
links: [{
"source": " ",
"target": "购车咨询"
}, {
"source": " ",
"target": "车源状态"
}, {
"source": " ",
"target": "车贷业务"
}, {
"source": " ",
"target": "相关业务"
}, {
"source": " ",
"target": "费用咨询"
}, {
"source": " ",
"target": "车辆检测"
}, {
"source": " ",
"target": "看车咨询"
}, {
"source": " ",
"target": "售后服务"
}, {
"source": "购车咨询",
"target": "费用计算"
}, {
"source": "购车咨询",
"target": "价格优惠"
}, {
"source": "购车咨询",
"target": "购车流程"
}, {
"source": "购车咨询",
"target": "全款买车"
}, {
"source": "购车咨询",
"target": "手续办理"
}, {
"source": "购车咨询",
"target": "合同签订"
}, {
"source": "购车咨询",
"target": "车辆出险证明"
}, {
"source": "购车咨询",
"target": "车辆落户"
}, {
"source": "购车咨询",
"target": "牌照问题"
}, {
"source": "费用咨询",
"target": "GPS费用"
}, {
"source": "车贷业务",
"target": "付一半产品"
}, {
"source": "车贷业务",
"target": "指定险种"
}, {
"source": "车贷业务",
"target": "尾款支付"
}, {
"source": "车贷业务",
"target": "信审申请"
}, {
"source": "车贷业务",
"target": "贷款分期"
}, {
"source": "车贷业务",
"target": "第三方金融"
}, {
"source": "车贷业务",
"target": "一车一分期方案"
}, {
"source": "车贷业务",
"target": "提前还款"
}, {
"source": "费用咨询",
"target": "定金"
}, {
"source": "费用咨询",
"target": "其他费用"
}, {
"source": "费用咨询",
"target": "年费率"
}, {
"source": "费用咨询",
"target": "违约金"
}, {
"source": "费用咨询",
"target": "风险保证金"
}, {
"source": "初步检测",
"target": "车辆检测"
}, {
"source": "车辆检测",
"target": "检测报告"
}, {
"source": "车辆检测",
"target": "重大事故排查"
}, {
"source": "车辆检测",
"target": "158项排查"
}, {
"source": "车辆检测",
"target": "双重检测"
}, {
"source": "看车咨询",
"target": "看车费用"
}, {
"source": "看车咨询",
"target": "异地看车"
}, {
"source": "看车咨询",
"target": "视频看车"
}, {
"source": "看车咨询",
"target": "预约看车"
}, {
"source": "看车咨询",
"target": "实地看车"
}, {
"source": "售后服务",
"target": "一年两万公里保修"
}, {
"source": "售后服务",
"target": "三十天包退"
}, {
"source": "售后服务",
"target": "无理由退款"
}, {
"source": "售后服务",
"target": "预约退款"
}, {
"source": "车源状态",
"target": "个人车源"
}, {
"source": "车源状态",
"target": "确认在售车辆"
}, {
"source": "相关业务",
"target": "委托卖车"
}, {
"source": "相关业务",
"target": "到期还车"
}, {
"source": "相关业务",
"target": "车辆置换"
}],
// 大的节点名称
categories: [{
'name': ' '
}, {
'name': '购车咨询'
}, {
'name': '车源状态'
}, {
'name': '车贷业务'
}, {
'name': '相关业务'
}, {
'name': '费用咨询'
}, {
'name': '车辆检测'
}, {
'name': '看车咨询'
}, {
'name': '售后服务'
}],
focusNodeAdjacency: true,
roam: true,
label: {
normal: {
show: true,
color: 'source',
formatter: '{b}',
fontSize: 13,
fontStyle: '600',
position: 'top',
}
},
lineStyle: {
normal: {
width: 2,
color: 'source',
curveness: 0,
type: "solid"
}
}
}]
};
27 Mar 2018
工程师朋友让我帮忙改一下Python脚本,业务场景是有现有两份csv文件,一张fcsv存放原始数据,一张fcsv_new存放更新数据,现在需要把更新的数据追加到原始表中
Python csv纵向合并程序如下:
import csv
fcsv="d:\\test\\20180323HF.csv" # 定义文件路径
fcsv_new="d:\\test\\20180323HFnew.csv"
reader_new = csv.DictReader(open(fcsv_new,encoding="utf-8")) # 读取fscv_new的数据
header = reader_new.fieldnames # 读取fscv_new的字段名
with open(fcsv,'a',encoding="utf-8") as csvfile:
writer = csv.DictWriter(csvfile, fieldnames=header)
writer.writerows(reader_new) # 将fcsv_new写入fcsv
reader = csv.DictReader(open(fcsv,encoding="utf-8")) #读取合并后的fcsv
for row in reader:
print(row)
23 Mar 2018
WingIDE安装总会遇到各种各样的麻烦,其破解方法也是作为一个Hacker基本应该有的“职业素养”,多说无益动手尝试一下吧!
· WingIDE安装
(1)登陆WingIDE官网选择企业版
(2)选择合适的包,博主用的是Linux32位的系统,WingIDE版本号为5.0.9
(3)选择5.0.9后,需要选择Linux32-bit,然后进入真正的下载页面
(4)下载完成后,会有一个wingide*.deb的包,需要拷贝到Linux虚拟机
(5)执行如下安装语句,会出现依赖包未安装的问题
#注意路径
dpkg -i wingide5_5.0.9-1_i386.deb
(6)手动下载安装依赖包libqt4-webkit,若还有问题可参考百度软文kali linux 安装wingide
(7)将libqt4-webkit*.deb考到linux系统下,并执行如下语句安装
dpkg -i libqt4-webkit_4.8.6+git64-g5dc8b2b+dfsg-3+deb8u1_i386.deb
22 Mar 2018
最近在利用Python研究渗透测试(黑客技术),Kali作为一款非常好用的渗透测试操作系统是值得我们花精力去安装的。在网上搜罗了一篇详细的Kali安装指南,鉴于该博文中文输入法安装不上的问题,博主另外写一篇博文进行修正。
(1)修改Kali源路径 ,并更新系统
切换到root用户(一般我们都是root用户登录,基本可忽略),在终端输入打开sources.list文件
leafpad /etc/apt/sources.list
在sources.list文件中添加(虽然也有其他的kali-rolling版本,但感觉中科大的最好用)
#中科大
deb http://mirrors.ustc.edu.cn/kali kali-rolling main non-free contrib
deb-src http://mirrors.ustc.edu.cn/kali kali-rolling main non-free contrib
修改完成后,更新系统
apt-get update && apt-get upgrade
(2)安装google拼音
apt-get install fcitx-googlepinyin
如果安装过程中提示依赖关系有问题:
apt-get install -f
(3)重启后,Ctrl+空格 切换输入法
参考博文:kali国内更新源+中文输入法安装+SSH
15 Mar 2018
现今数据分析岗位已不像从前那么火热,最大的一个原因便是越来越多的公司发现数据团队缺乏变现能力。如果数分师一直在循环往复的进行数据抽取、数据清洗、数据建模等工作,那么数分岗就成了一个服务型的岗位,专门为公司提供数据日志及报表。虽然偶尔能发现数据异常,但这些数据问题也只存在于报告的形式,无法进一步转化为公司产品价值。因此作为一名数据分析师,我们不仅需要对算法技术游刃有余,更需要学会产品思维,能够将数据问题(输入)转化为产品价值(输出)。
博主最近听了套名为《梁宁·产品思维30讲》的课程,感觉有必要站在一个数据分析师的角度,针对产品思维的相关概念进行整合
问题1:产品能力是什么?
回答1:产品能力是人生的一个底层能力,它能够让人有一种脚踩在地上的踏实感。
问题2:如何判断一个人的产品能力?
回答2:判断信息、抓住要点、整合有限资源,把所有价值打包成一个产品向世界交付。
问题3:作为一个产品人的信念?
回答3:用户驱动
问题4:如何让用户驱动产品?
回答4:记住草地与羊群的产品设计思路:如果有一片草地(产品),就在草地上养羊(用户),首先要有第一只羊,如果这只羊在草地上玩的很好则引入更多的羊。一方面,羊多了就需要有头羊(淘宝商家、社区版主等网络效应),只要有头羊,羊群就可以聚集。另一方面,羊多了就会有狼(供应商等),狼多了就把羊圈起来向狼收费。
问题5:如何划分羊群?
回答5:记住大明、笨笨、小闲的用户画像
用户画像
用户特征
商业案例
大明
明确需求,比价格
百度精确定位
笨笨
大概需求,找灵感
“逛”淘宝
小闲
打发闲暇时间
腾讯游戏
问题6:如何用产品思维框架看一只羊?
回答6:依据1-5逐层递进
产品思维层次
具体描述
1.感知层
外在特征:身材、相貌等
2.角色层
职业特征:律师严谨、艺术开放
3.资源层
内在价值:财富、人脉、精神等
4.能力圈
拓展能力:健身、学习、挣钱
5.内核
自身定义:存在感
问题7:如何深度理解这只羊?
回答7:用户无法像产品经理一样分层说出他的体验,却能展示用户情绪。生物性情绪包括:愉悦与不爽、愤怒与恐惧,因此一款成功的产品必须解决以下任意一点:让人愉悦到爆爽;帮人抵御恐惧。
问题8:产品设计中为什么要有数据分析?
回答8:潜意识分析!人们会基于自身所处的场景进行角色化交流,交流时人拥有意识,伴随而生的是一种防御机制。好的销售会攻破防御机制,但好的产品经理需要了解用户毫无防御机制时的想法。那么人们在独处时被记录的数据,是无压力状况下潜意识流露而做出的自然选择。因此数据分析能看到的是用户潜意识的行为,而一个产品要做的就是能够迎合用户的潜意识,让他们产生熟悉的感觉。
案例:切换分析思维与产品思维——女孩减肥
案例场景:A女孩整天说自己要减肥,该如何给出解决方案?
分析思维:
1.收集A女孩年龄、现有体重、体脂率、运动频率等数据制定用户画像
2.减肥最重要的衡量指标体重下降
3.影响体重因素,脂肪含量、肌肉含量、骨骼含量等
4.其实减肥主要减的是脂肪,如何减少脂肪?
5.打破能量缺口,能量=摄入-基础代谢-运动消耗
6.控制摄入,包括碳水、油、盐等,增加运动消耗,包括单车、跑步等有氧运动
7.每日获得能量缺口500卡路里,一周3500卡路里能消耗1磅脂肪,1公斤=2.2磅
总结:具体问题=>什么样的用户=>什么样的数据=>什么样的计算方式=>解决什么样的问题
产品思维:
1.A女孩想减肥的原因是什么?失恋、衣服穿不下、身体健康
2.如果失恋可以提供旅行服务,衣服穿不下可以提供服装剪裁,身体健康可以提供运动、营养搭配
3.假设原因是身体健康,就可以提供一个运动、饮食APP
4.APP功能提供身体数据分析,告诉用户当前的身体状况
5.APP功能提供达到理想身体状况所需要的运动方式
6.APP功能提供达到理想身体状况所需要的饮食方式
7.考虑用户沉淀、数据存储、数据流转
8.考虑目标群体范围,是不是要适用于男性
总结:具体问题=>为什么有这个问题=>需求分析=>功能方式=>体系能力=>产品延展
经典语句摘要:
1.后天学习是理性知识,理性是把人往回拉的力量,而驱动一个人的是他内在的感受和情绪。
2.去“角色化”来研究真是的用户,而不是用一堆“应该”来臆测用户行为。
3.用户调研是清空自己,接纳别人的过程。
4.你的样子里,有你爱过的人,走过的路,看过的风景,读过的书。
5.悲催的人生是在常态的面上做个勤奋的点。———《智能商业20讲》曾鸣
14 Mar 2018
最近有位同学提出了这样一个业务需求:期望能够通过检索参与人员名称、会议讨论内容等能够从大量语料中找出相关的会议议题。本文提供一种检索文本内容的方式,程序设计思路如下:
(1)读取文件夹下所有文本信息;
(2)将文件名(会议议题)和文件内容(会议内容)按照字典格式存储;
(3)利用正则表达式检索文件内容(会议内容);
(4)若匹配成功,则输出文件名(会议议题);
数据配置要求:在D盘下创建test文件夹,将全部会议数据.txt放在test文件夹下
Python程序设计如下:
# ==== 读取原始语料txt文件 ====
import os
rootdir='d:\\test\\'
txt_list = [] # 定义一个列表用于存储所有文件内容
for root, dirs, files in os.walk(rootdir): # 遍历指定目录
for filename in files: # 遍历目录下所有文件
fullname = root + filename # 拼接完整的文件名,parent是父目录
one_file = open(fullname,'r', encoding='utf-8').read()
# 存储K-value 文件名:文件内容
one_txt = dict()
one_txt[filename] = one_file
txt_list.append(one_txt)
# ==== 正则表达式遍历检索 ====
import re
pattern = re.compile("黄立鹏") #填写需要查找的人名或会议内容
result_content=''
for txt in txt_list: # 遍历txt文件
for txt_key in txt.keys(): # txt_key标题,txt[txt_key]内容
match = pattern.search(txt[txt_key])
if match:
result_content += os.path.join('会议议题:'+txt_key+'\n')
print(result_content)
12 Mar 2018
最近发现不少同学在实际业务场景中对数据类型的选择有诸多困惑,遂写下该博文,期望能够帮助同学进一步加深对数据类型的理解。MySQL中数据类型主要包括三大类:数值型、字符型和日期型,本章将详细描述不同数据类型的名称、适用场景以及如何选择数据类型。
· 数值型
数值型数据类型主要用来存储数字,MySQL中可以把数值型数据分为两类:整数型和小数点型。整数型包括:tinyint、smallint、mediumint、int、bigint,小数点型包括:float、double、decimal(M,D),具体请见下表:
MySQL中整数类型
类型名称
具体描述
存储需求
tinyint
非常小的整数
1个字节
smallint
较小的整数
2个字节
mediumint
中等大小的整数
3个字节
int
普通大小的整数
4个字节
bigint
较大的整数
8个字节
MySQL中小数点类型
类型名称
具体描述
存储需求
float
单精度浮点数
4个字节
double
双精度浮点数
8个字节
decimal(M,D)
定点数(M数值总位数,D小数点后位数)
M+2个字节
要点:
1.如果业务不需要小数部分,使用整数来保存数据,通常情况下我们会使用int整数类型,否则使用浮点数来保存数据,通常情况下我们会使用float浮点数类型;
2.浮点数float、double与定点数decimal,在长度一定的情况下,使用浮点数能表示更大的数据范围,但如果对数据精确度要求较高时,建议使用定点数来存储;
· 字符型
字符型数据类型用来存储字符串数据,MySQL支持两种字符型数据存储:文本字符串和二进制字符串,文本字符串包括:char、varchar、text、enum、set,二进制字符串包括:bit、binary、varbinary、tinyblob、blob、mediumblob、longblob,具体请见下表:
MySQL中文本字符串类型
类型名称
具体描述
存储需求
char
固定长度的字符串
M个字节,1<=M<=255
varchar
可变长度的字符串
L+1个字节,L<=M且1<=M<=255
tinytext
非常小的字符串
L+1个字节,L<2^8
text
较小的字符串
L+2个字节,L<2^16
mediumtext
中等大小的字符串
L+3个字节,L<2^24
longtext
较大的字符串
L+3个字节,L<2^32
enum
枚举类型
set
字符串对象,可以有零或多个值
MySQL中二进制字符串类型
类型名称
具体描述
存储需求
bit
位字段类型
约M+7个字节
binary
固定长度二进制字符串
M个字节
varbinary
可变长度二进制字符串
M+1个字节
tinyblob
非常小的BLOB
L+1个字节,L<2^8
blob
较小的BLOB
L+2个字节,L<2^16
mediumblob
中等大小的BLOB
L+3个字节,L<2^24
longblob
较大的BLOB
L+4个字节,L<2^32
要点:
1.文本字符串和二进制字符串本质区别在于数据存储方式不同,前者多以文本的ASCII码形式存储在计算机中,后者以文本的二进制形式存储在计算机中;
2.char与varchar,char是固定长度、自动删除插入数据的尾部空格,varchar是可变长度、不会删除尾部空格,char的优势在于处理数据更快,varchar的优势在于节省存储空间;
06 Feb 2018
当我们还没意识到自己在使用人工智能之前,AI就已经渗透于诸多智能产品和商业服务之中,小到我们常用的智能手机,大到我们接触的智能客服。随着AI技术的不断发展,越来越多的人开始关注人工智能的自动化对于我们工作场所、就业和社会的影响。简单来说,人工智能的挑战和局限性给领导者创造了一个“移动目标”的问题:很难在AI浪潮中一直保持领先的优势。每当AI技术试图应用到现实世界但受到障碍时,投资者便会采取观望的态度。为了保持AI技术的先进性,一个有用的方法便是追踪深度学习的最新进展。
深度学习相较于传统的有监督学习的“特征工程”,使用了大规模的神经网络,它可以包含数百万个模拟的“神经元”分层结构,这些神经网络通过训练数据和反向传播算法来学习。虽然深度学习推进了人工智能的发展,但人工智能的实现还有诸多的局限,例如AI方法、业务问题和数据可用性相适应的问题。由于AI系统是经过“训练”而不是建成的,所以各个过程通常需要大量的标记数据来精确地执行复杂的任务,此外,很难分辨一个由深度学习训练的数学模型是如何达到特定的预测或分类。让我们从以下五个方面来探索人工职能的挑战和局限性:
· 数据标签
目前大多数人工智能模型都是通过“监督式学习”进行训练的。这意味着我们必须手工对基础数据进行标注和分类,这是一个相当庞大且容易出错的杂事。例如,开发自驾车技术的公司正在雇佣数百人手动注释来自原型车辆的视频,以帮助更好的训练这些系统。与此同时,如流式监督的新技术也在不断涌现,这种技术能够在数据自然使用过程中被贴上标签,这种半监督的方法减少了需要大量标记的数据集,有可能将大量劳力成本从繁琐的数据标注中解放出来。
· 获得大量的训练数据集
研究表明,使用线性模型的简单的AI技术在某些情况下可以接近医学和其他领域的专家的能力。然而,目前机器学习需要的训练数据集不仅要求被标记,且要求足够大、足够全面。一次性学习是一种新的技术,可以减少大型数据集的需求,允许AI模型在给予少量样本的同时,精确地识别出一个类别的多个实例。由此可以减少AI建模时需要大量训练数据集的问题。
· 可解释性问题
可解释性并不是人工智能系统的一个新问题,随着深度学习的成功和采用,促进了更多样化和先进应用的同时也生成了更多的不透明性。更大、更复杂的模型使人们很难解释为什么达成某个决定,但随着AI应用范围的不断扩大,监管要求也可能导致需要更多可解释的人工智能模型。此时我们采用LIME方法可能更好的提高模型透明度,其目的是试图确定一个训练好的模型依赖最多的输入数据的哪个部分来开发可解释模型的预测。这种技术一次考虑某些数据段,观察预测结果的变化,对代理模型进行微调,并形成更精确的解释。
· 学习的普遍性
与人类学习的方式不同,人工智能模型难以将他们的经验从一种情况转移到另一种情况。实际上,对于一个给定的用例来说,无论是哪一个模型,都只能适用于这个用例。因此,即使在用例非常相似的情况下,公司也必须多次投入资源来训练另一个模型。对这一挑战的一个有希望的回应是转移学习。在这种方法中,人工智能模型被训练完成某个任务,然后迅速将这个学习应用于一个类似但不同的活动。 DeepMind的研究人员在实验中也发现了转移学习的有希望的成果,随着转换学习和其他通用方法的成熟,他们可以帮助组织更快速地构建新的应用程序,并为现有的应用程序提供更多不同的功能。例如,在创建虚拟个人助理时,转移学习可以将用户在一个区域(例如音乐)中的偏好推广到其他人(书籍)。
· 数据和算法中的偏差
随着我们在新的领域部署机器学习和人工智能算法,可能会有更多的实例将这些潜在的偏见问题无意识的融入到数据集和算法。这种偏见倾向于保持嵌入,因此承认这些偏见并采用措施解决这些偏见需要深入掌握数据科学技术以及对现有业务情况更多元的理解。
人工智能是强大的,但实现人工智能所需的技术、工具和流程条件还没有完全达到。但我们需要有足够的信心去相信,随着研究人员和AI开拓者不断的去挑战一些当今棘手的问题,AI终有一天会有全新的突破。
31 Jan 2018
知识图谱简单来说就是具有语义理解与信息互联互通能力的知识库。它作为人工智能技术的重要组成部分,主要应用在搜索引擎、话术追踪、人机交流等多个领域。本文提供一种构建知识图谱的概念,其本质上来说还算不上真正的知识图谱,构建方式如下:
(1)从样例文本或FAQ中提取不同的对话场景;
(2)将不同的对话场景编译为正则表达式的形式;
(3)人工对每个正则表达式配上相应的业务知识点;
(4)根据正则表达式回扫所有文本并打上对应的业务知识点标签;
具体操作步骤如下:
(1)将已构建好的正则及知识点整合文档reg.excel放在D盘下;
(2)在D盘下创建test文件夹,将原始语料*.txt放入文件夹中;
Python程序设计如下:
import xlrd # Excel读取包
import os # 路径包
import re # 正则包
# ==== 读取reg.excel文件 ====
datadir='d:\\reg.xlsx'
data = xlrd.open_workbook(datadir)
table = data.sheets()[0] # 0表示读取第1张表
nrows = table.nrows # 获取行数
reg_list = []
for i in range(1,nrows): # 第一行为表头,range从第二行到第nrows行
row = table.row_values(i) # 按行读取数据,row[0]第一列 row[1]第二列
if row: # 存储k-value值,row[0]正则为key,row[1]标签为value
one_reg = dict() # 创建一个字典对象
one_reg[row[0]] = row[1]
reg_list.append(one_reg)
# ==== 读取原始语料txt文件 ====
rootdir='d:\\test\\'
txt_list = [] # 定义一个列表用于存储所有文件内容
for root, dirs, files in os.walk(rootdir): # 遍历指定目录
for filename in files: # 遍历目录下所有文件
fullname = root + filename # 拼接完整的文件名,parent是父目录
one_file = open(fullname,'r', encoding='utf-8').read()
# 存储K-value 文件名:文件内容
one_txt = dict()
one_txt[fullname] = one_file
txt_list.append(one_txt)
# ==== 依据正则对文本进行打标 ====
result_content = ''
for reg in reg_list: # 遍历Excel文件
for reg_key in reg.keys(): # value值:reg[reg_key]
pattern = re.compile(reg_key)
for txt in txt_list: # 遍历txt文件
for txt_key in txt.keys():
match = pattern.search(txt[txt_key])
if match: # 如果Match不为空
turn = match.group(0) # group(0)返回整理,返回对应文本内容
# 输出"文件名\知识点\正则表达式"
result_content += os.path.join(txt_key + '|'+ reg[reg_key] + '|'+ reg_key + '|' + turn + '\n')
print((result_content),file=open('d:\\test01.txt','w',encoding='utf-8')) # 将结果打印到txt中
27 Jan 2018
最后再看一下文本剔除,该业务需求是我们手上有一份文件名单,希望从数据集中将对应名单的文本提取出来,换句话说就是将数据集中不匹配的文本剔除。具体步骤如下:将文件名单name.txt放在D盘下,并在D盘新建一个文件夹test,将原始语料a1.txt,a2.txt,a3.txt,a4.txt放入test文件夹中
Python文本剔除程序如下:
import os
rootdir = "d:\\test\\"
_files = []
for l in open("d:\\name.txt","r",encoding="utf-8").readlines():
_files.append(l.strip())
for root ,dirs, files in os.walk(rootdir):
for _file in files:
filepath = root + _file
if _file not in _files:
os.remove(filepath)
26 Jan 2018
最近发现许多同学对日期数据(YYYY-MM-DD hh:mm:ss)比较陌生,导致在表存储和表查询阶段出现了诸多问题,遂写下该博文,期望能够帮助同学掌握日期数据的常见处理方法。
日期数据有其固定的数据存储格式为datetime,但有时我们为了便捷会直接将其存成char字符型的数据,注意不要将日期数据存为数值型,由此我们分别建立两张test表,相关程序如下:
· 日期数据存储方法
-- 创建test01表,为datetime型
create table test01(
user_id int(10),
birthday datetime #datetime最大宽度为6,默认不填
);
insert into test01 values(10001,"1988-01-05"),(10002,"1991-02-05");
-- 创建test02表,为char型
create table test02(
user_id int(10),
birthday char(20)
);
insert into test02 values(10001,"1988-01-05"),(10002,"1991-02-05");
· 日期数据查询方法
-- 其中test01替换成test02结果相同
-- 查询年、月、日
select year(birthday) 年份,month(birthday) 月份,day(birthday) 日期 from test01;
-- 增加一年、添加一月、减少一月
select date_add(birthday,interval 1 day) as 日期加一天,
date_add(birthday,interval 1 month) as 日期加一月,
date_add(birthday,interval -1 month) as 日期减一月
from test01;
-- 查询当前时间
-- 对应输出为"YYYY-MM-DD hh:mm:ss","YYYY-MM-DD","hh:mm:ss"
select now(),CURDATE(),CURTIME();
-- 计算当前日期与生日相差天数
select DATEDIFF(CURDATE(),birthday) 相差天数 from test01;
24 Jan 2018
在我们日常技术交流过程中,往往需要对原始数据进行脱敏处理,例如公司名称、个人身份证号等敏感信息。由此本文介绍2种字符串替换的方法,帮助大家更好的解决数据脱敏的相关问题。具体步骤如下:在D盘新建文件夹test,并在test文件夹中放入原始语料a1.txt,a2.txt,a3.txt
Python文本数据脱敏程序如下:
# 字符串替换 replace()
infile = open("d:\\test\\a1.txt","r",encoding="utf-8").read()
new_infile = infile.replace("坐席","AAA") # replace函数替换
# 新建同名的空白文档覆盖原始文档
outfile = open("d:\\test\\a1.txt","w",encoding="utf-8")
# 将替换后的数据写入空白文档,注意str()
outfile.write(str(new_infile))
outfile.close()
# 正则表达式替换 import re
import re
infile = open("d:\\test\\a1.txt","r",encoding="utf-8").read()
words = re.compile("坐席") # 关键词定位
new_infile = words.sub("AAA",infile) # 关键词替换
outfile = open("d:\\test\\a2.txt","w",encoding="utf-8")
outfile.write(str(new_infile))
outfile.close()
# 注意:正则表达式适用于复杂的业务替换场景,一般利用replace函数就能达到数据脱敏的需求
# 批量字符串替换 replace(),后续可自行尝试批量正则替换
import os
rootdir = "d:\\test\\"
for root, dirs, files in os.walk(rootdir):
for i in files:
i = root + i
infile = open(i,"r",encoding="utf-8").read()
new_infile = infile.replace("座席","AAA").replace("客户","BBB") # 同时替换“坐席”与“客户”
outfile = open(i,"w",encoding="utf-8")
outfile.write(str(new_infile))
outfile.close()
23 Jan 2018
模型评估一直是数据建模中不可或缺的一环,评估指标的好坏直接关系到模型上线运用的情况。本文期望以最直观的方式告诉大家模型评估的相关指标,并手动绘制令诸多同学疑惑的ROC曲线。在此希望大家注意:模型评估指标只能作为参考依据,在真正的项目实施过程中,还是需要针对具体业务具体分析。
分类模型(贝叶斯、决策树、SVM等)评估指标:
评估指标
具体描述
sklearn对应函数
Precision
精准度
from sklearn.metrics import precision_score
Recall
召回率
from sklearn.metrics import recall_score
F1
F1值
from sklearn.metrics import f1_score
Confusion Matrix
混淆矩阵
from sklearn.metrics import confusion_matrix
ROC
ROC曲线
from sklearn.metrics import roc
AUC
ROC曲线下的面积
from sklearn.metrics import auc
回归模型(线性回归、非线性回归等)评估指标:
评估指标
具体描述
sklearn对应函数
Mean Square Error(MSE/RMSE)
平均方差
from sklearn.metrics import mean_squared_error
Absolute Error(MAE/RAE)
绝对误差
from sklearn.metrics import mean_absolute_error, median_absolute_error
R-Squared(R^2)
R平方值
from sklearn.metrics import r2_score
· 混淆矩阵、ROC曲线与AUC面积
问题1:混淆矩阵是什么?
回答1:混淆矩阵说简单一点就是预测的正例/反例与真实值之间的比例关系,该矩阵包括4个方面:
预测值
真实值
对应指标
正例
正例
True Positive(TP)
正例
反例
False Positive(FP)
反例
正例
True Negative(TN)
反例
反例
False Negative(FN)
混淆矩阵图如下:
由此计算:
True Positive Rate真实的正例中,被预测正确的比例:TPR = TP/(TP+FN)
False Positive Rate真实的反例中,被预测正确的比例:FPR = FP/(FP+TN)
问题2:混淆矩阵、ROC曲线与AUC面积之间的关系?
回答2:ROC曲线(Receiver Operating Characteristic)主要用于评估二分类模型的优劣,其绘图时X轴和Y轴分别对应混淆矩阵中FPR和TPR,其下方包围的面积为AUC(Area Under the Curve)。
问题3:ROC曲线如何绘制?
回答3:一条曲线的绘制必须是多个点的连线,那么我们就需要在坐标轴上描出多个点,以此来绘制ROC曲线,具体步骤如下:
(1)假设我们有一个100行的数据集,按照9:1划分为训练集和测试集;
(2)接下来我们建立二分类模型并预测结果,这时10行的测试集中每个观测都应该有一个对应的原始分类和预测概率;
测试集
原始分类
预测概率
测试集
原始分类
预测概率
1
P
0.9
6
P
0.49
2
P
0.8
7
N
0.38
3
N
0.7
8
N
0.31
4
P
0.6
9
P
0.3
5
P
0.54
10
N
0.1
(4)这时我们依次将10个预测概率作为阈值threshold,当准确度大于或等于这个值的时候,预测结果为P,否则为N,例如,预测概率值为0.6,那么测试集结果为:
测试集
原始分类
预测分类
测试集
原始分类
预测分类
1
P
P
6
P
N
2
P
P
7
N
N
3
N
P
8
N
N
4
P
P
9
P
N
5
P
N
10
N
N
由此绘制混淆矩阵:
计算TPR与FPR:
TPR = TP/(TP+FN) = 0.3/(0.3+0.3) = 0.5
FPR = FP/(FP+TN) = 0.3/(0.1+0.3) = 0.75
据此,我们每更换一次阈值threshold,就能计算出一组TPR与FPR,那么这个数据集就应该能计算出10组TPR与FPR(其余9组请同学自行推算,不再写出具体计算过程)
(5)由此,我们以FPR为横坐标,TPR为纵坐标,描出所有的坐标点并连线,最终汇出ROC曲线,这里给出ROC曲线样例如下:
21 Jan 2018
接下来,我们学习如何对文本进行拆分,即存在一个大数据集文本,我们如何将其切分成单个小的数据集。文本拆分适用于在自然语言处理过程中,需要对每通文本进行遍历打标的情况。具体步骤如下:将原始文本merge.txt放在D盘下,并在D盘中新建空白文件夹test
文本拆分的难点具体包括如下几个部分:
(1)原始文本如何按既定规则进行切片;
(2)切片后每个新文件的文件名如何写入;
(3)如何保证每个新文件中文本的完整性;
注:建议本节与Python文本预处理(文本合并)一同学习
Python文本拆分程序如下:
import re
import os
rootdir = 'd:\\test\\'
# 难点:对数据进行切片
p=re.compile('\/data\/voice\/',re.S) # 输入正则表达式切片的规则
fileContent=open('d:\\merge.txt','r',encoding='utf-8').read() # 读文件内容
paraList=p.split(fileContent) # 根据正则对文本进行切片
for i in range(len(paraList)): # 遍历切片后的文本列表
fileWriter=open(rootdir+str(i)+'.txt','w',encoding='utf-8')
fileWriter.write(paraList[i]) # 将文本写入
fileWriter.close()
for root, dirs, files in os.walk(rootdir):
for l in files:
l = root + l
line = open(l, 'r+', encoding='utf-8').readlines() # 文件按行读取
# 难点:剔除每个文件第一行数据
infile = ''.join(line[1:]) # 从每个文件第二行开始读取
outfile = open(str(l),'w',encoding='utf-8').write(infile)
# 难点:修改文件名
modname = ''.join(line[:1]) # 读取每个文件第一行
newurl = root + modname.strip() # strip移除字符串首尾字符(/n)
if newurl == root:
os.remove(l) # 删除多余文件
elif newurl != root:
os.rename(l,newurl) # 修改文件名
18 Jan 2018
在自然语言处理过程中,我们经常会遇到大量的文本文件,往往我们需要对这些文本进行预处理后才能使用,因此这里教大家针对文本文件的三种常见场景及预处理方法(文本合并、文本拆分和文本剔除)。
第一种方法是文件合并,即存在多个文本文件,如何将这些文件合成一个,便于后续知识标注人员对文本进行批量检测等。具体步骤如下:在D盘新建两个空白文件夹test和test01,并在test文件夹中放入原始语料a1.txt,a2.txt,a3.txt
Python文本合并程序如下:
# 文件合并(方法1)
#输入每个文件的绝对路径
list = ["D:\\test\\a1.txt","D:\\test\\a2.txt","D:\\test\\a3.txt"]
# 新建一个空白的txt文件,作为读入框
ofile = open("D:\\test01\\merge.txt","w")
for i in list:
ofile.write( i + "\n") # 每个文本开头输入文件名
for txt in open(i,"r",encoding="utf-8"):
ofile.write(txt) # 将文本合并到新的空白文件中
ofile.close()
# 由于方法1需要输入每个文件的绝对路径,我们需要更智能的方法,
# 遍历某个文件夹中所有的文本,然后进行合并
# 文件合并(方法2)
import os
rootdir = 'D:\\test' #输入文件的路径
list = os.listdir(rootdir) #遍历test文件夹所有文件
ofile = open("D:\\test01\\d.txt","w")
for i in list:
ofile.write( i + "\n")
i = rootdir+ os.path.sep + i #目录名+ 路径切割符+ 文件名
for txt in open(i,"r",encoding = "utf-8"):
ofile.write(txt)
ofile.close()
# 利用os包的时候,比较高级的方法是用os.walk
# 文件合并(方法3)
import os
rootdir = 'D:\\test'
ofile = open("D:\\test01\\e.txt","w")
#root表示文件夹路径,dirs次级目录路径,files文件名
for root, dirs, files in os.walk(rootdir):
for i in files:
ofile.write(i + "\n")
i = root + os.path.sep + i
for txt in open(i,"r",encoding = "utf-8"):
ofile.write(txt)
ofile.close()
16 Jan 2018
桑基图也称为能量分流图,是一种特定类型的流程图,图中分支的宽度对应数据量的大小,一般用来描述多分类数据之间的量级关系。
上图是Echarts官网原始的桑基图,下图是修改后的桑基图
桑基图修改点如下:
(1) 修改分类数据对应关系;
(2) 修改分类数据量大小;
注:为缩小篇幅,后续代码块全部为联网读写方式,大家可以试着将其修改成本地读写方式。
修改后桑基图代码如下所示:
var data1 = "{\"nodes\":[{\"node\":0,\"name\":\"质量保证\"},{\"node\":1,\"name\":\"车源状态\"},{\"node\":2,\"name\":\"售后服务\"},{\"node\":3,\"name\":\"车况查询\"},{\"node\":4,\"name\":\"车辆检测\"},{\"node\":5,\"name\":\"车辆来源\"},{\"node\":6,\"name\":\"确认在售车辆\"},{\"node\":7,\"name\":\"购车发票\"},{\"node\":8,\"name\":\"退款问题\"},{\"node\":9,\"name\":\"车况咨询-年检到期日\"},{\"node\":10,\"name\":\"车况咨询-保险到期日\"},{\"node\":11,\"name\":\"车况咨询-维修保养记录\"},{\"node\":12,\"name\":\"车辆检测-一次检测\"},{\"node\":13,\"name\":\"车辆检测-二次检测\"},{\"node\":14,\"name\":\"车辆检测-检测报告\"},{\"node\":15,\"name\":\"车辆检测-重大事故排查\"},{\"node\":16,\"name\":\"车源状态-车辆来源\"},{\"node\":17,\"name\":\"车源状态-个人车源\"},{\"node\":18,\"name\":\"车源状态-车辆下架\"},{\"node\":19,\"name\":\"车源状态-确认在售车辆\"},{\"node\":20,\"name\":\"售后服务-购车发票\"},{\"node\":21,\"name\":\"售后服务-三十天包退\"},{\"node\":22,\"name\":\"售后服务-无理由退款\"},{\"node\":23,\"name\":\"售后服务-预约退款\"}],\"links\":[{\"source\":0,\"target\":3,\"value\":1000},{\"source\":0,\"target\":4,\"value\":2000},{\"source\":1,\"target\":5,\"value\":1000},{\"source\":1,\"target\":6,\"value\":2000},{\"source\":2,\"target\":7,\"value\":500},{\"source\":2,\"target\":8,\"value\":2000},{\"source\":3,\"target\":9,\"value\":500},{\"source\":3,\"target\":10,\"value\":400},{\"source\":3,\"target\":11,\"value\":450},{\"source\":4,\"target\":12,\"value\":500},{\"source\":4,\"target\":13,\"value\":150},{\"source\":4,\"target\":14,\"value\":500},{\"source\":4,\"target\":15,\"value\":500},{\"source\":5,\"target\":16,\"value\":500},{\"source\":5,\"target\":17,\"value\":350},{\"source\":6,\"target\":18,\"value\":750},{\"source\":6,\"target\":19,\"value\":1000},{\"source\":7,\"target\":20,\"value\":400},{\"source\":8,\"target\":21,\"value\":700},{\"source\":8,\"target\":22,\"value\":400},{\"source\":8,\"target\":23,\"value\":600}]}";
var data=eval('(' + data1 + ')');
myChart.setOption(option = {
backgroundColor: '#FFFFFF',
title: {
text: 'Sankey Diagram'
},
tooltip: {
trigger: 'item',
triggerOn: 'mousemove'
},
series: [
{
type: 'sankey',
layout: 'none',
data: data.nodes,
links: data.links,
color: [
'#30588C',
'#77C3F2',
'#FAA805'
],
itemStyle: {
normal: {
borderWidth: 1,
borderColor: '#aaa'
}
},
lineStyle: {
normal: {
color: 'source',
curveness: 0.7
}
}
}
]
});
15 Jan 2018
1.在数据库中创建emp表空间
# 注意:emp表所有字段的数据类型必须为字符型
create table emp(
empno char(100),
ename char(100),
job char(100),
leader char(100),
hiredate char(100),
sal char(100),
comm char(100),
deptno char(100)
);
2.将emp表中内容粘贴到Notepad编辑器上,粘贴完成后如下图所示
3.利用Notepad正则表达式批量替换文本中内容
注意:Notepad查找/替换快捷键”Ctrl+F”;下述(1)-(3)查找模式为正则、(4)为普通
(1)替换开头列
-- ^ 正则表达式中代表开头
insert into emp values\("
-- 注意"\("代表转译符
(2)替换结尾列
-- $ 正则表达式中代表结尾
"\);
-- 注意"\)"代表转译符
(3)替换空格列
-- "空格"
","
-- 注意前后单引号
(4)将空值替换成null
"\N"
null
4.将替换好的代码全部复制到数据库中运行
5.查看emp表
select * from emp;
10 Jan 2018
现阶段自然语言处理NLP领域,最常见的问题莫过于获取用户心声,即用户在交流内容过程中,他们应答的一些关键词或者短句。这些相互关联的信息点可以映射出整段文本客户的应答内容,但这些信息点之间往往具有多条连接属性,因此需要绘制网状的关联图进行描述。
上图是Echarts官网原始的网状关联图,下图是修改后的网状关联图
网状关联图修改点如下:
(1) 修改圆圈颜色和大小;
(2) 在连接线上添加概率值;
注:为缩小篇幅,后续代码块全部为联网读写方式,大家可以试着将其修改成本地读写方式。
修改后关联图代码如下所示:
option = {
title: {
text: '网状关联图'
},
tooltip: {
formatter: function(x) {
return x.data.des;
}
},
series: [{
type: 'graph',
layout: 'force',
symbolSize: 80,
roam: true,
edgeSymbol: ['circle', 'arrow'],
edgeSymbolSize: [4, 10],
edgeLabel: {
normal: {
textStyle: {
fontSize: 20
}
}
},
force: {
repulsion: 2500,
edgeLength: [10, 50]
},
draggable: true,
itemStyle: {
normal: {
color: '#4b565b'
}
},
lineStyle: {
normal: {
width: 2,
color: '#4b565b'
}
},
edgeLabel: {
normal: {
show: true,
formatter: function(x) {
return x.data.name;
}
}
},
label: {
normal: {
show: true,
textStyle: {}
}
},
data: [{
name: '少送',
symbolSize: 90,
itemStyle: {
normal: {
color: '#ffa07a'
}
}
} ,{
name: '投诉',
symbolSize: 70,
itemStyle: {
normal: {
color: '#ffa07a'
}
}
} ,{
name: '退款',
symbolSize: 70,
itemStyle: {
normal: {
color: '#ffa07a'
}
}
} ,{
name: '补上',
symbolSize: 50,
itemStyle: {
normal: {
color: '#ffa07a'
}
}
} ,{
name: '联系不上',
symbolSize: 70,
itemStyle: {
normal: {
color: '#ffa07a'
}
}
} ,{
name: '未送达',
symbolSize: 90,
itemStyle: {
normal: {
color: '#ffa07a'
}
}
} ,{
name: '骑手',
symbolSize: 50,
itemStyle: {
normal: {
color: '#ffa07a'
}
}
} ,{
name: '商家',
symbolSize: 50,
itemStyle: {
normal: {
color: '#ffa07a'
}
}
} ,{
name: '催餐',
symbolSize: 70,
itemStyle: {
normal: {
color: '#ffa07a'
}
}
} ,{
name: '补偿',
symbolSize: 50,
itemStyle: {
normal: {
color: '#ffa07a'
}
}
} ,{
name: '预计送达',
symbolSize: 50,
itemStyle: {
normal: {
color: '#ffa07a'
}
}
} ,{
name: '态度不好',
symbolSize: 70,
itemStyle: {
normal: {
color: '#ffa07a'
}
}
}
],
links: [{
source: '少送',
target: '投诉',
name: '14.83%',
},{
source: '未送达',
target: '催餐',
name: '40.44%',
},{
source: '催餐',
target: '准时保',
name: '1.64%',
},{
source: '催餐',
target: '退款',
name: '20.51%',
},{
source: '催餐',
target: '投诉',
name: '23.58%',
},{
source: '少送',
target: '退款',
name: '50.44%',
},{
source: '少送',
target: '补上',
name: '1.14%',
},{
source: '少送',
target: '联系不上',
name: '1.52%',
},{
source: '少送',
target: '态度不好',
name: '1.26%',
},{
source: '投诉',
target: '态度不好',
name: '31.33%',
},{
source: '态度不好',
target: '退款',
name: '1.32%',
},{
source: '态度不好',
target: '商家',
name: '30.54%',
},{
source: '态度不好',
target: '骑手',
name: '60.32%',
},{
source: '联系不上',
target: '商家',
name: '25.33%',
},{
source: '联系不上',
target: '骑手',
name: '62.32%',
},{
source: '催餐',
target: '退款',
name: '12.32%',
},{
source: '退款',
target: '补偿',
name: '3.74%',
},{
source: '未送达',
target: '预计送达',
name: '6.83%',
},{
source: '少送',
target: '未送达',
name: '',
},
]
}]
};
10 Jan 2018
最近经常遇到同学询问协同过滤的算法,但协同过滤的结果出来后大家有想过如何进行展示么?这时,我们便可以用到环形关联图。
上图是Echarts官网原始的环形关联图,下图是修改后的环形关联图
环形关联图修改点如下:
(1) 修改组别颜色;
(2) 修改不同类别间对应关系及概率值;
注:为缩小篇幅,后续代码块全部为联网读写方式,大家可以试着将其修改成本地读写方式。
修改后关联图代码如下所示:
var option = {
animationDurationUpdate: 1500,
animationEasingUpdate: 'quinticInOut',
series: [{
type: 'graph',
tooltip: {},
ribbonType: true,
layout: 'circular',
circular: {
rotateLabel: true
},
symbolSize: 30,
roam: true,
focusNodeAdjacency: true,
label: {
normal: {
position: 'center',
fontWeight: 'bold',
formatter: '{b}',
normal: {
textStyle: {
fontFamily: '宋体'
}
}
}
},
edgeSymbol: ['circle'],
edgeSymbolSize: [4, 10],
edgeLabel: {
normal: {
textStyle: {
fontSize: 13,
fontWeight: 'bold',
fontFamily: '宋体'
}
}
},
// 外部字体样式设置
itemStyle: {
normal: {
label: {
rotate: true,
show: true,
textStyle: {
color: '#333',
fontWeight: 'bold'
}
},
color: ["#393f51", "#393f51", "#393f51", "#393f51", "#393f51", "#393f51", "#393f51", "#85d6f7",
"#85d6f7", "#85d6f7", "#85d6f7", "#85d6f7", "#85d6f7", "#85d6f7", "#85d6f7", "#85d6f7", "#85d6f7"]
},
emphasis: {
label: {
show: true
}
}
},
// 类别定义,保证类别没有相同的名称
data: [{
name: '购车咨询-车辆购置城市', //类别名称
itemStyle: {
normal: {
color: '#0099cc' //类别颜色
}
}
}, {
name: '购车咨询-意向车辆确认',
itemStyle: {
normal: {
color: '#0099cc'
}
}
}, {
name: '购车咨询-关注车型',
itemStyle: {
normal: {
color: '#0099cc'
}
}
}, {
name: '购车咨询-关注品牌',
itemStyle: {
normal: {
color: '#0099cc'
}
}
}, {
name: '购车咨询-价格优惠',
itemStyle: {
normal: {
color: '#00ffcc'
}
}
}, {
name: '购车咨询-车辆过户',
itemStyle: {
normal: {
color: '#00ffcc'
}
}
}, {
name: '购车咨询-牌照问题',
itemStyle: {
normal: {
color: '#00ffcc'
}
}
}, {
name: '购车咨询-提车流程',
itemStyle: {
normal: {
color: '#00ffcc'
}
}
}, {
name: '车贷业务-首付款',
itemStyle: {
normal: {
color: '#009933'
}
}
}, {
name: '车贷业务-贷款分期',
itemStyle: {
normal: {
color: '#009933'
}
}
}, {
name: '看车咨询-预约看车',
itemStyle: {
normal: {
color: '#ffcc00'
}
}
}, {
name: '看车咨询-视频看车',
itemStyle: {
normal: {
color: '#ffcc00'
}
}
}, {
name: '看车咨询-实地看车',
itemStyle: {
normal: {
color: '#ffcc00'
}
}
}, {
name: '车辆检测-质量保证',
itemStyle: {
normal: {
color: '#ff3300'
}
}
}, {
name: '车辆检测-检测报告',
itemStyle: {
normal: {
color: '#ff3300'
}
}
}, {
name: '车源状态-确认在售车辆',
itemStyle: {
normal: {
color: '#000099'
}
}
}, {
name: '购车咨询-全国直购',
itemStyle: {
normal: {
color: '#0099cc'
}
}
}],
// 类别关联对应,保证关联的类别在上述模块中定义过
links: [{
source: '购车咨询-车辆购置城市', // 基础点
target: '购车咨询-意向车辆确认', // 关联点
name: '2.38%', // 关联概率值
tooltip: {
trigger: 'item',
formatter: function(params, ticket, callback) {
return params.data.name;
}
},
symbolSize: [5, 20],
label: {
normal: {
formatter: function(params, ticket, callback) {
params.name = params.data.name;
return params.name;
},
show: true
}
},
// 关联线样式设置
lineStyle: {
normal: {
width: 1, // 线的粗细
curveness: 0.2, // 线的弧度
color: '#0099cc', // 线的颜色
}
}
}, {
source: '购车咨询-车辆购置城市',
target: '购车咨询-全国直购',
name: '2.38%',
tooltip: {
trigger: 'item',
formatter: function(params, ticket, callback) {
return params.data.name;
}
},
symbolSize: [5, 20],
label: {
normal: {
formatter: function(params, ticket, callback) {
params.name = params.data.name;
return params.name;
},
show: true
}
},
lineStyle: {
normal: {
width: 1,
curveness: 0.2,
color: '#0099cc'
}
}
}, {
source: '购车咨询-车辆购置城市',
target: '购车咨询-关注品牌',
name: '0.40%',
tooltip: {
trigger: 'item',
formatter: function(params, ticket, callback) {
return params.data.name;
}
},
symbolSize: [5, 20],
label: {
normal: {
formatter: function(params, ticket, callback) {
params.name = params.data.name;
return params.name;
},
show: true
}
},
lineStyle: {
normal: {
width: 1,
curveness: 0.2,
color: '#0099cc'
}
}
}, {
source: '购车咨询-车辆购置城市',
target: '购车咨询-价格优惠',
name: '0.66%',
tooltip: {
trigger: 'item',
formatter: function(params, ticket, callback) {
return params.data.name;
}
},
symbolSize: [5, 20],
label: {
normal: {
formatter: function(params, ticket, callback) {
params.name = params.data.name;
return params.name;
},
show: true
}
},
lineStyle: {
normal: {
width: 1,
curveness: 0.2,
color: '#0099cc'
}
}
}, {
source: '购车咨询-车辆购置城市',
target: '车贷业务-贷款分期',
name: '0.66%',
tooltip: {
trigger: 'item',
formatter: function(params, ticket, callback) {
return params.data.name;
}
},
symbolSize: [5, 20],
label: {
normal: {
formatter: function(params, ticket, callback) {
params.name = params.data.name;
return params.name;
},
show: true
}
},
lineStyle: {
normal: {
width: 1,
curveness: 0.2,
color: '#0099cc'
}
}
}, {
source: '车贷业务-贷款分期',
target: '看车咨询-预约看车',
name: '0.53%',
tooltip: {
trigger: 'item',
formatter: function(params, ticket, callback) {
return params.data.name;
}
},
symbolSize: [5, 20],
label: {
normal: {
formatter: function(params, ticket, callback) {
params.name = params.data.name;
return params.name;
},
show: true
}
},
lineStyle: {
normal: {
width: 1,
curveness: 0.2,
color: '#009933'
}
}
}, {
source: '车贷业务-贷款分期',
target: '购车咨询-车辆过户',
name: '0.53%',
tooltip: {
trigger: 'item',
formatter: function(params, ticket, callback) {
return params.data.name;
}
},
symbolSize: [5, 20],
label: {
normal: {
formatter: function(params, ticket, callback) {
params.name = params.data.name;
return params.name;
},
show: true
}
},
lineStyle: {
normal: {
width: 1,
curveness: 0.2,
color: '#009933'
}
}
}, {
source: '车贷业务-贷款分期',
target: '车源状态-确认在售车辆',
name: '0.40%',
tooltip: {
trigger: 'item',
formatter: function(params, ticket, callback) {
return params.data.name;
}
},
symbolSize: [5, 20],
label: {
normal: {
formatter: function(params, ticket, callback) {
params.name = params.data.name;
return params.name;
},
show: true
}
},
lineStyle: {
normal: {
width: 1,
curveness: 0.2,
color: '#009933'
}
}
}, {
source: '车贷业务-贷款分期',
target: '看车咨询-预约看车',
name: '0.13%',
tooltip: {
trigger: 'item',
formatter: function(params, ticket, callback) {
return params.data.name;
}
},
symbolSize: [5, 20],
label: {
normal: {
formatter: function(params, ticket, callback) {
params.name = params.data.name;
return params.name;
},
show: true
}
},
lineStyle: {
normal: {
width: 1,
curveness: 0.2,
color: '#009933'
}
}
}, {
source: '车贷业务-贷款分期',
target: '购车咨询-牌照问题',
name: '0.13%',
tooltip: {
trigger: 'item',
formatter: function(params, ticket, callback) {
return params.data.name;
}
},
symbolSize: [5, 20],
label: {
normal: {
formatter: function(params, ticket, callback) {
params.name = params.data.name;
return params.name;
},
show: true
}
},
lineStyle: {
normal: {
width: 1,
curveness: 0.2,
color: '#009933'
}
}
}, {
source: '购车咨询-意向车辆确认',
target: '看车咨询-预约看车',
name: '0.13%',
tooltip: {
trigger: 'item',
formatter: function(params, ticket, callback) {
return params.data.name;
}
},
symbolSize: [5, 20],
label: {
normal: {
formatter: function(params, ticket, callback) {
params.name = params.data.name;
return params.name;
},
show: true
}
},
lineStyle: {
normal: {
width: 1,
curveness: 0.2,
color: '#0099cc'
}
}
}, {
source: '购车咨询-车辆购置城市',
target: '购车咨询-意向车辆确认',
name: '0.13%',
tooltip: {
trigger: 'item',
formatter: function(params, ticket, callback) {
return params.data.name;
}
},
symbolSize: [5, 20],
label: {
normal: {
formatter: function(params, ticket, callback) {
params.name = params.data.name;
return params.name;
},
show: true
}
},
lineStyle: {
normal: {
width: 1,
curveness: 0.2,
color: '#0099cc'
}
}
}, {
source: '购车咨询-意向车辆确认',
target: '看车咨询-实地看车',
name: '0.13%',
tooltip: {
trigger: 'item',
formatter: function(params, ticket, callback) {
return params.data.name;
}
},
symbolSize: [5, 20],
label: {
normal: {
formatter: function(params, ticket, callback) {
params.name = params.data.name;
return params.name;
},
show: true
}
},
lineStyle: {
normal: {
width: 1,
curveness: 0.2,
color: '#0099cc'
}
}
}, {
source: '购车咨询-意向车辆确认',
target: '车源状态-确认在售车辆',
name: '0.13%',
tooltip: {
trigger: 'item',
formatter: function(params, ticket, callback) {
return params.data.name;
}
},
symbolSize: [5, 20],
label: {
normal: {
formatter: function(params, ticket, callback) {
params.name = params.data.name;
return params.name;
},
show: true
}
},
lineStyle: {
normal: {
width: 1,
curveness: 0.2,
color: '#0099cc'
}
}
}, {
source: '车辆检测-检测报告',
target: '车辆检测-质量保证',
name: '0.13%',
tooltip: {
trigger: 'item',
formatter: function(params, ticket, callback) {
return params.data.name;
}
},
symbolSize: [5, 20],
label: {
normal: {
formatter: function(params, ticket, callback) {
params.name = params.data.name;
return params.name;
},
show: true
}
},
lineStyle: {
normal: {
width: 1,
curveness: 0.2,
color: '#ff3300'
}
}
}, {
source: '购车咨询-全国直购',
target: '购车咨询-提车流程',
name: '0.13%',
tooltip: {
trigger: 'item',
formatter: function(params, ticket, callback) {
return params.data.name;
}
},
symbolSize: [5, 20],
label: {
normal: {
formatter: function(params, ticket, callback) {
params.name = params.data.name;
return params.name;
},
show: true
}
},
lineStyle: {
normal: {
width: 1,
curveness: 0.2,
color: '#0099cc'
}
}
}, {
source: '购车咨询-全国直购',
target: '购车咨询-车辆落户',
name: '0.13%',
tooltip: {
trigger: 'item',
formatter: function(params, ticket, callback) {
return params.data.name;
}
},
symbolSize: [5, 20],
label: {
normal: {
formatter: function(params, ticket, callback) {
params.name = params.data.name;
return params.name;
},
show: true
}
},
lineStyle: {
normal: {
width: 1,
curveness: 0.2,
color: '#0099cc'
}
}
}, {
source: '购车咨询-全国直购',
target: '车辆检测-质量保证',
name: '0.13%',
tooltip: {
trigger: 'item',
formatter: function(params, ticket, callback) {
return params.data.name;
}
},
symbolSize: [5, 20],
label: {
normal: {
formatter: function(params, ticket, callback) {
params.name = params.data.name;
return params.name;
},
show: true
}
},
lineStyle: {
normal: {
width: 1,
curveness: 0.2,
color: '#0099cc'
}
}
}, {
source: '购车咨询-全国直购',
target: '购车咨询-关注车型',
name: '0.13%',
tooltip: {
trigger: 'item',
formatter: function(params, ticket, callback) {
return params.data.name;
}
},
symbolSize: [5, 20],
label: {
normal: {
formatter: function(params, ticket, callback) {
params.name = params.data.name;
return params.name;
},
show: true
}
},
lineStyle: {
normal: {
width: 1,
curveness: 0.2,
color: '#0099cc'
}
}
}, {
source: '购车咨询-意向车辆确认',
target: '购车咨询-全国直购',
name: '0.40%',
tooltip: {
trigger: 'item',
formatter: function(params, ticket, callback) {
return params.data.name;
}
},
symbolSize: [5, 20],
label: {
normal: {
formatter: function(params, ticket, callback) {
params.name = params.data.name;
return params.name;
},
show: true
}
},
lineStyle: {
normal: {
width: 1,
curveness: 0.2,
color: '#0099cc'
}
}
}
]
}]
};
10 Jan 2018
接下来我们再来试着做一个嵌套饼图,单层饼图能够反映各类数据之间的比例关系,但日常业务中往往会遇到每个类别中再嵌套多个类别的情况,因此我们需要借助嵌套饼图来进行展示
上图是Echarts官网原始的嵌套饼图,下图是修改后的嵌套饼图
嵌套饼图修改点如下:
(1) 修改背景颜色;
(2) 修改数据标签及标签对应的值;
注:为缩小篇幅,后续代码块全部为联网读写方式,大家可以试着将其修改成本地读写方式。
修改后嵌套饼图代码如下所示:
option = {
// 标题设置
title: {
text: "嵌套饼图",
subtext: "",
left: "center",
textStyle: {
color: "BLACK",
fontSize: 24
},
},
backgroundColor: new echarts.graphic.RadialGradient(0, 0, 1, [{
offset: 0,
color: '#ffffff'
}, {
offset: 1,
color: '#ffffff'
}]),
tooltip: {
trigger: 'item',
formatter: "{a} <br/>{b}:({d}%)"
},
series: [{ // 设置一级指标(内圈)
name: '一级指标',
type: 'pie',
selectedMode: 'single',
radius: [0, '30%'], // 可以设置内圈的大小
label: {
normal: {
position: 'inner'
}
},
labelLine: {
normal: {
show: false
}
},
// 设置内圈的类别和数量,与中圈、外圈一一对应
data: [
{value:4379,name:'菜品质量_数量'},
{value:8226,name:'催单问题'},
{value:7549,name:'退款问题'}]
}, { // 设置二级指标(中圈)
name: '二级指标',
type: 'pie',
radius: ['32%', '60%'], // 设置中圈的大小
label: {
normal: {
position: 'inner'
}
},
// 设置中圈的类别和数量,与内圈、外圈一一对应
data: [
{value:44,name:'菜品没有餐具'},
{value:548,name:'菜品撒了/包装损坏'},
{value:1326,name:'菜品少送'},
{value:686,name:'菜品送错'},
{value:84,name:'菜品未按备注制作'},
{value:222,name:'菜品与图片不符'},
{value:1468,name:'菜品质量问题'},
{value:1,name:'外卖菜品比到店贵'},
{value:3006,name:'餐未到显示已送达'},
{value:843,name:'骑手长时间未接单'},
{value:466,name:'骑手长时间未取餐'},
{value:3911,name:'用户催单'},
{value:500,name:'查询退款进度'},
{value:514,name:'订单被取消'},
{value:57,name:'骑手要求用户退款'},
{value:139,name:'取消退款申请'},
{value:106,name:'商家要求用户退款'},
{value:2973,name:'退款申请被拒绝'},
{value:921,name:'退款申诉被拒绝'},
{value:211,name:'退款审核'},
{value:375,name:'我要部分退款'},
{value:1728,name:'我要全部退款'},
{value:25,name:'咨询原路退失败/提现失败'}]
}, { // 设置三级指标(外圈)
name: '三级指标',
type: 'pie',
radius: ['62%', '70%'], // 设置外圈的大小
label: {
normal: {
position: 'outer'
}
},
// 设置外圈的类别和数量,与内圈、中圈一一对应
data: [
{value:35,name:'骑手配送'},
{value:9,name:'商家配送'},
{value:482,name:'骑手配送'},
{value:66,name:'商家配送'},
{value:267,name:'骑手原因'},
{value:173,name:'商家配送'},
{value:886,name:'商家原因'},
{value:337,name:'骑手原因'},
{value:22,name:'商家配送'},
{value:327,name:'商家原因'},
{value:84,name:'菜品未按备注制作'},
{value:222,name:'菜品与图片不符'},
{value:225,name:'变质有异味'},
{value:533,name:'口味不佳'},
{value:64,name:'食用后身体不适'},
{value:640,name:'有异物'},
{value:6,name:'住院'},
{value:1,name:'外卖菜品比到店贵'},
{value:2885,name:'骑手配送'},
{value:121,name:'商家配送'},
{value:843,name:'骑手长时间未接单'},
{value:466,name:'骑手长时间未取餐'},
{value:896,name:'美团配送'},
{value:1104,name:'骑手配送'},
{value:1152,name:'商家配送'},
{value:759,name:'要求重新配送'},
{value:78,name:'确认退款'},
{value:247,name:'申请退款'},
{value:175,name:'退款成功'},
{value:20,name:'风控原因'},
{value:494,name:'其他'},
{value:57,name:'骑手要求用户退款'},
{value:82,name:'申退'},
{value:57,name:'退款成功'},
{value:106,name:'商家要求用户退款'},
{value:2973,name:'退款申请被拒绝'},
{value:921,name:'退款申诉被拒绝'},
{value:211,name:'退款审核'},
{value:77,name:'商家无法提供菜品'},
{value:298,name:'少送错送'},
{value:607,name:'配送慢'},
{value:11,name:'配送员交通事故'},
{value:102,name:'骑手长时间未取餐'},
{value:289,name:'商家出餐慢'},
{value:206,name:'商家出餐配送慢'},
{value:426,name:'用户原因'},
{value:87,name:'长时间无骑手接单'},
{value:21,name:'非风控原因'},
{value:4,name:'风控原因'}]
}]
};
嵌套饼图修改颜色代码如下所示:
option = {
// 标题设置
title: {
text: "嵌套饼图",
subtext: "",
left: "center",
textStyle: {
color: "BLACK",
fontSize: 24
},
},
backgroundColor: new echarts.graphic.RadialGradient(0, 0, 1, [{
offset: 0,
color: '#ffffff'
}, {
offset: 1,
color: '#ffffff'
}]),
tooltip: {
trigger: 'item',
formatter: "{a} <br/>{b}:({d}%)"
},
series: [{ // 设置一级指标(内圈)
name: '一级指标',
type: 'pie',
selectedMode: 'single',
radius: [0, '30%'], // 可以设置内圈的大小
label: {
normal: {
position: 'inner'
}
},
labelLine: {
normal: {
show: false
}
},
// 设置内圈的类别和数量,与中圈、外圈一一对应
data: [{
value: 666,
name: '本人'
},
{
value: 2326,
name: '三方'
}
],
itemStyle: {
emphasis: {
shadowBlur: 10,
shadowOffsetX: 0,
shadowColor: 'rgba(0, 0, 0, 0.5)'
},
normal: {
color: function(params) {
//自定义颜色
var colorList = [
'#478989', '#3D7084'
];
return colorList[params.dataIndex]
}
}
}
}, { // 设置二级指标(中圈)
name: '二级指标',
type: 'pie',
radius: ['40%', '60%'], // 设置中圈的大小
label: {
normal: {
position: 'outter'
}
},
// 设置中圈的类别和数量,与内圈、外圈一一对应
data: [{
value: 38,
name: '恶意拖欠'
},
{
value: 9,
name: '费用服务争议'
},
{
value: 619,
name: '资金还款问题'
},
{
value: 655,
name: '不认识'
},
{
value: 718,
name: '认识不配合'
},
{
value: 953,
name: '愿意转告'
}
],
itemStyle: {
emphasis: {
shadowBlur: 10,
shadowOffsetX: 0,
shadowColor: 'rgba(0, 0, 0, 0.5)'
},
normal: {
color: function(params) {
//自定义颜色
var colorList = [
'#99CC99', '#66CCCC', '#CCFFFF', '#336666', '#3399CC', '#669999'
];
return colorList[params.dataIndex]
}
}
}
}]
};
09 Jan 2018
我们先来练习一个最简单的柱状图,柱状图一般适用于离散型数据,通过比较柱子高低辨别各类别数据大小及差异
上图是Echarts官网原始的多彩柱状图,下图是修改后的柱状图
柱状图修改点如下:
(1) 修改背景颜色;
(2) 添加一条柱子;
(3) 修改柱子显示的值;
注:为缩小篇幅,后续代码块全部为联网读写方式,大家可以试着将其修改成本地读写方式。
修改后柱状图代码如下所示:
// 输入数据,数据位置、类别位置与颜色位置一一对应
var value = [100,200,300,400,500,600,700,800,900,1000,1100,1200];
option = {
backgroundColor: '#FFFFFF', //修改背景颜色
title: {
text: '多彩柱状图',
x: 'center',
textStyle: {
color: 'black', //修改字体颜色
fontSize: 25, //修改字体大小
}
},
tooltip: {
trigger: 'item'
},
dataRange: {
show: false,
min : 0,
max : 12,
calculable : true,
color: ['#d94e5d','#eac736','#50a3ba'],
y:'center',
},
xAxis: [
{
type: 'category',
show: false,
// 修改分类柱子名称
data: ['类别L', '类别K', '类别J', '类别I', '类别H', '类别G',
'类别F', '类别E', '类别D', '类别C', '类别B', '类别A']
}
],
yAxis: [
{
type: 'value',
show: false
}
],
series: [
{
name: '类别总数/位置',
type: 'bar',
barGap: 0.1,
barCategoryGap: 0.01,
itemStyle: {
normal: {
color: function(params) {
// 颜色位置与柱子类别位置一一对应
var colorList = [
'#C1232B','#B5C334','#FCCE10','#E87C25','#27727B',
'#FE8463','#9BCA63','#FAD860','#F3A43B','#60C0DD',
'#D7504B','#C6E579','#F4E001','#F0805A','#26C0C0','#ff0000'
];
return colorList[params.dataIndex]
},
label: {
show: true,
position: 'top', // 数值显示位置
// 修改柱子显示的值
formatter: function(obj){
return obj.name +"\n"+ obj.value.toString().split(",")[1]
}
},
// 柱子阴影显示
shadowBlur: 80,
shadowColor: 'rgba(0, 0, 0, 0.5)'
}
},
data: value.map(function (a, idx) {
return [idx, a , idx];
})
}
]
};
04 Jan 2018
最近发现许多同学对数据可视化都非常感兴趣,遂单独开辟了这个专题。类似于tableau之类的可视化工具虽然能够做出非常精美的图表,但其所生成的图表只能应用在数据分析报告中。若期望自己所做出的图表具有高度的灵活性,并且能够和程序员无障碍沟通,我们便需要运用JavaScript、HTML5和PHP等前端知识。
作为数据分析师,花太多精力去学习前端知识有些捡芝麻丢西瓜。那么如何快速高效的利用JS汇编各种数据可视化图表呢?这时,我们便可以借助JS封装好的Echarts库对数据进行可视化展示Echarts官方示例。本博客中会改写几套常用的数据可视化图形,例如多彩柱状图、多层嵌套饼图等,并尽量加入清晰的注释便于大家理解。
利用Echarts绘制第一张图形之前,我们需要了解Echarts一共提供2种读写方式:一种是联网状态下直接利用官网的编译器进行读写操作;另一种是脱机状态下本地进行读写操作。(强烈建议学会第二种读写方式)
· 联网读写方式
联网的读写方式非常简单,直接将改写好的代码粘贴到Echarts官网自带的编译器刷新就OK了!如下图是官网原始的堆叠面积图
试试将修改后的代码复制到粘黏框并点击刷新按钮
option = {
title: {
text: '堆叠区域图Demo'
},
tooltip : {
trigger: 'axis'
},
legend: {
data:['类别一','类别二','类别三']
},
toolbox: {
feature: {
saveAsImage: {}
}
},
grid: {
left: '3%',
right: '4%',
bottom: '3%',
containLabel: true
},
xAxis : [
{
type : 'category',
boundaryGap : false,
data : ['周一','周二','周三','周四','周五','周六','周日']
}
],
yAxis : [
{
type : 'value'
}
],
series : [
{
name:'类别一',
type:'line',
stack: '总量',
areaStyle: {normal: {}},
data:[120, 132, 101, 134, 90, 230, 210]
},
{
name:'类别二',
type:'line',
stack: '总量',
areaStyle: {normal: {}},
data:[220, 182, 191, 234, 290, 330, 310]
},
{
name:'类别三',
type:'line',
stack: '总量',
areaStyle: {normal: {}},
data:[150, 232, 201, 154, 190, 330, 410]
},
]
};
· 本地读写方式
1.下载Echarts本地读写包:selfEchart.rar下载路径(右键点击目标另存为),下载完成后解压selfEchart包,解压后结果如下:
2.在解压后的selfEchart中,编辑echartTest.html文件,将下述代码全部替换到echartTest.html中,然后双击查看echartTest.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>本地页面</title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="description" content="">
<meta name="author" content="">
<!-- Echart 文件系统配置 -->
<link href="bootstrap/css/bootstrap.css" rel="stylesheet">
<script src="echart/echarts.min.js" />" ></script>
<script src="bootstrap/js/bootstrap.min.js" />" ></script>
<script src = "jquery/jquery.min.js" />" ></script>
</head>
<body>
<!-- Echart 页面大小-->
<div style="width:80%;border:1px #777 solid;height:550px;" id="testdiv">
</div>
<!-- Echart 代码块编辑 -->
<script>
$(function () {
var myChart= echarts.init(document.getElementById('testdiv'));
<!-- Echart 联网读写方式代码块 -->
option = {
title: {
text: '堆叠区域图'
},
tooltip : {
trigger: 'axis'
},
legend: {
data:['类别一','类别二','类别三']
},
toolbox: {
feature: {
saveAsImage: {}
}
},
grid: {
left: '3%',
right: '4%',
bottom: '3%',
containLabel: true
},
xAxis : [
{
type : 'category',
boundaryGap : false,
data : ['周一','周二','周三','周四','周五','周六','周日']
}
],
yAxis : [
{
type : 'value'
}
],
series : [
{
name:'类别一',
type:'line',
stack: '总量',
areaStyle: {normal: {}},
data:[120, 132, 101, 134, 90, 230, 210]
},
{
name:'类别二',
type:'line',
stack: '总量',
areaStyle: {normal: {}},
data:[220, 182, 191, 234, 290, 330, 310]
},
{
name:'类别三',
type:'line',
stack: '总量',
areaStyle: {normal: {}},
data:[150, 232, 201, 154, 190, 330, 410]
},
]
};
myChart.setOption(option);
})
</script>
</body>
</html>
02 Jan 2018
随着大数据的迅猛发展,许多公司都期望能够借助机器学习技术指导自身的商业决策,由此他们通过不断的优化程序,设置复杂的算法来处理大量且频繁更新的数据集,并从中发现用户喜好、产品周期等问题。机器学习的广泛应用证明了企业对于“技术支持决策”这一观点的认可,但缺乏经验所构建的机器学习算法会产生偏差,从而造成预测结果严重偏离数据内在规律。这种经常被业务人员忽视的缺陷可能会诱发高额的代价,如果不加以控制,项目目标和实际目标可能背道而驰。因此从一开始就有效的解决这个问题,将获得比预期收益更大的回报,从而使得机器学习真正的潜力得到最有效的发挥。现阶段,影响机器学习算法偏差的问题可能基于以下几个方面:
· 主观偏见
由于人类决策者可能受到历史经验的影响,因此其做出的决策可能具有一定的偏见,我们通常将这种偏见形式称为锚定偏见。而另一种偏见形式称为可用性偏见,即人们在做出决定前通常会做出熟悉的假设,这些假设在过去可能发挥了充分的作用,但却不能够适应新的情况。如果偏见能够影响人类的判断,那么机器也同样会受到影响。一方面,机器学习算法创建过程中很容易带入人的主观偏见;另一方面,机器学习所预测的结果需要参照过去有偏见性的经验进行判断。这种主观偏见会随着机器学习算法的深入不断放大,从而导致最后所得结果具有严重的偏差。
· 数据限制
机器学习可以挖掘庞大数据集中的本质规律,但数据异常和错误可能导致算法走向歧途。不具有代表性的事件会导致机器学习算法偏离正轨,例如,一系列特殊的天气时间或欺诈行为引发违约率上升,由此信用评分卡可能会将该地区标记为“高风险”。在这种情况下,除非采用实时的纠正措施,不适当的算法会使偏见持续存在。寻求通过统计方法来克服偏见的公司可能会发现,监督他们的机器学习算法的数据科学家可能受到同样的偏见。与此同时,受到成本和时间的制约,他们可能不会收集更多的数据变量,而这部分数据集恰巧包含了对预测结果最真实的判断力。
· 稳定性偏差
在不确定的环境中具有惯性趋势,实际上是机器学习算法的一个重要问题。预测模型基于历史数据中检测到的模式进行操作,如果相同的模式不复存在,那么这个模型就类似于一个古老的铁路时刻表,其对于历史学家来说是具有价值的,但对于旅行者来说却毫无意义。要形成机器学习算法来识别数据中不存在的模式是非常困难的,即使是分析师熟悉的模型也可能在某些事件节点表现出来不一样的特性。为了弥合现有数据和现实之间的差距,可以创建合成的数据点,并试图用机器学习算法捕捉非常详细的模式。
在人工智能领域,机器学习越来越多指的是基于统计算法的计算机辅助决策,这些决策最显著的用途是预测建模。例如,在信用评分方面,一般认为长期无拖欠贷款的客户风险较低,但是如果这些客户一直维持的抵押贷款多年来将被大量税收优惠所抵消,违约高峰可能在贷款机构的统计风险模型中不了了之。因此需要通过专家了解正确的数据,并矫正原始机器学习模型,使得该模型可以找到数据中的隐藏模式并准确预测这种违约高峰发生的可能性。创建一个有意识的,基于标准的系统来开发机器学习算法将涉及许多决策判断的结果,在此背景下,一项有效的技术就是“预先设定练习”,旨在查明所提议模型的局限性,帮助企业管理层了解算法中涉及的业务风险,从而减少机器学习算法偏误所引起的损失。
03 Dec 2017
1.在数据库中创建emp表空间
create table emp (
empno int,
ename varchar(20),
job varchar(20),
leader int,
hiredate datetime,
sal float,
comm float,
deptno int
);
2.将emp表保存为csv格式文件,放在D盘下
emp表数据要求格式如下:emp表下载路径
(1)删除表中变量名,确保要插入的数据从第一行开始;
(2)将表中所有空值部分用\N替代;
(3)确保每一行的观测值与表空间数据类型一致;
3.查询数据表安全加载路径
show variables like '%secure%';
4.将emp表复制到指定路径下
(1)打开Windows运行下cmd命令框
(2)进入到数据库安全加载路径目录
cd C:\ProgramData\MySQL\MySQL Server 5.7\Uploads\
(3)将D盘中emp.csv复制到当前目录下,并查看
copy d:\emp.csv .\
dir #查看当前目录下所有文件
5.利用load data命令插入数据到emp表空间
load data infile 'C:/ProgramData/MySQL/MySQL Server 5.7/Uploads/emp.csv' into table emp fields terminated by ',' ;
# 注:路径切换符注意使用/,而不是\,不然会报错
# 通用规则:load data infile 'filename_path' into table table_name fields terminated by ',' ;
# filename_path表示文件存放路径
# table_name表示数据表名称
# ','表示字段间以逗号分隔
6.查看emp表
select * from emp;
20 Nov 2017
像“大数据”这样的流行语通常会让人联想到定量分析,例如机器学习算法和统计分析应用。虽然这些方法及应用是透析数据本质、挖掘数据价值的关键步骤,但数据领域一个更加基础的模块便是获取数据。现阶段,如何大规模地收集和分享数据已经成为各行各业的热门话题,例如政府部门公开部分数据以提高行政职能部门的透明度。
数据共享通常通过应用程序编程接口(API)来实现,这是一种智能管道,允许以受控但无缝的方式在系统之间传输数据,具体可见表1(来源于:McKinsey Payments Practice)。多年来,API已经在银行业务环境中得到了充分利用,鉴于先进分析技术的突破以及众多非银行金融科技公司的市场吸引力,API正在作为向零售消费者和商业客户提供金融服务的手段,重新受到各界的广泛关注。
开放式银行作为数据共享的实际应用之一,其潜在好处包括改善客户体验,创造新的收入来源,以及提供可持续的服务模式。虽然开放式银行有利于终端用户,并促进银行和非银行之间的技术和领域竞争,但也可能迎来一个全新的金融服务生态系统,银行未来的角色可能会发生显著转变。
开放式银行业务可以定义一种协作模式,在这种模式中,银行数据通过两个或多个无关联方之间的API共享,从而为时长提供增强的功能。API已经被使用了数十年,特别是在发达国家,使得个人财务管理软件能够在银行网站上呈现计费细节,并将开发者连接到Visa之类的支付网络。但迄今为止,这些关系主要用于分享信息,而不是转移货币余额。
随着数据生态系统的日趋成熟,类似腾讯、阿里巴巴等诸多企业会开始发生数据碰撞,数据无法共享将损害到每一家企业的商业利益及其运营模式的创新。此外,大部分的数据都来自金融服务领域之外的公司,虽然银行拥有丰富的交易数据以及可信的客户关系,但他们往往把这些数据流的开放视为威胁而不是新的机遇。
共享“精简档案”消费者的有限数据可以帮助推进金融领域的包容性,集中有限的信息以获得更准确的风险评分和信贷承保决策。通过向正规金融体系引入更多的消费者,开放式银行业务将增加市场机会和未来提供盈利性服务的潜力。虽然开发式银行业务会导致现有银行在某种程度上受到冲击,但它们可以通过预测分析、人工智能等技术手段,提升客户粘性、深度挖掘客户价值,例如支付宝、微信通过它们的平台实现增加版的电子商务,提供更流畅的个性化体验以及包括点对点在内的全套支付选项。
现阶段,数据共享与开放式银行还存在一些问题,例如“敏感数据”的责任风险以及第三方供应商在一段时间之后销毁数据的义务,相信随着技术不断革新,开放式银行的诸多问题将迎刃而解,整个数据生态系统将会迎来新的篇章。
01 Nov 2017
本文纯属博主日常Linux操作记录,用于查询不考虑编写顺序
[root@localhost ~]#
root:当前登录用户
localhost:主机名
~:当前所在目录(家目录)
#:超级用户提示符 ==> 家目录(/root)
$:普通用户提示符 ==> 家目录(/home/user01)
文件类型(- 文件;d 目录;l 快捷方式)
命令格式:
命令 [选项] [参数]
例:查询目录内容
ls [选项] [文件或目录]
ls -a 显示所有文件,包括隐藏文件(.开头)
ls -l 显示详细信息(也可用ll)
下载器:
更新系统(不建议使用apt-get dist-upgrade,会导致文件不匹配卸载的情况)
apt-get update && apt-get upgrade
下载安装文件
apt-get install [文件名]
安装过程中存在依赖关系
apt-get install -f
知道网址下载方法:
wget [粘贴网址]
不同类型文件解压:
tar -xvf file.tar //解压 tar包
tar -xzvf file.tar.gz //解压tar.gz
tar -xjvf file.tar.bz2 //解压 tar.bz2
tar -xZvf file.tar.Z //解压tar.Z
unrar e file.rar //解压rar
unzip file.zip //解压zip
27 Oct 2017
程序设计基本结构包括:顺序结构、选择结构、循环结构,Python中任何算法都可以通过这3种基本结构的排列组合来实现。
在介绍Python程序设计结构之前,童鞋们需要储备程序流程图的相关知识如下:
据此,Python程序设计3种基本结构的流程图如下:
· 顺序结构实例
顺序结构其实贯穿于所有的Python程序之中,这里给出一个“Hello World”的小例子
#Input输入数据
str1 = "Hello"
str2 = "World"
#Process处理数据
str_add = str1+" "+str2
#Output输出数据
print(str_add)
· 选择结构实例
选择结构包含:多分支(if…elif…else…)和异常处理(try…except…),由于异常处理机制对于数分师来说并不是重点,因此这里不再赘述,有兴趣的童鞋请参阅:Python异常处理
接下来,举一个选取最大值的实例,以帮助童鞋理解Python选择结构中的多分支问题。实例需求:从x1,x2,x3三个数中,选取最大的数并输出。
# 共4种解决方法,代码由繁琐到简洁依次排列
x1=1
x2=2
x3=3
# ==== 通盘比较 ====
if x1>x2 and x1>x3:
max_n=x1
elif x2>x1 and x2>x3:
max_n=x2
else:
max_n=x3
# ==== 决策树 ====
if x1>x2:
if x1>x3:
max_n=x1
elif x2>x3:
max_n=x2
else:
max_n=x3
# ==== 顺序处理 ====
max_n = x1
if x2>max_n:
max_n=x2
if x3>max_n:
max_n=x3
print(max_n)
# ==== Python内置函数 ====
max_n=max(x1,x2,x3)
#输出结果
print(max_n)
3
· 循环结构实例
期望用Python编译循环结构实例,首先要了解循环类型和循环控制语句,循环类型包括for循环和while循环两种,其配套的循环控制语句也有break语句和continue语句两种,详情可参考: Python循环语句
循环类型
样例描述
for循环
for in :
while循环
while :
循环控制语句
样例描述
break语句
循环执行过程中终止并且跳出整个循环
continue语句
循环执行过程中终止并且跳出该次循环,执行下次循环
这里给出计算平均值的实例,各位可以比较一下不同代码之间的优劣性,实例如下:
# ==== for循环 ====
n = eval(input("how many numbers?"))
sum = 0
for i in range(n):
x = eval(input("enter a number >>"))
sum += x
print("\nThe average is",sum/n)
# 输出结果
how many numbers?3
enter a number >>10
enter a number >>20
enter a number >>30
The average is 20.0
# 缺点:需要提前定义输入数据的个数
# ==== while循环 ====
sum = 0
count = 0
moredata = "yes"
while moredata[0] == "y": #moredata首字母为y,执行循环
x = eval(input("enter a number >>"))
sum += x
count += 1
moredata = input("do you have more numbers(yes or no)?")
print("\nThe average is",sum/count)
# 输出结果
enter a number >>10
do you have more numbers(yes or no)?y
enter a number >>20
do you have more numbers(yes or no)?y
enter a number >>30
do you have more numbers(yes or no)?n
The average is 20.0
# 缺点:虽无需计数,但又总被提示信息打扰
# ==== while哨兵循环 ====
sum = 0
count = 0
xStr = input("enter a number (<ENTER> to quit) >>") #while执行前需定义xStr
while xStr != "": #xStr为空时,退出循环
x = eval(xStr)
sum += x #若将x换成xStr,当xStr为空时,表达式不成立
count += 1
xStr = input("enter a number (<ENTER> to quit) >>")
print("\nThe average is",sum/count)
# 输出结果
enter a number (<ENTER> to quit) >>10
enter a number (<ENTER> to quit) >>20
enter a number (<ENTER> to quit) >>30
enter a number (<ENTER> to quit) >>
The average is 20.0
# 缺点:需用户手动输入数据,不能自动读取文件数据
# ==== 文件循环 ====
# average1.txt 文件内容如下
10
20
30
fileName = "D:\\average1.txt" #读取D盘中的txt文件
infile = open(fileName,'r')
sum = 0
count = 0
for line in infile:
sum = sum + eval(line)
count = count + 1
print("\nThe average is",sum/count)
# 输出结果
The average is 20.0
# ==== 嵌套循环 ====
# average2.txt 文件内容如下
10,20,30
fileName = "D:\\average2.txt"
infile = open(fileName,'r')
sum = 0
count = 0
line = infile.readline()
while line != "": #外循环:对每行循环一次
for xStr in line.split(","): #内循环:对一行中每个数字循环一次
sum = sum +eval(xStr)
count = count +1
line = infile.readline()
print("\nThe average is",sum/count)
# 输出结果
The average is 20.0
25 Oct 2017
Python主要包含以下6种数据类型:
·数字类型 ·字符串类型
·元组类型 ·列表类型
·文件类型 ·字典类型
注:由于篇幅问题,Python基础之数据类型被分为3个部分,相关页面请跳转:
Python基础之数据类型(PartA.数字与字符串类型)
Python基础之数据类型(PartB.元组与列表类型)
Python基础之数据类型(PartC.文件与字典类型)
· 文件类型
问题1:常用的文件编码类型有哪些?
回答1:具体见下表
编码类型
编码描述
ASCII码
多用于英文字母及数字(存储汉字容易报错)
Unicode
包含:汉字、英文字母、数字及各国通用语言
UTF-8
可变长度的Unicode(最常用)
GBK编码
面向汉字的编码(最少用)
问题2:Python如何读取文件?
回答2:Python读取文件包括两步:文件打开+文件读取
文件打开代码示例:infile = open(“numbers.dat”,”r”),文件打开模式如下:
打开模式代码
可做操作
若文件不存在
若该文件存在
r
只能读
报错
-
r+
可读可写
报错
全文覆盖
w
只能写
创建
全文覆盖
w+
可读可写
创建
全文覆盖
a
只能写
创建
末尾追加
a+
可读可写
创建
末尾追加
文件读取代码示例:data = infile.read(),文件读取方法如下:
读取模式代码
代码详细描述
read()
返回值为包含整个文件内容的一个字符串
readline()
返回值为文件下一行内容的字符串
readlines()
返回值为整个文件内容的列表,每项是以换行符为结果的一行字符串
Python读取文件示例
# test01.txt 文件内容如下
1 2 3
4 5 6
7 8 9
# 读取文件全部内容
fname = "D:\\test01.txt" #确保D盘下有test.txt文件
infile = open(fname,"r")
data = infile.read()
# 上述两条代码也可合并成:data = open(fname,"r").read() #建议分开写
print(data)
# 输出结果
1 2 3
4 5 6
7 8 9
# 遍历读取文件全部内容
infile = open(fname,"r")
for line in infile:
print(line)
# 输出结果
1 2 3
4 5 6
7 8 9
# 读取文件前n行内容
fname = "D:\\test01.txt"
infile = open(fname,"r")
for i in range(2): #读取文件前几行
data = infile.readline()
print(data)
# 输出结果
1 2 3
4 5 6
# 从第2行开始读取文件内容(多用于去除表头)
fname = "D:\\tes01.txt"
infile = open(fname,"r")
infile.readline() #去除表头
data = infile.readlines() #以列表方式读取
print(data)
# 输出结果
4 5 6
7 8 9
问题3:Python如何写入文件?
回答3:Python文件写入代码示例如下:
outfile = open("D:\\test02.txt","w") #在D盘建一个名为test02的文件,若存在则不会创建
outfile.writelines(["Hello"," ","World"]) #写入数据
outfile.close()
infile = open("D:\\test02.txt","r").read() #读取数据
print(infile)
# 输出结果
Hello World
Python文件写入方法如下:
写入模式代码
代码详细描述
write()
把含有文本数据和二进制数据块的字符串写入文件中
writelines()
针对列表操作,接受一个字符串列表作为参数,并写入文件中
问题4:Python多个文件如何进行合并?
回答4:若熟悉SQL的童鞋应该知道横向全连接这个概念,即以某个变量为参照,将两个文件(数据集)合并成一个文件,这里演示在不借助任何库的情况下,利用Python进行横向连接的方法。
# ==== 原始文件 ====
a1.txt
姓名 电话
王五 123456
张三 456789
李四 789456
熊七 456123
a2.txt
姓名 邮箱
王五 feifei1@qq.com
胜八 feifei2@qq.com
张三 feifei3@qq.com
章九 feifei4@qq.com
# ==== Python代码 ====
# 原始数据读入
ftele1=open('d:\\a1.txt','rb') #采用二进制方式读取,避免中文乱码
ftele2=open('d:\\a2.txt','rb')
ftele1.readline() #去除表头变量名
ftele2.readline()
lines1 = ftele1.readlines()
lines2 = ftele2.readlines()
list1_name = []
list1_tele = []
list2_name = []
list2_email = []
for line in lines1: #获取a1文件中的姓名和电话信息
elements = line.split()
list1_name.append(str(elements[0].decode('gbk'))) #采用gbk中文编码读入
list1_tele.append(str(elements[1].decode('gbk'))) #str()将文本读出来的bytes转换为字符类型
for line in lines2: #获取a2文件中的姓名和邮件信息
elements = line.split()
list2_name.append(str(elements[0].decode('gbk')))
list2_email.append(str(elements[1].decode('gbk')))
# 创建空白文件
lines = []
lines.append('姓名\t 电话 \t 邮箱\n')
#按索引方式遍历姓名列表1
for i in range(len(list1_name)):
s= ''
if list1_name[i] in list2_name:
j = list2_name.index(list1_name[i]) #找到姓名列表1对应列表2中的姓名索引位置
s = '\t'.join([list1_name[i], list1_tele[i], list2_email[j]])
s += '\n'
else:
s = '\t'.join([list1_name[i], list1_tele[i], str(' ----- ')])
s += '\n'
lines.append(s)
#处理姓名列表2中剩余的姓名
for i in range(len(list2_name)):
s= ''
if list2_name[i] not in list1_name:
s = '\t'.join([list2_name[i], str(' ----- '), list2_email[i]])
s += '\n'
lines.append(s)
ftele3 = open('d:\\a3.txt', 'w') #将数据写入文件
ftele3.writelines(lines)
ftele3.close()
ftele1.close()
ftele2.close()
# ==== 输出结果 ====
姓名 电话 邮箱
王五 123456 feifei1@qq.com
张三 456789 feifei3@qq.com
李四 789456 -----
熊七 456123 -----
胜八 ----- feifei2@qq.com
章九 ----- feifei4@qq.com
· 字典类型
问题1:什么是字典类型?
回答1:字典类型是Python中一种非序列的存储结构,存储的是键值对(key:value),其存储形式为 d={key1:value1, key2:value2},以用户名和密码为例:admin={‘admin01’:1234, ‘admin02’:2345, ‘admin03’:3456},其中是唯一不重复的,可以不唯一。
问题2:Python如何操作字典类型数据(基础)?
回答2:操作方式如下
# ==== 构建字典类型数据 ====
students={"203-2012-045":"John","203-2012-037":"Peter"} # 大括号创建字典
# 输出结果
print(students)
{'203-2012-045': 'John', '203-2012-037': 'Peter'}
# ==== 向已有字典里增加数据项 ====
students["202-2011-121"]="Susan" # 中括号添加字典
# 输出结果
print(students)
{'203-2012-045': 'John', '203-2012-037': 'Peter', '202-2011-121': 'Susan'}
# ==== 查询字典中的值 ====
students["203-2012-045"]
# 输出结果
'John'
# ==== 删除字典中的一项 ====
del students["203-2012-037"]
# 输出结果
print(students)
{'203-2012-045': 'John', '202-2011-121': 'Susan'}
# ==== 字典遍历 ====
for key in students:
print(key) # 输出key值
print(students[key]) # 输出value值
print(key + ":" + str(students[key])) # 输出key-value值
# 输出结果
203-2012-045
John
203-2012-045:John
==============
202-2011-121
Susan
202-2011-121:Susan
# ==== 判断键key是否在字典中 ====
"203-2012-045" in students # Output显示True/False
# 输出结果
True
问题3:Python如何高效操作字典类型数据(进阶)?
回答3:这里要使用到Python所提供的函数,具体方式如下:
# ==== 构建字典类型数据 ====
students={"203-2012-045":"John","203-2012-037":"Peter"}
# ==== 显示字典中所有的key ====
tuple(students.keys())
# 输出结果
('203-2012-045', '203-2012-037')
# ==== 显示字典中所有的value ====
tuple(students.values())
# 输出结果
('John', 'Peter')
# ==== 显示字典中所有的key-value ====
tuple(students.items())
# 输出结果
(('203-2012-045', 'John'), ('203-2012-037', 'Peter'))
# ==== 获取字典中key对应的值 ====
students.get("203-2012-045")
# 输出结果
'John'
# ==== 删除字典中key对应的值 ====
students.pop("203-2012-045")
students
# 输出结果
'John'
{'203-2012-037': 'Peter'} #students中删除了'John'
# ==== 删除字典中所有的值 ====
students.clear()
students
# 输出结果
{} #students被清空
25 Oct 2017
Python主要包含以下6种数据类型:
·数字类型 ·字符串类型
·元组类型 ·列表类型
·文件类型 ·字典类型
注:由于篇幅问题,Python基础之数据类型被分为3个部分,相关页面请跳转:
Python基础之数据类型(PartA.数字与字符串类型)
Python基础之数据类型(PartB.元组与列表类型)
Python基础之数据类型(PartC.文件与字典类型)
· 元组类型VS列表类型
问题1 :元组类型和列表类型分别是什么样?
回答1a:元组中元素之间用逗号分隔,可加()也可以不加,具体请见下文,Python元组类型的操作。例:t1=(123,456,”hello”)
回答1b:列表中元素之间同样用逗号分隔,必须加[ ]。例:t2=[123,456,”hello”]
问题2 :元组类型和列表类型之间的相同点和不同点?
回答2a:相同点:元组和列表中的元素类型可以不一样;可以采用索引形式获取元组和列表中的元素。
回答2b:不同点:定义好的元组不可修改,但列表可随时修改且没有大小限制。
· Python元组类型的操作
t1 = 123,456,"hello"
t2 = (123,456,"hello")
t3 = 123,(456,"hello")
print(t1[1])
print(t2[1])
print(t3[1]) #(456,"hello")为一个元素
#输出结果
456
456
(456, 'hello')
· Python列表类型的操作
# ==== 列表运算操作 ====
m1 = [123,456,"hello"]
m1*2
len(m1[0:]) #计算列表中元素个数
for i in m1[0:]: #遍历列表中所有元素
print(i)
123 in m1 #判断列表中是否包含某个元素
#注:上述程序分条运行
#输出结果
[123, 456, 'hello', 123, 456, 'hello']
3 #len()函数
123 #循环语句
456
hello
True #条件判断
# ==== 列表修改操作 ====
#添加元素
m1.append("中国") #将元素X增加到列表的最后
m1.insert(2,"中国") #将元素X插入到2号位
#元素排序
m1.reverse() #将列表元素反转
m1.sort() #将列表元素排序,注:混合列表无法排序
#删除元素
m1.remove(123) #删除列表中第一次出现的元素X
m1.pop(2) #删除列表中2号位的元素
#注:上述程序分条运行,测试代码如下
m1 = [123,456,"hello"]
m1.append("中国") #分别替换“列表修改操作”代码条
print(m1)
#输出结果
[123, 456, 'hello', '中国']
[123, 456, '中国', 'hello']
['hello', 456, 123] #元素反转
[456, 'hello']
[123, 456]
25 Oct 2017
问题: 10,011,101这样一个数据该如何解释?
回答: 可以是1个二进制数字,1个十进制数字,一段文本,或者是逗号分割的3个数字···
但诸如Python、Java等程序设计语言中,不允许存在语法歧义,因此在输入数据时需要明确说明数据的含义,即标记数据类型。
Python主要包含以下6种数据类型:
·数字类型 ·字符串类型
·元组类型 ·列表类型
·文件类型 ·字典类型
注:由于篇幅问题,Python基础之数据类型被分为3个部分,相关页面请跳转:
Python基础之数据类型(PartA.数字与字符串类型)
Python基础之数据类型(PartB.元组与列表类型)
Python基础之数据类型(PartC.文件与字典类型)
· 数字类型
Python包含3种数字类型
·整数类型 int()
·浮点数类型 float()
·复数类型 complex()
问题1:整数、浮点数、复数之间是怎样的关系?
回答1:复数==去除虚数部分==>浮点数==去除小数部分==>整数,因此整数是浮点数特例,浮点数是复数特例。
问题2:不同数据类型之间混合运算的结果?
回答2:运算后结果为最宽的数字类型,例:整数+浮点数=浮点数
问题3:数字类型之间能否相互转化?
回答3:整数与浮点数之间能够相互转化,但复数只能单向转化,例如:
#正确示例
int(4.5) #输出结果:4
float(4) #输出结果:4.0
complex(4) #输出结果:4+0j
#错误示例
float(4+0j) #输出结果:错误!
问题4:如何判断数字类型?
回答4:利用type()函数,例:type(4.5) 输出结果:float
· 字符串类型
Python字符串是用”双引号”或者’单引号’括起来的字符组,例如:
str1 = "Hello"
str2 = 'World'
print(str1+" "+str2)
#输出结果
Hello World
Python语言转义符: \
print("\"Hello World\"")
#输出结果
"Hello World"
print("Hello\nWorld") #\n表示换行
#输出结果
Hello
World
Python截取字符串
print("Hello World"[0:3]) #"string"[start:end]
#字符截取从start开始直到end结束,但不包括end位置,即[0:3]输出编号为0,1,2
#输出结果
Hel
Python返回字符串长度len()函数
len("Hello world")
#输出结果
11
Python字符串类型转化str()函数
str(123.456) #输出结果:'123.456'
type(str(123.456)) #输出结果:str
Python字符串使用实例
# month.py
weeks = "MonTueWenThuFriSatSun"
n = input("请输入星期数(1-7):")
pos = (int(n)-1) * 3
#星期一 pos=0,星期二 pos=3,星期三 pos=6以此类推
weekAbbrev = weeks[pos:pos+3]
print("星期几简写是:" + weekAbbrev)
24 Oct 2017
· 格式化输出
1.整数输出
#'%d'代替十进制数字(常用)
print("I am %d years old"%10)
#与上句结果相同
age=10
print("I am %d years old"%age)
#输出整数三种表现形式
print("十进制%d,八进制%o,十六进制%x"%(age,age,age))
#输出结果
I am 10 years old
dec=10, oct=12, hex=a
注:整数有三种表现形式:十进制%d, 八进制%o, 十六进制%x
2.浮点数输出
#'%f'默认保留小数点后6位
#'%e'指数形式输出
#'%g'根据实际情况输出,最多保留小数点后6位
num=3.1415
print('%f , %e , %g'%(num,num,num))
#输出结果
3.141500 , 3.141500e+00 , 3.1415
3.字符串输出
#'%s'代替字符串
print('I love study %s'%'python')
#截取部分字符串
print('I love study %.2s'%'python')
#输出结果
I love study python
I love study py
· format()函数输出
1.通过位置替换
print("{} {}".format("hello","world")) #必须一一对应
print("{0} {0} {1}".format("hello","world"))
#输出结果
hello world
hello hello world
2.关键词替换
print("I love {you}".format(you="python"))
#输出结果
I love python
· print输出到txt文件
sentence = "I love python"
print((sentence),file=open("D:\\test01.txt","a+"))
23 Oct 2017
1.初始化数据库
service postgresql initdb
2.启动数据库
service postgresql start
3.切换用户修改密码
su postgres
psql
alter user postgres with password '1234';
\q
4.修改认证文件/var/lib/pgsql/data/pg_hba.conf
vi /var/lib/pgsql/data/pg_hba.conf
把配置文件METHOD栏下方,修改为trust,从而解决用户Ident认证失败这个问题
5.重启postgresql服务器使设置生效
service postgresql restart
pg_hba.conf文件的完整代码如下:
#=========================================
# PostgreSQL Client Authentication Configuration File
# ===================================================
#
# Refer to the "Client Authentication" section in the PostgreSQL
# documentation for a complete description of this file. A short
# synopsis follows.
#
# This file controls: which hosts are allowed to connect, how clients
# are authenticated, which PostgreSQL user names they can use, which
# databases they can access. Records take one of these forms:
#
# local DATABASE USER METHOD [OPTIONS]
# host DATABASE USER ADDRESS METHOD [OPTIONS]
# hostssl DATABASE USER ADDRESS METHOD [OPTIONS]
# hostnossl DATABASE USER ADDRESS METHOD [OPTIONS]
#
# (The uppercase items must be replaced by actual values.)
#
# The first field is the connection type: "local" is a Unix-domain
# socket, "host" is either a plain or SSL-encrypted TCP/IP socket,
# "hostssl" is an SSL-encrypted TCP/IP socket, and "hostnossl" is a
# plain TCP/IP socket.
#
# DATABASE can be "all", "sameuser", "samerole", "replication", a
# database name, or a comma-separated list thereof. The "all"
# keyword does not match "replication". Access to replication
# must be enabled in a separate record (see example below).
#
# USER can be "all", a user name, a group name prefixed with "+", or a
# comma-separated list thereof. In both the DATABASE and USER fields
# you can also write a file name prefixed with "@" to include names
# from a separate file.
#
# ADDRESS specifies the set of hosts the record matches. It can be a
# host name, or it is made up of an IP address and a CIDR mask that is
# an integer (between 0 and 32 (IPv4) or 128 (IPv6) inclusive) that
# specifies the number of significant bits in the mask. A host name
# that starts with a dot (.) matches a suffix of the actual host name.
# Alternatively, you can write an IP address and netmask in separate
# columns to specify the set of hosts. Instead of a CIDR-address, you
# can write "samehost" to match any of the server's own IP addresses,
# or "samenet" to match any address in any subnet that the server is
# directly connected to.
#
# METHOD can be "trust", "reject", "md5", "password", "gss", "sspi",
# "krb5", "ident", "peer", "pam", "ldap", "radius" or "cert". Note that
# "password" sends passwords in clear text; "md5" is preferred since
# it sends encrypted passwords.
#
# OPTIONS are a set of options for the authentication in the format
# NAME=VALUE. The available options depend on the different
# authentication methods -- refer to the "Client Authentication"
# section in the documentation for a list of which options are
# available for which authentication methods.
#
# Database and user names containing spaces, commas, quotes and other
# special characters must be quoted. Quoting one of the keywords
# "all", "sameuser", "samerole" or "replication" makes the name lose
# its special character, and just match a database or username with
# that name.
#
# This file is read on server startup and when the postmaster receives
# a SIGHUP signal. If you edit the file on a running system, you have
# to SIGHUP the postmaster for the changes to take effect. You can
# use "pg_ctl reload" to do that.
# Put your actual configuration here
# ----------------------------------
#
# If you want to allow non-local connections, you need to add more
# "host" records. In that case you will also need to make PostgreSQL
# listen on a non-local interface via the listen_addresses
# configuration parameter, or via the -i or -h command line switches.
# TYPE DATABASE USER ADDRESS METHOD
# "local" is for Unix domain socket connections only
local all all trust
# IPv4 local connections:
host all all 127.0.0.1/32 trust
# IPv6 local connections:
host all all ::1/128 trust
# Allow replication connections from localhost, by a user with the
# replication privilege.
#local replication postgres peer
#host replication postgres 127.0.0.1/32 ident
#host replication postgres ::1/128 ident
#=========================================
20 Oct 2017
· 安装PostgreSQL
1.查看系统是否安装了PostgreSQL:
rpm -qa | grep postgresql
注:如果没有结果就说明未安装,跳转到2
如果有就利用 rm -rf 删除
2.利用yum安装PostgreSQL数据库
yum -y install postgresql*
3.查看安装好的PostgreSQL版本
psql --version
· 启动PostgreSQL
1.给linux添加一个PostgreSQL超级管理用户
# 添加一个pg用户
adduser pguser
# 查看是否添加成功
cat /etc/passwd | grep pguser
2.启动PostgreSQL服务
service postgresql start
3.切换到PostgreSQL用户(postgres是数据库默认的角色)
su postgres
4.进入PostgreSQL数据库
psql
注:系统提示变为“postgres=#”,即进入到数据库中
· 操作PostgreSQL
1.查看所有数据库
\l
2.选择数据库
\c db_name
3.查看当前数据库所有表格
\d
4.查看当前数据库所有表格
\d
5.查看表格的结构
\d table_name
6.退出控制台(快捷键Ctrl+D)
\q
20 Oct 2017
随着深度学习技术的不断革新,人工智能在生活和工作中的作用越来越明显,认知技术作为人工智能中一块分支,正在逐渐改变企业传统的工作流程。认知技术简单来说,就是让计算机代替人来理解和思考问题,Google的人工智能专家指出,现在他们正在努力提高机器认知的速度、准确性和效率,并期望能够增加20%-30%的额外容量。通过认知技术的实现及广泛运用,能够将一大批人类专家从繁琐的数据整理工作中解放出来,从而专注于更高价值的活动。
认知技术的实现模式既可以是应用程序,也可以是独立的机器,它们工作的主要目的是替换以前需要通过专家定义才能进行输入及输出的任务,其中包括机器人过程自动化(RPA)、机器学习和自然语言处理。认知技术减少了对专家输入的需求,并通过新的工作方式提高了机器自动学习的效率。
现阶段,已经有诸多利用认知技术优化工作流程的实例,例如RPA通过现有接口自动执行包括数据提取和清理的日常任务活动;机器学习将高级算法应用于大数据集以识别模式,帮助诸如客户关系管理CRM、产品控制和交易监控等领域做出决策;自然语言处理将语音和文本文件转化为结构化可搜索和处理的数据;认知代理人技术与用户直接互动,常用于雇员服务中心、帮助台和其他内部联络中心。
麦肯锡公司近期分别比较了几家银行在使用认知技术之后,其现金股权业务中的数字运营及贸易处理的渗透率。他们发现数字运营水平最高的公司其收入增长了八倍,并且FTE的交易量高水平组比低水平组高出4倍以上(数据来源于:《McKinsey Capital Markets Trade Processing Survey》, McKinsey research, Coalition data),具体可见下图:
技术效率的提升往往与员工人数的减少呈现直接的线性关系。这是因为自动化能够有效降低工作总量,例如,RPA通常将每个人的工作量降低10%至20%,因此人员配比也将相应减少。然而,从整理的创造能力来看,认知技术的影响是潜在的,其可以作用于独立解决方案,也可以和其他应用程序组合运行而增加其影响力。例如,RPA和机器学习对结算和付款功能中的标准指令的更正具有很高的使用价值。同时,认知代理、智能工作流程和自然语言处理在客户端服务中最为有用,例如用于创建自定义的电子邮件响应等等。
现在大多数企业所需要解决的问题不是在于是否部署基于人工智能的技术,而是在于部署了人工智能技术之后如何使其快速的产生价值,相信随着认知技术在不同领域的广泛运用,人工智能将在企业日常运营活动中产生更大的价值。
19 Oct 2017
资本资产定价对于公司的重要性毋庸置疑,据相关数据统计,1%的价格涨幅能够提升8.7%的营业利润增长。然而许多公司至少有30%的定价决策是不受到市场认可的,导致了大量的资源浪费和收入损失。因此借助大数据技术挖掘客户互动过程中所提供的海量数据,能够帮助公司进行更为合理的资本资产定价决策,即调整到合理的价格以获得高额的营业利润。
对于每个产品,公司都应当找到客户愿意支付的最优价格。一般情况下,大多数公司都会通过受众群体、市场同价产品、产品核心竞争力等维度指标,制定较为理想的市场价格。事实上,这种方法只适用于产品种类少且订单数量少的公司。然而,现有公司产品种类及数量规模都达到一个比较高的标准,这时传统的定价模式将不再适用。对于大型公司而言,借助大数据技术精准的管理这些复杂的定价变量,处理成千上万不断变换的产品定价问题,是具有重要意义的。例如基于支付意愿的客户–产品差异化定价模型,就是大数据助力资本资产定价的典型案例,其中蓝色点为产品销售价格和折扣率之间的散点图,黄色点代表不同的客户群体,由此找到市场需求和产品价格之间一个最佳的平衡点,从而使得产品定价对于消费者来说价格最小化,对于公司来说利润最大化。
一家跨国能源公司的销售业务主管曾表示:“事实上,许多公司每年都以规模和数量等相关指标来增加价格,例如生产成本、标准利润率、类似产品价格、批量折扣等,而不是以数据科学为基础。”
更好地定价的关键是充分了解公司现有的数据。Sasol集团副总裁Tom曾表示:“当销售团队知道他们的定价以后,他们可能就能预估到自己的销量,但这些数据多数都是基于字面发票。”事实上,在B2B的商业环境中使用大数据所产生的价值早就超越了定价,并触及到了公司商业引擎的其他方面。例如“动态交易评分”是基于一系列类似于盈利/亏损交易,提供个人交易、决策升级点、激励措施、绩效评分等级来进行价格指导。因此为了获得更优的定价决策,公司可以从以下三个方面着手:
· 倾听数据所发出的声音
鉴于公司通常都会收集足够多的用户信息,因此设定最优惠的价格并不属于数据收集的挑战,而是数据分析的挑战。最好的B2C公司知道如何解释和运转他们所拥有的海量数据,但B2B公司倾向于管理数据,而不是用它们来推动决策。良好的分析可以帮助企业确定经常被忽视的因素,例如更广泛的经济形势、用户产品偏好和销售代表性谈判,并揭示出哪些因素能够驱动客户群体和产品价格。
· 使海量数据自动化运转
手动分析成千上万产品的人工和时间成本难以估量,而自动化系统可以快速识别数据波动规律和异常状态,精确定位哪些因素为客户带来价值,并将其与历史事物数据进行匹配。这允许公司根据数据为产品进行客户细分并生成对应价格,自动化还使得分析具有实时性,不需要每次都从头开始进行计算。
· 数据技术支持公司决策
新价格的实施既是销售的挑战也是技术的挑战。许多公司为了帮助他们的销售人员了解和接受新的定价方法,投入了大量的资金。他们需要与销售密切合作,解释价格定制的原因以及系统的运作原理,以便销售相信该定价的合理性。技术层面上,开发一套清晰的通讯系统也是同样重要的,该套系统能够实时提供购买的理由、突出产品的价值,并为客户量身定制具有个性化的产品。
现有电信、交通、医疗等多个行业的众多公司都期望通过使用大数据技术来获得更好的定价决策。相信在不久的将来,大数据技术能够帮助公司突破传统的资本资产定价方式,寻找到市场认可与公司盈利最佳的切合点。
13 Oct 2017
非线性回归相较于线性回归而言,总带有一丢丢复杂的神秘感。关于线性回归模型相信各位已耳熟能详,因此这里主要讨论非线性回归模型。其实非线性回归中很大一部分是基于多项式的回归模型,即利用曲线方程代替直线方程拟合坐标图上各点,使得各点到曲线的距离总和最短。
一元m次多项式回归方程为:
二元二次多项式回归方程为:
多项式回归的最大优点就是可以通过增加x的高次项对实测点进行逼近,直至满意为止。事实上,多项式回归可以处理很大一类非线性问题,它在分析中占有重要的地位,因为任何一个函数都可以分段用多项式来逼近。
举一个房屋价格与房屋尺寸非线性拟合的实例,数据集下载地址:prices.txt
· 算法构建代码
# python -version 3.5+
import matplotlib.pyplot as plt
import numpy as np
from sklearn import linear_model
from sklearn.preprocessing import PolynomialFeatures
# 读取数据集
datasets_X = [] #建立datasets_X储存房屋尺寸数据
datasets_Y = [] #建立datasets_Y储存房屋成交价格数据
fr = open('E:\\prices.txt', 'r', encoding='utf-8') #指定prices.txt数据集所在路径
lines = fr.readlines() #读取一整个文件夹
for line in lines: #逐行读取,循环遍历所有数据
items = line.strip().split(",") #变量之间按逗号进行分隔
datasets_X.append(int(items[0])) #读取的数据转换为int型
datasets_Y.append(int(items[1]))
# 数据预处理
length = len(datasets_X)
datasets_X = np.array(datasets_X).reshape([length, 1]) #将datasets_X转化为数组
datasets_Y = np.array(datasets_Y)
minX = min(datasets_X) #以数据datasets_X的最大值和最小值为范围,建立等差数列,方便后续画图
maxX = max(datasets_X)
X = np.arange(minX, maxX).reshape([-1, 1])
# 数据建模
poly_reg = PolynomialFeatures(degree=2) #degree=2表示二次多项式
X_poly = poly_reg.fit_transform(datasets_X) #构造datasets_X二次多项式特征X_poly
lin_reg_2 = linear_model.LinearRegression() #创建线性回归模型
lin_reg_2.fit(X_poly, datasets_Y) #使用线性回归模型学习X_poly和datasets_Y之间的映射关系
· 测试结果代码
# 查看回归系数
print('Coefficients:',lin_reg_2.coef_)
# 查看截距项
print('intercept:',lin_reg_2.intercept_)
# 数据可视化
plt.scatter(datasets_X, datasets_Y, color='orange')
plt.plot(X, lin_reg_2.predict(poly_reg.fit_transform(X)), color='blue')
plt.xlabel('Area')
plt.ylabel('Price')
plt.show()
· 部分结果展示
相关系数Coefficients: [ 0.00000000e+00 4.93982848e-02 1.89186822e-05]
截距项intercept: 151.846967505
非线性回归公式:Y = 151.8470 + 4.9398e-02*x + 1.8919e-05*x^2
非线性拟合图:
10 Oct 2017
· 单表查询
select * from table_name;
where 条件查询
group by 分组查询
having 分组后筛选
order by 结果排序
-- 查询emp表中所有的行和列(emp表位于表管理单元测试中)
select * from emp;
-- 从表中检索部分的变量
select empno,ename,job,leader,hiredate,sal,comm,deptno from emp;
select empno as 员工编号,ename as 员工姓名,job as 职位,leader as 直属领导,hiredate as 雇用时间,sal as 薪水,comm as 津贴,deptno as 部门编号 from emp;
select empno 员工编号,ename 员工姓名,job 职位,leader 直属领导,hiredate 雇用时间,sal 薪水,comm 津贴,deptno 部门编号 from emp;
-- 查询去重
select distinct deptno from emp;
---- 条件查询 ----
-- 从表中检索部分观测(大小写不敏感)
select * from emp where job='salesman';
-- 从表中查找空值
select * from emp where comm is null;
select * from emp where comm is not null;
-- 将空值转化为实际值
select coalesce(comm,0) from emp;
-- 多条件查询
select * from emp where deptno=10 or deptno=20;
select * from emp where deptno=10 or (deptno=20 and sal<=2000);
-- 模糊查询
select * from emp where ename like 'a%';
select * from emp where ename like '%a%';
select * from emp where ename like '_a%';
---- 分组查询 ----
select deptno,sum(sal) from emp group by deptno;
select deptno,sum(comm) from emp group by deptno; #空值不计算
select deptno,sum(coalesce(comm,0)) from emp group by deptno; #空值变为0
select deptno,sum(sal) from emp where sal>2000 group by deptno;
select deptno,job,sum(sal) from emp group by deptno,job;
---- 分组后筛选 ----
select deptno,job,sum(sal) from emp group by deptno,job having job = 'manager';
select deptno,job,sum(sal) from emp where job = 'manager' group by deptno,job; #where条件查询更快
-- 为什么还要having?
select deptno,job,sum(sal) from emp group by deptno,job having sum(sal)>5000;
select deptno,job,new_sal from (select deptno,job,sum(sal) as new_sal from emp group by deptno,job) as a where new_sal>5000;
---- 结果排序 ----
select * from emp order by sal;
select * from emp order by sal desc;
select * from emp order by sal desc limit 5;
select deptno,job,sum(sal) as new_sal from emp group by deptno,job order by deptno,new_sal;
---- 逻辑操作符 ----
and,or 且,或
!=(<>) 不等于
is null 查询空值
like 模糊查询
between ... and ... (b<=a<c)
---- 逻辑表达式 ----
select ename,sal,
case when sal<= 2000 then '过低'
when sal>= 4000 then '过高'
else '可行'
end as status
from emp;
· 多表查询
创建测试表 a1、a2
create table a1(x int,y varchar(20));
create table a2(m int,n varchar(20));
insert into a1(x,y) values(1,"one"),(2,"two"),(2,"two2"),(3,"three");
insert into a2(m,n) values(1,"one"),(2,"two"),(4,"four");
---- 纵向查询(连接的观测值——行)----
select * from a1
union
select * from a2;
-- 加入条件语句
select x,y from a1 where x=1
union
select m,n from a2 where m=2
order by 1 desc;
-- emp各部门工资排名前三的员工
(select deptno,ename,sal from emp where deptno=10 order by sal desc limit 3)
union
(select deptno,ename,sal from emp where deptno=20 order by sal desc limit 3)
union
(select deptno,ename,sal from emp where deptno=30 order by sal desc limit 3);
---- 横向连接(连接的是变量——列) ----
-- 内连接
select * from a1 inner join a2 on a1.x=a2.m;
select * from a1 join a2 on a1.x=a2.m;
select * from a1,a2 where a1.x=a2.m;
-- 左连接
select * from a1 left join a2 on a1.x=a2.m;
-- 右连接
select * from a1 right join a2 on a1.x=a2.m;
-- 全连接(Mysql不支持)
select * from a1 full join a2 on a1.x=a2.m; # MySQL不支持
select * from a1 left join a2 on a1.x=a2.m
union
select * from a1 right join a2 on a1.x=a2.m;
· 子查询
创建测试表players,penalties
---- 表 子查询from型 ----
-- 获取编号小于10的男性球员的号码
select playerno from players where playerno<10 and sex='M';
select playerno from (select playerno,sex from players where playerno<10) as players10 where sex='m';
---- 行 子查询where型 ----
-- 获取和100号球员性别相同并且居住在同一城市的球员号码
select playerno,sex,town from players where (sex,town)=(select sex,town from players where playerno=100);
-- 获取和27号球员出生在同一年的球员的号码
select playerno,birth_date from players where year(birth_date)=(select year(birth_date) from players where playerno = 27);
select playerno,birth_date from players where year(birth_date)=1964; #需求转化
---- 列 子查询 ----
-- 1.实例(in):获取球员性别为女的所有球员的球员号,名字及所在城市
select playerno,name,town from players where playerno in (select playerno from players where sex="F");
-- 2.实例(any):获取至少比同城的另一球员年轻的所有球员的号码,日期和居住城市
select playerno,birth_date,town from players as p1 where birth_date> any(select birth_date from players as p2 where p1.town = p2.town);
-- 3.实例(all):获取最老球员的号码,名字及生日。(即出生日期数值小于或等于所有其它球员的球员)
select playerno,name,birth_date from players where birth_date<= all(select birth_date from players);
---- exists型子查询 ----
-- 1.实例(exists):获取那些至少支付了一次罚款的球员的名字和首字母
select name,initials from players where exists (select * from penalties where playerno = players.playerno);
-- 2.实例(not exists):获取那些从来没有罚款的球员的名字和首字母
select name,initials from players where not exists (select * from penalties where playerno = players.playerno);
· 高级查询
---- 数字运算 ----
-- 每个部门平均值、最小值、最大值、工资合计、部门人数、获得提成人数
select deptno as 部门编号,
avg(sal) as 平均值,
min(sal) as 最小值,
max(sal) as 最大值,
sum(sal) as 工资合计,
count(ename) 部门人数,
count(comm) 获得提成人数
from emp group by deptno;
-- 每个部门人均提成的算法
select deptno 部门编号,
avg(comm) 错误的人均提成算法,
avg(coalesce(comm,0)) 正确的人均提成算法
from emp group by deptno;
---- 日期运算 ----
select hiredate as 聘用日期,
date_add(hiredate,interval 1 day) as 日期加一天,
date_add(hiredate,interval 1 month) as 日期加一月,
date_add(hiredate,interval -1 month) as 日期减一月
from emp;
---- 字符串运算 ----
select substring(ename,1,4) from emp; #截取字符串
select replace(ename,"smith","SMITH") from emp; #替换字符串
select concat(job,sal) as data from emp; #字符与数字合并
select convert(empno,signed) from emp; #数字转字符
---- 正则表达式 ----
#Mysql大小写不敏感,binary属性让大小写敏感
create table aa1(id int auto_increment primary key,data varchar(20) binary);
insert into aa1(data) values ("123"),("abc"),("123abc"),("abc123");
insert into aa1(data) values ("DeF456"),("456dEf");
select data from aa1 where data regexp "[0-9]";
select data from aa1 where data regexp "[a-z]";
select data from aa1 where data regexp "def";
select data from aa1 where data regexp "[De][Ee][Ff]";
10 Oct 2017
· 约束
约束作用:1.防止将错误值插入数据表;2.保持表中数据的一致性
包含哪些:1.非空约束、唯一约束、检查约束;2.主键约束、外键约束
-- 主键约束
create table s_user(
u_id int auto_increment primary key,
u_name varchar(20),
u_pwd varchar(20)
);
# 添加自增列
create table s_user(
u_id int auto_increment primary key,
u_name varchar(20),
u_pwd varchar(20)
);
-- 外键约束
-- 方法1
create table s_order(
o_id int auto_increment primary key,
o_buyer_id int,
o_totalprices float,
foreign key(o_buyer_id) references s_user(u_id)
);
-- 方法2
create table s_order2(
o_id int auto_increment primary key,
o_buyer_id int,
o_totalprices float
);
alter table s_order2 add foreign key(o_buyer_id) references s_user(u_id);
· 表管理
-- 添加数据
insert into s_user(u_name,u_pwd) values("carry","123");
insert into s_user(u_name,u_pwd) values("carry","123"),("harry","456"),("marry","789");
-- 修改数据
set sql_safe_updates=0; #设置数据库安全等级
update s_user set u_pwd="963" where u_name="harry";
-- 删除数据
delete from s_user where u_name="marry";
· 单元测试
创建员工表emp
· 相关连接
MySQL基础讲义—— 数据库与表空间
MySQL基础讲义—— 约束与表管理
MySQL基础讲义—— SQL查询
10 Oct 2017
· 数据库
-- 创建数据库
create database test1;
-- 查看数据库
show databases;
-- 选择数据库
use test1;
-- 删除数据库
drop database test1;
· 表空间
表空间是什么?
数据类型(共3大类):数值型、字符型、日期型
数值型:int整数型、float浮点型
字符型:char、varchar 注意:区别,填满和不填满
日期型:datetime “YYYY-MM-DD hh:mm:ss”
-- 创建表
create table stu_inf(id int(10),stu_name varchar(20),stu_sex varchar(20),stu_score float(10));
-- 查询表
show tables;
describe stu_inf;
-- 修改表(修改表名称,添加变量,修改变量,删除变量)
alter table stu_inf rename a1; #修改表名称
alter table a1 add column class varchar(20); #添加变量
alter table a1 change column class stu_class varchar(20); #修改变量
alter table a1 drop column stu_class; #删除变量
-- 删除表
drop table a1;
索引:主键索引(一张表里只能有一个)
唯一索引(一张表里可能存在多个)
作用:提高后台查询效率(为什么?)
-- 添加索引
alter table stu_inf add primary key(id);
alter table stu_inf add unique(stu_name);
-- 查询索引
show index from stu_inf;
-- 修改索引(先删除后添加)
-- 删除索引
alter table stu_inf drop primary key; #删除主键索引
alter table stu_inf drop index stu_name; #删除其他索引
· 单元测试
创建一个数据库 test_stu
进入数据库 test_stu
在数据库 test_stu 中建立四张表:
Student 学生表(id, S_name, S_age, S_sex)
Score 成绩表(S_id, C_name, score)
Teacher 教师表(id, S_id, C_name, T_name)
· 相关连接
MySQL基础讲义—— 数据库与表空间
MySQL基础讲义—— 约束与表管理
MySQL基础讲义—— SQL查询
15 Sep 2017
近年来,机器学习技术的突飞猛进促使计算机系统能够解决现实世界中诸多复杂的问题。其中之一便是Google发布大规模的、基于图的机器学习平台,而这套技术正是我们日常使用的收件箱提醒、Allo智能信息回复、Google Photos图像识别等功能背后的技术工具之一。
相对于需要经过大规模带标签的数据训练,才能够展现出其预测能力的“有监督”的机器学习方法,基于图的机器学习技术受到人类在已有知识(有标签数据)和全新未知结果(无标签数据)之间搭建学习桥梁的启发,使用称之为“半监督”学习的方法,使系统能够在稀疏数据集上进行训练,从而能够避免“有监督”学习中,对于每个新的任务都需要耗费大量的时间和精力去采集标签数据的问题。此外,基于图的半监督学习方法使得系统在学习的时候能够同时吸收带标签和不带标签的数据,这样有助于改善数据的底层结构,混合多种不同信号的特征,例如带有原始特征的知识图谱相关信息等。
基于图的机器学习算法核心就是构建图本身,由此我们需要定义节点、边、以及每条边的权重。在整个学习过程中,最主要的问题就是如何生成图以及连接方式的选择。图有各种各样的大小和形状,并且能够与多种不同的来源进行结合,Google所发布的基于图的机器学习平台正是抓住了这一痛点,能够直接从推断或已知的数据要素间关系中自动地生产图。为了更好的理解基于图的机器学习系统是如何运转的,本文列举以下的示例:
如图所示,灰色节点代表无标签数据,彩色节点代表有标签数据,节点数据之间的关系通过边表示,边的粗细程度代表边的权重,由此我们需要解决的问题是预测图表中每一个节点的颜色。基于图的机器学习技术最简单的实现原理,就是学习图像中每一个节点的颜色标签,相邻标签则依据相互之间链接的强度来分配与之相似的颜色。一个较为简洁的方法就是尝试一次性全部学完标签分配,但这种方法并不能拓展到大型的图上。另一个方法就是通过把标签节点的颜色传递给相邻节点,然后重复这一过程,从而不断的获得优化。通过第二种方法,我们可以升级每一个节点的标签,重复操作,直到整个图都是彩色的,而这一过程在优化相似的难题上也被证明是极其有效的。
现今,基于图的机器学习技术被应用到越来越多的领域中,例如自然语言处理中的情绪标记,金融领域中的反欺诈模型构建,当然还包括一些智能提醒、对话理解等应用。相信随着基于图的机器学习技术不断发展,在不久的将来,互联网规模膨胀的问题也将获得圆满的解决。
13 Sep 2017
鉴于许多童鞋对课堂上利用python构建的随机点名器比较感兴趣,遂写下该博文。
随机点名器属于python比较基础的运用,构建点名器前需要具备以下条件:
Python版本3.5及以上;
已安装random包(Anconda自带)
已安装tkinter包(需自行安装)
· 构建简易的点名器
import random
random.choice(['张三','李四','王五'])
输出结果:'李四'
· 具有弹出框的点名器
from tkinter import *
import random
root = Tk() #注意大小写
root.title("CDA 点名器")
root.geometry()
def printhello():
name = random.choice(['张三','李四','王五']) #学员姓名
t.insert('1.0', "Who is the Lucky Guy:"+ name + "\n")
t = Text()
t.pack()
Button(root, text="点击", command = printhello).pack()
root.mainloop()
结果窗口:
07 Sep 2017
随着通讯技术的不断发展,呼叫中心的规模与日俱增,现阶段国内拥有上千席的呼叫中心不在少数,其每日所产生的语音数据体量难以想象,属于典型的非结构化“大数据”。这些数据中所蕴含的客户偏好、产品质量、坐席技能等相关指标是呼叫中心优化服务质量、提高运营效率的重要参考因素,直接关系着营销决策制定以及产品服务设计。
然而,语音数据作为呼叫中心一项重要的价值资产,在过去很长一段时间内却没有受到足够的重视。这是受限于传统技术条件下,语音数据存储成本过高,应用难度过大,更难说从中挖掘核心价值以支持决策分析。但随着大数据、云计算与人工智能技术的迅猛发展,使得海量数据存储成本不断降低,分布式并行计算效率不断提高,打破了语音数据存储及处理的技术壁垒,为呼叫中心提供了全新的运营模式,其具体应用场景如下:
1. 分布式存储海量语音数据成为主流
呼叫中心体量的不断扩张,导致大量的语音数据堆积,以某金融机构呼叫中心为例,其坐席数量超过3000余个,每日产生的录音文件量高达100G以上,年录音文件总量超过50T,预计未来语音数据量的年平均增长率高达30%。如此海量的语音数据加剧了数据存储的难度,虽然现有计算机存储硬件的发展已经非常迅猛,但其发展速度还远不及数据量的几何式爆破增长,并且由于高性能的存储硬件存在造价成本的问题,大多数企业对于日益增长的进量数据以及原始积累的存量数据又爱又恨。在现有职能体系下,多数企业还将呼叫中心评定为服务中心,一心旨在控制呼叫中心成本而并没有期待其能够产生收益。由此试图通过提高计算机硬件配置来解决呼叫中心语音数据存储的问题,并不具有一般可行性。
大数据技术的发展成功解决了呼叫中心语音数据量存储的问题,其特有的分布式存储技术能够将单一体量巨大语音数据文件夹切分为多个小的区块,并使其能够存放于由多台计算机所架构的集群上。这些计算机之间通过某种方式相互通信,进而将整个集群内所有存储空间资源整合、虚拟化并对外提供文件访问服务的文件系统。利用大数据技术存储语音数据具有两大突出的优点:其一,极大降低了数据存储所需的硬件成本,由于大数据技术能对单一体量的数据集进行切分、存储、再整合,因此数据存储就不再受限于高性能的计算机硬件,而只需要多个性能基本达标的存储硬件便能够对海量数据进行存储和处理;其二,所保存的数据不易丢失或破坏,由于大数据技术会将单条语音数据重复分配到集群中多个计算机上,因此在数据提取时,若某个计算机的数据不慎丢失或其本身遭受破坏,我们也能正常的从集群中提取到完整的数据。
现阶段大多数呼叫中心运营高层都逐渐意识到日常语音数据的价值,也纷纷表示分布式存储技术确实能够帮助其解决语音数据体量过大的问题。由此如今众多呼叫中心都致力于从抽取部分语音进行存储变革为全量语音存储,从真正意义上使得分布式存储海量语音数据成为主流趋势。
2. 实现“机器质检泛听+人工质检精听”新模式
呼叫中心是人力密集型行业,其质量监控管理一直是一项浩瀚的工程,如果都通过传统的人工监听进行质检管理,其所需的人力物力难以估计。因此在过去很长一段时间内,呼叫中心都利用抽听的方法进行质量监控管理,该方法一方面从业务角度而言,可能导致坐席人员工作的投机性,另一方面从统计学角度而言,简单的随机抽样所得出的结果并不能完整反应该坐席普遍的日常工作状态。质量监控工作对于呼叫中心而言具有重要的意义,其通过对坐席人员服务质量的检测和监控,确保坐席通话过程中的规范性、完整性和准确性,提升坐席人员日常的营销技能和服务水平,保证业务一线人员高水平服务的持续性。然而,传统质检人员每天面对大量的录音,常用方法都是通过听录音进行合规性检查,无法识别批量录音中所蕴含的重要信息,例如客户投诉信息中,有多少客户是不满意坐席服务态度,有多少客户是不满意产品价格。又假设面对业务量陡然激增,管理者是否能在第一时间洞察背后原因,从而及时制定应对策略?
随着大数据技术实现呼叫中心语音数据全量存储,质检系统也由传统人工抽检转变为机器录音质检100%全覆盖。借助深度学习方法所构建的声学模型和语言模型,语音分析系统能够更精确的将海量通话内容转化为录音文本文件。在此基础上,加入全面的质检评分规则:通过设置业务术语、礼貌用语、禁忌用语、静默时长等质检点计算机能够自动地对所有坐席人员的业务熟练度进行打分,从而筛选出评分较低的通话供质检人员调听,在全方位覆盖每通录音的同时,大幅降低了人工质检所需的成本。如此系统筛选与人工调听相结合的质检方式,形成了“机器质检泛听+人工质检精听”的新模式,进而有利于全面把握呼叫中心人工坐席服务质量,提高呼叫中心运营效率。
3. 文本分析结合机器学习深度挖掘客户价值
现阶段,大多数呼叫中心仍被定义为成本中心,那么如何充分利用呼叫中心数据资源,将呼叫中心打造为利润中心,是传统呼叫中心转型升级的关键。呼叫中心现有系统及分析报告中所包含的通话时长、响应率、成单量、投诉率等指标计算已经相当成熟,并且在关于构建客户群体划分、产品竞争分析、业务风险评估等机器学习模型上也小有建树,但仅此还无法完成呼叫中心由成本中心转向价值中心,最后成为利润中心的转型。这是由于单一结构化数据所构建的机器学习模型还无法全方位精准的预测客户行为,由此我们在构建机器学习模型时还需要添加诸如客户情绪等非结构化数据,以保证学习过程的完整性。
消费者金融保护局(CFPB)曾经就利用文本分析搭配机器学习的方法来探索自身的数据情况。他们的数据主要记录了客户对银行、信用卡公司和其他金融服务公司的投诉,其中包括客户信息、产品信息等结构化数据以及客户评论、语音文本等非结构化的数据。该分析方法首先使用文本分析技术来识别CFPB收集的自由形式数据中的负面情绪,然后利用机器学习算法建立一个预测模型,用来分析负面情绪程度与客户是否收到违规银行补偿,这两个变量之间的关系。研究结果表明,客户得到补偿与负面情绪之间确实存在相关性,当客户评论表现出较强的负面情绪,违规银行很大概率上会针对这部分客户进行补偿,特别是当有客户使用“偷”或者与之类似的词语时,其获得补偿的概率会更大。这项数据分析工作充分展示了文本分析和机器学习结合的力量,一旦文本分析被引入机器学习的预测模型中,该模型就能在发现行为模式的同时,回答为什么会产生这种行为模式,以及如何解决这种行为模式所带来的问题。
相对于其他部门而言,呼叫中心所特有的语音数据属于典型的非结构化数据,通过文本分析技术能够对这些非结构化语音数据进行淬炼,从中提取高价值、新维度的变量,例如客户满意度、客户情绪、产品偏好系数等,进而改进现有机器学习模型。结合文本分析和机器学习所实现的智能数据挖掘系统,将突破呼叫中心传统数据分析方法的局限性,更深层次、全方位的对客户进行扫描,使得呼叫中心与客户之间关系由简单交易到亲密信赖,最终达到价值依托。
随着大数据、云计算和人工智能技术的发展,海量语音数据存储成本不断下降,智能质检系统的精确度不断提升,客户价值获得更深层次的挖掘,届时呼叫中心将突破传统业务逻辑,形成全新的运营模式。在该模式下,呼叫中心日常运营将会主要围绕如下四个方面:全方位挖掘客户需求,提升客户感知及服务质量;关注员工发展,提高员工技能及日常工作满意度;聚焦中心实际需求,降低运营成本,提高营销收入;收集高价值信息,降低信息预测风险。随着新运营模式的不断深入,呼叫中心将真正从过去的被动服务转向主动服务,由成本中心转向企业核心利润中心。
30 Aug 2017
逻辑回归(Logistic Regression)是比较常见的机器学习算法之一,与SVM支持向量机类似,属于典型的 二分类算法。但逻辑回归相较于SVM的优点在于,前者不仅能够预测某事件是否将会发生,还包含该事件发生的可能性。例如想要知道张三是否会购买产品A,SVM所预测的结果只能告诉你,张三会购买或者不会购买,但逻辑回归能告诉你,张三有70%的概率购买产品A,从而你可以根据自己的业务设置风险率阀值。
关于逻辑回归的数学公式百度、Google已经有很好的解答,遂不再赘述。本博文主要介绍如何利用Python实现逻辑回归算法,该算法并没有引用sklearn包,因此具有一定的复杂度,但所实现的算法具有相当高的灵活性,适用于大规模数据分析系统的开发。
偏好使用sklearn的朋友,请跳转:sklearn主要模块和基本使用
输入数据集下载地址:训练集train,测试集test,预测集predict.txt
· 算法构建代码
# python -version 3.5+
import numpy as np
from numpy import *
## 构建sigmoid函数
def sigmoid(x):
return .5 * (1 + np.tanh(.5 * x))
## 训练逻辑回归模型
def trainLogRegres(train_x, train_y, opts):
# 构建训练样本
numSamples, numFeatures = shape(train_x)
alpha = opts['alpha']
maxIter = opts['maxIter']
weights = ones((numFeatures, 1))
# 选择最优的梯度下降法
for k in range(maxIter):
if opts['optimizeType'] == 'gradDescent': # 梯度下降法
output = sigmoid(train_x * weights)
error = train_y - output
weights = weights + alpha * train_x.transpose() * error
elif opts['optimizeType'] == 'stocGradDescent': # 随机梯度下降法
for i in range(numSamples):
output = sigmoid(train_x[i, :] * weights)
error = train_y[i, 0] - output
weights = weights + alpha * train_x[i, :].transpose() * error
elif opts['optimizeType'] == 'smoothStocGradDescent': # 平稳随机梯度下降法
dataIndex = list(range(numSamples))
for i in range(numSamples):
alpha = 4.0 / (1.0 + k + i) + 0.01
randIndex = int(random.uniform(0, len(dataIndex)))
output = sigmoid(train_x[randIndex, :] * weights)
error = train_y[randIndex, 0] - output
weights = weights + alpha * train_x[randIndex, :].transpose() * error
del (dataIndex[randIndex])
else:
raise NameError('Not support optimize method type!')
return weights
## 检验逻辑回归模型
def testLogRegres(weights, test_x, test_y):
numSamples, numFeatures = shape(test_x)
matchCount = 0
for i in range(numSamples):
predict = sigmoid(test_x[i, :] * weights)[0, 0] > 0.5 #设置阀值为0.5
if predict == bool(test_y[i, 0]):
matchCount += 1
accuracy = float(matchCount) / numSamples
return accuracy
## 预测逻辑回归模型
def preLogRegres(weights ,pre_x):
numSamples, numFeatures = shape(pre_x)
outfile = open('D://predict_result.txt', 'w') # 将概率值输出到文件
for i in range(numSamples):
predict = sigmoid(pre_x[i, :] * weights)[0, 0]
predict_m = sigmoid(pre_x[i, :] * weights)[0, 0] > 0.5 #是否阀值定为0.5
outfile.write(str(predict)+'\n')
print(str(predict_m) + ' ' + str(predict)) #同时输出是否及概率值
outfile.close()
· 测试结果代码
## step 1: 模型训练
def loadData(): # 载入训练集
train_x = []
train_y = []
fileIn = open('D://train.txt')
for line in fileIn.readlines():
lineArr = line.split() #设置分隔符
train_x.append([1.0, float(lineArr[0]), float(lineArr[1])])
train_y.append(float(lineArr[-1]))
return mat(train_x), mat(train_y).transpose()
fileIn.close()
train_x, train_y = loadData()
opts = {'alpha': 0.01, 'maxIter': 20, 'optimizeType': 'smoothStocGradDescent'} # 参数设置
optimalWeights = trainLogRegres(train_x, train_y, opts)
## step 2: 模型检验
def loadData1():
test_x = []
test_y = []
fileIn = open('D://test.txt')
for line in fileIn.readlines():
lineArr = line.split()
test_x.append([1.0, float(lineArr[0]), float(lineArr[1])])
test_y.append(float(lineArr[-1]))
return mat(test_x), mat(test_y).transpose()
fileIn.close()
test_x, test_y = loadData1()
accuracy = testLogRegres(optimalWeights, test_x, test_y)
print('模型预测精度:' + str(accuracy))
print('================================')
## step 3: 模型预测
def loadData2():
pre_x = []
fileIn = open('D://predict.txt')
for line in fileIn.readlines():
lineArr = line.split()
pre_x.append([1.0, float(lineArr[0]), float(lineArr[1])])
return mat(pre_x)
fileIn.close()
pre_x = loadData2()
print('模型预测结果:')
predict = preLogRegres(optimalWeights, pre_x)
· 部分结果展示
模型预测精度:0.9215686274509803
================================
模型预测结果:
True 0.969439134428
False 0.0121320687856
True 0.999891075052
False 0.0276136702724
True 0.948171859849
True 0.999981963204
True 0.960074174269
True 0.999639571954
True 0.999979133078
True 0.99509838304
True 0.999965399666
True 0.999948401765
False 0.00443630610109
···
19 Aug 2017
自然语言处理(NLP)很基础的一块便是构建文本分类器,其应用领域也比较广泛,例如新闻题材、垃圾邮件的自动分类等。现阶段构建文本分类器的算法大致包括:朴素贝叶斯、SVM支持向量机、最大熵分类器和BP神经网络等。本文选取SVM算法对某银行客服录音数据进行分类,分类方法及程序设计如下:
注:在构建文本分类器之前,请先确定配备以下环境
Python 3.5及以上版本
jieba分词包
详情请见: python之结巴中文分词
· 数据预处理方法论
1.导入原始语料(存储格式:TXT,utf-8)
原始语料下载地址
2.样本整理
3.导入停用词库和自定义词库
停用词库和自定义词库下载地址
4.文本分词:
- 删除第1行和最后2行语句(规范话术)
- 去除停用词
- 添加自定义词典
- 结巴分词(精确模式)
清洗目的:
1)避免无意义词汇的出现,干扰后续TF-IDF词频提取的准确度
2)降低SVM支持向量机分类计算时的空间复杂度
· 数据预处理程序设计
import jieba
import jieba.analyse
#添加自定义词典
jieba.load_userdict('e:\\lexicon\\CBwords.txt')
# 创建停用词列表函数
def creadstoplist(stopwordspath):
stwlist = [line.strip() for line in open(stopwordspath, 'r', encoding='utf-8').readlines()]
return stwlist
# 对句子进行分词
def seg_sentence(sentence):
wordList = jieba.cut(sentence.strip())
stwlist = creadstoplist('e:\\lexicon\\CBstopwords.txt') #加载停用词路径
outstr = ''
for word in wordList:
if word not in stwlist:
if word != '\t':
outstr += word
outstr += " "
return outstr
#删除第1行和最后3行语句
infile = open('e:\\SVM预处理输入\\in1.txt', 'r', encoding='utf-8')
line_new = infile.readlines() #注意readline 和readlines
infile_new = ''.join(line_new[1:-3])
outfile_new = open("e:\\new.txt","w",encoding='utf-8')
outfile_new.write(infile_new)
infile.close()
outfile_new.close()
#结果输出到txt文件夹中
infile_new1 = open("e:\\new.txt","r",encoding='utf-8')
outfile = open('e:\\SVM预处理输出\\outfile1.txt', 'w', encoding='utf-8')
for line in infile_new1:
line_seg = seg_sentence(line)
outfile.write(line_seg+'\n')
infile_new1.close()
outfile.close()
import jieba
import jieba.analyse
#添加自定义词典
jieba.load_userdict('e:\\lexicon\\CBwords.txt')
# 创建停用词列表函数
def creadstoplist(stopwordspath):
stwlist = [line.strip() for line in open(stopwordspath, 'r', encoding='utf-8').readlines()]
return stwlist
# 对句子进行分词
def seg_sentence(sentence):
wordList = jieba.cut(sentence.strip())
stwlist = creadstoplist('e:\\lexicon\\CBstopwords.txt') #加载停用词路径
outstr = ''
for word in wordList:
if word not in stwlist:
if word != '\t':
outstr += word
outstr += " "
return outstr
#删除第1行和最后3行语句
infile = open('e:\\SVM预处理输入\\in1.txt', 'r', encoding='utf-8')
line_new = infile.readlines() #注意readline 和readlines
infile_new = ''.join(line_new[1:-3])
outfile_new = open("e:\\new.txt","w",encoding='utf-8')
outfile_new.write(infile_new)
infile.close()
outfile_new.close()
#结果输出到txt文件夹中
infile_new1 = open("e:\\new.txt","r",encoding='utf-8')
outfile = open('e:\\SVM预处理输出\\outfile1.txt', 'w', encoding='utf-8')
for line in infile_new1:
line_seg = seg_sentence(line)
outfile.write(line_seg+'\n')
infile_new1.close()
outfile.close()
· SVM自动分类器方法论
1.导入数据集(存储格式:CSV)
预处理后数据集下载地址
Num表示id号(随意编排)
Content表示数据预处理后文本内容
Lable表示文本内容所对应的分类标签
2.划分为训练集和测试集A
3.转化为词频向量化矩阵,并计算TF-IDF值
4.训练SVM文本分类器
5.测试分类结果
6.计算精确度
7.稳健性检验
检验目的:提高文本分类器可信度
检验方法分别为以下两种:
1)训练集不变,将测试集A替换成测试集B,由此预测测试集B的分类结果
2)训练集与测试集A进行同类别相互替换,由此重新训练并预测分类器结果
8.整理预测结果
label 人工分类标签
predict 分类器预测标签
· SVM自动分类器程序设计
import csv
import numpy as np
from sklearn.feature_extraction.text import CountVectorizer
from sklearn.feature_extraction.text import TfidfTransformer
from sklearn.svm import SVC
from sklearn.pipeline import Pipeline
from sklearn import metrics
from sklearn.grid_search import GridSearchCV
# 1.读取训练集
def readtrain():
with open('e:\\test1.csv', 'r') as csvfile:
reader = csv.reader(csvfile)
column1 = [row for row in reader]
content_train = [i[1] for i in column1[1:]] #第一列为文本内容,并去除列名
opinion_train = [i[2] for i in column1[1:]] #第二列为分类标签,并去除列名
print ('数据集共有 %s 条句子' % len(content_train))
train = [content_train, opinion_train]
return train
def changeListCode(b):
a = []
for i in b:
a.append(i.decode('utf8'))
return a
train = readtrain() #读取readtrain数据集
content = train[0] #第一行文本内容赋给content
opinion = train[1] #第二行分类标签赋给opinion
# 2.划分训练集与测试集
train_content = content[:85] #训练集文本内容
test_content = content[85:] #测试集文本内容
train_opinion = opinion[:85] #训练集分类标签
test_opinion = opinion[85:] #测试集分类标签(用于计算精确度)
# 3.文本向量化
vectorizer = CountVectorizer() #将向量化函数赋给vectorizer
tfidftransformer = TfidfTransformer()
tfidf = tfidftransformer.fit_transform(vectorizer.fit_transform(train_content)) # 先转换成词频矩阵,再计算TFIDF值
print (tfidf.shape)
# 4.训练文本分类器
text_clf = Pipeline([('vect', CountVectorizer()), ('tfidf', TfidfTransformer()), ('clf', SVC(C=0.99, kernel = 'linear'))])
text_clf = text_clf.fit(train_content, train_opinion)
# 5.预测文本分类结果
predicted = text_clf.predict(test_content)
print ("打印预测结果:")
print (predicted) #打印预测分类结果
# 6.计算精确度
print ("============================================")
print ("计算预测结果精确度")
print ('SVC',np.mean(predicted == test_opinion))
· SVM自动分类器预测结果
打印预测结果:
['手机银行-安全工具-交易限额' '手机银行-安全工具-交易限额' '手机银行-安全工具-交易限额' '手机银行-安全工具-交易限额'
'手机银行-安全工具-交易限额' '手机银行-安全工具-交易限额' '手机银行-安全工具-交易限额' '手机银行-安全工具-交易限额'
'手机银行-安全工具-交易限额' '手机银行-安全工具-交易限额' '手机银行-安全工具-设备绑定与解绑' '手机银行-转账汇款-无法转账'
'手机银行-账户管理-关联账户' '手机银行-账户管理-关联账户' '手机银行-账户管理-关联账户' '手机银行-账户管理-关联账户'
'手机银行-账户管理-关联账户' '手机银行-账户管理-关联账户' '手机银行-账户管理-关联账户' '手机银行-账户管理-关联账户'
'手机银行-账户管理-关联账户' '手机银行-转账汇款-款项未到账' '手机银行-转账汇款-款项未到账' '手机银行-转账汇款-款项未到账'
'手机银行-转账汇款-款项未到账' '手机银行-转账汇款-款项未到账' '手机银行-转账汇款-无法转账' '手机银行-转账汇款-款项未到账'
'手机银行-转账汇款-款项未到账' '手机银行-转账汇款-款项未到账' '手机银行-转账汇款-款项未到账' '手机银行-转账汇款-无法转账'
'手机银行-转账汇款-无法转账' '手机银行-转账汇款-无法转账' '手机银行-转账汇款-无法转账' '手机银行-转账汇款-无法转账'
'手机银行-转账汇款-款项被退回' '手机银行-转账汇款-款项未到账' '手机银行-转账汇款-款项被退回' '手机银行-转账汇款-款项被退回']
============================================
计算预测结果精确度
SVC 0.9
09 Aug 2017
1.引言
最近看到许多同学对自然语言处理(NLP)都非常感兴趣,但对于NLP中一些基本的统计模型并不够了解。遂写下该博文,帮助大家掌握NLP中文分词这一大板块比较核心的统计模型——HMM隐马尔可夫模型。
HMM模型的全称是Hidden Markov Model,看关键词就知道该模型中存在隐含层,它是用来描述一个含有隐含未知参数的马尔可夫过程,其目的是希望通过求解这些隐含的参数来进行实体识别,说简单些也就是起到词语粘合的作用。
举一个经典的实例:一个北京的朋友每天根据天气【下雨,天晴】决定当天的活动【公园散步,购物,清理房间】中的一种,我每天只能在朋友圈上看到她发的消息 “我前天公园散步,昨天购物,今天清理房间了!”,那么我如何根据她发的消息推断北京这三天的天气?
2.隐马尔可夫模型概述
任何一个HMM模型都包括如下五方面:
Obs 显现层
States 隐含层
Start_p 初始概率
Trans_p 转移概率
Emit_p 发射概率
图:HMM隐马尔可夫模型变迁图
3.样例计算
命题:“我前天公园散步,昨天购物,今天清理房间了!”
HMM模型的计算公式:
# 隐含层
states = ('Rainy', 'Sunny')
# 显现层
observations = ('walk', 'shop', 'clean')
# 初始概率
start_probability = {'Rainy': 0.6, 'Sunny': 0.4}
# 转移概率
transition_probability = {
'Rainy': {'Rainy': 0.7, 'Sunny': 0.3},
'Sunny': {'Rainy': 0.4, 'Sunny': 0.6},
}
# 发射概率
emission_probability = {
'Rainy': {'walk': 0.1, 'shop': 0.4, 'clean': 0.5},
'Sunny': {'walk': 0.6, 'shop': 0.3, 'clean': 0.1},
}
【第一天】【散步】= [初始概率,下雨] * [发射概率,散步] = 0.6*0.1 = 0.06
【第一天】【散步】= [初始概率,晴天] * [发射概率,散步] = 0.4*0.6 = 0.24
因为0.24>0.06,所以第一天可能是 晴天
【第二天】【购物】= [初始概率,晴天] * [转移概率,M=>下雨] * [发射概率,购物] = 0.24*0.4*0.4= 0.0384
【第二天】【购物】= [初始概率,晴天] * [转移概率,M=>晴天] * [发射概率,购物] = 0.24*0.6*0.3= 0.0432
【第二天】【购物】= [初始概率,下雨] * [转移概率,M=>下雨] * [发射概率,购物] = 0.06*0.7*0.4= 0.0168
【第二天】【购物】= [初始概率,下雨] * [转移概率,M=>晴天] * [发射概率,购物] = 0.06*0.3*0.3= 0.0054
需要注意的是,这里0.0432是累积概率 ,所以全局最优解: 第一天 晴天;第二天 晴天(不能够理解这句话的同学请继续看第三天)
【第三天】【清理】= [初始概率,晴天,下雨] * [转移概率,M=>下雨] * [发射概率,清理] = 0.0384*0.7*0.5= 0.01344
【第三天】【清理】= [初始概率,晴天,下雨] * [转移概率,M=>晴天] * [发射概率,清理] = 0.0384*0.3*0.1= 0.00115
【第三天】【清理】= [初始概率,晴天,晴天] * [转移概率,M=>下雨] * [发射概率,清理] = 0.0432*0.4*0.5= 0.00864
【第三天】【清理】= [初始概率,晴天,晴天] * [转移概率,M=>晴天] * [发射概率,清理] = 0.0432*0.6*0.1= 0.00259
【第三天】【清理】= [初始概率,下雨,下雨] * [转移概率,M=>下雨] * [发射概率,清理] = 0.0168*0.7*0.5= 0.00588
【第三天】【清理】= [初始概率,下雨,下雨] * [转移概率,M=>晴天] * [发射概率,清理] = 0.0168*0.3*0.1= 0.00050
【第三天】【清理】= [初始概率,下雨,晴天] * [转移概率,M=>下雨] * [发射概率,清理] = 0.0054*0.4*0.5= 0.00108
【第三天】【清理】= [初始概率,下雨,晴天] * [转移概率,M=>晴天] * [发射概率,清理] = 0.0054*0.6*0.1= 0.00032
从这里就能看出,累积概率最大值为0.01344,所以全局最优解:第一天晴天;第二天 下雨;第三天 下雨
注:若认为第二天应该是晴天的同学,请区分全局最优解和局部最优解
Python程序实现
# Python -version 3.5以上版本
# 打印路径概率表
def print_dptable(V):
print (" ",)
for i in range(len(V)):
print ("%7d" % i,)
print ()
for y in V[0].keys():
print ("%.5s: " % y,)
for t in range(len(V)):
print ("%.7s" % ("%f" % V[t][y]),)
print ()
def viterbi(obs, states, start_p, trans_p, emit_p):
# 路径概率表 V[时间][隐含层] = 概率
V = [{}]
# 中间变量
path = {}
# 状态初始化 (t == 0)
for y in states:
V[0][y] = start_p[y] * emit_p[y][obs[0]]
path[y] = [y]
# 对 t > 0 跑一遍维特比算法
for t in range(1, len(obs)):
V.append({})
newpath = {}
for y in states:
# 概率 隐含层 = 前状态是y0的初始概率 * y0转移到y的转移概率 * y表现为当前状态的发射概率
(prob, state) = max([(V[t - 1][y0] * trans_p[y0][y] * emit_p[y][obs[t]], y0) for y0 in states])
# 记录最大概率
V[t][y] = prob
# 记录路径
newpath[y] = path[state] + [y]
path = newpath
print_dptable(V)
(prob, state) = max([(V[len(obs) - 1][y], y) for y in states])
return (prob, path[state])
# HMM 实例导入
states = ('Rainy', 'Sunny')
observations = ('walk', 'shop', 'clean')
start_probability = {'Rainy': 0.6, 'Sunny': 0.4}
transition_probability = {
'Rainy': {'Rainy': 0.7, 'Sunny': 0.3},
'Sunny': {'Rainy': 0.4, 'Sunny': 0.6},
}
emission_probability = {
'Rainy': {'walk': 0.1, 'shop': 0.4, 'clean': 0.5},
'Sunny': {'walk': 0.6, 'shop': 0.3, 'clean': 0.1},
}
def example():
#将实例值传输到viterbi函数
return viterbi(observations,
states,
start_probability,
transition_probability,
emission_probability
)
print (example())
Python程序结果
第1天 第2天 第3天
Rainy: 0.06000 0.03840 0.01344
Sunny: 0.24000 0.04320 0.00259
第3天最大概率值及预测结果:
(0.01344, ['Sunny', 'Rainy', 'Rainy'])
参考文献:
- HMM与分词、词性标注、命名实体识别
01 Aug 2017
关于机器学习对银行业影响的研究自20世纪以来,已经持续了很长一段时间,但一直没有获得过重大的突破。直到大数据技术的实现,摆脱了传统数据存处理技术对计算机硬件要求的枷锁,机器学习才真正在银行业务中发挥出了其实战作用,例如信用风险管理等。
机器学习(Marchine Learning)听起来比较复杂,很有未来感,但其实它的工作原理很简单。简单来说,机器学习就是结合大量类似于决策树的决策模型,来创建一个更加精确的模型。通过快速地对这些决策模型进行迭代训练,机器学习能够找到“隐藏”的最优解,特别是在统计模型中经常遗漏的非结构化数据。
· 机器学习在银行业中的应用
银行投资组合中经常会出现长尾数据,相对于传统的统计方法,机器学习对长尾数据的解释力更强。考虑到那些个体投资较少但总体数量庞大的客户,我们通常对这一群体的客户知之甚少,并且他们也是相当被动的接受银行业务。但是,机器学习能够对这类客户的行为进行很好的分析,从而指导业务人员有针对性的挖掘潜在的盈利目标。
举一个机器学习在银行业信用卡产品线中实际应用的案例,该银行的目标是针对每个客户寻求最优的信用额度,简单来说就是他们希望知道能够在哪些方面增加或减少信用额度。现有统计模型虽然已经具有了相当可观的预测能力,但当利用机器学习方法去重新训练与之相同的数据集,并在训练时添加一些诸如政策规定等非结构化数据时,模型的预测能力直接提高了1.6倍。这种改进能够从基于现有模型中风险较低的客户手中获得显著收益,由此会导致信用额度下降,并且会避免因为信用额度增加而导致的额外损失。
· 机器学习应用的局限性及解决方案
那么,是什么导致了银行业并没有更广泛地采用机器学习方法呢?通常来说,有以下三个方面的问题:首先,变量规模的扩大会使得当前的银行系统需要更多的资金进行研发和维护;其次,机器学习中许多模型都是一个黑盒子,以至于造成了预测结果的不可解释性,这严重触犯了银行业的稳定规范;最后,机器学习准确性的检验比较复杂,因此使用机器学习方法在验证环节具有一定的挑战。
尽管机器学习方法具有诸如此类的问题,但也有一些切实可行的办法来弱化这些问题。例如,直接使用现有所有可用的变量开始建模,根据每个变量对模型的贡献率快速地进行筛选,从而在不影响模型预测精度的前提下,留下一批可受控制的变量;或者是减少机器学习模型中的一些“分支”,从而获得一组核心的线性规则,这些规则所使用的变量更少,但同时还保留了原模型80%以上的预测能力。
关于银行业是否能够用更复杂的机器学习模型来获取更多的价值?这个答案是肯定的,并且也是未来银行业发展的一个趋势。机器学习通过利用银行业现有模型所忽略的大量的“小”数据,加上内外部监管系统中常见的非结构化数据,从而能够更深入的了解潜在客户需求,帮助银行挖掘更多的客户价值。
11 Jun 2017
结巴分词(Jieba)是python中一个比较常用的中文分词包,功能包括:中文分词、词性标注、未登录词识别等。本文将着重介绍以下两个部分:Part A. 结巴分词下载与安装; Part B. 结巴中文分词基础应用。
Part A 结巴分词下载与安装
1.下载结巴分词(jieba)
官方下载地址:https://pypi.python.org/pypi/jieba/
注:可尝试官网中所述的其他安装方法
2.将下载好的ZIP包,解压缩到新建文件夹中
3.进入Windows下cmd命令框,输入如下命令
C:\Users\Admin>e:
E:\>cd 新建文件夹
E:\新建文件夹>cd jieba-0.38
D:\新建文件夹\jieba-0.38>python setup.py install
#=========== 安装完成 ============#
Part B 结巴中文分词基础应用
结巴分词共支持如下三种分词模式:
精确模式 也是最常用的模式,适合文本分析;
全模式 把句子中所有的可以组成词的词语都切分出来;
搜索引擎模式 在精确模式的基础上,对长词再次切分,从而提高召回率;
Python程序设计
import jieba
text="小明硕士毕业于中国科学院计算所,后在日本京都大学深造"
seg_list = jieba.cut(text, cut_all = False)
print("Precise Mode: " + "/".join(seg_list)) #精确模式
seg_list = jieba.cut(text, cut_all=True)
print("Full Mode: " + "/ ".join(seg_list)) # 全模式
seg_list = jieba.cut_for_search(text) #搜索引擎模式
print("Search Mode: " + "/".join(seg_list))
Python执行结果
Precise Mode: 小明/硕士/毕业/于/中国科学院/计算所/,/后/在/日本京都大学/深造
Full Mode: 小/ 明/ 硕士/ 毕业/ 于/ 中国/ 中国科学院/ 科学/ 科学院/ 学院/ 计算/ 计算所/ / / 后/ 在/ 日本/ 日本京都大学/ 京都/ 京都大学/ 大学/ 深造
Search Mode: 小明/硕士/毕业/于/中国/科学/学院/科学院/中国科学院/计算/计算所/,/后/在/日本/京都/大学/日本京都大学/深造
08 Jun 2017
互联网的迅猛发展给用户带来了大量的信息,一方面大量的信息可以满足用户在信息时代对信息量的需求,但另一方面过大的信息量会使用户在面对纷繁复杂的信息时,难以从中快速获得有效的部分,降低信息的使用效率,诱发信息超载问题。解决信息超载问题一个强有力的办法就是采用用户推荐系统,推荐系统是根据用户个人特征和历史行为习惯等因素,将用户可能感兴趣的信息推荐给用户的智能系统。和搜索引擎相比,推荐系统通过统计、建模等手段分析用户的行为偏好,不仅能够给用户推荐当前需要的产品信息,还能引导用户发现自己潜在的信息需求。推荐系统现已广泛应用于很多领域,其中最典型并具有良好发展前景的领域就是电子商务。
如上图,以电子商务的推荐系统为例,其输入数据可以是多种多样的,归纳起来主要分为用户(user)、产品(product)和评分(ratings)三个维度,并分别对应一个矩阵的行、列、值。其中0、1表示用户对产品的评分,该评分可以是二值型变量,也可以是0~5的分值等,问号表示用户对该项产品评分的缺失。推荐系统主要分为“预测”和“推荐”两个环节,“预测”要解决的问题就是推断每一个用户对不同产品的偏爱程度,“推荐”要解决的问题是根据预测环节所计算的结果向用户推荐其没有打过分的产品,即矩阵中的问号部分。但目前绝大多数的推荐算法都把精力放在“预测”环节上,“推荐”环节则根据预测环节所计算的得分由高到底排序推荐给用户。
· 基于协同过滤的用户推荐
基于协同过滤(collaborative filtering,CF)的用户推荐算法 目前主要分为两类:memory-based CF 和 model-based CF, 其中memory-based CF 又包括基于用户的协同过滤算法和基于产品的协同过滤算法。前者是根据邻居用户的偏好信息产生对目标用户的推荐,它基于这样一个假设,如果一些用户对某一类项目的打分比较接近,则他们对其它类项目的打分也比较接近;后者是根据用户对相似产品的评分数据预测目标产品的评分,它是建立在如下假设基础上,如果大部分用户对某些产品的打分比较相近,则当前用户对这类产品的打分也会比较接近。memory-based CF算法不仅计算简单且精确度较高,其核心就是通过相似性度量方法计算出最近邻的集合,并将最近邻的评分结果作为推荐预测结果返回给用户。
model-based CF最常用的方法就是矩阵分解,即把原始矩阵分解成两个矩阵相乘的形式。该方法的优势在于将评分矩阵R分解成U和V两个矩阵后,这样评分矩阵中缺失的评分就可以通过U矩阵的某列和V矩阵的某行相乘得到,而U矩阵和V矩阵的具体数值又可以通过梯度下降法多次迭代后获得。其背后的核心思想就是找到两个矩阵,使得它们相乘之后所得到的矩阵与评分矩阵尽可能的相似,从而评分矩阵中缺失的值则由这两个矩阵的乘积值来填补。
· 深度学习优化推荐系统的演变过程
Model-Based CF的目的就是找到基于用户的隐向量矩阵U和基于产品的隐向量矩阵V,目前很多公司会采用深度学习算法来寻找这些较为抽象的隐向量矩阵,以提高用户推荐系统的准确率。最初用来优化推荐模型的深度学习算法名为Autoencoder,简称AE ,是一种无监督学习模型。利用AE预测用户对某个产品缺失的评分值,其原理类似于BP神经网络的反向传播方法,该模型的输入为评分矩阵中的一行或者一列,通过迭代计算出最小损失度来进行模型训练,并根据训练结果预测缺失的产品评分,进而对用户进行个性化推荐。由于训练样本中可能存在噪音数据,因此在AE的基础上又提出改进的深度学习算法名为DenoisingAutoencoder(DAE)。DAE虽然在去除噪声数据上有斐然的功效,但其又显现出另外一个问题——机器学习的泛化能力。这时便应运而生了Stacked DenoisingAutoencoder(SDAE)深度学习算法,SDAE是一个多层的AE组成的神经网络,其前一层自编码器的输出作为其后一层自编码器的输入。在SDAE的基础上,机器学习专家们又提出了Bayesian SDAE模型,该模型假设SDAE中的参数满足高斯分布,同时假设用户的隐向量也满足高斯分布,通过最大后延估计得到想要优化的目标函数,进而利用梯度下降训练模型参数,从而得到基于用户和产品对应的隐向量矩阵U和V,用来拟合原始评分矩阵R。
当前深度学习在推荐领域已具有广泛的应用,一些常见的深度学习模型例如AE、DNN、CNN等都能较好的应用于推荐系统中,但对于不同行业领域的用户推荐,应该具有更强针对性的模型。相信随着信息化的不断发展,深度学习会不断完善成为推荐系统中一项必不可少的技术手段。
18 May 2017
在信息爆破增长的时代,我们以成倍的速度收集到海量的数据,但当我们拥有这些数据时,却不敢说自己真正了解它。据IDC统计,当今有75%以上的数据属于非结构化数据,即数据没有固定的存储与展现格式,并且根据福布斯的研究表明,在传统电脑屏幕上人们的双眼仅能以最高每秒100字节的速度读取信息。不规则的外部数据和人类自身条件的局限性,使得我们难以高效地处理大批量的数据集。由此我们渴望新技术的出现,能够帮助我们应对这复杂多变且规模庞大的数据信息,此时虚拟现实技术便展现出其惊人的效用。
虚拟现实技术(VR) 早在20世纪60年代,就以类似于3D幻灯片的形式出现过,然而直到现在,VR在商业和工业活动中才得以真正的运用,例如索尼的Project Morpheus眼镜,三星的Gear VR耳机等。当然VR带领用户进入3D空间不仅仅是因为好玩那么简单,它还有更多额外的价值。俗话说“字不如表,表不如图”,数据可视化对于数据观测的重要性毋庸置疑,而VR能够为用户提供身临其境的数据观测环境,并利用动态交互功能提高用户的数据操纵能力。
· 沉浸式大数据观测方法
在2D屏幕上一次性观测大批量的数据并不是件轻松的事情,而VR提供的沉浸式大数据观测方法能够有效的解决这个问题。试想一下,如果你能站在海量数据的中心,朝向某个数据点,然后转瞬间飞向一个离群点是一种怎样的数据观测方式?使用VR,用户可以真正走入自己的数据,他们可以找到流动数据的峰值或者从不同的角度查看同一数据点。虚拟现实影院便是沉浸式VR系统的典型应用,它用六个三米高的屏幕组成一个闭合的立方体,在立方体外围分别对应放置六台投影设备,当用户置身于立方体中心观看影片时,由六个平面组成的高维图像会使用户完全沉浸在虚拟现实之中。
有前瞻性的商业公司早已使用VR的沉浸式功能来解决复杂的数据问题。几年前,美国Goodyear公司就利用VR技术来解决他们的轮胎为何在比赛中表现不佳的问题。为了找出问题的根源,Goodyear公司将比赛中汽车和轮胎的数据复制到了虚拟现实环境中,沉浸式的数据读取方法使得重要的数据更容易识别,因此他们很快便发现了轮胎压力数值的变化并据此进行改良。
· 交互式大数据处理方法
交互式是处理大数据的关键,如果没有交互式数据处理能力,沉浸式数据观测方法其实并不具有太大意义。几十年来,我们一直在使用静态数据模型来了解动态数据,但VR已经为用户配备了动态处理数据的能力。使用VR,用户能够伸手触碰到自己的数据,堆叠或拉伸相关数据,甚至创建闪烁点用来标注数据检索痕迹。届时,大数据将成为一种动态的交互体验,这使得它变得更容易理解和操纵。以家装行业为例,VR技术不仅能够帮助用户真实地感受到装修后房间的空间布局、材质颜色等搭配,还能够借助动作捕捉设备,让用户在虚拟现实环境中伸手打开门窗、衣橱,在桌子上摆放几件自己喜爱的玩物,甚至来一场恶作剧将房间变得凌乱不堪。
如今随着信息量的不断扩大,我们必须找到更有效的方式来应对大数据时代所带来的各种挑战。当我们能够身临其境的触碰到动态数据的时候,我们对数据的理解能力,甚至是数据分析能力会达到一个前所未有的高度,而VR技术的发展恰巧帮助我们满足了这一点。
15 May 2017
据统计,世界上大约有80%的数据源都是非结构化的,例如,博客文章、评论日志、呼叫中心的语音文本等。由于非结构化数据并不是以行列的形式记录到数据库中,那么诸如线性回归等传统的数据分析算法对于这类数据并不适用,由此我们需要用到文本分析技术来解决如何挖掘非结构数据等相关问题。随着近几年技术的发展,文本分析已经到达一个比较成熟的水平,并且被广泛运用到各个领域。Gartner在“大数据炒作周期”报告中,明确指出文本分析是近两到五年内能够产生巨大商业价值的主流技术,虽然现阶段单独对非结构化数据进行挖掘已经能够发现大量的商业机会,但如果将文本分析与机器学习相结合,即对非结构化与结构化数据进行联合挖掘,将产生更多的商业价值。
· CFPB的数据分析案例
消费者金融保护局(CFPB)曾经就利用文本分析搭配机器学习的方法来探索自身的数据情况。他们的数据主要记录了客户对银行、信用卡公司和其他金融服务公司的投诉,其中包括客户信息、产品信息等结构化数据以及客户评论、语音文本等非结构化的数据。该分析方法首先使用文本分析技术来识别CFPB收集的自由形式数据中的负面情绪,然后利用机器学习算法建立一个预测模型,用来分析负面情绪程度与客户是否收到违规银行补偿,这两个变量之间的关系。研究结果表明,客户得到补偿与负面情绪之间确实存在相关性,当客户在CFPB的评论中表现出较强的负面情绪,违规银行很大概率上会针对这部分客户进行补偿,特别是当有客户使用“偷”或者与之类似的词语时,其获得补偿的概率会更大。
这项数据分析工作展示了文本分析和机器学习结合的力量,一旦文本分析被引入机器学习的预测模型中,该模型就能在发现行为模式的同时,回答为什么会产生这种行为模式,以及如何解决这种行为模式所带来的问题。SAS公司的数据分析总监Sabo曾经说过:“所有的文本分析都是在没有数据结构的情况下生成数据结构,当你能够利用机器学习对结构化数据进行建模预测时,加入文本分析产生意想不到的效果。”
· 文本分析技术之情绪分析
正如CFPB中利用文本分析发现客户情绪的案例,在文本分析领域中理解客户的想法和感觉的技术,通常被称为情绪分析。这里文本分析技术的实现是基于自然语言处理(NLP),文本分析中最有希望也是最具挑战性的领域之一就是要使用自然语言处理来了解客户在使用一组单词时真正意义上的含义。例如,“这是伟大的”总是积极的?如果文字读到“你一直非常有帮助”,那是一个真正和发光的评论还是一个愤世嫉俗的反驳?通常,我们人类喜欢以暧昧,模糊的语言来表达自己的情感。随着越来越多的客户互动通过电子邮件、聊天和短信,而不是电话或面对面的讨论,我们失去了来自语音音调和表情特征等重要的线索。然而情绪分析能够借助前沿的数据分析技术来寻找语言的微妙之处。
· 其他文本分析技术的涌现
文件术语矩阵(DTM) 列出了我们正在挖掘的文本中所有的唯一术语。这种简单但通常非常大的中间结果为进一步分析提供了基础。例如在产品销售环节,特定术语基于一定频次的出现是否会对客户的购买行为产生影响?这时我们会根据信号强度对从最弱到最强的正式建模的单词或短语进行排序。这些提取出的单词和短语的频率可以在我们的建模数据集中的新列中以数字表示,并且直接并入到搜索最佳的预测模型中。
命名实体提取(NEE) 是基于自然语言处理,借鉴了计算机科学,人工智能和语言学的学科。通过分析文本的结构,NEE能够识别出文本哪些部分可能代表诸如人员,地点,组织,职称,产品,货币金额,百分比,日期和时间等实体。对于每个识别的实体,NEE算法生成一个表示识别正确概率的分数。因此,我们的数据科学家可以设计概率阈值,例如,只有那些得分高于80%的实体,在创建结构化特征和将该特征包含在预测模型中。
主题模型(LDA) 能够有效分割和检测客户行为变化,用于查找能够进行分类和分组的数据中的相似性。这种灵活的技术通常用于营销中,为具有相似存款,取款和购买行为的客户生成原型,并且可以应用于呼叫中心客户来电的分类。在后一种情况下,我们可以确定客户呼叫的有意义的原因,并使用这些见解更好地预测损耗风险,以更准确地预测电话量,甚至改进产品的功能和结构。
随着与客户相关文本数据量的不断扩大,企业必须将一系列文本分析技术融入到机器学习算法中。现阶段文本分析还存在着巨大的尚未开发的价值和潜在的市场竞争优势,相信在不久的将来,结合文本分析和机器学习所实现的智能项目,将在我们的生活中变得触手可及。
08 May 2017
1.双击Setup.exe文件,开始安装
2.选择安装Custom
3.选择操作系统x64表示64位,x86表示32位
4.选择安装路径
5.点击3次下一步,直到要求输入账户密码(可根据个人的喜好填写)
6.继续点击N次下一步+Finish,完成安装
08 May 2017
1.输入网址(www.mysql.com)
2.点击Downloads =>下载Mysql Community Editon社区版
注:该页面包括以下三个版本
Mysql Enterprise Edition 企业版
Mysql Cluster CGE 集群版
Mysql Community Editon 社区版
3.点击Mysql Community Server下Download
4.下拉找到 Mysql Install for Windows => 点击Download
5.选择下载文件
6.点击直接下载
注:该版本内包含32位和64位,安装时注意选项配置
08 May 2017
从2012年开始,宏观到人工智能引爆工业4.0变革,微观到智能家居改变传统生活,我们总能耳濡目染到“人工智能”这个概念。为什么“人工智能”突然间受到如此高度的关注?这源于“深度学习”革命性的突破,直接推动了“人工智能”由方法论走向实体产品。例如我们常听到的无人驾驶技术、无人机送货服务等,都是人工智能在生产和生活中的具体应用。既然说到了人工智能与深度学习,这里得再引入一个“机器学习”的概念。因为这三者之间的关系类似于一个同心轴,即人工智能涵盖了机器学习,而深度学习只是机器学习中的一个重要分支。具体可见下图:
那么这三者具体又都是什么呢?
· 人工智能(Artificial Intelligence):机器模拟人类的科学
美国麻省理工学院温斯顿教授曾经说过:“人工智能就是研究如何利用计算机代替只有人类才能做的智能工作。”即人工智能本质是研究人类智能活动的规律,构造具有一定人类智能的人工系统,从而应用计算机的软硬件来模拟人类某些智能行为的基本理论、方法和技术。
不知道大家有没有试着用苹果手机的“Siri功能”,它就是人工智能应用的一个典型代表。首先你得说一句话作为语音输入,然后苹果后台会把你说的话转译成文本,接下来系统会根据输入的文本进行分词、实体识别、依存句法等文本挖掘,最后输出一个有效的结果反馈给你。
这便是利用机器理解自然语言的典型案例,其他的人工智能领域还包括:指纹识别、人脸识别、智能搜索、专家系统等。
· 机器学习(Machine Learning):实现人工智能的一种方法
简单来说,机器学习就是利用机器替代人类学习的过程。图像识别一直是机器学习广泛应用的领域之一。关于图像识别,首先要搜集大量的图像A,在此基础上,依据多种组合算法让机器识别并记录这些图像A。然后输入一批新的图像B,机器就能够根据之前学习到的图像A的信息,将图像B中与A信息匹配度高的图像归结为一类,将匹配度低的图像B重新经过模型训练分组。这便是机器学习的典型应用,其目的是利用机器高效处理并存储数据的能力去替换原有人脑长时间记忆学习的过程。
· 深度学习(Deep Learning):实现机器学习的一种技术
快进到今天,我们看到的是一个夺人眼球的技术——深度学习。而在深度学习的模型中,受宠爱最多的就是被用在大规模图像识别任务中的卷积神经网络(Convolutional Neural Nets,CNN),简称ConvNets。
深度学习强调的是模型中的参数是从数据中学习获得的。由此深度学习也带来了一些其他需要考虑的问题。例如典型的卷积神经网络,如上图机器面对的是一个高维的空间模型,因此想要实现其参数自动化调整需要两个方面的硬性指标:第一,大量且真实有效的数据,第二,强大的计算机运算能力。
总而言之,不要过于崇拜深度学习框架,但也不要害怕对这些框架进行裁剪和调整,以得到能和你的算法协同工作的软件框架。未来的Linux内核也许会在一个非常流行的深度学习框架上运行,例如Caffe。记住,历史上所有成功的产品总是需要伟大的愿景、领域的专业知识、市场的开发和最重要的——人类的创造力。
参考文献:
- What’s the Difference Between Artificial Intelligence, Machine Learning, and Deep Learning?
20 Apr 2017
数字运营服务正在提高各行业的竞争门槛。为了抓住这个机会,现有企业应该采用一种新的运营模式,这种模式能够极大的改善用户体验,将数据优势转化为用户体验优势。纵观各个行业,客户的满意度直接关系着他们愿意为公司产品所支付的费用和他们对公司品牌的忠诚度。在公司价值提升和长期竞争优势中,提供数字运营服务几乎成为各行业提升用户体验的主要动力。随着像亚马逊、苹果和优步等高科技公司不断革新以提供更简单、更直接的个性化用户体验,类似于钢铁、化工等传统行业也在采取大胆的举措,建立动态的数字生态系统,以满足用户的需求。传统的运营模式着重于优化企业内部功能,而数字运营服务的重点是在于满足客户的需求,因此从传统运营模式转化为数字化运营模式是一项比较繁琐的过程,其中包括设计一套以客户为中心的数字化流程、提高公司对用户需求的洞察力、诱导用户采用数字化渠道等。
· 以客户为中心的数字化流程设计
提供良好的用户体验的关键是根据数字化用户需求重新设计一整套流程,其主要目标是彻底变革传统、低效的运营方式。在全新的数字化流程设计上,公司会以用户的需求和偏好作为产品的出发点,这意味着新的设计将根据用户反馈立即进行测试和迭代。这样的流程设计有助于为原始模型实时传输用户的动态数据,由此保证公司能够对用户行为进行连续性的监测。然而这种方法必须能够同现有营销渠道形成无缝链接,促使新流程能够与原始遗留进程同时运行,以保证新流程的设计满足原始客户的需求。
· 提高洞察力的速度和敏捷性
快速变化的消费者动态数据需要更快捷的、无阻碍的“实时”洞察,从而能够影响到众多领域的决策制定。传统的市场研究方法往往花费太长的时间,并且由于不能够进行迭代训练,从而缺少不断整合客户反馈信息的能力。因此公司需要采用速度更快的研究方法来提升洞察力,诸如对当前客户接触点进行深入的用户体验评估,然后将这些数据与竞争对手的行为模式进行比较。通过对比找出一些关于数字化用户体验设计的优点与缺点,由此指导以客户为中心的数据化流程的设计与实施。
· 诱导用户采用数字化渠道
近年来,大多数企业已显著提高建立有效数字渠道的意识。然而仍有许多原因导致客户无法采用数字化渠道,从而造成企业采集用户需求偏好、产品交付速度等数据指标的困难,并由此限制了企业效率的提升和成本的控制。因此,公司精心的策划去推动用户采用数字化渠道是成功转型的关键,其中包括三种常见的方法:客户推广,使用有效的营销手段对于吸引消费者是至关重要的,例如搜索引擎优化(SEO)、搜索引擎广告(SEA)或离线活动;功能捆绑,由于单个用户使用的应用数量有限,所以将多个功能整合到一个应用中,有助于提高用户使用的可能性;客户激励,提供激励也是推动用户采用数字化渠道的主要方式之一,公司一般会采用优惠券或奖金折价的方式诱导消费者通过数字渠道进行消费。
在快速变化的市场环境下,加深对客户的了解,提高用户体验的满意度,有助于增强公司整体的竞争优势。通过重塑传统的运营模式,取而代之的是一种将数字技术和运营能力结合起来的新的运营模式,由此公司便能够设计一套以客户为中心的数字化流程,以此提高对客户行为的洞察力,提升用户体验的满意度,将数据优势转化为用户体验优势。
15 Apr 2017
大数据时代的到来,越来越多的企业管理层意识到数字转化的重要性,但大多数企业的数字转化还处于炒作的层面,那么如何将数字转化变为公司日常的工作机制?数字化资源应该存储在哪里?需要实现哪些新的功能?其最首要的任务是建立一个具有速度、精确度和灵活度的操作模型,该模型可以通过改善客户体验、优化内部流程来解锁更多的客户价值,从而落实数字转化。由此本文将从以下四个方面阐述如何建立“下一代”操作模型,促成企业的快速、高效、数字化。
· 拥有跨职能的技术团队
“下一代”操作模型将以跨职能团队为运营核心,通过多种类技能的组合,突破传统模型专业局限性的问题。例如,现有许多保险公司正在组建新的索赔团队,其中包括传统团队中所需的律师、销售员等,还特别添加了医生、工程师等其他领域的专家,以便他们在工作时能获取额外的观察视角。这些团队还与技术专家紧密合作,设计数字工具与数据化流程,以最大限度提高承保的准确性和效率。在任何领域,管理层都需要广泛考虑如何配置团队,并通过不断的调整团队配置以适应不断变化的客户需求。
· 灵活的IT资源
技术团队在企业数字转化过程中的重要性的毋庸置疑的,他们从原始单一的功能需求研发转变为数字化商业模式的生产方式。IT基础结构需要灵活的模块化,以提供高效且具有成本效益的解决方案,并且能够快速的开发或修改应用程序。 技术团队必须与商业专家合作,以了解如何能够实现新的业务方式,并创造新的收入来源。与之对应,企业管理层也应该了解如何快速构建、测试及发布软件和基础设施改进的过程,从而能够高效的组合业务和技术人员,使得IT资源变得越发灵活。
· 快速响应的管理系统
“下一代”操作模型也涉及到学习、测试及实验,这意味着企业需要一套管理系统来进行维护。那么如何利用数据做出决策并高效运行?企业需要在前端、后台操作和产品团队之间建立快速反馈的机制,以确保正确的信息能够传递给决策者。为了实现这一目标,多数企业正在构建商业智能系统,以收集日常生产活动中产生的大量数据,并创建友好的管理界面及报告,其中一些可以实时捕捉用户活动。绩效管理也变得越来越真实,依据每天的数据来指导人员调控及任务分配。
· 一种敏捷地、客户为中心的商业文化
敏捷地、以客户为中心的商业文化在数字化过程中具有重要的意义。例如,公司不能再将产品发布作为一次性过程,在产品能够完美的适应市场需求之前,企业需要迅速的从客户反馈中学习经验,并针对需要交付的产品做出有必要的更改。管理层必须适应这种灵活性,并进行正确的调整以实现商业文化中的敏捷性。正如一家资产管理公司的顶级团队表示,当他们抛弃了原有的预算流程,并大力推动高管们获得更多价值时,在预算审查中,他们重新分配以获得了最高价值的资产项目
如今,大多数企业意识到,在大数据时代,需要进行数字转化来推动企业的长期发展。从上述四个方面开始,不断的进行测试及修改企业的操作模型以支持数字转化,从而成为一个真正的快速、高效、数字化的企业。
01 Apr 2017
1.运行 -> cmd -> 输入jupyter notebook –-generate-config
2.打开C盘 -> 用户 -> admin -> 看到.jupyter
3.进入.jupyter -> 右键jupyter_notebook_config -> Edit with Idle
4.找到c.NotebookApp.notebook_dir= 修改路径(注意去除#),后保存
注意:路径中jupyter为用户新建文件夹(可选择自己的路径)
5.重新打开jupyter notebook(路径修改成功)