| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 人工智能 -> 学习识别对话式问答中的后续问题 -> 正文阅读 |
|
[人工智能]学习识别对话式问答中的后续问题 |
题目:学习识别对话式问答中的后续问题 目录 摘要? ? ? ?尽管最近在对话式问答方面取得了进展,但大多数先前的工作并不关注后续问题。实用的对话问答系统经常会在正在进行的对话中收到后续问题,对于系统来说能够确定问题是否是当前对话的后续问题是至关重要,以便随后更有效地找到答案。本文介绍了一个新的后续问题识别任务,提出了一个三向注意力池网络,它通过捕获相关段落、对话历史和候选后续问题之间的成对交互来确定后续问题的适用性。它使模型能够在对特定候选后续问题进行评分时捕捉主题连续性和主题转移。实验表明,本文提出的三向注意力池网络以显着的优势优于所有基线系统。 1.介绍? ? ? ?对话式问答(QA)模仿自然人与人对话的过程。最近,对话式QA受到了广泛关注,其中系统需要从相关文本段落或结构化知识图中回答一系列相互关联的问题。然而,大多数对话式QA任务并没有明确关注要求模型来识别后续问题。一个实用的对话式QA系统必须具备很好地理解对话历史并识别当前问题是否是该特定对话的后续问题的能力。考虑用户尝试与机器(例如 Siri、Google Home、Alexa、Cortana 等)对话:首先,用户提出问题,机器回答。当用户问第二个问题时,机器了解它是否是第一个问题及其答案的后续是非常重要的。这需要针对用户在正在进行的对话中提出的每个问题进行确定。机器通过判断问题是否与历史对话问题相关来判断是否是后续问题,接下来将使用合适的答案查找策略来回答问题:①若为后续问题,QA系统首先使用信息检索(IR)引擎检索一些相关文档来回答问题。②若不是后续问题,QA系统会根据问题通过IR引擎通信以检索其他支持文档。 ? ? ? ?图1中给出了一些示例,以说明对话式阅读理解环境中的后续问题识别任务。本文提出了一个新的数据集,用于学习识别后续问题,即LIF。给定一个文本段落作为知识和一系列问答对作为对话历史,它需要一个模型通过识别候选问题主题连续性或主题转移来确定候选的问题是有效还是无效。例如,在图1中给出的示例①中,模型需要从对话历史(1)中(即,第一部电影是血肉)捕获主题连续性以及从(2)中获取主题转移(即,电影类型)。(2)中的候选后续问题是无效的,因为相关的段落没有提供关于他最后几年的任何信息。最后一个后续问题示例③无效,因为Verhoeven是他,而不是她。
图 1:说明后续问题识别任务的示例。 ? ? ? ?过去有一些研究侧重于确定对话历史的哪一部分对于处理后续问题很重要。然而,最近提出的基于神经网络的会话QA模型并没有明确关注后续问题。本文中提出了一种三向注意力池网络,用于会话阅读理解环境中的后续问题识别。它基于两个角度来评估每个候选的后续问题——话题转移和话题连续性。所提出的模型利用两个注意力矩阵,它们以相关段落为条件,以捕捉后续问题中的主题转移。它还依赖于另一个注意力矩阵来直接从对话历史记录中的先前问答对中捕获主题连续性。为了进行比较,还研究了几个强大的基准系统用于后续问题识别。 本文的贡献如下: 2.任务概述? ? ? ?给定一段文本、对话历史中的一系列问答对和候选后续问题,任务是确定候选后续问题是否是有效的后续问题。符号表示: 3.LIF 数据集? ? ? 在本节中,将描述作者如何准备LIF数据集,然后对数据集进行分析。 3.1 数据准备? ? ? ?本文依靠QuAC数据集来准备LIF数据集。QuAC数据集中的每个问题都被分配了三个类别之一:“确定的(should ask)”、“可能确定的(could ask)”或“不能回答(should not ask)”后续问题。使用“确定的(should ask)”后续问题实例来构建数据集的有效实例。由于QuAC的测试集是隐藏的(Question Answering in Context官网只给了训练和开发集,未给测试集),将QuAC开发集分成两半,生成LIF的开发集和测试集。拆分是在段落级别进行的,以确保在开发和测试集中使用的段落没有重叠。 ? ? ? ? 正样本 ? ? ? ? 负样本 ? ? ? ?对于训练集和开发集,结合了来自其他对话和同一对话的所有候选后续问题。为来自不同来源的候选保留三个测试集:来自其他对话和同一对话(Test-I),仅来自其他对话(Test-II),仅来自同一对话(Test-三)。表1给出了整个数据集的统计数据。从Test-I集中随机抽取了100个无效的后续问题,并手动检查它们,验证了其中97%是真正无效的。 表 1:LIF数据集统计数据。 FUQ?后续问题 3.2 数据集的挑战? ? ? ?为了识别问题是否是有效的后续问题,模型需要能够捕捉其与相关段落和对话历史的相关性。该模型需要确定问题的主题是否与相关段落或对话历史中的主题相同,代词(例如I, he, she)和所有格代词(例如,my, his, her)的引入通常会分散注意力。在确定后续问题的有效性时,代词的这种解析是一个关键方面。它还需要检查候选后续问题中描述的主题的动作和特征是否可以从相关的段落或对话历史中逻辑推断出来。此外,捕捉主题连续性和主题转移对于确定后续问题的有效性是必要的。无效后续问题中的主题及其行为或特征经常在段落中提及,但与不同的主题相关联。 3.3 数据分析? ? ? 本文从Test-I集中随机抽取了100个无效实例,并根据表2中给出的不同属性手动分析它们。发现35%的无效问题与相关段落具有相同的主题,42%的问题需要代词解析。11%的问题与有效后续问题具有相同的主题实体,5%的问题与对话历史中的最后一个问题具有相同的主题实体。8%的无效问题中的代词与相应的有效后续问题中的代词匹配,另外8%的案例中匹配对话历史中的最后一个问题。对于7%的案例,问题类型与有效问题相同,对于6%的案例,它们与对话历史中的最后一个问题类型相同。作者还观察到,4%的无效问题提到了与相应有效问题相同的动作,并且在3%的案例中它们与对话历史中的最后一个问题相同。这些属性的分布显示了解决这一任务的挑战。 表2:对LIF数据集的分析。百分比加起来不等于100%(大于100%),因为许多示例包含多个属性。(Q~—无效的后续问题;P—相关段落;G—有效的后续问题;L—对话历史中的最后一个问题)。 4.三向注意力池化网络? ? ? ?在本节中,描述了三向注意力池网络。首先,将嵌入层应用于相关段落、对话历史和候选后续问题。此外,对它们进行编码以导出序列级编码向量。最后,将提出的三向注意力池网络应用于每个候选后续问题的评分。 4.1嵌入和编码? ? ? ? 嵌入(Embedding)和 编码(Encoding)区别,参考encoding与embedding - 简书。字符嵌入(character-level Embedding)参考自然语言处理中的Character Embedding技术_土豆洋芋山药蛋的博客-CSDN博客。 ? ? ? ?备注:通过字符嵌入(将词细粒度化)和词嵌入获得单词之间的语义相似度表示(意思相近的词在嵌入空间中力的较近,数值也相差较小),而编码是将历史对话、后续问题这样的长文本的词进行编码。两者不一样,是先对词嵌入,在嵌入的基础上再对文本编码,可以理解为Embedding和Encoding都是编码,而嵌入是考虑了词之间的语义关系。 4.4.1 嵌入? ? ? 同时使用字符嵌入和词嵌入2我们还对 ELMO 和 BERT 进行了试验,但没有观察到任何一致的改进。类似于Kim (2014),使用卷积神经网络(CNN)获得字符级嵌入。首先,使用基于字符的查找表将字符嵌入为向量,将其喂到CNN,其大小是CNN的输入通道大小。然后在整个宽度上对CNN输出进行最大池化,以获得每个token的固定大小的向量。使用来自GloVe (Pennington et al., 2014) 的预训练向量来为每个token获得一个固定长度的词嵌入向量。最后,将单词和字符嵌入连接起来以获得最终的嵌入。 4.1.2 联合编码? ? ? ?使用双向LSTM,将对话历史、候选后续问题和段落编码的序列级编码分别表示为Q∈R、C∈和D∈,其中H是隐藏单元的数量。对段落和对话历史进行联合编码,推导出相似矩阵A = ∈,在A上应用一个逐行softmax函数来获得R∈(归一化,因为相似矩阵数值有大有小,故将其归一化)。现在,对于所有的段落词、会话历史的聚合表示为G = RQ∈。然后将与G中的段落词对应的聚合向量与D中的段落向量连接起来,然后是另一个BiLSTM以获得联合表示V∈。 4.1.3 多因素注意力? ? ? 此外,多因子自注意力编码应用于联合表示。如果m代表因子个数,多因子注意力 ∈ 公式为: ? ? ? ?这里∈是一个三向张量。对执行最大池化操作,在因子数量上,导致自注意力矩阵F ∈ 。通过应用逐行的softmax 函数对F进行归一化,从而得到?∈ 。现在自我注意编码可以给出为 M = V ∈ 。然后将自注意力编码向量与联合编码向量连接起来,然后应用基于前馈神经网络的门控来控制整体影响,导致 Y ∈。 最后一段编码 P ∈?是通过在 Y 上应用另一个 BiLSTM 层获得的。 4.2 三向注意力池使用三向注意力池网络对每个候选后续问题进行评分。网络架构如图2所示。 图 2:三路注意力池网络的架构。 ? ? ? ?注意力pooling(AP)首先由dos Santos等人(2016)提出并成功用于答案句子选择任务。AP本质上是一种注意力机制,可以联合学习一对输入的表示及它们的相似性度量。主要思想是将成对的输入投影到一个公共表示空间中,以更合理地比较它们,即使两个输入在语义上没有可比性,例如问答对。在本文中,将注意力pooling网络的思想扩展到所提出的用于后续问题识别任务的三路注意力集中网络,该模型需要通过与对话历史和相关段落进行比较来捕捉候选后续问题的适用性。特别是,所提出的模型旨在捕捉后续问题中的主题转移和主题延续。多斯桑托斯等人(2016)使用单个注意力矩阵来比较一对输入。相比之下,本文提出的模型依赖于三个注意力矩阵,其中两个额外的注意力矩阵利用相关的段落(捕获主题转移)。此外,与多斯桑托斯等人提出的模型相比,本文提出的模型是为了处理更复杂的后续问题识别任务而开发的。本文根据其与对话历史的相关性从两个不同的角度对每个候选后续问题进行评分:(1)考虑相关的段落(即知识)和(2)不考虑段落。 ? ? ?注意矩阵计算 ? ? ? ?其中fattn(.)函数可以写成fattn(Q, P) = 。直观地说,Aq,p(i, j) 捕获了段落中第i个token和对话历史记录中的第 j 个token之间的上下文相似度得分。类似地,注意力矩阵 Ac,p ∈ ?,捕捉候选后续问题和相关段落的上下文相似性,Ac,p(i,j)捕获了段落中第i个token和后续问题的第j个token之间的文本相似度得分: ? ? ? 给定P,Aq,p和Ac,p将联合用于捕获Q和C之间的相似性。 ? ? ? 矩阵Ac,q ∈ ,它捕获候选后续问题和不考虑相关段落的对话历史记录相似度得分: ? ? ? ?注意力Pooling ? ? ? ?rqp的第i个元素表示为:(对话历史中第i个token的文本编码)相对于(段落编码)的相对重要性分数。rcp 表示为:(候选问题中第i个token的文本编码)相对于(段落编码)的相对重要性分数。当不考虑相关的段落编码时,对Ac,q执行行和列最大池化以分别生成rqc∈和rcq ∈。rqc的第i个元素表示为:(对话历史中第i个token的文本编码)相当于(候选问题编码)的相对重要性分数,rcq的第i个元素表示为:(候选问题编码)相当于(对话历史中第i个token的文本编码)的相对重要性分数。 ? ? ? ?候选评分 ? ? ? ?其中C是C的编码。相似函数fsim(C, Q|P) = xyT,其中x=rqp Q∈RH和y=rcp C∈RH。另一个相似函数fsim(C,Q) = ,其中m = rqc Q∈和n=rcq C∈。上边说的rqp第i个元素表示为历史对话第i个token的文本编码相对于段落编码的相对重要性分数,加上Q是历史对话的整体相对于段落编码的重要性分数。 ? ? ? ?使用二元交叉熵损失来训练模型。对于预测,找到了一个阈值来最大化开发集的分数。对于测试实例,使用阈值来预测后续问题是有效还是无效(看复现介绍)。 5基线模型? ? ? ?本文开发了几种基于规则的统计机器学习和神经基线模型。对于所有模型,根据开发集上的最佳性能确定阈值。 5.1基于规则的模型? ? ? ?本文开发了两个基于单词重叠计数的模型——在候选后续问题和段落之间,以及在候选后续问题和对话历史之间。 根据候选后续问题的长度对计数值进行标准化。 ? ? ? ?接下来,使用InferSent句子嵌入基于上下文相似度分数开发了两个模型。这两个模型分别将候选后续问题与相关段落和对话历史进行比较。相似度分数是基于向量余弦相似度计算的。 ? ? ? ?还使用tf-idf加权token重叠分数开发了另一个基于规则的模型。将对话历史中的最后一个问题添加到候选后续问题中,并在连接的上下文和段落之间添加重叠单词的 tf idf。 5.2 统计机器学习模型? ? ? ?本文为统计机器学习模型手工制作了两组特征。一组特征由 tf-idf 加权GloVe向量组成。由于作者在实验中采用了300维 GloVe 向量,因此这些特征的维数为300。 ? ? ? ?另一组特征包括单词重叠计数。计算候选后续问题、相关段落和对话历史之间的成对单词重叠计数。基于重叠计数的特征是维度 3。使用派生的特征对逻辑回归进行实验。 5.3 神经模型? ? ? ?本文还开发了几个神经基线模型。首先嵌入(与前面描述的相同),然后连接相关的段落、对话历史和候选后续问题。然后,使用BiLSTM或CNN应用序列级编码。对于CNN,使用相同数量的unigram、bigram 和 trigram 过滤器,并将输出连接起来以获得最终编码。接下来,应用全局最大池化或注意力池化来获得聚合向量表示,然后是前馈层来对候选后续问题进行评分。 令连接文本的序列编码为 E ∈ R,et为E的第t行。注意力池的聚合向量 e ∈ 可得为 ? ? ? ?其中 w ∈ 是一个可学习的向量。使用BERT开发了一个基线模型。首先连接所有输入,然后应用BERT来导出上下文向量。接下来,使用注意力将它们聚合成一个向量。 然后使用前馈层对每个候选后续问题进行评分。 6实验? ? ? 在本节中,将介绍实验设置、结果和性能分析。 6.1 实验设置? ? ? ?在训练期间不更新GloVe向量。100维字符级嵌入向量。所有LSTM中隐藏单元的数量为150(H = 300)。使用概率为0.3的dropout。将多因子注意力编码中的因子数量设置为 4,使用Adam优化器,学习率为 0.001,clipnorm 5。考虑对话历史中最多3个先前的问题答案对。这是一个二元分类任务,使用精度、召回率、F1和macro F1作为评估指标。本文中报告的所有分数均以%为单位。 6.2 结果? ? ? ?表3显示,本文提出的模型在所有测试集上都以显着的优势优于竞争的基线模型。使用配对t检验和自助重采样进行统计显着性检验。提出的模型的性能明显优于最佳基线系统(p < 0.01),后者在 Test-I 上提供最高的 Macro-F1 分数。在大多数情况下,基于LSTM的神经基线比基于规则和统计的机器学习模型表现更好。在Test III上,统计模型倾向于预测有效,有效实例的数量远高于无效实例(大约 75%:25%),从而导致 Valid F1 分数很高。这些基线系统(虽然在有效问题上表现良好)在使用macro F1 衡量有效和无效后续问题进行评估时表现不佳。macro F1 是用于比较所有系统的整体评估指标。总体而言,与其他对话(测试 II)相比,从同一对话(测试 III)中识别后续问题更难。 表 3:后续问题识别任务的比较结果。 将三路注意力池化网络与几种基于规则的统计机器学习和神经模型(V – Valid、P – Precision、R – Recall、Psg – Passage、Hist – Conversation history)的性能进行比较。 ? ? ? ?执行了表4中所示的消融研究。当不考虑对话历史时,所提出的模型表现最差。这是因为对话历史记录中的问答对有助于确定主题连续性,同时识别有效的后续问题。当不考虑相关的段落(即知识)时,性能也会下降,因为它有助于捕捉主题转移。当删除Ac,q时,性能也会下降。 它比完全不考虑对话历史的模型表现更好,因为在段落编码中考虑了对话历史。当删除其他组件(例如多因素注意力编码,联合编码和字符嵌入)时,性能也会下降。 表4:对开发集的消融研究。 6.3 定性分析? ? ? ?所提出的模型旨在通过使用三向注意力池网络来捕获主题连续性和主题转移。对Aq,p和 Ac,p 的注意力池旨在捕捉给定对话历史的后续问题中的主题转移。考虑表5中的第一个例子。当不考虑段落时,它无法正确识别后续问题,而本文提出的模型通过使用段落正确识别了主题转移到“骚乱的持续时间 after four days and restore order and take back the prison on September 13.”。在第二个例子中,虽然本文模型可以通过Schuur正确识别主题连续性,但没有历史对话的模型无法识别后续问题。 ? ? ? ?作者进行了错误分析,其中本文提出的模型未能识别后续问题。从开发集中随机抽取了50个这样的实例(25个有效和25个无效)。作者发现其中32%的实例需要对后续问题中的主题进行代词解析。38%的实例需要对动作/主体的特征进行验证(例如did they have any children? vs. gave birth to her daughter)。14%的错误发生在需要匹配以不同形式出现的对象或谓词(例如,hatred vs hate, television vs TV)。对于剩下的16%的案例,它无法正确捕捉主题转移。 表5:取自LIF开发集的示例,其中本文的模型正确识别了有效的后续问题。 7.相关的工作? ? ? ? 许多数据驱动的机器学习方法已被证明对与对话相关的任务有效,例如对话策略学习(Young 等人,2013 年)、对话状态跟踪(Henderson 等人,2013 年;Williams 等人,2013 年; Kim 等人,2016)和自然语言生成(Sordoni 等人,2015 年;Li 等人,2016 年;Bordes 等人,2017 年)。大多数最近的对话系统要么不是面向目标的(例如,简单的聊天机器人),要么是特定于领域的,如果它们是面向目标的(例如,IT 服务台)。在过去的几年中,人们对会话式问答的兴趣激增。萨哈等人(2018) 发布了一个复杂的顺序问答(CSQA) 数据集,用于通过对知识图进行推理,通过一系列相互关联的QA对来学习对话。崔等人(2018) 发布了一个大规模的对话式 QA 数据集,即上下文问答 (QuAC),它模仿了师生互动场景。雷迪等人(2019) 发布了 CoQA 数据集,并在其上评估了许多系统。朱等人(2018)提出SDNet将上下文融合到传统的阅读理解模型中。黄等人 (2019) 提出了一种“流程”机制,可以通过交替的并行处理结构合并在回答先前问题的过程中生成的中间表示。在对话环境中,将之前的 QA 对作为对话历史,而这些模型专注于回答下一个问题,而本文的工作则专注于识别后续问题。最近,Saeidi等人(2018) 提出了一个法规文本数据集,需要一个模型来提出后续澄清问题。然而,答案仅限于是或否,这使得任务相当有限。此外,虽然 Saeidi 等人(2018)专注于针对对话问题生成澄清问题,本文专注于识别问题是否是对话的后续问题。 8结论本文在对话环境中提出了一个新的后续问题识别任务。开发了一个数据集,即LIF,它源自之前发布的QuAC数据集。值得注意的是,所提出的数据集支持自动评估。提出了一种新颖的三向注意力池网络,该网络通过考虑段落中的相关知识和对话历史来识别后续问题是有效还是无效。此外,开发了几个强大的基线系统,并表明提出的三向注意力池网络优于所有基线系统。将三向注意力池网络整合到开放域对话QA系统中将是未来有趣的工作(本文只是判断候选问题是不是先前对话的后续问题,但并没有针对识别出的后续问题就行答案回复)。 9 复现? ? ? ?下载本文源码,初始为如下内容,12af为模型源码,training_configs为模型配置文件,download_data.sh为下载数据集的脚本,download_pretrined_models.sh为下载作者已训练好模型的模型(不下载也行,可以自己训练),evalutor.py为评估模型性能的代码,README.md为复现本文模型的教程,requirements为代码运行所需要的库(只给出3个,不全)。复现教材可以参考作者的README.md,也可以按着我的步骤来。 9.1 下载数据集(LIF) 可以看到download_data.sh脚本如下,需要下载两个东西,红色的为词嵌入,绿色的为LIF数据集,可以直接执行脚本,不知道怎么回事,我直接执行脚本的时候报错,我手动下载的,就是下图的链接,红色链接可以直接访问,绿色的数据集存放在谷歌云盘中,得挂梯子。 ?下载好了,词嵌入glove.840B.300d.txt.gz放在路径 data/embeddings/ 下 data和12af、training_configs在同一目录下。数据集下载好了为lif_v1,把里边的dataset放在data/下边。 ?? ?9.2 前期处理库版本:
解决:pip install --ignore-installed greenlet ②在执行训练命令后报错:
解决:安装en_core_web_sm 链接:百度网盘 请输入提取码 将下载好的en_core_web_sm放在合适的位置,pip install 路径/en_core_web_sm-2.2.5.tar.gz 9.3 训练? ? ? ?training_configs/bert_baseline.json和l2af_3way_ap.json修改一下GPU的序号,若GPU只有一块,则原配置文件不可取,以l2af_3way_ap.json为例,例如只有一块改为0。我尝试使用多块,将其改为[0,1,2,3],系统报错ValueError:?Found?input?variables?with?inconsistent?numbers?of?samples? 不知道怎么解决,所以我就使用了一块。GPU用的是P100 ①三向注意力池训练执行:
?训练了18个小时,系统自己结束了。 ②BERT训练执行:
BERT训练了两天多,AUC一直在89徘徊,我就终止了 9.4 预测9.4.1 三向注意力池? ? ? ? ?三向注意力池模型训练完了models/bert_baseline/ 文件如上图,其中 best.th 为最优参数,系统自动将其打包到 model.tar.gz 中(红色框)。 ? ? ? ?分别执行如下代码,得到上图蓝色的文件。
也可以用论文作者训练好的模型,脚本?download_pretrained_models.sh 可以下载,同样我无法直接执行脚本,还是手动下载(红色框链接,同样需要挂梯子),并将文件放在合适文件夹下。? ?执行预测和上述介绍相同。 9.4.2 BERT? ? ? ?因为训练BERT的时候我手动终止的,所以系统没有将best.th自动打包到model.tar.gz中,需要手动打包。将上述作者训练好的模型下载下了,并解压,得到如下文件,将models/3way_ap/下的best.th替换原weights.th 并改名为?weights.th。这里打包需要特定的打包工具,我用的是网上下载的7-zip ? ? ? ?这样就得到了model.tar.gz,将其放到models/3way_ap/下,分别执行如下:
得到如下文件: ?9.5 评估? ? ? 分别执行如下命令评估训练的三向注意力池模型(由上一个预测的时候得出的各个样本的概率,可以自行去看看那些jsonl文件),得到如下结果,以test_i为例
? ? ? ?红色的为4.2节最后说的阈值,浅蓝色为验证集(dev)的macro F1,蓝色的为验证集(dev)的三种指标,橙色的为测试集test_i的macro F1,紫色的为测试集test_i的三种指标 评估Bert模型操作也一样 9.6 数据整合? ? ? ?其中↑代表结果比原论文数据高,↓代表结果比原论文数据低。具体为什么这样大家可以自行分析 。 |
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/26 2:25:44- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |