自然语言处理 |使用 Execnet 进行分布式标记 - 第 1 部分
什么是执行网?
- Execnet是Python的分布式执行库。
- 它允许为远程代码执行创建网关和通道。
- 网关是从调用进程到远程环境的连接。
- 远程环境可以是本地子进程或到远程节点的 SSH 连接。
- 通道从网关创建并处理通道创建者和远程代码之间的通信。
- 这样,execnet 是一种消息传递接口 (MPI) ,网关创建连接,通道用于来回发送消息。
由于许多 NLTK 进程在计算期间占用 100% 的 CPU,因此 execnet 是分配该计算以最大限度地利用资源的理想方式。可以为每个 CPU 内核创建一个网关,无论这些内核是在本地计算机中还是分布在远程计算机上都无关紧要。在很多情况下,只需要在单台机器上拥有训练好的对象和数据,并且可以根据需要将对象和数据发送到远程节点。
安装 execnet :
它应该像sudo pip install execnet或sudo easy_install execnet一样简单。在撰写本文时,execnet 的当前版本是 1.2。包含 API 文档和示例的 execnet 主页位于 http://codespeak.net/execnet/。
这个怎么运作?
需要导入 Pickle 以序列化(传输)标注器。 Execnet 本身并不知道如何处理复杂对象,例如词性标注器,因此要使用pickle.dumps()将标注器转储为字符串。
默认标注器由nltk.tag.pos_tag()函数使用,但任何预训练的词性标注器都可以使用,只要它实现了TaggerI接口。在拥有序列化标记器之后,可以通过使用 execnet.makegateway() 创建网关来启动 Execnet。
默认网关创建一个Python子进程,调用remote_tag模块的remote_exec()函数可以创建一个通道。使用开放通道,可以发送序列化标记器,然后是树库语料库的第一个标记化句子。
视觉上,通信过程是这样的
现在,调用channel.receive()将返回一个标记的句子,它相当于树库语料库中的第一个标记句子,因此已知标记有效。最后它通过退出网关结束,网关关闭通道并杀死子进程。
import execnet, remote_tag, nltk.tag, nltk.data
from nltk.corpus import treebank
import pickle
pickled_tagger = pickle.dumps(nltk.data.load(nltk.tag._POS_TAGGER))
gw = execnet.makegateway()
channel = gw.remote_exec(remote_tag)
channel.send(pickled_tagger)
channel.send(treebank.sents()[0])
tagged_sentence = channel.receive()
# will give output
tagged_sentence == treebank.tagged_sents()[0]
gw.exit()
输出 :
True