分类
Technology|技术

通义听悟简析情景剧流程与其他LLM比较

题记:

本文旨在测试“通义听悟”对音频和视频的转写识别和信息提炼能力。以及与其他大语言模型(Large Language Model,LLM)对纯文本进行信息提炼能力的比较。本文完整真实地转载测试结果。所有结果均为第一次测试得出。本文无意推广任一LLM。

本文通过转写情景剧流程进行测试。使用该情景剧的原因是该剧有充足的对白内容,且不含可能造成干扰的音效。同时该剧中有单人独白、双人对话,多人讨论的形式,能够充分测试LLM。本文仅使用该剧作为测试素材,不评价剧中提及的观点,也无意推广该剧涉及的课程。

文末附本次测试所使用的相关资源链接。


准备内容

收到阿里云的广告短信,邀请体验“通义听悟”。恰好最近在学习管理网课,就尝试一下它能不能提高我的学习效率。

首先要准备网课的音频或视频材料。为了实验,我做了三手准备。第一,使用Chrome的Sample插件直接内录网页播放的音频。第二,手机录屏了网课视频。第三,看视频写文字稿。

新建内容主要有实时记录、上传音视频和导入云盘三大途径。本文用的是上传音视频的方式。常见的音视频格式都支持。单个视频最大支持4G、单个音频最大支持500M。

可以按事先的了解选择区分发言人。但是实测,即使选择“2人对话”但实际出现多于2人还是能够区分开的。

图1 上传文件

内容在上传完毕后,根据设置自动开始转写为记录。实测接近6分钟的内容转写时间为1分钟左右。转写完成后,以卡片的形式出现在“我的记录”页面的对应文件夹中。

卡片题目默认为上传文件的文件名,可以修改。然后是一些AI提炼的关键词。主内容部分,如果是上传的是视频,会出现视频的第一帧的缩略图。如果是音频,则会出现转写文本。最后是音视频的长度和上传时间。

图2 记录卡片

记录页面还可以星标收藏某些记录。切换视图为卡片或列表模式。按记录是否已读、语言类型、文件来源、上传日期等要素筛选。以及批量标记已读、移动到其他文件夹或删除。


剧本

以下是我结合字幕听写的剧本全文:

《刚当上manager 既兴奋又让你头疼》

时长:5分51秒
下面我会分镜头画面描述这个视频。

镜头画面一
办公室的卡座里,一部电话响了。一个成年男性接起电话,接下来是电话交流的对话:
小刘(成年男性):“喂,吴总。”
吴总(成年女性):小刘啊,你能过来一下吗?有点事找你。
小刘:好的好的,我现在就过去。
小刘离开办公室卡座,镜头画面一结束。

镜头画面二
小刘敲了一下吴总办公室的门。
吴总:“进来。把门带上。”
小刘关了门,然后坐在吴总的对面,吴总首先发话。
吴总:“小刘。今天叫你过来,就是想跟你商量一下最近你们组的人事变动。你看,你来公司也很多年了。从你还是应届毕业生的时候就加入我们公司。那逐步就成长为一个资深的销售。我对你个人的工作表现一直都是挺满意的。”
小刘:“嗯,谢谢吴总的肯定。这也离不开您对我们的指导。”
吴总:“那最近呢,就是你们组的王经理,他提出了离职。其实我们也觉得挺遗憾的。”
小刘:“啊?老大要离职?”
吴总:“对。这是他个人的决定。我们也表示尊重。与此同时,这个manager的职位就空出来了。所以呢,我就在跟HR去评估和商量一下。那我们看了一些人员以往的这个能力和以往的业绩表现。吴总:我会觉得说你相对来说是比较适合manager这个职位的。是个不错的人选。所以我就想今天来问问看你个人的想法。”
小刘:“非常感谢您对我的信任!其实我从实习到现在,进入这家公司已经有近七个年头了。在这段时间当中,我也跟着老大做了不少的项目。那我现在其实也已经开始自己带徒弟了。在这个过程当中其实收获的确挺多的。有机会担任这个职务的话,我相信也可以带着团队在未来做出更好的成绩。”
吴总:“嗯,很好!很高兴你能这么想。那这么看你,这件事我们就可以基本上先这么商定下来。后续呢,我会请HR去走一些流程。那这个流程走完了之后,会大概几天时间吧。会有邮件就是向外宣布通知大家。嗯,这个时候我会希望你能够做一些准备。为什么呢?因为我觉得做leader跟做组员是不太一样的。那我还是对你有信心。我是希望你能够带着你们组呢继续好好地干。”
小刘:“好的!一定!那今后还请吴总多多指导。”
吴总:“行!没问题。你先去忙吧。我这边跟HR再沟通一下。”

镜头画面三
小刘的内心独白:“啊,我终于要成为manager啦!大展宏图的时候到了!我做manager,我们组的业绩肯定要超出之前我们老大定的业绩。然后给每个人多发点奖金。让大家都开心地把活干了。哼!显示我管理能力的时候到了。跟着我这样的老大有肉吃!”

