阅读更多
引用

作者:张俊林,中科院软件所博士,技术书籍《这就是搜索引擎:核心技术详解》、《大数据日知录:架构与算法》作者。曾担任阿里巴巴、百度、新浪微博资深技术专家,目前是用友畅捷通工智能相关业务负责人,关注深度学习在自然语言处理方面的应用。
责编:周建丁(zhoujd@csdn.net)
本文为《程序员》原创文章,未经允许不得转载,更多精彩文章请订阅2016年《程序员》

聊天机器人(也可以称为语音助手、聊天助手、对话机器人等)是目前非常热的一个人工智能研发与产品方向。很多大型互联网公司投入重金研发相关技术,并陆续推出了相关产品,比如苹果Siri、微软Cortana与小冰、Google Now、百度的“度秘”、亚马逊的蓝牙音箱Echo内置的语音助手Alexa、Facebook推出的语音助手M、Siri创始人新推出的Viv……

究其原因在于大家都将聊天机器人定位为未来各种服务的入口,尤其是移动端App及可穿戴设备场景下提供各种服务的入口。

聊天机器人的类型
目前市场上有各种类型的聊天机器人,比如有京东JIMI客服机器人,儿童教育机器人,小冰娱乐聊天机器人,Alexa家居控制、车载控制机器人,Viv全方位服务类型机器人等。这是从应用方向对聊天机器人的一种划分。

如果对应用目的或者技术手段进行抽象,聊天机器人可以有以下两种划分方法。
  • 目标驱动(Goal Driven) VS. 无目标驱动(Non-Goal Driven)聊天机器人

目标驱动的聊天机器人指的是聊天机器人有明确的服务目标或者服务对象,比如客服机器人、儿童教育机器人、类似Viv的提供天气/订票/订餐等服务的服务机器人等,这种目标驱动的聊天机器人也可以称作特定领域的聊天机器人。

无目标驱动聊天机器人指的是聊天机器人并非为特定领域服务目的而开发,比如纯粹聊天或者出于娱乐聊天目的以及计算机游戏中的虚拟人物聊天机器人都属于此类。这种无明确任务目标的聊天机器人也可以称作为开放领域的聊天机器人。
  • 检索式 VS. 生成式聊天机器人

检索式聊天机器人指的是事先存在一个对话库,聊天系统接收到用户输入句子后,通过在对话库中以搜索匹配的方式进行应答内容提取。很明显,这种方式对对话库要求很高,需要对话库足够大,能够尽量多地匹配用户问句,否则会经常出现找不到合适回答内容的情形(因为在真实场景下用户说什么都是可能的),但它的好处是回答质量高,因为对话库中的内容都是真实的对话数据,表达比较自然。

生成式聊天机器人则采取不同的技术思路,在接收到用户输入句子后,采用一定技术手段自动生成一句话作为应答,这个路线机器人的好处是可能覆盖任意话题的用户问句,但是缺点是生成应答句子质量很可能会存在问题,比如语句不通顺、句法错误等看上去比较低级的错误。

本文重点介绍开放领域、生成式的聊天机器人如何通过深度学习技术来构建,很明显这是最难处理的一种情况。

好聊天机器人应该具备的特点
一般而言,一个优秀的开放领域聊天机器人应该具备如下特点:

首先,针对用户的回答或者聊天内容,机器人产生的应答句应该和用户的问句语义一致并逻辑正确,如果聊天机器人答非所问或者不知所云,或者总是回答说“对不起,我不理解您的意思”,无疑是毁灭性的用户体验。

其次,回答应该语法正确。这个看似是基本要求,但是对于采用生成式对话技术的机器人来说其实有一定困难,因为机器人的回答是一个字一个字生成,要保证这种生成的若干个字句法正确,并不容易做得那么完美。

再次,应答应该是有趣、多样而非沉闷无聊的。尽管有些应答看上去语义没什么问题,但目前技术训练出的聊天机器人很容易产生“安全回答”的问题,就是说,不论用户输入什么句子,聊天机器人总是回答“好啊”、“是吗”等诸如此类,看上去语义说得过去,但是这给人很无聊的感觉。此外,聊天机器人应该给人“个性表达一致”的
感觉。因为人们和聊天机器人交流,从内心习惯还是将沟通对象想象成一个人,而一个人应该有相对一致的个性特征,如果用户连续问两次“你多大了”,而聊天机器人分别给出不同的岁数,那么会给人交流对象精神分裂的印象,这即是典型的个性表达不一致。而好的聊天机器人应该对外体现出各种基本背景信息以及爱好、语言风格等
方面一致的回答。

