AIGC背后的技术分析 | 基于规则产生式的推理

简介: 基于规则的产生式系统一般由规则库(知识库)、综合数据库和推理引擎三部分组成。知识库由谓词演算事实和有关讨论主题的规则构成,综合数据库又称为上下文,用来暂时存储推理过程中的结论和数据。推理机是用规则进行推理的过程和行为。知识采集系统是领域专家把相关领域的知识表示成一定的形式,并输入到知识库中。解释系统通过用户输入的条件来分析被系统执行的推理结构,并将专家知识以易理解的方式解释给用

640.jpg


640.png

1、建立推理规则库

首先,建立规则库(知识库),本实验系统部分规则如下:

① 哺乳动物食肉动物黄褐色黑色条纹虎

② 鸟长脖子长腿黑白二色不飞鸵鸟

2、输入事实进行推理

输入事实后开始推理:

640.png


640.png

3、推理结果

输入规则①推理事实,显示推理结果如图2所示。

640.png


■ 图2 规则①推理结果

输入规则②推理事实,显示推理结果如图3所示。

640.png


■ 图3规则②推理结果

实践对应示例程序参见附录C。

附录C 基于规则产生式的推理

from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtWidgets import (QWidget, QHBoxLayout, QLabel, QApplication)
from PyQt5.QtGui import QPixmap
import sys
class Ui_Form(object):
    def setupUi(self, Form):
        Form.setObjectName("Form")
        Form.setGeometry(100, 200, 623, 300)
        self.groupBox = QtWidgets.QGroupBox(Form)
        self.groupBox.setGeometry(QtCore.QRect(10, -20, 700, 311))
        self.groupBox.setTitle("")
        self.groupBox.setObjectName("groupBox")
        self.label = QtWidgets.QLabel(self.groupBox)
        self.label.setGeometry(QtCore.QRect(30, 40, 61, 18))
        self.label.setAlignment(QtCore.Qt.AlignCenter)
        self.label.setObjectName("label")
        self.label_2 = QtWidgets.QLabel(self.groupBox)
        self.label_2.setGeometry(QtCore.QRect(470, 40, 101, 18))
        self.label_2.setAlignment(QtCore.Qt.AlignCenter)
        self.label_2.setObjectName("label_2")
        self.pushButton = QtWidgets.QPushButton(self.groupBox)
        self.pushButton.setGeometry(QtCore.QRect(230, 35, 88, 27))
        self.pushButton.setObjectName("pushButton")
        self.pushButton_3 = QtWidgets.QPushButton(self.groupBox)
        self.pushButton_3.setGeometry(QtCore.QRect(475, 265, 88, 27))
        self.pushButton_3.setObjectName("pushButton_3")
        self.pushButton_3.clicked.connect(QtCore.QCoreApplication.instance().quit)
        self.textEdit = QtWidgets.QTextEdit(self.groupBox)
        self.textEdit.setGeometry(QtCore.QRect(20, 80, 80, 211))
        self.textEdit.setObjectName("textEdit")
        self.textEdit_2 = QtWidgets.QTextEdit(self.groupBox)
        self.textEdit_2.setGeometry(QtCore.QRect(110, 80, 331, 211))
        self.textEdit_2.setObjectName("textEdit_2")
        self.textEdit_2.setReadOnly(True)
        self.lineEdit = QtWidgets.QLineEdit(self.groupBox)
        self.lineEdit.move(450, 80)
        self.lineEdit.setGeometry(QtCore.QRect(450, 80, 140, 40))
        self.lineEdit.setReadOnly(True)
        self.pushButton.clicked.connect(self.go)

        self.label_3 = QtWidgets.QLabel(self.groupBox)
        self.label_3.setGeometry(QtCore.QRect(450, 125, 140,140))
        self.label_3.setAlignment(QtCore.Qt.AlignCenter)
        self.label_3.setObjectName("label_3")

        self.retranslateUi(Form)
        QtCore.QMetaObject.connectSlotsByName(Form)


    def retranslateUi(self, Form):
        _translate = QtCore.QCoreApplication.translate
        Form.setWindowTitle(_translate("Form", "正向推理-动物识别系统"))
        self.label.setText(_translate("Form", "输入事实"))
        self.label_2.setText(_translate("Form", "显示推理结果"))
        self.label_3.setText(_translate("Form", ""))
        self.pushButton.setText(_translate("Form", "进行推理"))
        self.pushButton_3.setText(_translate("Form", "退出程序"))

    # 将知识库做拓扑排序
    def topological(self):
        Q = []
        P = []
        ans = ""  # 排序后的结果
        for line in open('RD.txt'):
            line = line.strip('\n')
            if line == '':
                continue
            line = line.split(' ')
            Q.append(line[line.__len__() - 1])
            del (line[line.__len__() - 1])
            P.append(line)

        # 计算入度
        inn = []
        for i in P:
            sum = 0
            for x in i:
                if Q.count(x) > 0: # 能找到,那么
                    sum += Q.count(x)
            inn.append(sum)

        while (1):
            x = 0
            if inn.count(-1) == inn.__len__():
                break
            for i in inn:
                if i == 0:
                    str = ' '.join(P[x])
                    ans = ans + str + " " + Q[x] + "\n"  # 写入结果
                    inn[x] = -1
                    # 更新入度
                    y = 0
                    for j in P:
                        if j.count(Q[x]) == 1:
                            inn[y] -= 1
                        y += 1
                x += 1
        print(ans)

        # 将结果写入文件
        fw = open('RD.txt', 'w', buffering=1)
        fw.write(ans)
        fw.flush()
        fw.close()

    # 进行推理
    def go(self, flag=True):
        # 将产生式规则放入规则库中
        # if P then Q
        # 读取产生式文件
        self.Q = []
        self.P = []
        fo = open('RD.txt', 'r', encoding='utf-8')
        for line in fo:
            line = line.strip('\n')
            if line == '':
                continue
            line = line.split(' ')
            self.Q.append(line[line.__len__() - 1])
            del (line[line.__len__() - 1])
            self.P.append(line)
        fo.close()
        self.lines = self.textEdit.toPlainText()
        self.lines = self.lines.split('\n') # 分割成组
        self.DB = set(self.lines)
        print(self.DB)
        self.str = ""
        print(self.str)
        flag = True
        temp = ""
        for x in self.P:  # 对于每条产生式规则
            if ListInSet(x, self.DB): # 如果所有前提条件都在规则库中
                self.DB.add(self.Q[self.P.index(x)])
                temp = self.Q[self.P.index(x)]
                flag = False # 至少能推出一个结论
                self.str += "%s --> %s\n" % (x, self.Q[self.P.index(x)])

        if flag:  # 一个结论都推不出
            print("无法推出结论")
            for x in self.P:  # 对于每条产生式
                if ListOneInSet(x, self.DB): # 事实是否满足部分前提
                    flag1 = False # 默认提问时否认前提
                    for i in x:  # 对于前提中所有元素
                        if i not in self.DB:  # 对于不满足的那部分
                            btn = s.quest("是否" + i)
                            if btn == QtWidgets.QMessageBox.Ok:
                                self.textEdit.setText(self.textEdit.toPlainText() + "\n" + i) # 确定则增加到textEdit
                                self.DB.add(i) # 确定则增加到规则库中
                                flag1 = True # 肯定前提
                                # self.go(self)
                    if flag1:  # 如果肯定前提,则重新推导
                        self.go()
                        return

        self.textEdit_2.setPlainText(self.str)
        print(self.str)
        if flag:
            btn = s.alert("没有推出任何结论")
        else:
            self.lineEdit.setText(temp)
            self.label_3.setPixmap(QPixmap(temp+'.jpg'))
            self.label_3.setScaledContents(True)

            # 判断list中至少有一个在集合set中