镜头画面四
小刘上任的第一天。
组员甲:“老刘(由于组员甲年龄比小刘小,所以称他为老刘)荣升我们组经理啦,我们大家表示一下。”
各组员鼓掌。
小刘:“谢谢。感谢大家的信任。那以后还需要大家多多支持。那今晚我请客,有家有室的赶紧回家报备一下吧。”
组员乙:“放心。肯定支持。在你的带领下,我们组肯定越来越好的。”
组员甲:“老刘领着我们赚钱啊。”
小刘:“没问题。”

镜头画面五
小刘的内心独白:“哈哈哈。终于要走上人生巅峰了!”

镜头画面六
会议室里,小刘和组员小肖、小华一起开会。
小刘:“A公司下个季度的采购计划就要出来了。那需要咱们组出一份方案。上个季度的方案和输出我带着小华一起做的。但是我最近手头上的事情比较多。这次小肖你带着小华一起做怎么样。客户那边小华也已经比较熟了。”
小肖:“我这边没什么问题啊。小华怎么样?”
小华:“好的,没问题。”
小刘:“行,那我们下周二再过一下。”
小肖:“OK。”
小华:“好的。”

镜头画面七
周二上午,小刘和组员小肖、小华一起开会。
小刘:“哎,这个方案没有沿用我们之前的思路嘛。你们有没有看过上个季度的方案?”
小华:“嗯。我跟小肖讲过了。但是我们这次想尝试另一个想法。”
小肖:“对。我们关注到这家客户正在做转型。所以用了不同的框架来展示我们的产品。那我觉得这个的话会更加适合我们的客户。”
小刘:“这样的做法会有些风险。对方的采购负责人一直以来都比较认同我们之前的思路。不确定他们是否会满意这个方案。要不然这样吧,我们先保留这个方案你们再出一个备选怎么样?”
小肖:“好呀。那我和小华再看一下。”
小华:“嗯。”

镜头画面八
周三下班前,小刘工位卡座。
小肖:“老大,我和小华又做了一版方案。回头你看一下?”
小刘:“好。你先放这,我马上看。”
小肖:“行。”

镜头画面九
小刘的内心独白:“这做的都什么玩意儿?又得打回去重新让他们做。哎,算了算了。明天就要交了,这次我先来吧。这都5点半了,今儿又要熬了。和小丽的面谈推到明天吧。今天晚上的课程也没空听了。”

情景剧结束。

镜头画面十
蒋芸,成年女性,肯耐珂萨专家讲师。十多年企业管理实战经验。曾任世界500强企业高级经理人。
蒋芸:“你好,我是蒋芸。是《明星经理人成长营:角色认知》这门课程的老师情景剧里,小刘被任命为部门经理。他踌躇满志,想要从此带领团队一飞冲天。但是理想很丰满,现实却很骨感。小刘很快就碰到了问题。下属做的方案不合适。只能自己加班加点做。管理之路,好像没那么容易。那么小刘的问题出在哪里?又该如何解决呢?你是不是也和他有相同的困惑呢?接下来就让我们一起进入到这门课程的学习。一起探寻答案吧。”

关键词

首先看看音频和视频提炼的关键词的异同。我列出该词实际在对白中出现的次数并对它们的关键程度作出人工评价:

音频视频词频关键程度
老大老大5一般
业绩业绩3重要
季度3不重要
客户客户3重要
离职离职2一般
managermanager4重要
商量商量2不重要
职位职位2重要
信任2不重要
表1 音视频提炼关键词对比

老大、离职:王经理作为旧老大离职,是小刘接替成为新老大原因。

业绩:小刘、小肖、小华都面临他们上级的业绩压力。

季度:属于小刘部门员工的业务计划的具体细节,可替换为其他细节不影响剧情表达。

客户:小刘部门的业务主要面对的就是客户,不可替换。

Manager、职位:该情景剧主要发生在小刘升任部门manager一职前后一小段时间。

商量:吴总的客套话。

信任:小刘的客套话。

根据上面的分析可以得出,音频和视频提炼的关键词基本一致。但是一些不是很重要的词也被纳入关键词里了。

全文概要

以下是音频转写的全文概要:

全文概要(音频转写)

吴总和小刘进行了商量,吴总告诉小刘最近公司的人事变动,王经理提出了离职,空出了manager职位,吴总认为小刘相对适合这个职位并希望他能够担任。他们商定后,吴总会请HR走一些流程,小刘表示一定会做好准备。另外,他们还讨论了下一季度的采购计划,小刘和小华做了一个方案,但吴总认为不合适,建议保留备选方案并重新制定。最后,吴总还提到了蒋云老师的课程《明星经理人成长营》,提到了老刘的问题和解决方法。