几种主流技术思路
当前聊天机器人的几种主流技术包括:基于人工模板、基于检索、基于机器翻译技术,以及基于深度学习的聊天机器人。

基于人工模板的技术通过人工设定对话场景,并对每个场景编写针对性的对话模板,模板描述了用户可能的问题以及对应的答案。这个技术路线的好处是精准,缺点是需要大量人工工作,而且可扩展性差,需要一个场景一个场景去扩展。目前市场上各种类似于Siri的对话机器人中都大量使用了人工模板的技术,但其精准性是其他方法还无法比拟的。

基于检索技术的聊天机器人则走的是类似搜索引擎的路线,事先存储好对话库并建立索引,根据用户问句,在对话库中进行模糊匹配找到最合适的应答内容。

基于机器翻译技术的聊天机器人把聊天过程比拟成机器翻译过程,就是说将用户输入聊天信息Message,翻译成聊天机器人应答Response的过程类似于把英语翻译成汉语。基于这种假设,就完全可以将统计机器翻译领域相对成熟的技术直接应用到聊天机器人开发中来。

基于深度学习的聊天机器人技术是本文后续内容主要介绍的技术路线,总体而言,绝大多数技术都是在Encoder-Decoder(或者称作Sequence to Sequence)深度学习技术框架下改进的。使用深度学习技术来开发聊天机器人相对传统方法来说,整体思路非常简单并可扩展。

利用深度学习构建聊天机器人
如上所述,目前对于开放领域生成式聊天机器人技术而言,多数采用了Encoder-Decoder框架,所以这里首先描述Encoder-Decoder框架技术原理。然后分别针对聊天机器人研究领域需要特殊考虑的主要问题及其对应的解决方案进行讲解,这些主要问题分别是:多轮会话中的上下文机制、“安全回答”以及个性信息一致性问题。

Encoder-Decoder框架
Encoder-Decoder框架可以看作一种文本处理领域的研究模式,应用场景异常广泛,不仅可用在对话机器人领域,还可以应用在机器翻译、文本摘要、句法分析等各种场合。图1是文本处理领域里常用的Encoder-Decoder框架最抽象的一种表示。Encoder-Decoder框架可以直观地理解为适合处理由一个句子(或篇章)生成另外一个句子(或篇章)的通用处理模型。对于句子对(X,Y),我们的目标是给定输入句子X,期待通过Encoder-Decoder框架来生成目标句子Y。X和Y可以是同一种语言,也可以是两种不同的语言。而X和Y分别由各自的单词序列构成:



Encoder顾名思义就是对输入句子X进行编码,将输入句子通过非线性变换转化为中间语义表示C:



对于解码器Decoder来说,其任务是根据句子X的中间语义表示C和之前已经生成的历史信息y1,y2……yi-1来生成i时刻要生成的单词yi:






图1 抽象的Encoder-Decoder框架

每个yi都依次这么产生,那么看起来就是整个系统根据输入句子X生成了目标句子Y。

对于聊天机器人来说,完全可以使用上述的Encoder-Decoder框架来解决技术问题。具体而言,对应的

多轮会话中的上下文问题
利用上述Encoder-Decoder框架,聊天机器人可以根据用户当前输入Message自动生成应答Response,形成了一个有效的对话系统。但是一般人们聊天并不是单纯的一问一答,回答的内容常常要参考上下文信息Context,也就是在用户当前输入问句Message之前两者的对话信息。因为存在多轮的一问一答,这种情形一般称为多轮会话。

深度学习解决多轮会话的关键是如何将上下文聊天信息Context引入到Encoder-Decoder模型中。Context应该引入到Encoder中,因为这是除了当前输入Message的额外信息,有助于Decoder生成更好的应答Response。目前不同的研究主体思路都是这样,无非如何将Context信息在Encoder端建立模型或者说具体的融入模型有些不同。

表1 聊天机器人聊天效果示例



在上文所述的Encoder-Decoder框架中,很容易想到一种直观地将Context信息融入Encoder的思路:无上下文信息的Encoder-Decoder模型的输入仅仅包含Message,只需要把上下文信息Context和信息Message拼接形成一个长的输入提供给Encoder,这样就把上下文信息融入模型中了。这个直觉本身没有什么问题,但是对于采用RNN模型的Encoder来说,这种方式使得有时候输入非常长,而对于RNN模型来说,输入的线型序列长度越长,模型效果越差。所以简单地拼接Context和Message的策略不会产生太好的聊天效果。

