软件体系结构笔记4-2(用代码直观理解)

四、Data-centered Software Architecture Style(数据为中心的体系结构风格)

2、黑板体系结构风格

黑板体系结构是一种问题求解模式,特别适用于那些难以事先完全形式化的复杂问题。它由三个主要组件组成:

  • 黑板(Blackboard):一个共享的信息库,所有知识源都可以读取和写入。在我们的例子中,黑板将存储输入的词和它们的词性标注。
  • 知识源(Knowledge Source):一组独立的模块,每个模块负责解决问题的某个特定方面。在我们的例子中,知识源将是不同的词性标注规则。
  • 控制(Control):一个控制模块,负责协调知识源的活动,决定哪个知识源应该在什么时候运行。

示例:基于NLTK的黑板词性标注系统

import nltk
from nltk.corpus import stopwords
from nltk.tokenize import word_tokenize

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

# 黑板
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]

# 控制模块
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()  # 清空黑板

if __name__ == "__main__":
    control()

结果演示:

请输入一个句子:today is a good day
{'today': 'NN', 'is': 'VBZ', 'a': 'DT', 'good': 'JJ', 'day': 'NN'}

请输入一个句子:i have an apple
{'i': 'NN', 'have': 'VB', 'an': 'DT', 'apple': 'NN'}

请输入一个句子:i love you
{'i': 'NN', 'love': 'NN', 'you': 'PRP'}

请输入一个句子:Furthering that point, the association noted a number of somber research findings, including that men are four times more likely than women to die of suicide worldwide, are "far more likely" than women to be arrested and charged with intimate partner violence in the U.S. and commit about 90 percent of all homicides nationwide.

{'Furthering': 'VBG', 'that': 'IN', 'point,': 'NN', 'the': 'DT', 'association': 'NN', 'noted': 'VBD', 'a': 'DT', 'number': 'NN', 'of': 'IN', 'somber': 'NN', 'research': 'NN', 'findings,': 'NN', 'including': 'VBG', 'men': 'NNS', 'are': 'VBP', 'four': 'CD', 'times': 'NNS', 'more': 'RBR', 'likely': 'JJ', 'than': 'IN', 'women': 'NNS', 'to': 'TO', 'die': 'NN', 'suicide': 'NN', 'worldwide,': 'NN', '"far': 'NN', 'likely"': 'NN', 'be': 'VB', 'arrested': 'VBD', 'and': 'CC', 'charged': 'VBD', 'with': 'IN', 'intimate': 'NN', 'partner': 'NN', 'violence': 'NN', 'in': 'IN', 'U.S.': 'NNP', 'commit': 'NN', 'about': 'IN', '90': 'CD', 'percent': 'NN', 'all': 'DT', 'homicides': 'NNS', 'nationwide.': 'NN'}

代码解释

  1. 黑板:使用Python字典blackboard来存储词和对应的词性标注。
  2. 知识源:定义了两个知识源rule1rule2rule1基于简单的后缀规则进行词性标注,rule2使用NLTK提供的默认词性标注器。
  3. 控制control函数负责控制整个系统的运行。它不断地从用户输入句子,然后对每个词调用所有的知识源,直到找到一个合适的词性标注。

如何运行

  1. 确保你已经安装了NLTK库。
  2. 运行这段代码。
  3. 输入一个句子,程序会输出每个词的词性标注。

这个例子展示了黑板体系结构的几个特点:

  • 知识的共享:所有的知识源都共享同一个黑板,可以随时读取和修改其中的信息。
  • 知识源的独立性:每个知识源都是独立的,可以根据自己的规则进行推理。
  • 控制的灵活性:控制模块可以根据不同的情况选择不同的知识源。

这个例子虽然简单,但已经体现了黑板体系结构在解决自然语言处理问题时的优势。 我们可以很容易地添加更多的知识源,来提高词性标注的准确性。

### 关于软件体系结构期末考试复习建议 对于准备《软件体系结构》课程的期末考试,收集并整理有效的复习资源至关重要。以下是针对该科目的一些具体建议: #### 一、复习资料的选择 为了更好地理解理论概念和技术细节,可以从多个渠道搜集学习材料。除了官方教材外,还可以参考教师发布的PPT以及课堂笔记[^1]。这些一手资料往往包含了授课过程中强调的重点内容。 #### 二、考点总结 根据以往的经验,在准备此类技术类科目的时候,应该重点关注以下几个方面: - **基本定义与原理**:掌握各种架构模式(如MVC, SOA等)、设计原则及其应用场景。 - **实际案例分析**:通过研究真实世界的项目实例来加深对不同架构风格的理解- **工具链熟悉度**:了解常用的建模工具和框架,并能够运用它们解决简单的设计问题。 #### 三、往年试题练习 利用往年的试卷可以帮助考生更直观地感受命题趋势和难度分布。虽然具体的题目可能每年都会有所变化,但核心知识点通常保持稳定。因此,尝试解答之前年度的相关考题是非常有益的做法之一。例如,可以借鉴其他高校同名课程公开分享的记忆版本试题作为参考资料[^2]。 ```python # Python代码示例用于说明如何解析JSON格式的数据文件, # 这里仅作为一个编程技能的例子而非直接关联到软件体系结构的内容 import json def load_exam_data(file_path): with open(file_path, 'r', encoding='utf-8') as f: data = json.load(f) return data['questions'] exam_questions = load_exam_data('past_exams.json') for q in exam_questions[:5]: print(q['question_text']) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值