这段概要有如下问题:

  1. 第三句的“他们”指代不清,如果和第二句的“他们”一样指的是吴总和小刘的话,那么就是错误的。
  2. 应该是小肖和小华做方案,小刘认为不合适。
  3. 吴总并没有提到蒋芸的课程。

以下是视频转写的全文概要:

全文概要(视频转写)

吴总和小刘讨论了小刘所在团队的人事变动,吴总提出了让小刘担任新的manager职位的想法。小刘对此表示感谢并表示有信心带领团队取得更好的成绩。吴总还告诉小刘需要准备一些东西,以便能够更好地胜任这个职位。另外,还有一位老师介绍了一门关于经理人角色认知的课程。

这段概要的问题是小华和小肖提出的方案让小刘犯难这一关键剧情没有概括到。

章节速览

以下是音频转写划分的章节速览:

小刘对公司人事变动的看法。

吴总与小刘商量公司销售部门的人事变动,其中王经理提出离职,空出了经理职位。吴总认为小刘适合担任这个职位,并询问他的想法。小刘感谢吴总的信任,表示自己在这家公司近七年来一直跟着王经理做项目,并开始带自己的徒弟,他相信自己可以带领团队做出更好的成绩。

对hr的要求及其人员的安排。

一位员工被告知将成为团队的经理,他的主管向他表示祝贺并商定了后续的流程。主管希望他能够准备好,因为作为经理和组员是不太一样的,他对他有信心。主管还承诺要超过之前定下的业绩,并给每个人多发奖金。他表示感谢并希望大家继续支持他。最后,他邀请大家今晚一起吃饭,表示感谢并展望团队的未来。

关于采购方案的讨论。

讨论了A公司下季度的采购计划方案和输出,并决定由小华和小乔一起合作完成。他们关注到一家客户正在做转型,因此决定尝试另一种展示产品的方案。虽然存在一定风险,但他们认为这个方案更适合该客户。在讨论中还提到了之前的方案和思路,以及保留这个方案并再出一个备选方案的建议。最后,蒋云老师介绍了一门名为明星经理人成长营的课程,其中包含了老刘作为部门经理所面临的问题和解决方法。

以下是视频转写划分的章节速览:

对员工离职的原理。

吴总与小刘商量公司销售部门的人事变动,王经理提出离职,公司考虑评估小刘作为接替者。吴总表示感谢对小刘的信任,并肯定其在公司的工作表现,认为他相对适合担任经理职位。小刘也表示愿意承担这个机会,带领团队做出更好的成绩。

对hr的要求及其人员安排。

一位员工被告知将成为团队的经理,他的主管向他表示祝贺并商定了一些后续流程。在此期间,主管提到了该员工在担任组员时与担任领导者时的不同,并表示对他的信心。主管还向员工保证将来会有更多的奖金和发展机会。最后,主管请求其他员工支持和保留该员工,并宣布今晚他将请客庆祝。

关于采购方案的讨论。

讨论了A公司下季度的采购计划,并决定由小华和小乔一起合作。他们计划针对一家正在转型的客户制定不同的方案,但也准备了一个备选方案。讨论中还提到了之前方案的成功和新方案的风险,以及蒋老师的一门关于管理的课程。

从剧本镜头可知内容大概可以分为以下几部分:

  1. 镜头一至镜头三:吴总打算升小刘为销售部门经理,小刘洋洋自得。
  2. 镜头四至镜头五:小刘新官上任,踌躇满志。
  3. 镜头六至镜头九:小肖和小华能力不足。小刘紧急救火,心生埋怨。
  4. 镜头十:蒋芸总结情景剧,引出课程。

对比之下可以看出,无论是音频还是视频,其“断章取义”能力都非常不足。


发言总结

全内容有发言的角色按首次发言先后顺序分别为:小刘(老刘)、吴总、组员甲、组员乙、小肖、小华、蒋芸。共有7人。

音频方面自动划分出10个发言人,比实际上多3个,即音纹识别方面出现误差。部分发言内容太少,不能总结。已总结出的有:

发言人1的总结

首先感谢吴总的信任和肯定,并承诺尽快处理相关事务。他自豪地提到自己在这家公司已经有近七年的经历,跟着老大参与了不少项目。如果有机会担任这个职务,他相信可以带领团队取得更好的成绩。最后,他向吴总表示今后会继续努力。

从内容可知,发言人1为小刘。

发言人2的总结

告诉小刘,老大要离职,自己终于要成为manager了,并且决心要超过之前老大定的业绩,给每个人多发奖金,让大家都开心地把活干完。他还表示跟着他这样的老大有优势,并且自信能够管理好团队。然而,他也抱怨了一些工作上的问题,并决定先自己处理。最后,他提到今天晚上要熬夜,并取消了和小丽的面谈。

发言人2混合了多个角色的发言,归纳错误。

发言人3的总结

召集小刘商量公司人事变动,小刘被提升为资深销售经理,并有望接替离职的王经理担任manager职位。他表示对小刘的个人工作表现一直满意,希望他能够带领团队继续前进。HR流程走完后,会宣布通知大家。