考虑到RNN对长度敏感的问题,文献3提出了针对聊天机器人场景优化的Encoder-Decoder模型,核心思想是将Encoder用多层前向神经网络来代替RNN模型,神经网络的输出代表上下文信息Context和当前输入Message的中间语义表示,而Decoder依据这个中间表示来生成对话Response。这样做既能够将上下文信息Context和当前输入语句Message通过多层前向神经网络编码成Encoder-Decoder模型的中间语义表达,又避免了RNN对于过长输入敏感的问题。图2和图3是论文中提出的两种不同的融合方法,方法1对Context和Message不做明显区分,直接拼接成一个输入;而方法2则明确区分了Context和Message,在前向神经网络的第一层分别对其进行编码,拼接结果作为深层网络后续隐层的输入,核心思想是强调Message的作用,因为毕竟Response是针对Message的应答,Context只是提供了背景信息,所以应该突出Message的作用。

当然,除了Encoder从RNN替换为深层前向神经网络外,文献3与传统Encoder-Decoder还有一个显著区别,就是Decoder的RNN模型每个时刻t在输出当前字符的时候,不仅仅依赖t-1时刻的隐层状态和当前输入,还显示地将Encoder的中间语义
编码直接作为t时刻RNN节点的输入,而不是像经典Encoder-Decoder模型那样把中间语义编码当做Decoder中RNN的最初输入。其出发点也很直观,就是在生成每个输出字符时反复强化中间语义编码的作用,这对于输出应答Response较长的情况是有帮助的。

文献4给出了解决多轮会话上下文问题的另外一种思路(如图4所示),称作层级神经网络(Hierarchical Neural Network,简称HNN)。HNN本质上也是Encoder-Decoder框架,主要区别在于Encoder采用了二级结构,上下文Context中每个句子首先用“句子RNN(Sentence RNN)”对每个单词进行编码形成每个句子的中间表示,而第二级的RNN则将第一级句子RNN的中间表示结果按照上下文中句子出现先后顺序序列进行编码,这级RNN模型可称作“上下文RNN(Context RNN)”,其尾节点处隐层节点状态信息就是所有上下文Context以及当前输入Message的语义编码,以这个信息作为Decoder产生每个单词的输入之一,这样就可以在生成应答Response时把上下文信息考虑进来。

综上所述,深度学习解决多轮会话的上下文信息问题时大致思路相同,都是在Encoder阶段把上下文信息Context及当前输入Message同时编码,从而可以参考上下文信息生成应答Response。

解决“安全回答”(Safe Response)问题
如果采用经典的Encoder-Decoder模型构建开放领域生成式聊天机器人系统,一个比较容易产生的严重问题就是“安全回答”。就是说不论用户说什么内容,聊天机器人都用少数非常常见的句子进行应答,比如英文的“I don’t know”、“Come on”、“I’ m OK”,中文的“是吗”、“呵呵”等。虽然很多种情况下这么回答也不能说是错误的,但可以想象,如果用户遇到这样一位聊天对象会有多抓狂。

这个现象产生的主要原因是聊天训练数据中确实有很多这种宽泛而无意义的应答,所以机器人通过Encoder-Decoder模型学会这种常见应答模式。如何解决聊天机器人“安全回答”问题,让机器产生多样化的应答是个重要的课题。



图2 融合方法1




图3 融合方法2




图4 层级神经网络

文献5即在Sequence-to-Sequence框架下来解决“安全回答”问题。在聊天场景下,使用Sequence-to-Sequence框架来进行模型训练时,传统的优化目标基本上是最大似然法(MLE),就是说给定用户输入Message,通过训练来最大化生成应答Response的概率:



其中M代表message,R代表Response。

文献X提出了改进的优化目标函数:最大化互信息(MMI),其目标函数如下:



可以从公式差异中看出,MMI的优化目标除了最大化从Message生成应答Response的概率,同时加入了反向优化目标,即最大化应答Response产生Message的概率(即log p(M|R)部分),是控制两者哪个更重要的调节超参数。通过其名称“互信息”以及具体公式可以看出,这个优化目标函数要求应答Response和Message内容密切相关而不仅仅是考虑哪个Response以更高概率出现,从而降低了那些非常常见的回答的生成概率,使得应答Response更多样化且跟Message语义更相关。

采用MMI作为目标函数明显解决了很多“安全回答”问题,表2是两个不同优化目标函数产生的应答Response的示例,其中Message列代表用户输入语句Message,S2S Response代表MLE优化目标产生的应答,MMI Response代表MMI优化目标产生的应答。