def ListOneInSet(li, se):
    for i in li:
        if i in se:
            return True
    return False


# 判断list中所有元素是否都在集合set中
def ListInSet(li, se):
    for i in li:
        if i not in se:
            return False
    return True


class SecondWindow(QtWidgets.QWidget):
    def __init__(self, parent=None):
        super(SecondWindow, self).__init__(parent)
        self.setGeometry(725, 200, 300, 300)
        self.textEdit = QtWidgets.QTextEdit(self)
        self.textEdit.setGeometry(8, 2, 284, 286)


    # 警告没有推导结果
    def alert(self, info):
        QtWidgets.QMessageBox.move(self, 200, 200)
        QtWidgets.QMessageBox.information(self, "Information", self.tr(info))

    # 询问补充事实
    def quest(self, info):
        # 如果推理为空,需要询问用户是否要添加已知条件
        QtWidgets.QMessageBox.move(self, 200, 200)
        button = QtWidgets.QMessageBox.question(self, "提示",
                                                self.tr(info),
                                                QtWidgets.QMessageBox.Ok | QtWidgets.QMessageBox.Cancel,
                                                QtWidgets.QMessageBox.Cancel)
        return button

if __name__ == "__main__":
    app = QtWidgets.QApplication(sys.argv)
    widget = QtWidgets.QWidget()
    ui = Ui_Form()
    ui.setupUi(widget)
    widget.show()
    s = SecondWindow()
    sys.exit(app.exec_())