从内容可知,发言人3为吴总。

发言人10的总结

他为蒋云,是明星经理人成长营角色认知课程的老师。他提出了老刘作为部门经理的困境,并邀请听众一起学习这门课程,探寻解决方案。

发言人10明示是蒋芸,但是蒋芸是女性角色,“他”字错用。

视频方面自动划分出11个发言人,比实际上多4个,即音纹识别方面出现也误差。同时也可以得出AI没有深入分析视频的内容。部分发言内容太少,不能总结。已总结出的有:

发言人2的总结

感谢吴总的肯定和信任,并介绍了自己在公司的工作经历和成就。他表示自己已经带了不少徒弟,并相信可以在未来带领团队做出更好的成绩。最后,他表示今后会继续请吴总多多指导。

从内容可知,发言人2为小刘。

发言人3的总结

讨论了公司销售团队的人事变动,提到了王经理的离职和空出的manager职位,并表示认为员工小刘相对适合担任该职位。他向小刘征求个人意见,并商定了后续流程,希望他能够准备好成为团队的领导者。最后,他嘱咐小刘先去忙,自己会与HR继续沟通。

从内容可知,发言人3为吴总。但是吴总是女性角色,“他”字错用。

发言人四的总结

表示自己即将成为manager,希望能够带领团队实现更好的业绩,并给每个人多发奖金。他自信满满地表示跟着他这样的老大有优势,并且称赞自己的管理能力。此外,他还提到了一些工作中遇到的问题,但并未透露具体是什么问题。最后,他表示今晚要熬夜加班,并推迟和小丽的面谈到明天。

从内容可知,发言人3为小刘。但是没有和发言人2的内容融合。

发言人11的总结

他介绍了自己是明星经理人成长营角色认知课程的老师,通过一个情景剧描述了老刘作为部门经理的问题和困惑,并提出了一个问题:你是否也遇到了相似的问题?邀请听众一起参与课程学习,寻找解决方案。

从内容可知,发言人11明示是蒋芸,但是蒋芸是女性角色,“他”字错用。

综上分析可知,发言人的序号与角色出场说话的顺序一致。


问题回顾

问题回顾属于实验性的功能,AI识别出内容中的问句,并标记时间。点击后可以转跳到音频或视频。

图3 问句识别功能

音视频在这方面表现一致。问句识别涉及到语法、语气和音调等语言学要素的识别。并非内容中的所有问句都被识别到。

在情景剧中该功能不是很重要,不过多介绍。


对白识别

上述的内容实际上都是建立在对每一句对白的识别上的。

图4 对白呈现

音视频的对比呈现方式一致,都是以这种对话框的方式呈现。点击对白可以转跳到相应的播放进度。

可以修改发言人的名称。修改时,可以指定单一对话框的发言人名称。也可以指定所有对话框的该发言人名称。

可以修改对白内容。可以直接编辑对白内容。可以回车新建对话框。也可以后退合并对话框。

一些口癖和语气助词,如“呃、嗯、呢,啊”等,不会被转写到对白文本中。

目前语音识别为文字的识别率比较高。除了个别字因口音、轻重音等问题导致识别错误,大部分都成功识别。但如前述,发言人划分方面表现较差。在该情景剧中,发言人划分面临的挑战包括:同一个人的电话交谈音色与面对面交谈音色不同。同一个人的内心独白音色与多人对白音色不同。多人发言重叠等。

遗憾的是,目前即使修正了全部对白文本,前述的由AI生成的关键词、全文概要、章节速览、发言总结、问题回顾等内容也不会更正。


导出对白

可以将转写的对白文本导出为doc、pdf、srt三种格式。

图5 导出的doc文本

可以选择是否需要附上时间戳。


BARD的答案

我使用以下Prompt向BARD提问:

Prompt(BARD)

请根据以下的情景剧剧本,回答一些问题:
“我结合字幕听写的剧本全文”
问题一:请提炼出该情景剧的关键词。数量不少于5个。
问题二:请写出该情景剧的全文概要。
问题三:请给该情景剧划分章节。用一句话最大程度概括每一章节的内容。并用一段话总结该章节的内容。
问题四:请总结每个角色的发言。

以下是BARD的回答:

关键词

新经理、新工作、压力、挑战、成长

全文概要

小刘是一家公司的资深销售人员。他被任命为部门经理。他很兴奋,也感到压力。他希望能带领团队取得成功,但他不知道该怎么做。他遇到了很多挑战,但他也从中成长。最后,他成功地带领团队取得了成功。

章节速览

  • 第一章:小刘被任命为部门经理。他很兴奋,也感到压力。他不知道该怎么做。
  • 第二章:小刘面临很多挑战。他的下属不听他的指挥,客户不满意他的方案。
  • 第三章:小刘克服挑战。他学习如何管理团队,如何制定方案。他也学会了如何与客户沟通。
  • 第四章:小刘取得成功。他的团队取得了销售业绩的突破。客户也对他的方案非常满意。

