四、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'}
代码解释
- 黑板:使用Python字典
blackboard
来存储词和对应的词性标注。 - 知识源:定义了两个知识源
rule1
和rule2
。rule1
基于简单的后缀规则进行词性标注,rule2
使用NLTK提供的默认词性标注器。 - 控制:
control
函数负责控制整个系统的运行。它不断地从用户输入句子,然后对每个词调用所有的知识源,直到找到一个合适的词性标注。
如何运行
- 确保你已经安装了NLTK库。
- 运行这段代码。
- 输入一个句子,程序会输出每个词的词性标注。
这个例子展示了黑板体系结构的几个特点:
- 知识的共享:所有的知识源都共享同一个黑板,可以随时读取和修改其中的信息。
- 知识源的独立性:每个知识源都是独立的,可以根据自己的规则进行推理。
- 控制的灵活性:控制模块可以根据不同的情况选择不同的知识源。
这个例子虽然简单,但已经体现了黑板体系结构在解决自然语言处理问题时的优势。 我们可以很容易地添加更多的知识源,来提高词性标注的准确性。
标签:词性,word,NN,知识,笔记,黑板,软件体系结构,直观,标注 From: https://blog.csdn.net/qq_52060318/article/details/142354253