表2 S2S与MMI产生的应答



个性信息一致性问题
对于聊天助手等应用来说,聊天机器人往往会被用户当做一个具有个性的虚拟人,比如经常会问“你多大了”、“你的爱好是什么”、“你是哪里人啊”等问题。如果将聊天助手当做一个虚拟人,那么这位虚拟人相关的年龄、性别、爱好、语言风格等个性特征信息应该维护回答的一致性。利用经典的Sequence-to-Sequence模型训练出的聊天助手往往很难保持这种个性信息的一致性(不一致的例子请参考图5),这是因为Sequence-to-Sequence模型训练的都是单句Message对单句Response的映射关系,内在并没有统一维护聊天助手个性信息的场所,所以并不能保证相同的问题每次能够产生完全相同的应答。另外,对于海量用户来说,可能不同的用户会喜欢不同聊天风格或者不同身份的聊天助手,所以聊天机器人应该能够提供不同身份和个性信息的聊天助手,不同类型用户可以采用相应类型的聊天助手来聊天,当然,在聊天过程中要尽量保持身份和个性信息的一致性。

那么如何在Sequence-to-Sequence框架下采用技术手段维护聊天助手的个性信息一致性呢?文献6给出了一种比较典型的解决方案,我们可以改造出一个能够实现不同身份个性特征的聊天助手思路。图6是其示意图(注意:本文叙述的并非文献6中的原始场景,而是本文作者参照文献稍作修正的技术方案)。

其基本思路如下:聊天机器人系统可以定义不同身份、个性及语言风格的聊天助理,个性化信息通过Word Embedding的表达方式来体现,在维护聊天助手个性或身份一致性的时候,可以根据聊天对象选择某种风格、身份的聊天助手。整体技术框架仍然采用Sequence-to-Sequence架构,其实现思路是把聊天助手的个性信息导入到Decoder的输出过程中,就是说在采用RNN的Decoder生成应答Response的时候,每个t时刻,神经网络节点除了RNN标准的输入外,也将选定身份的个性化Word Embedding信息一并作为输入。这样就可以引导系统在输出时倾向于输出符合身份特征的个性化信息。

上述是一种深度学习框架下维护聊天助手个性一致的技术框架,很明显还可以衍生出很多种其他方案,但是技术思路应该是类似的,核心思想是把聊天助手的个性信息在Decoder阶段能够体现出来,以达到维护个性一致的目的。

小结
上述内容介绍了使用深度学习构建聊天机器人采用的主体技术框架以及面临的一些独特问题及相应的解决方案。此外,还有一些问题值得探讨,比如如何使得聊天机器人有主动引导话题的能力,因为一般聊天机器人都比较被动,话题往往都是由用户发起和引导,聊天机器人只是作为应答方,很少主动引导新话题,而这很容易导致聊天冷场,所以如何主动引导话题也是聊天机器人应该具备的能力之一,文献7提出了一种技术方案,此处不赘述,感兴趣的读者可自行参考。



图5 个性信息不一致问题(这是利用Twitter 2500万训练数据经过Sequence-to-Sequence模型训练后产生的结果)



图6 一种Sequence-to-Sequence框架下维护聊天助手个性信息一致性的方案

深度学习聊天机器人的优点与需要改进的方向
相对基于检索类或者机器翻译类传统技术而言,基于Encoder-Decoder深度学习框架的聊天机器人具有如下明显优点:
  • 构建过程是端到端(End-to-End)数据驱动的,只要给定训练数据即可训练出效果还不错的聊天系统,省去了很多特征抽取以及各种复杂中间步骤的处理,比如省去句法分析与语义分析等传统NLP绕不开的工作,使得系统开发效率大幅提高。
  • 语言无关,可扩展性强。对于开发不同语言的聊天机器人来说,如果采用Encoder-Decoder技术框架,只需要使用不同语言的聊天数据进行训练即可,不需要专门针对某种语言做相关的特定优化措施,这使得系统可扩展性大大加强。
  • 训练数据扩大有助于持续提升系统效果。对于Encoder-Decoder深度学习模型来说,一般通过不断增加训练数据就能够带来持续的效果提升。
  • 当然,开发出具备像人一样能够自然交流的聊天机器人目前还面临着各种技术难题,具体到使用深度学习技术来构建聊天机器人来说,目前在以下几个方面还需大力加强:
  • 聊天机器人的评价标准。聊天机器人效果质量的评价标准对于持续提升系统是至关重要的,因为只有这样才能有针对性地设计技术方案进行改进。聊天机器人在评价标准方面还有待深入研究,目前常用的标准包括机器翻译的评价指标BLEU、语言模型评价标准困惑度等,还有很多工作是通过人工来进行效果评价,还没有特别合适的专用于聊天机器人的评价标准,这是阻碍聊天机器人技术持续发展的一个障碍。
  • 缺乏标准化的大规模训练数据。就像上述深度学习模型优点所述,训练数据的不断增加一般能够带来性能的持续提升。但是目前来说,标准化的特大规模人与人对话数据相对缺乏,很多研究都是通过Twitter或者微博评论等高成本的采集方式来收集对话训练数据,或者使用电影字幕等比较间接的方式来积累训练数据。如果能够有大规模的标准聊天数据,很明显将能够极大促进技术进步。
  • 技术仍处于发展初期。很明显采用深度学习来构建聊天机器人的技术研发还处于非常初期的阶段,技术手段也好,实际系统效果也好,都有非常大的进步空间。