发言总结

  • 小刘:他是一个有理想有抱负的人。他希望能带领团队取得成功,但他也知道这并不容易。他遇到了很多挑战,但他也从中成长。最后,他成功地带领团队取得了成功。
  • 吴总:她是一个有经验的领导者。她信任小刘,也给予了他支持。她帮助小刘克服了挑战,取得了成功。
  • 小肖和小华:他们是小刘的下属。他们年轻有活力,但也缺乏经验。小刘帮助他们学习和成长。最后,他们也成为了团队中不可或缺的成员。

从BARD的回答可以看到,它在胡编剧本没有的内容。小刘在该情景剧中只是在面对困难,并没有完全克服困难并带领团队取得成绩。小肖和小华也还没有成长。


GPT4的答案

我使用以下Prompt向GPT4提问:

Prompt(GPT4)

请根据以下的情景剧剧本,回答一些问题:
“我结合字幕听写的剧本全文”
问题一:请提炼出该情景剧的关键词。数量不少于5个。
问题二:请写出该情景剧的全文概要。
问题三:请给该情景剧划分章节。用一句话最大程度概括每一章节的内容。并用一段话总结该章节的内容。
问题四:请总结每个角色的发言。

以下是GPT4的回答:

关键词

提拔、经理、责任、团队管理、角色转变

全文概要

该情景剧讲述了小刘从一个资历丰富的销售人员被提拔为经理的过程。老板吴总对小刘的工作表现和能力给予了充分的肯定,并希望他在新的角色中可以带领团队取得好成绩。小刘对此表示热切的期待,但在接手工作后发现,管理团队并非想象中那么简单,他不得不加班处理一些麻烦事,感受到了责任和压力。

章节速览

  • 第一章:小刘被任命为经理。在和吴总的对话中,小刘被告知将担任经理的位置,他对此充满期待,并表示会全力以赴。
  • 第二章:小刘上任的第一天。小刘宣布他的打算,并从团队那里收到了信任和支持,他振奋的计划着以后的工作。
  • 第三章:小刘开始了管理工作。小刘开始分派任务,对组员的工作提出了建议,并开始面临到实际的问题,他发现管理工作并不像他想象的那样简单。
  • 第四章:小刘的反思和困惑。在经历了一段时间的管理工作后,小刘发现团队的问题需要他进行解决,他开始感受到压力。

发言总结

  • 小刘:对被提拔为经理表示高兴和期待,表示会全力以赴,但在实际操作中遇到了问题,表现出困惑和压力。
  • 吴总:肯定了小刘的工作表现和能力,并对他新的经理角色寄予了期望。
  • 小肖和小华:对小刘的指示表示服从和合作,但也在工作中表达出自己的观点和想法。

文心一言的答案

由于文心一言每次输入限制2000字符,我使用以下两部分Prompt向文心一言提问:

Prompt(文心一言 1/2)

请根据以下的情景剧剧本,回答一些问题:
“我结合字幕听写的剧本开始至镜头七”

Prompt(文心一言 2/2)

“我结合字幕听写的剧本镜头八至结尾”
问题一:请提炼出该情景剧的关键词。数量不少于5个。
问题二:请写出该情景剧的全文概要。
问题三:请给该情景剧划分章节。用一句话最大程度概括每一章节的内容。并用一段话总结该章节的内容。
问题四:请总结每个角色的发言。

以下是文心一言的回答:

关键词

新任部门经理、团队管理、方案不合适、加班加点、碰到了问题、困惑、学习、探寻答案

全文概要

该情景剧描述了一个刚被任命为部门经理的员工小刘,面临着如何带领团队、解决团队中出现的问题的挑战。他试图在第一次开会时提出一个方案,但被其他团队成员的方案替代。他感到不安,并在后续的会议中试图解决问题,但最终方案还是被打回重新做。小刘感到困惑和疲惫,同时也意识到管理并不像他想象的那么简单。

章节速览

  • 第一章:小刘被任命为部门经理,吴总找他商谈。
  • 第二章:小刘在会议中提议的方案被团队成员替代。
  • 第三章:小刘试图在后续的会议中解决问题,但方案还是被否决。
  • 第四章:小刘感到困惑和疲惫,意识到管理并不简单。

发言总结

  • 小刘的发言包括:对吴总提出自己想法的肯定和感谢;表达对王经理离职的惊讶;表示对成为manager的信心和对团队未来的期望;对组员表示信任并承诺会提供支持;确认新的方案并安排后续的会议。
  • 吴总的发言包括:对小刘的工作表现表示肯定和满意;告知小刘王经理离职的消息并表达遗憾;提出让小刘担任manager的建议并征询他的意见;对小刘表示信任并鼓励他担任好这个角色;安排HR进行相关流程并向外公布消息;邀请小刘一起庆祝并表示后续会提供指导。
  • 组员们的发言包括:对小刘成为部门经理表示祝贺和信任;提出新的方案并表示愿意支持小刘;对小刘的决策表示理解和配合;同时也表达了对自身工作成果的肯定和自信。

