黑板体系风格

1、起源

遇到了一类问题,它们:

  1. 没有直接的算法,多种方法都可能解决问题
  2. 找不到确定的求解策略(先做什么?后做什么?)
  3. 问题没有唯一的解答:每个求解步骤中都可能产生多个可能的解,需要寻求最佳或可接受解。
  4. 需要多个领域的专门知识协作解决。

例如:自然语言处理、语音处理、模式识别、图像处理等。

2、形成

为了解决以上的问题,大家设计软件时,逐渐有了一些共识,形成了一种风格,即黑板体系风格。

这种风格是这么解决以上的问题的?

  1. 将一个大问题被分解为若干个子问题
  2. 每个子问题的解决需要不同的问题表达方式和求解模型,分别设计求解程序
  3. 每个求解程序具有某一特定领域的知识,可解决某一方面的问题
  4. 这些程序是相互独立的,之间不存在相互调用,也不存在可事先确定的操作顺序
  5. 根据问题求解过程中的状态来动态决定各个专门程序之间的操作顺序,它们之间通过协同工作共同完成整个问题的求解
  6. 专门的控制程序负责根据问题求解的状态来调用最恰当的求解程序,从而形成一种随机性的执行次序

3、基本结构

4、基于黑板体系结构风格设计实现的词性标注系统源码案例

import tkinter as tk
import nltk
from nltk.corpus import stopwords
from nltk.tokenize import word_tokenize

"""
NN:名词
NNS:名词复数
VB:动词
DT:限定词
PRP:人称代词
VBZ:动词现在式第三人称时态
JJ:形容词
......
"""

# 黑板
#blackboard: 一个字典,用于存储单词和其对应的词性标注。
blackboard = {}

# 知识源1:简单的词性标注规则
def rule1(word):
    if word.endswith('ing'):
        return 'VBG'  # 现在分词
    elif word.endswith('ed'):
        return 'VBD'  # 过去式
    else:
        return None

# 知识源2:NLTK提供的默认词性标注器
def rule2(word):
    return nltk.pos_tag([word])[0][1]

# 控制模块
# 接收用户输入的句子,对每个单词进行词性标注,并存储在blackboard中。
def control():
    while True:
        sentence = input("请输入一个句子:")
        words = sentence.split()
        for word in words:
            for rule in [rule1, rule2]:
                tag = rule(word)
                if tag:
                    blackboard[word] = tag
                    break
        print(blackboard)
        blackboard.clear()  # 清空黑板


# 图形化界面
"""
创建一个Tkinter窗口,作为程序的主界面。
sentence_entry: 输入框,用于输入待标注的句子。
result_text: 输出框,用于显示标注结果。
button: 标注按钮,点击后触发标注过程。
"""

# 创建主窗口
window = tk.Tk()
window.title("词性标注工具")

# 输入框
sentence_entry = tk.Entry(window, width=50)
sentence_entry.pack()

# 输出框
result_text = tk.Text(window, height=10, width=50)
result_text.pack()

# 标注按钮
def start_tagging():
    sentence = sentence_entry.get()
    result_text.delete('1.0', tk.END)  # 清空输出框

    # 调用控制模块
    control(sentence)

    # 将结果添加到输出框
    for word, tag in blackboard.items():
        result_text.insert(tk.END, f"{word}: {tag}\n")

# 修改控制模块,使其接受句子作为输入
def control(sentence):
    words = sentence.split()
    for word in words:
        for rule in [rule1, rule2]:
            tag = rule(word)
            if tag:
                blackboard[word] = tag
                break

button = tk.Button(window, text="开始标注", command=start_tagging)
button.pack()

window.mainloop()

黑板(Blackboard)

  • 程序中的实现blackboard 字典。

  • 功能:存储每个单词及其对应的词性标注,作为系统中共享的知识库。

知识源(Knowledge Sources, KS)

  • 程序中的实现rule1rule2 函数。

  • 功能

    • rule1:基于简单的后缀规则进行词性标注。
    • rule2:利用 NLTK 提供的更复杂的词性标注器进行标注。
  • 特点:每个知识源专注于特定的标注规则,并独立地对输入的单词进行处理。

控制模块

  • 程序中的实现control 函数和主循环。

  • 功能

    • 接收用户输入的句子。
    • 将句子拆分成单词。
    • 逐个单词调用各个知识源进行标注。
    • 将标注结果写入黑板。
    • 控制知识源的执行顺序和条件。

黑板体系结构的优势在程序中的体现:

  • 模块化:各个知识源独立实现,易于维护和扩展。
  • 灵活性:可以通过添加新的知识源来扩展系统的功能,例如加入基于上下文信息的标注规则。
  • 可复用性:黑板作为共享的知识库,可以被多个知识源共享。
  • 并行性:在某些情况下,不同的知识源可以并行地处理单词,提高标注效率。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值