1、起源
遇到了一类问题,它们:
- 没有直接的算法,多种方法都可能解决问题
- 找不到确定的求解策略(先做什么?后做什么?)
- 问题没有唯一的解答:每个求解步骤中都可能产生多个可能的解,需要寻求最佳或可接受解。
- 需要多个领域的专门知识协作解决。
例如:自然语言处理、语音处理、模式识别、图像处理等。
2、形成
为了解决以上的问题,大家设计软件时,逐渐有了一些共识,形成了一种风格,即黑板体系风格。
这种风格是这么解决以上的问题的?
- 将一个大问题被分解为若干个子问题
- 每个子问题的解决需要不同的问题表达方式和求解模型,分别设计求解程序
- 每个求解程序具有某一特定领域的知识,可解决某一方面的问题
- 这些程序是相互独立的,之间不存在相互调用,也不存在可事先确定的操作顺序
- 根据问题求解过程中的状态来动态决定各个专门程序之间的操作顺序,它们之间通过协同工作共同完成整个问题的求解
- 专门的控制程序负责根据问题求解的状态来调用最恰当的求解程序,从而形成一种随机性的执行次序
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):
-
程序中的实现:
rule1
和rule2
函数。 -
功能:
rule1
:基于简单的后缀规则进行词性标注。rule2
:利用 NLTK 提供的更复杂的词性标注器进行标注。
-
特点:每个知识源专注于特定的标注规则,并独立地对输入的单词进行处理。
控制模块:
-
程序中的实现:
control
函数和主循环。 -
功能:
- 接收用户输入的句子。
- 将句子拆分成单词。
- 逐个单词调用各个知识源进行标注。
- 将标注结果写入黑板。
- 控制知识源的执行顺序和条件。
黑板体系结构的优势在程序中的体现:
- 模块化:各个知识源独立实现,易于维护和扩展。
- 灵活性:可以通过添加新的知识源来扩展系统的功能,例如加入基于上下文信息的标注规则。
- 可复用性:黑板作为共享的知识库,可以被多个知识源共享。
- 并行性:在某些情况下,不同的知识源可以并行地处理单词,提高标注效率。