四个大语言模型对比

关键词:通义有比较多非重点的内容作为关键词。BARD和GPT4的关键词概括比较准确。文心一言不能提炼出关键词。

全文概要:通义有张冠李戴和遗漏重点的情况。BARD编造剧本中没有的内容。GPT4前面大部分都概括得比较好,但和BARD、文心一言都遗漏了“蒋芸”部分的内容。文心一言对人物关系理解不到位。

章节速览:通义的章节划分基本错误。BARD编造剧本中没有的章节。GPT4章节划分比较正确,但是和文心一言都遗漏了“蒋芸”部分的内容。文心一言部分章节总结与全文概要一样理解有误。

发言总结:通义使用音频划分发言人,与BARD和GPT4直接用剧本的难度不一致,不具可比性。BARD纯属放飞自我,胡编乱造。GPT4基本能够根据发言文本合理总结出每个人的剧情走向,但仍然遗漏了“蒋芸”部分的内容。文心一言的发言总结大部分正确,但也存在张冠李戴等明显错误。


相关资源

通义听悟:https://tingwu.aliyun.com

BARD:https://bard.google.com

GPT4:https://chat.openai.com

文心一言:https://yiyan.baidu.com

网课视频:https://www.mlearning365.com/courseDetail.html#/videoPlay/5292

分类
MachineLearning|机器学习

使用机器学习预测世界杯赛果

目标

本文的目标是在学习了TensorFlow的官方Graph Execution示例后,通过举一反三运用其他例子来进一步理解官方示例。因此,本文中的所有结果仅作学术研究用途。

前提

IDE准备

Visual Studio 2017

打开Visual Studio Installer修改当前使用的VS,确保工作负载Web和云分类下的Python开发被选中。然后切换到单个组件,确保开发活动中的Python语言支持编译器、生成工具和运行时中的Python 3 64-bit被勾选。

点击右下角的修改,等待组件被下载和安装。

项目准备

新建一个Python应用程序项目。在解决方案资源管理器中找到Python环境,并右键添加虚拟环境。虚拟环境的基础解析器为Python 3中的某个版本。

右键点击新建的虚拟环境,选择安装Python包

分别安装pip、pandas和tensorflow。这些包在安装的同时,会把所有需要的包进行链式安装。以防万一,以下列出需要用到的所有包及版本。

absl-py==0.2.2
astor==0.6.2
bleach==1.5.0
certifi==2018.4.16
chardet==3.0.4
cycler==0.10.0
gast==0.2.0
get==1.0.3
grpcio==1.13.0
html5lib==0.9999999
idna==2.7
kiwisolver==1.0.1
Markdown==2.6.11
matplotlib==2.2.2
numpy==1.14.5
pandas==0.23.1
pip==10.0.1
post==1.0.2
protobuf==3.6.0
public==1.0.3
pyparsing==2.2.0
python-dateutil==2.7.3
pytz==2018.5
query-string==1.0.2
request==1.0.2
requests==2.19.1
setuptools==39.2.0
six==1.11.0
tensorboard==1.8.0
tensorflow==1.8.0
termcolor==1.1.0
urllib3==1.23
Werkzeug==0.14.1
wheel==0.31.1

数据准备

既然要进行机器学习,就需要准备好训练数据集测试数据集。训练数据集用于构建出一个能根据特征值推断出标签值模型,而测试数据集用于评估这个模型的准确度,它们都来自一个数据超集。为了有效地对模型进行评判,测试数据集与训练数据集不能有交集。

我构建的数据超集每一行代表一场比赛,因为我希望以一场比赛为单位预测它的赛果,并有如下的列,并描述为什么我要纳入这些列:

  • 序号:描述这是第几场比赛。随着赛程时间的进行,球员逐渐适应气候环境的情况以及产生的疲倦都可能会影响赛果。
  • 主队:以数字的方式表示这场比赛的主队。我按出场顺序为每支球队定义了一个编号,实际上编号的大小无所谓,只要在整个数据集中用同一个编号表示同一支球队即可。编号对应的球队在后面会给出。
  • 客队:以数字的方式表示这场比赛的客队。
  • 主队胜的平均初始赔率:赔率代表着某家公司对该场比赛该队表现的看法,它本身即是各种可能影响比赛因素的一个综合提炼。而取多家公司的平均赔率更具客观性。
  • 平局的平均初始赔率
  • 主队负的平局初始赔率
  • 主队胜的平局即时赔率:通过与同一行中的初始赔率作比较,获得赔率变化。这个变化可能是因为某些临赛前影响比赛的因素变化所导致的,也可能是公司一开始在掩盖自己的真实意图。即时赔率在数据超集中为截止投注前的最后一次公布的赔率,而在预测条件中为当前得知的最后一次公布的赔率。
  • 平局的平均即时赔率
  • 主队负的平均即时赔率
  • 主队近10场比赛的胜场数:近期比赛会在一定程度上反映出该队伍的状态。
  • 主队近10场比赛的平场数
  • 主队近10场比赛的负场数
  • 客队近10场比赛的胜场数
  • 客队近10场比赛的平场数
  • 客队近10场比赛的负场数
  • 主队积分:这场比赛开始前,按小组赛规则的积分。因为数据集中也纳入了淘汰赛的数据,所以也按胜方积3分,平局各积1分,负方不积分的方式统计。积分在一定程度上反映了之前的比赛结果对该队伍造成的影响。
  • 客队积分
  • 赛果:以数字方式表述这场比赛的结果。主胜为2,平局为1,主负为0.