参考文献:

[1]Lifeng Shang, Zhengdong Lu, and Hang Li.2015. Neural responding machine for short-text conversation. In ACL-IJCNLP, pages 1577–1586.

[2] Oriol Vinyals and Quoc Le. 2015. A neural conversational model. In Proc. of ICML Deep Learning Workshop.

[3] Alessandro Sordoni, Michel Galley, Michael Auli, ChrisBrockett, Yangfeng Ji, Meg Mitchell,Jian-Yun Nie,Jianfeng Gao, and Bill Dolan. 2015.A neural network approach to context-sensitive generation of conversational responses. In Proc. of NAACL-HLT.

[4] Iulian V Serban, Alessandro Sordoni, Yoshua Bengio,Aaron Courville, and Joelle Pineau. 2015. Building end-to-end dialogue systems using generative hierarchical neural network models. In Proc. of AAAI.

[5]Jiwei Li, Michel Galley, Chris Brockett, Jianfeng Gao,and Bill Dolan. 2015. A diversity-promoting objective function for neural conversation models. arXiv preprint arXiv:15

[6] Jiwei Li, Michel Galley, Chris Brockett, Jianfeng Gao and Bill Dolan. A Persona-Based Neural Conversation Model. arXiv preprint arXiv:16

[7] Xiang Li,Lili Mou,Rui Yan and Ming Zhang. StalemateBreaker: A Proactive Content-Introducing Approach to Automatic Human-
Computer Conversation.IJCAI 2016.
  • 大小: 12.5 KB
  • 大小: 6.2 KB
  • 大小: 11.3 KB
  • 大小: 63.9 KB
  • 大小: 87.8 KB
  • 大小: 100.9 KB
  • 大小: 133.8 KB
  • 大小: 132.4 KB
  • 大小: 17 KB
  • 大小: 28.4 KB
  • 大小: 31.2 KB
  • 大小: 51.5 KB
  • 大小: 158.8 KB
0
0
评论 共 0 条 请登录后发表评论

发表评论

您还没有登录,请您登录后再发表评论

