NLP |使用 Execnet 进行分布式分块
原文:https://www . geesforgeks . org/NLP-distributed-chunking-with-exec net/
本文旨在通过 execnet 网关执行分块和标记。这里将发送两个对象而不是一个对象,并接收一个树,这需要酸洗和拆封以进行序列化。
它是如何工作的?
- 使用腌制的标签。
- 首先,酸洗 nltk.chunk.ne_chunk() 使用的默认 chunker,尽管任何 chunker 都可以。
- 接下来,为 remote_chunk 模块创建一个网关,获取一个通道,然后将腌制的标记器和 chunker 发送过来。
- 然后,收到一棵腌制过的树,可以拆开检查,看看结果。最后,退出网关:
代码:解释工作
# importing libraries
import execnet, remote_chunk
import nltk.data, nltk.tag, nltk.chunk
import pickle
from nltk.corpus import treebank_chunk
tagger = pickle.dumps(nltk.data.load(nltk.tag._POS_TAGGER))
chunker = pickle.dumps(
nltk.data.load(nltk.chunk._MULTICLASS_NE_CHUNKER))
gw = execnet.makegateway()
channel = gw.remote_exec(remote_chunk)
channel.send(tagger)
channel.send(chunker)
channel.send(treebank_chunk.sents()[0])
chunk_tree = pickle.loads(channel.receive())
print (chunk_tree)
gw.exit()
输出:
Tree('S', [Tree('PERSON', [('Pierre', 'NNP')]), Tree('ORGANIZATION',
[('Vinken', 'NNP')]), (', ', ', '), ('61', 'CD'), ('years', 'NNS'),
('old', 'JJ'), (', ', ', '), ('will', 'MD'), ('join', 'VB'), ('the',
'DT'), ('board', 'NN'), ('as', 'IN'), ('a', 'DT'), ('nonexecutive',
'JJ'), ('director', 'NN'), ('Nov.', 'NNP'), ('29', 'CD'), ('.', '.')])
这次沟通略有不同,如下图所示–
- remote_chunk.py 模块比 remote_tag.py 模块稍微复杂一点。
- 除了接收一个腌制标记器,它还希望接收一个实现 ChunkerIinterface 的腌制 chunker
- 一旦它有了一个标记器和一个组块器,它期望接收任意数量的标记化句子,并将其标记和解析成一个树。然后,这棵树被腌制并通过通道送回:
代码:解释上述工作
import pickle
if __name__ == '__channelexec__':
tagger = pickle.loads(channel.receive())
chunker = pickle.loads(channel.receive())
for sentence in channel:
chunk_tree = chunker.parse(tagger.tag(sent))
channel.send(pickle.dumps(chunk_tree))
remote_chunk 模块的唯一的外部依赖是 pickle 模块,它是 Python 标准库的一部分。它不需要导入任何 NLTK 模块来使用标记器或分块器,因为所有必要的数据都被腌制并通过通道发送。
版权属于:月萌API www.moonapi.com,转载请注明出处