前17列为特征列,每列中的每个值即为特征值。最后一列为标签列,每列中的每个值即为标签值。机器学习的目的就是找出已知的特征值与特征值组合和已知标签值之间的关联,然后根据已知的特征值去预测未知的标签。

这些数据的来源通常可以在投注网站找得到。

这时前提准备已经完成,可以往项目中添加.py文件及代码。

代码展示

先上代码,然后对代码进行讲解。

from __future__ import absolute_import
from __future__ import division
from __future__ import print_function

import argparse
import tensorflow as tf

import game_data


parser = argparse.ArgumentParser()
parser.add_argument('--batch_size', default=4, type=int, help='捆绑大小')
parser.add_argument('--train_steps', default=2000, type=int,
                    help='训练步数')

def main(argv):
    args = parser.parse_args(argv[1:])

    # 拉取数据
    (train_x, train_y), (test_x, test_y) = game_data.load_data()

    # 描述输入特征列
    my_feature_columns = []
    for key in train_x.keys():
        my_feature_columns.append(tf.feature_column.numeric_column(key=key))

    # 构建DNN分类器
    classifier = tf.estimator.DNNClassifier(
        feature_columns=my_feature_columns,
        # 3个隐藏层
        hidden_units=[20, 15, 5],
        # 设置3个类别
        n_classes=3)

    # 训练模型
    classifier.train(
        input_fn=lambda:game_data.train_input_fn(train_x, train_y,
                                                 args.batch_size),
        steps=args.train_steps)

    # 评估模型
    eval_result = classifier.evaluate(
        input_fn=lambda:game_data.eval_input_fn(test_x, test_y,
                                                args.batch_size))

    print('\n测试集准确度: {accuracy:0.3f}\n'.format(**eval_result))

    # 建立需要使用模型做出预测的数据
    predict_x = {
        'Game': [57],
        'Home': [4],
        'Away': [9],
        'WinInitialOdds': [4.3],
        'DrawInitialOdds': [3.17],
        'LossInitialOdds': [2.00],
        'WinCurrentOdds': [4.44],
        'DrawCurrentOdds': [3.11],
        'LossCurrentOdds': [2.03],
        'HomeWinCount': [8],
        'HomeDrawCount': [1],
        'HomeLossCount': [1],
        'AwayWinCount': [6],
        'AwayDrawCount': [3],
        'AwayLossCount': [1],
        'HomePoint': [12],
        'AwayPoint': [10]
    }

    predictions = classifier.predict(
        input_fn=lambda:game_data.eval_input_fn(predict_x,
                                                labels=None,
                                                batch_size=args.batch_size))

    template = ('\预测结果是"{}" ({:.1f}%)"')

    for pred_dict in predictions:
        class_id = pred_dict['class_ids'][0]
        probability = pred_dict['probabilities'][class_id]

        print(template.format(game_data.RESULT[class_id],
                              100 * probability))


if __name__ == '__main__':
    tf.logging.set_verbosity(tf.logging.INFO)
    tf.app.run(main)
import pandas as pd
import tensorflow as tf

TRAIN_URL = "http://www.halve.top/wp-content/uploads/2018/07/game_training.csv"
TEST_URL = "http://www.halve.top/wp-content/uploads/2018/07/game_test.csv"

CSV_COLUMN_NAMES = ['Game','Home','Away',
                    'WinInitialOdds','DrawInitialOdds','LossInitialOdds',
                    'WinCurrentOdds','DrawCurrentOdds','LossCurrentOdds',
                    'HomeWinCount','HomeDrawCount','HomeLossCount',
                    'AwayWinCount','AwayDrawCount','AwayLossCount',
                    'HomePoint','AwayPoint','Result']

RESULT = ['Loss','Draw','Win']

def maybe_download():
    train_path = tf.keras.utils.get_file(TRAIN_URL.split('/')[-1], TRAIN_URL)
    test_path = tf.keras.utils.get_file(TEST_URL.split('/')[-1], TEST_URL)

    return train_path, test_path