相关推荐

  • 一个基于C语言的简易学生管理系统.zip

    C语言是一种广泛使用的编程语言,它具有高效、灵活、可移植性强等特点,被广泛应用于操作系统、嵌入式系统、数据库、编译器等领域的开发。C语言的基本语法包括变量、数据类型、运算符、控制结构(如if语句、循环语句等)、函数、指针等。在编写C程序时,需要注意变量的声明和定义、指针的使用、内存的分配与释放等问题。C语言中常用的数据结构包括: 1. 数组:一种存储同类型数据的结构,可以进行索引访问和修改。 2. 链表:一种存储不同类型数据的结构,每个节点包含数据和指向下一个节点的指针。 3. 栈:一种后进先出(LIFO)的数据结构,可以通过压入(push)和弹出(pop)操作进行数据的存储和取出。 4. 队列:一种先进先出(FIFO)的数据结构,可以通过入队(enqueue)和出队(dequeue)操作进行数据的存储和取出。 5. 树:一种存储具有父子关系的数据结构,可以通过中序遍历、前序遍历和后序遍历等方式进行数据的访问和修改。 6. 图:一种存储具有节点和边关系的数据结构,可以通过广度优先搜索、深度优先搜索等方式进行数据的访问和修改。 这些数据结构在C语言中都有相应的实现方式,可以应用于各种不同的场景。C语言中的各种数据结构都有其优缺点,下面列举一些常见的数据结构的优缺点: 数组: 优点:访问和修改元素的速度非常快,适用于需要频繁读取和修改数据的场合。 缺点:数组的长度是固定的,不适合存储大小不固定的动态数据,另外数组在内存中是连续分配的,当数组较大时可能会导致内存碎片化。 链表: 优点:可以方便地插入和删除元素,适用于需要频繁插入和删除数据的场合。 缺点:访问和修改元素的速度相对较慢,因为需要遍历链表找到指定的节点。 栈: 优点:后进先出(LIFO)的特性使得栈在处理递归和括号匹配等问题时非常方便。 缺点:栈的空间有限,当数据量较大时可能会导致栈溢出。 队列: 优点:先进先出(FIFO)的特性使得

  • 数通系列ospf学习思维导图

    数通系列ospf学习思维导图

  • 基于UDP的聊天软件,纯C语言编写(使用时记得修改IP地址).zip

    C语言是一种广泛使用的编程语言,它具有高效、灵活、可移植性强等特点,被广泛应用于操作系统、嵌入式系统、数据库、编译器等领域的开发。C语言的基本语法包括变量、数据类型、运算符、控制结构(如if语句、循环语句等)、函数、指针等。下面详细介绍C语言的基本概念和语法。 1. 变量和数据类型 在C语言中,变量用于存储数据,数据类型用于定义变量的类型和范围。C语言支持多种数据类型,包括基本数据类型(如int、float、char等)和复合数据类型(如结构体、联合等)。 2. 运算符 C语言中常用的运算符包括算术运算符(如+、、、/等)、关系运算符(如==、!=、、=、<、<=等)、逻辑运算符(如&&、||、!等)。此外,还有位运算符(如&、|、^等)和指针运算符(如、等)。 3. 控制结构 C语言中常用的控制结构包括if语句、循环语句(如for、while等)和switch语句。通过这些控制结构,可以实现程序的分支、循环和多路选择等功能。 4. 函数 函数是C语言中用于封装代码的单元,可以实现代码的复用和模块化。C语言中定义函数使用关键字“void”或返回值类型(如int、float等),并通过“{”和“}”括起来的代码块来实现函数的功能。 5. 指针 指针是C语言中用于存储变量地址的变量。通过指针,可以实现对内存的间接访问和修改。C语言中定义指针使用星号()符号,指向数组、字符串和结构体等数据结构时,还需要注意数组名和字符串常量的特殊性质。 6. 数组和字符串 数组是C语言中用于存储同类型数据的结构,可以通过索引访问和修改数组中的元素。字符串是C语言中用于存储文本数据的特殊类型,通常以字符串常量的形式出现,用双引号("...")括起来,末尾自动添加'\0'字符。 7. 结构体和联合 结构体和联合是C语言中用于存储不同类型数据的复合数据类型。结构体由多个成员组成,每个成员可以是不同的数据类型;联合由多个变量组成,它们共用同一块内存空间。通过结构体和联合,可以实现数据的封装和抽象。 8. 文件操作 C语言中通过文件操作函数(如fopen、fclose、fread、fwrite等)实现对文件的读写操作。文件操作函数通常返回文件指针,用于表示打开的文件。通过文件指针,可以进行文件的定位、读写等操作。 总之,C语言是一种功能强大、灵活高效的编程语言,广泛应用于各种领域。掌握C语言的基本语法和数据结构,可以为编程学习和实践打下坚实的基础。

  • VBA复制指定路径文件待粘贴【可用于自动发微信文件】.xlsm

    VBA复制指定路径文件待粘贴【可用于自动发微信文件】.xlsm 有时候我们需要复制指定路径的文件,然后到指定的位置或软件进行粘贴 所有我们可根据指定的路径文件进行复制,待粘贴

  • 基于QT、ARM开发板、Linux系统并对接百度AI的停车管理系统.zip

    该资源内项目源码是个人的课程设计、毕业设计,代码都测试ok,都是运行成功后才上传资源,答辩评审平均分达到96分,放心下载使用! ## 项目备注 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.md文件(如有),仅供学习参考, 切勿用于商业用途。 该资源内项目源码是个人的课程设计,代码都测试ok,都是运行成功后才上传资源,答辩评审平均分达到96分,放心下载使用! ## 项目备注 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.md文件(如有),仅供学习参考, 切勿用于商业用途。

  • 上海理工大学C语言课程设计作业:基于LSTM模型的头条号热词分析.zip

    C语言是一种广泛使用的编程语言,它具有高效、灵活、可移植性强等特点,被广泛应用于操作系统、嵌入式系统、数据库、编译器等领域的开发。C语言的基本语法包括变量、数据类型、运算符、控制结构(如if语句、循环语句等)、函数、指针等。下面详细介绍C语言的基本概念和语法。 1. 变量和数据类型 在C语言中,变量用于存储数据,数据类型用于定义变量的类型和范围。C语言支持多种数据类型,包括基本数据类型(如int、float、char等)和复合数据类型(如结构体、联合等)。 2. 运算符 C语言中常用的运算符包括算术运算符(如+、、、/等)、关系运算符(如==、!=、、=、<、<=等)、逻辑运算符(如&&、||、!等)。此外,还有位运算符(如&、|、^等)和指针运算符(如、等)。 3. 控制结构 C语言中常用的控制结构包括if语句、循环语句(如for、while等)和switch语句。通过这些控制结构,可以实现程序的分支、循环和多路选择等功能。 4. 函数 函数是C语言中用于封装代码的单元,可以实现代码的复用和模块化。C语言中定义函数使用关键字“void”或返回值类型(如int、float等),并通过“{”和“}”括起来的代码块来实现函数的功能。 5. 指针 指针是C语言中用于存储变量地址的变量。通过指针,可以实现对内存的间接访问和修改。C语言中定义指针使用星号()符号,指向数组、字符串和结构体等数据结构时,还需要注意数组名和字符串常量的特殊性质。 6. 数组和字符串 数组是C语言中用于存储同类型数据的结构,可以通过索引访问和修改数组中的元素。字符串是C语言中用于存储文本数据的特殊类型,通常以字符串常量的形式出现,用双引号("...")括起来,末尾自动添加'\0'字符。 7. 结构体和联合 结构体和联合是C语言中用于存储不同类型数据的复合数据类型。结构体由多个成员组成,每个成员可以是不同的数据类型;联合由多个变量组成,它们共用同一块内存空间。通过结构体和联合,可以实现数据的封装和抽象。 8. 文件操作 C语言中通过文件操作函数(如fopen、fclose、fread、fwrite等)实现对文件的读写操作。文件操作函数通常返回文件指针,用于表示打开的文件。通过文件指针,可以进行文件的定位、读写等操作。 总之,C语言是一种功能强大、灵活高效的编程语言,广泛应用于各种领域。掌握C语言的基本语法和数据结构,可以为编程学习和实践打下坚实的基础。

  • 嵌入式Liunx应用程序开发笔记-代码.zip

    该资源内项目源码是个人的课程设计、毕业设计,代码都测试ok,都是运行成功后才上传资源,答辩评审平均分达到96分,放心下载使用! ## 项目备注 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.md文件(如有),仅供学习参考, 切勿用于商业用途。 该资源内项目源码是个人的课程设计,代码都测试ok,都是运行成功后才上传资源,答辩评审平均分达到96分,放心下载使用! ## 项目备注 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.md文件(如有),仅供学习参考, 切勿用于商业用途。

  • 目标检测-零售食品LOGO检测数据集-1000张图-+对应VOC-COCO-YOLO三种格式标签+数据集划分脚本

    ● 数据集介绍:零售食品 LOGO 检测数据集,真实零售食品 LOGO 高质量商品图片数据,数据集含常见零售食品 LOGO 图片,包括饮料类、酒类、调味品类、膨化饼干类、巧克力类、常见零食类等等。数据集类别丰富,标注标签包含 1500 个商品商标类别; ● 适用实际项目应用:零售食品 LOGO 检测项目,以及作为通用新零售场景商品目标检测数据集场景数据的补充; ● 标注说明:采用 labelimg 标注软件进行标注,标注质量高,提供 VOC(xml)、COCO (json)、YOLO (txt) 三种常见目标检测数据集格式,可以直接用于如 YOLO 等的算法训练; 注意:由于数据集资源超过 1G,所以托管在我的百度网盘,所以这里的资源格式是 PDF,内附数据集基本情况介绍以及数据集获取方式!

  • 12121212132323232323

    12121212132323232323

  • 基于jsp+servlet实现的旅游管理系统.zip

    该资源内项目源码是个人的课程设计、毕业设计,代码都测试ok,都是运行成功后才上传资源,答辩评审平均分达到96分,放心下载使用! ## 项目备注 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.md文件(如有),仅供学习参考, 切勿用于商业用途。 该资源内项目源码是个人的课程设计,代码都测试ok,都是运行成功后才上传资源,答辩评审平均分达到96分,放心下载使用! ## 项目备注 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.md文件(如有),仅供学习参考, 切勿用于商业用途。

  • Java课程设计,做个扫雷游戏.zip

    该资源内项目源码是个人的课程设计、毕业设计,代码都测试ok,都是运行成功后才上传资源,答辩评审平均分达到96分,放心下载使用! ## 项目备注 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.md文件(如有),仅供学习参考, 切勿用于商业用途。 该资源内项目源码是个人的课程设计,代码都测试ok,都是运行成功后才上传资源,答辩评审平均分达到96分,放心下载使用! ## 项目备注 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.md文件(如有),仅供学习参考, 切勿用于商业用途。

  • 断指(肢)再植术护理规定(医院规章制度管理文件).docx

    断指(肢)再植术护理规定(医院规章制度管理文件).docx

  • 燃油消耗统计表.docx

    燃油消耗统计表.docx

  • 常见基础数据结构的C语言实现,包含顺序表,链表,栈,队列,串,树,图等,基于Visual Studio 2019.zip

    C语言是一种广泛使用的编程语言,它具有高效、灵活、可移植性强等特点,被广泛应用于操作系统、嵌入式系统、数据库、编译器等领域的开发。C语言的基本语法包括变量、数据类型、运算符、控制结构(如if语句、循环语句等)、函数、指针等。下面详细介绍C语言的基本概念和语法。 1. 变量和数据类型 在C语言中,变量用于存储数据,数据类型用于定义变量的类型和范围。C语言支持多种数据类型,包括基本数据类型(如int、float、char等)和复合数据类型(如结构体、联合等)。 2. 运算符 C语言中常用的运算符包括算术运算符(如+、、、/等)、关系运算符(如==、!=、、=、<、<=等)、逻辑运算符(如&&、||、!等)。此外,还有位运算符(如&、|、^等)和指针运算符(如、等)。 3. 控制结构 C语言中常用的控制结构包括if语句、循环语句(如for、while等)和switch语句。通过这些控制结构,可以实现程序的分支、循环和多路选择等功能。 4. 函数 函数是C语言中用于封装代码的单元,可以实现代码的复用和模块化。C语言中定义函数使用关键字“void”或返回值类型(如int、float等),并通过“{”和“}”括起来的代码块来实现函数的功能。 5. 指针 指针是C语言中用于存储变量地址的变量。通过指针,可以实现对内存的间接访问和修改。C语言中定义指针使用星号()符号,指向数组、字符串和结构体等数据结构时,还需要注意数组名和字符串常量的特殊性质。 6. 数组和字符串 数组是C语言中用于存储同类型数据的结构,可以通过索引访问和修改数组中的元素。字符串是C语言中用于存储文本数据的特殊类型,通常以字符串常量的形式出现,用双引号("...")括起来,末尾自动添加'\0'字符。 7. 结构体和联合 结构体和联合是C语言中用于存储不同类型数据的复合数据类型。结构体由多个成员组成,每个成员可以是不同的数据类型;联合由多个变量组成,它们共用同一块内存空间。通过结构体和联合,可以实现数据的封装和抽象。 8. 文件操作 C语言中通过文件操作函数(如fopen、fclose、fread、fwrite等)实现对文件的读写操作。文件操作函数通常返回文件指针,用于表示打开的文件。通过文件指针,可以进行文件的定位、读写等操作。 总之,C语言是一种功能强大、灵活高效的编程语言,广泛应用于各种领域。掌握C语言的基本语法和数据结构,可以为编程学习和实践打下坚实的基础。

  • 外固定支架患者健康教育学习培训资料(心理指导、饮食指导、休息、运动或体位指导、功能锻炼 ).docx

    外固定支架患者健康教育学习培训资料(心理指导、饮食指导、休息、运动或体位指导、功能锻炼 ).docx

  • chromedriver-win64_118.0.5940.0.zip

    chromedriver-win64_118.0.5940.0.zip

  • QT-qtablewidget表头添加复选框QHeaderView

    在 Qt 框架中,要在 QTableWidget的表头中添加复选框,可以通过继承 QHeaderView 并重写 paintSection 方法来实现。 介绍一种继承 QHeaderView的方法分别实现QTableWidget中添加复选框,可全选/全不选/部分选。

  • SDP零信任与AI结合思考

    未来差异化SDP零信任的技术创新点 - AI的结合思路及技术落地方案 ;探讨AI与SDP零信任结合的技术创新点 - 当前网络安全形势与挑战 - 传统安全架构的局限性 - SDP和零信任的兴起背景

  • 环境因素及控制措施表.docx

    环境因素及控制措施表.docx

Global site tag (gtag.js) - Google Analytics