目录
- 引言
- 一阶规则学习基础概念
- 规则学习定义
- 一阶规则与命题规则对比
- 一阶规则学习优势
- 一阶规则学习核心原理
- 序贯覆盖策略
- 剪枝优化机制
- FOIL 算法详解
- FOIL 算法概述
- FOIL 算法流程
- FOIL 增益计算
- 一阶规则学习实战实现
- 准备数据集
- 代码实现过程
- 定义数据结构
- 实现 FOIL 算法
- 规则生成与评估
- 应用案例分析
- 医疗领域应用
- 金融领域应用
- 总结与展望
一、引言
在机器学习的广阔领域中,一阶规则学习作为一个重要的研究方向,正逐渐受到学术界和工业界的高度重视。它与传统的机器学习方法,如神经网络、支持向量机等“黑箱模型”不同,一阶规则学习旨在从数据中提取出具有清晰语义的规则,这些规则以“若…,则…”的形式呈现,使模型的决策过程透明且易于理解。
在当今数字化时代,数据量呈指数级增长,机器学习算法被广泛应用到各个领域。在医疗诊断中,医生依赖机器学习模型辅助判断疾病,但一个难以解释的模型结果可能导致医生和患者的不信任。而一阶规则学习可以提供类似“若患者体温超过 38 度,且咳嗽频繁,且白细胞计数高于正常范围,则很可能患有呼吸道感染”的明确规则,使诊断依据清晰明了。
在金融风险评估领域,银行需要决定是否给客户发放贷款。如果使用神经网络等黑箱模型得出“拒绝贷款”的结果,客户可能难以理解原因,银行也难以向客户解释。而一阶规则学习可以生成规则,如“若客户信用评分低于 600 分,且负债收入比超过 50%,则拒绝贷款申请”,使决策过程有理有据,透明清晰。
正是这种透明性和可解释性,使得一阶规则学习在许多高风险场景中具有不可替代的价值,为我们在复杂的数据世界中提供了一种可信的决策依据。
二、一阶规则学习基础概念
2.1 规则学习定义
规则学习是机器学习中的一个重要分支,其主要目标是从训练数据中提取出一组具有明确语义的规则。这些规则能够对未见过的示例进行分类,其基本形式通常为“若……,则……”。以判断西瓜是否为好瓜为例,可能会得到这样一条规则:若西瓜的根蒂是蜷缩的,且脐部是凹陷的,那么这个西瓜是好瓜。这里,“西瓜的根蒂是蜷缩的,且脐部是凹陷的”构成了规则体,即规则的前提条件;“这个西瓜是好瓜”则是规则头,表示规则的结论。规则学习的过程,就是寻找能够准确描述数据特征与目标类别之间关系的规则集合,以实现对新数据的有效分类和预测。
2.2 一阶规则与命题规则对比
在规则学习中,规则主要分为命题规则和一阶规则。命题规则由“原子命题”和逻辑连接词(如与、或、非、蕴含)构成的简单陈述句。例如,“如果天气晴朗且温度适宜,那么适合外出游玩”,其中“天气晴朗”和“温度适宜”是原子命题,通过“且”这个逻辑连接词组合在一起,形成规则体,“适合外出游玩”是规则头。命题规则的表达能力相对较弱,主要用于描述事物的简单属性和类别。
而一阶规则的基本成分是能描述事物属性或关系的“原子公式”,它可以表达复杂的关系,因此也称为关系型规则。例如,“如果 X 是 Y 的父亲,且 Y 是 Z 的父亲,那么 X 是 Z 的爷爷”,这里引入了变量 X、Y、Z,以及谓词“父亲”和“爷爷”来描述人物之间的亲属关系。一阶规则通过引入变量和谓词,大大增强了规则的表达能力,可以处理更复杂的数据结构和关系。
2.3 一阶规则学习优势
一阶规则学习具备多种显著优势。它能够轻松整合领域知识。在许多实际任务中,领域知识对于准确的判断和预测至关重要。以医疗诊断为例,医生的专业知识和经验可以通过一阶规则的形式融入到学习模型中。例如,“如果患者出现咳嗽、发热症状,且近期有流感接触史,那么该患者很可能感染了流感病毒”。这种将领域知识直接嵌入规则的方法,使模型能够利用先验信息,提高决策的准确性和可靠性。
一阶规则学习能够有效处理对象之间的关系。在现实世界中,许多数据都包含复杂的关系信息,如社交网络中的人际关系、生物信息学中的蛋白质相互作用等。命题规则在处理这些关系时往往力不从心,而一阶规则可以通过变量和谓词来精确描述这些关系。例如,在社交网络分析中,“如果 A 关注了 B,且 B 关注了 C,那么 A 可能对 C 的信息感兴趣”。通过这样的规则,可以挖掘出用户之间潜在的兴趣关系,为个性化推荐等应用提供有力支持。
相比较之下,在命题规则学习乃至普遍的统计学习中,若要引入专业知识,通常需要在已有属性基础上利用专业知识构建新属性,或者基于专业知识设计某种函数机制(如正则化)来限制假设空间。然而,并非所有专业知识都能轻易通过属性重构和函数限制来表达。例如,在复杂的生物化学反应中,很难通过简单的属性重构来描绘各种分子间的复杂交互关系,而一阶规则学习则能更自然地表达此类知识。
三、一阶规则学习核心原理
3.1 序贯覆盖策略
序贯覆盖是一阶规则学习中极其关键的策略,它运用分而治之的思想,将复杂的规则学习任务巧妙拆解为一系列较为简单的子任务。具体而言,序贯覆盖的基本方法是逐条推导规则。在每次推导过程中,专注于从训练数据集中提炼出一条规则,该规则需尽可能精确地覆盖部分正例,同时尽量避免覆盖负例。一旦成功提炼出一条规则,就会将该规则所涵盖的所有样本(无论正例或负例)从训练数据集中剔除,然后基于剩余样本继续提炼下一条规则。此过程反复进行,直至训练数据集中的所有正例均被规则覆盖。通过这种方法,最终获得一个有序的规则集合。
在实际应用中,存在两种常用的策略用于生成规则,分别是“自上而下”和“自下而上”。“自上而下”的策略是从最普遍的规则开始,这一最普遍的规则通常形式为规则体为空(即能覆盖所有样本),规则头为目标分类。随后,逐步向规则体中加入逻辑条款,使规则逐渐具体化,覆盖范围逐渐缩小,直至满足预设条件,比如不再覆盖负例,或达到一定准确性等。这种策略也称为“生成-测试”法,因其从较大覆盖范围逐步缩小,故通常较易生成泛化性能更好的规则。例如,在学习判断动物是否为哺乳动物的规则时,最初可能生成的最普遍规则是“动物是哺乳动物←TRUE”,此规则覆盖了所有动物样本。接着,通过加入逻辑条款,如“动物有毛发”,规则变得更具体,覆盖范围缩小至有毛发的动物。若发现仍有负例被覆盖,则继续加入条款,如“动物哺育幼崽”,进一步优化规则。
“自下而上”的策略与“自上而下”相反,它从非常具体的规则开始,这些特定规则可能仅覆盖极少数样本,然后逐步移除规则体中的逻辑条款,使规则的覆盖范围逐渐扩大,直至满足特定条件。这种策略也称为“数据驱动”法,更适合于训练样本较少的情况。例如,从规则“动物是哺乳动物←动物是猫且动物哺育幼崽且动物有毛发”开始,逐步移除一些条款,如“动物是猫”,使规则的覆盖范围扩大至所有有毛发且哺育幼崽的动物。
3.2 剪枝优化机制
在一阶规则学习过程中,剪枝优化是极其重要的环节,其主要功能在于减轻过拟合风险。由于规则学习本质上是一个贪婪搜索过程,在规则生成过程中,若不加以控制,很容易过度拟合训练数据,导致模型在新数据上的表现不佳。剪枝优化通过在适当时候对规则进行简化,去除可能导致过拟合的部分,从而增强模型的泛化能力。
剪枝优化主要包含预剪枝和后剪枝两种方式。预剪枝是在规则生成过程中进行的。在每一步尝试加入新的逻辑条款时,都会基于某种性能度量指标来评估加入该条款前后规则的性能。如果评估结果显示加入该条款后规则的性能没有提升,甚至有所下降,那么就停止加入该条款,提前终止规则的生成。例如,CN2 算法采用似然比统计量(LRS)作为预剪枝的评估标准。LRS 的核心作用在于衡量一条规则所覆盖样本的分类分布与整个训练集的分类分布之间的差异。如果 LRS 值较低,说明规则覆盖样本的分布与训练集的经验分布差异不大,加入新条款可能只是捕捉到了训练集中的某些偶然现象,此时应停止规则生成。
后剪枝则是在规则已生成之后进行的。首先生成完整的规则集,然后对每条规则或整个规则集进行评估。基于性能度量指标,判断删除某些逻辑条款或整个规则后,规则集的性能是否会有提升。如果会,就执行相应的剪枝操作。此外,剪枝还可借助统计显著性检验来进行。例如,通过假设检验来判断规则的效果是否仅为偶然现象,如果是,则进行剪枝。通过合理运用预剪枝和后剪枝,可以有效优化一阶规则学习模型,使其在复杂的数据环境中保持良好的性能。
3.3 FOIL 算法详解
3.3.1 FOIL 算法概述
FOIL(First Order Inductive Learner)算法是一阶规则学习中非常具有代表性的算法,在归纳逻辑编程领域占有重要地位。它严格遵循序贯覆盖框架,采用“自上而下”的规则归纳策略。这意味着它从最普遍的规则开始,逐步添加约束条件,使规则不断细化,直至满足预设条件。
FOIL 算法学习的一阶规则集类似于 Horn 子句,但具有一些显著的不同。相较于常规的 Horn 子句,FOIL 算法中的规则更为独特。一方面,这些规则不支持函数符号,从而减少了假设空间搜索的难度。在处理复杂的逻辑规则学习时,排除函数符号能有效降低规则的复杂度和搜索空间的维度,简化学习过程。另一方面,FOIL 算法的规则比 Horn 子句更具表达能力,因为它允许在规则主体中使用否定文字。这种能力让 FOIL 算法能更好地表达复杂的逻辑关系,比如,在评估一个人是否适合某个职位时,可以通过否定文字描述不符合特定条件的情形,如 “如果一个人缺乏相关经验且未接受过相关培训,则此人不适合该职位”。
FOIL 算法在多个领域中广泛应用。例如,在归纳快速排序(QUICKSORT)算法的递归定义时,FOIL 算法能从众多示例数据中提炼出快速排序的核心规则。通过分析不同大小数组的排序流程,它学会了如何挑选基准值、如何分割数组以及如何递归地对分割后的子数组进行排序等关键操作。在判定国际象棋局面合法性的问题上,FOIL 算法可以掌握各种棋子的合法移动规则及棋盘状态的合法性标准。通过大量合法与非法局面的学习,它能总结出一系列用于判断给定国际象棋局面是否合法的规则。
3.3.2 FOIL 算法流程
FOIL 算法的流程严格有序,旨在从初始化阶段逐步建立规则集,精确描述目标谓词。算法首先初始化正例和反例集。具体而言,将目标谓词为真的实例归入正例集 Pos,将目标谓词为假的实例归入反例集 Neg。此步骤为后续规则学习提供了基础资料。
随后进入生成新规则的循环阶段。在此阶段,首先创建一条没有前提条件的规则,用以预测目标谓词,此时规则覆盖所有实例。接着,不断向规则中添加新的文字以提高其特异性。在添加文字时,根据提供的谓词集合生成候选新文字。对每个候选文字,计算其加入规则后的 FOIL 增益。选取能使 FOIL 增益最大的文字作为最优文字并加入规则的前提条件中。随着新文字的持续添加,规则变得越来越具体,覆盖的反例数量逐渐减少。当规则不再覆盖任何反例时,停止添加文字,此时即获得了一条完整的规则。将该规则加入已学规则集 LearnedRules,并从正例集 Pos 中删除被该规则覆盖的实例。重复此过程,直至正例集 Pos 为空,算法结束,形成一个完整的规则集。
例如,假设我们正在学习“祖先”关系的规则。首先初始化正例集 Pos 和反例集 Neg,其中正例可能包括 (Alice, Bob),表示 Alice 是 Bob 的祖先;反例可能包括 (Alice, David),表示 Alice 不是 David 的祖先。开始时生成规则 “祖先 (X, Y) ← ”,它覆盖所有实例。然后生成候选新文字,如 “父母 (X, Z)”,并计算其 FOIL 增益。如果添加 “父母 (X, Z)” 后 FOIL 增益最大,则将其加入规则中,得到 “祖先 (X, Y) ← 父母 (X, Z)”。之后继续生成候选新文字,如 “父母 (Z, Y)”,再次计算 FOIL 增益。若添加 “父母 (Z, Y)” 后增益最大,最终得到规则 “祖先 (X, Y) ← 父母 (X, Z) ∧ 父母 (Z, Y)”。
3.3.3 FOIL 增益计算
FOIL 增益在 FOIL 算法中起着决定性作用,是指导规则扩展方向的关键指标。FOIL 增益的计算公式为:\(Gain = p \cdot (\log_2 \frac{p'}{p' + n'} - \log_2 \frac{p}{p + n})\),其中,\(p\) 表示当前规则覆盖的正例数,\(n\) 表示当前规则覆盖的反例数,\(p'\) 表示加入条件后覆盖的正例数,\(n'\) 表示加入条件后覆盖的反例数。
该公式的中心理念在于通过对比新增条件前后正面案例信息量的变动,来衡量新条件对规则改善的效果。它仅考量正面案例的信息量,并以新规则涵盖的正面案例数作为权重。这主要是因为,在关联数据中,正面案例通常远少于负面案例。若同等看待正面和负面案例,负面案例的数量优势可能遮蔽正面案例的关键信息,使学到的规则无法精确描绘正面案例的特点。而将正面案例作为主要关注点,可以更高效地捕捉正面案例中的模式和规律,进而生成更具针对性的规则。例如,在一个关于疾病诊断的关联数据集中,患有某病的正面案例样本数量相对较少,而健康的负面案例样本数量较多。如果在计算增益时不对正面案例的重要性加以突出,可能会产生一些过于宽泛的规则,无法准确诊断疾病。通过运用 FOIL 增益,能更加聚焦正面案例的变化,生成更为精准的诊断规则。
四、一阶规则学习实战实现
4.1 准备数据集
在一阶规则学习过程中,数据集的准备是最关键的第一步。为了更好地理解和展示,我们以经典的西瓜数据集为例。西瓜数据集包含了多种属性,如色泽、根蒂、敲声、纹理、脐部、触感等离散属性,以及密度、含糖率等连续属性。这些属性共同描述了西瓜的特性,而标签则表明西瓜是否为优质西瓜。
在 Python 中,我们可以通过列表嵌套的方式表示西瓜数据集。以下是一个简化版的西瓜数据集示例代码:
# 西瓜数据集
watermelon_data = [
# 色泽, 根蒂, 敲声, 纹理, 脐部, 触感, 密度, 含糖率, 好瓜
['青绿', '蜷缩', '浊响', '清晰', '凹陷', '硬滑', 0.697, 0.460, '是'],
['乌黑', '蜷缩', '沉闷', '清晰', '凹陷', '硬滑', 0.774, 0.376, '是'],
['乌黑', '蜷缩', '浊响', '清晰', '凹陷', '硬滑', 0.634, 0.264, '是'],
# 更多数据...
['青绿', '蜷缩', '沉闷', '稍糊', '稍凹', '硬滑', 0.719, 0.103, '否']
]
# 特征名称
feature_names = ['色泽', '根蒂', '敲声', '纹理', '脐部', '触感', '密度', '含糖率']
在这个数据集中,每个内部列表代表一个西瓜样本,其中前八个元素是西瓜的特征值,最后一个元素是西瓜是否为优质西瓜的标签。feature_names 列表则记录了各特征的名称,便于后续的数据理解和处理。通过这种数据结构,我们可以便捷地对数据集进行各类操作,为后续的一阶规则学习提供数据支撑。
4.2 代码实现过程
4.2.1 定义数据结构
在 Python 中,我们可以通过自定义类来实现这些数据结构。下面是一个简单的示例:
class Example:
def __init__(self, features, label):
self.features = features
self.label = label
class Rule:
def __init__(self, antecedent, consequent):
self.antecedent = antecedent # 规则体,是一个文字列表
self.consequent = consequent # 规则头,是一个文字
class Literal:
def __init__(self, predicate, terms):
self.predicate = predicate # 谓词
self.terms = terms # 项列表,可能包含变量或常量
在上述代码中,Example 类用于表示数据集中的一个实例,包含特征和标签。Rule 类表示一条规则,由规则前提(antecedent)和规则结论(consequent)构成。Literal 类表示文字,包含谓词和项列表。通过这些类的定义,我们可以方便地存储和操作数据、规则及文字,为后续的 FOIL 算法实现打下基础。
4.2.2 实现 FOIL 算法
实现 FOIL 算法的关键步骤包括生成候选文字、计算 FOIL 增益、选择最优文字等。下面是一个简化的 Python 实现示例:
def generate_candidate_literals(rule, examples, predicates):
candidate_literals = []
# 这里简单示例,仅考虑新的文字添加到规则体中
for predicate in predicates:
# 假设谓词的项可以是数据集中的特征名
terms = rule.antecedent + rule.consequent.terms
new_literal = Literal(predicate, terms)
candidate_literals.append(new_literal)
return candidate_literals
def calculate_foil_gain(literal, rule, examples):
# 计算添加文字前后覆盖的正例和负例数量
p = sum(1 for example in examples if match(rule, example) and example.label == '是')
n = sum(1 for example in examples if match(rule, example) and example.label == '否')
new_rule = Rule(rule.antecedent + [literal], rule.consequent)
p_prime = sum(1 for example in examples if match(new_rule, example) and example.label == '是')
n_prime = sum(1 for example in examples if match(new_rule, example) and example.label == '否')
gain = p * (math.log2(p_prime / (p_prime + n_prime)) - math.log2(p / (p + n)))
return gain
def select_best_literal(candidate_literals, rule, examples):
best_literal = None
max_gain = -float('inf')
for literal in candidate_literals:
gain = calculate_foil_gain(literal, rule, examples)
if gain > max_gain:
max_gain = gain
best_literal = literal
return best_literal
def learn_one_rule(examples, predicates, target_predicate):
rule = Rule([], Literal(target_predicate, []))
while True:
candidate_literals = generate_candidate_literals(rule, examples, predicates)
best_literal = select_best_literal(candidate_literals, rule, examples)
if best_literal is None or calculate_foil_gain(best_literal, rule, examples) <= 0:
break
rule.antecedent.append(best_literal)
return rule
在上述代码中,generate_candidate_literals 函数根据当前规则、数据集和谓词集合生成候选文字。calculate_foil_gain 函数依据 FOIL 增益的计算公式计算添加特定文字后规则的增益。select_best_literal 函数从候选文字中选取增益最大的文字。learn_one_rule 函数则通过持续添加最优文字来学习一条规则,直至找不到增益大于 0 的文字为止。
4.2.3 规则生成与评估
通过反复调用 learn_one_rule 函数,我们可以生成一组规则。随后,利用准确率、召回率等指标评估规则组的表现。
def learn_rules(examples, predicates, target_predicate):
rules = []
remaining_examples = examples.copy()
while remaining_examples:
rule = learn_one_rule(remaining_examples, predicates, target_predicate)
rules.append(rule)
remaining_examples = [example for example in remaining_examples if not match(rule, example)]
return rules
def evaluate_rules(rules, examples):
true_positive = 0
false_positive = 0
false_negative = 0
for example in examples:
predicted_label = predict(rules, example)
if predicted_label == '是' and example.label == '是':
true_positive += 1
elif predicted_label == '是' and example.label == '否':
false_positive += 1
elif predicted_label == '否' and example.label == '是':
false_negative += 1
if true_positive + false_positive == 0:precision = 1.0
else:
precision = true_positive / (true_positive + false_positive)
if true_positive + false_negative == 0:
recall = 1.0
else:
recall = true_positive / (true_positive + false_negative)
return precision, recall
def match(rule, example):
# 简单匹配规则,这里假设规则中的文字和示例特征能直接匹配
for literal in rule.antecedent:
# 这里仅简单示例,实际需要更复杂的匹配逻辑
if literal.predicate in example.features and example.features[literal.predicate] != literal.terms[0]:
return False
return True
def predict(rules, example):
for rule in rules:
if match(rule, example):
return rule.consequent.predicate
return '否'
在上述代码中,learn_rules 函数通过持续学习新的规则,直到所有正面案例都被涵盖,从而创建一个规则集合。evaluate_rules 函数基于预测结果计算精确率和召回率。match 函数用于确定一条规则是否能匹配某个实例,predict 函数则依据规则集合对实例做出预测。通过这些函数的合作,我们能够实现一阶规则的生成与评估。
五、应用案例分析
5.1 医疗领域应用
在医疗行业,一阶规则学习拥有巨大的应用潜力,它能够从大量的病例资料中提炼出有价值的诊断规则,为医生的诊断活动提供坚实的支持。以一家大型医院的糖尿病诊断为例,医院积累了众多患者的病历资料,这些资料包括患者的基础信息,比如年龄、性别;症状信息,例如多饮、多食、多尿、体重减轻;检测指标,如空腹血糖水平、餐后血糖水平、糖化血红蛋白等。
运用一阶规则学习算法对这些资料进行分析,可以得出以下诊断规则:如果患者年龄超过 45 岁,并且空腹血糖值高于 7.0mmol/L,或是餐后 2 小时血糖值高于 11.1mmol/L,则该患者可能患有糖尿病。此类规则清晰直白,医生可根据这些规则迅速对患者的情况做出初步判断。
一阶规则学习还能整合患者的遗传数据、生活方式数据等多元信息,形成更加全面、精确的诊断规则。通过将基因测试中某些与糖尿病相关联的基因变异信息加入规则学习,以及考虑患者的饮食习惯(如高糖食品摄入频率)、锻炼频率等生活方式因素,可以进一步提升诊断的准确性。
5.2 金融领域应用
在金融界,风险评估是一项极其重要的职责,一阶规则学习在构建风险评估模型方面扮演着关键角色。以银行的贷款审批为例,银行需根据客户的多种信息来决定是否批准贷款请求,以减少违约的可能性。银行收集了客户的个人资料,如年龄、职业、收入;信用资料,如信用评分、以往贷款偿还记录;财务资料,如债务状况、资产状态等数据。
通过一阶规则学习算法处理这些数据,可以得出类似的风控评估规则:如果客户的信用评分低于 650 分,且债务收入比率超过 40%,同时有过往逾期还款的历史,那么应拒绝该客户的贷款请求。这样的规则为银行的贷款审批提供了明确的决策指导,有助于银行有效管理信贷风险。
在实际操作中,一阶规则学习还能够实时监控市场动态和客户行为的变化,适时调整风险评估规则。当市场利率出现显著波动时,将利率波动的信息融入规则学习,调整贷款审批规则。或者当客户的消费模式出现异常变化时,如短时间内频繁的大额消费,及时更新风险评估规则,以便更精准地评估风险。
六、总结与展望
一阶规则学习作为机器学习领域内一个独特且重要的分支,为我们提供了一种可解释、透明的模型构建途径。通过从数据中提炼出具有明确意义的规则,它在多个领域展现了强大的应用潜力。从基本概念来看,一阶规则学习与命题规则学习存在差异,它能够描述复杂的关系,通过引入变量和谓词,大大提升了规则的表达力。在医疗领域,它可以从大量的病例资料中提炼诊断规则,辅助医生进行疾病诊断;在金融领域,能够建立风险评估模型,帮助银行等金融机构有效控制风险。
其核心原理,如序列覆盖策略和修剪优化机制,为规则的生成和优化提供了坚实的理论支撑。序列覆盖策略采用分而治之的思想,将规则学习任务分解成一系列子任务,逐步生成规则集合。修剪优化机制则通过预修剪和后修剪两种方式,有效减少了过拟合的风险,提高了模型的泛化能力。FOIL 算法作为一阶规则学习的典型代表,严格遵循序列覆盖框架,采用“自上而下”的规则归纳策略,通过计算 FOIL 收益来选取最优文字,不断细化规则,为我们提供了一种高效的规则学习方法。
展望未来,随着人工智能技术的不断进步,一阶规则学习有望在可解释的人工智能领域发挥更加核心的作用。面对日益复杂的现实问题,人们对于模型的可解释性要求越来越高。一阶规则学习生成的规则能够清晰地展示决策过程,使用户能够理解模型的决策依据,这将有助于增加公众对人工智能系统的信任。
在处理复杂关系数据方面,一阶规则学习也展现出广阔的发展前景。随着数据量的不断增加和数据结构的日趋复杂,如何高效地处理和分析这些数据成为了一个亟待解决的问题。一阶规则学习能够自然地表示对象间的关系,通过深入的研究和优化,有望在社交网络分析、生物信息学、知识图谱构建等领域取得更多突破,为这些领域的发展提供更强的技术支持。


雷达卡


京公网安备 11010802022788号