def load_data(y_name='Result'):
    """以(train_x, train_y), (test_x, test_y)的形式返回比赛数据集"""
    train_path, test_path = maybe_download()

    train = pd.read_csv(train_path, names=CSV_COLUMN_NAMES, header=0)
    train_x, train_y = train, train.pop(y_name)

    test = pd.read_csv(test_path, names=CSV_COLUMN_NAMES, header=0)
    test_x, test_y = test, test.pop(y_name)

    return (train_x, train_y), (test_x, test_y)

def train_input_fn(features, labels, batch_size):
    """训练输入函数"""
    # 将输入转换为数据集
    dataset = tf.data.Dataset.from_tensor_slices((dict(features), labels))

    # 打乱、重复以及捆绑样本
    dataset = dataset.shuffle(1000).repeat().batch(batch_size)

    # 返回数据集
    return dataset

def eval_input_fn(features, labels, batch_size):
    """验证和预测输入函数"""
    features=dict(features)
    if labels is None:
        # 没有标签,只有特征
        inputs = features
    else:
        inputs = (features, labels)

    # 将输入转换为数据集
    dataset = tf.data.Dataset.from_tensor_slices(inputs)

    # 捆绑样本
    assert batch_size is not None, "batch_size must not be None"
    dataset = dataset.batch(batch_size)

    # 返回数据集
    return dataset

CSV_TYPES = [[0.0], [0.0], [0.0], 
             [0.0], [0.0], [0,0],
             [0.0], [0.0], [0.0],
             [0.0], [0.0], [0.0],
             [0.0], [0.0], [0.0],
             [0.0], [0.0], [0]]

def _parse_line(line):
    # 解码行
    fields = tf.decode_csv(line, record_defaults=CSV_TYPES)

    # 将结果打包为字典
    features = dict(zip(CSV_COLUMN_NAMES, fields))

    # 将标签从特征中分离
    label = features.pop('Species')

    return features, label


def csv_input_fn(csv_path, batch_size):
    # 创建一个包含多行文本的数据集
    dataset = tf.data.TextLineDataset(csv_path).skip(1)

    # 转换每一行
    dataset = dataset.map(_parse_line)

    # 打乱、重复和捆绑样本
    dataset = dataset.shuffle(1000).repeat().batch(batch_size)

    # 返回数据集
    return dataset

首先说WorldCupPredict.py的代码。引用了一些固定的模块,然后确定了步数(step)和捆绑(batch)两个参数。步长并不是越大越好,模型的准确度会从第一步开始逐渐波动上升,到达某个最大值值后可能会下降一点然后再上升一点。当训练数据多的时候,捆绑值可以设大一点。具体意义参考TensorFlow官网的术语表。

然后会调用game_data模块获得训练数据和测试数据。再对特征值进行标记。之后构建了一个分类器,因为实质上这是个按特征把比赛归类为主胜、平局和主负三种不同赛果的问题。

分类器中设置了三个隐藏层,每一个特征值都会流进第一层的每个神经元里,第一层神经元的计算结果又会流进第二层,如此类推。直至输出到三个不同的赛果类别中。最佳的隐藏层数的设置和每层神经元数的设置需要通过重复实验和一定的经验决定。往往多的层和多的神经元需要更多的训练数据去达到有效的训练。

训练完成后会使用测试数据对模型进行评估,并给出准确度。之后可以手动构造一个或多个比赛数据给模型预测。这里使用的是第57场乌拉圭对战法国的数据,这里并没有给出赛果作为标签值。

模型会根据特征值预测出归属于不同标签的可能性,这里文本输出了最大可能性的标签及其可能性。

接下来说一下game_data.py的代码。首先定义了两个数据源,采用的是本网站整理好的训练集和测试集。数据源的形式是csv文件,是一种以换行表示数据行,逗号表示一行中的数据列的表格型数据。

首先需要从网络把数据源下载回到本地,然后将csv数据源整理成可以被计算的张量(tensor)。解析csv文件需要用到一个数据模板向程序说明每列是一个什么数据类型的数据。这里把前面17列的特征值作为浮点数,最后一列作为整数。因为张量转换过程中所有数据的类型要相同。这个文件的代码主要是做了数据整理的工作。

运行结果

过程中会给出在训练模型时的信息,包括了步数、进行到当前步数的损失和每秒进行了多少步。

模型训练完成后,会放入测试集,用于评估模型的准确度。最后会给出一个无标签的特征值的标签预测结果。如上图所示,即评估准确度达到50%,而有39.5%的概率本场(乌拉圭VS法国)的比赛中,主队(乌拉圭)会输。

读者可以尝试进行以下几种工作:

  1. 调整步长和捆绑对训练和评估的影响。
  2. 调整隐藏层数和神经元个数对训练和评估的影响。
  3. 加入新的特征列和删除已有特征列对训练和评估的影响。
  4. 把该项目作为模板处理其他分类问题。
  5. 壕砸2块钱法国赢。

数据集文件

点此下载