目录
相关文章
|
3月前
|
搜索推荐
师资培训|AIGC在高校教学中的应用场景与案例分析-某产教科技公司
北京新大陆时代科技有限公司举办新一代信息技术名家大讲坛系列培训,旨在提升教师专业素质,加强“双师型”教师队伍建设。TsingtaoAI作为培训伙伴,提供全面支持。培训涵盖AIGC在高校教学的应用场景、教案生成及个性化教学资源定制等内容,助力提升教学质量与人才培养。
109 0
|
6月前
|
存储 自然语言处理 API
通义万相AIGC技术Web服务体验评测
随着人工智能技术的不断进步,图像生成技术已成为创意产业的一大助力。通义万相AIGC技术,作为阿里云推出的一项先进技术,旨在通过文本到图像、涂鸦转换、人像风格重塑及人物写真创建等功能,加速艺术家和设计师的创作流程。本文将详细评测这一技术的实际应用体验。
207 4
|
2月前
|
人工智能 自然语言处理 数据可视化
什么是AIGC?如何使用AIGC技术辅助办公?
2分钟了解AIGC技术及其如何提高日常办公效率!
110 4
什么是AIGC?如何使用AIGC技术辅助办公?
|
3月前
|
人工智能 自然语言处理 数据挖掘
Claude 3.5:一场AI技术的惊艳飞跃 | AIGC
在这个科技日新月异的时代,人工智能(AI)的进步令人惊叹。博主体验了Claude 3.5 Sonnet的最新功能,对其卓越的性能、强大的内容创作与理解能力、创新的Artifacts功能、视觉理解与文本转录能力、革命性的“computeruse”功能、广泛的应用场景与兼容性以及成本效益和易用性深感震撼。这篇介绍将带你一窥其技术前沿的魅力。【10月更文挑战第12天】
101 1
|
3月前
|
机器学习/深度学习 人工智能 自然语言处理
探索AIGC的底层技术:人工智能通用计算架构
探索AIGC的底层技术:人工智能通用计算架构
236 3
|
3月前
|
人工智能 自然语言处理 搜索推荐
超越边界:探索2023年AIGC技术盛宴,预测前沿科技的奇迹 🚀
本文探讨了互联网内容生产从PGC、UGC到AIGC的演变,特别关注了AIGC(人工智能生成内容)的发展及其对未来内容生产的深远影响。文章详细介绍了AIGC的定义、技术进展(如生成算法、多模态技术、AI芯片等),并展示了AIGC在多个领域的广泛应用,如代码生成、智能编程、个性化服务等。未来,AIGC将在各行各业创造巨大价值,推动社会进入更加智能化的时代。同时,文章也探讨了AIGC对开发者的影响,以及其可能无法完全取代人类的原因,强调开发者可以利用AIGC提升工作效率。
55 0
|
3月前
|
机器学习/深度学习 自然语言处理 Go
Python与Go在AIGC领域的应用:比较与分析
Python与Go在AIGC领域的应用:比较与分析
76 0
|
5月前
|
机器学习/深度学习 数据采集 人工智能
作为AIGC技术的一种应用-bard
8月更文挑战第22天
75 15
|
5月前
|
机器学习/深度学习 人工智能 自然语言处理
|
5月前
|
机器学习/深度学习 人工智能 数据处理
企业如何通过更可持续的推理实现更环保的AIGC
企业如何通过更可持续的推理实现更环保的AIGC