如何加速 spaCy 词形还原?

TR5*_*517 11 performance nlp spacy

我在 NLP 管道的第一步中使用 spaCy(版本 2.0.11)进行词形还原,但不幸的是它需要很长时间。这显然是我的处理流程中最慢的部分,我想知道我是否可以进行改进。我使用管道作为:

nlp.pipe(docs_generator, batch_size=200, n_threads=6, disable=['ner'])
Run Code Online (Sandbox Code Playgroud)

在 8 核机器上,我已验证该机器正在使用所有内核。

在大约 300 万个短文本的语料库中,总大小接近 2GB,需要将近 24 小时来词形还原和写入磁盘。合理的?

我尝试禁用处理管道的几个部分,发现它破坏了词形还原(解析器、标记器)。

除了命名实体识别之外,默认处理管道的任何部分是否不需要词形还原?

还有其他方法可以加快 spaCy 词形还原过程吗?

在旁边:

文档似乎也没有列出解析管道中的所有操作。在 spacy Language 类的顶部,我们有:

factories = {
    'tokenizer': lambda nlp: nlp.Defaults.create_tokenizer(nlp),
    'tensorizer': lambda nlp, **cfg: Tensorizer(nlp.vocab, **cfg),
    'tagger': lambda nlp, **cfg: Tagger(nlp.vocab, **cfg),
    'parser': lambda nlp, **cfg: DependencyParser(nlp.vocab, **cfg),
    'ner': lambda nlp, **cfg: EntityRecognizer(nlp.vocab, **cfg),
    'similarity': lambda nlp, **cfg: SimilarityHook(nlp.vocab, **cfg),
    'textcat': lambda nlp, **cfg: TextCategorizer(nlp.vocab, **cfg),
    'sbd': lambda nlp, **cfg: SentenceSegmenter(nlp.vocab, **cfg),
    'sentencizer': lambda nlp, **cfg: SentenceSegmenter(nlp.vocab, **cfg),
    'merge_noun_chunks': lambda nlp, **cfg: merge_noun_chunks,
    'merge_entities': lambda nlp, **cfg: merge_entities
}
Run Code Online (Sandbox Code Playgroud)

其中包括此处文档中未涵盖的一些项目:https : //spacy.io/usage/processing-pipelines

由于它们没有被覆盖,我真的不知道哪些可能被禁用,也不知道它们的依赖关系是什么。

TR5*_*517 9

我发现你也可以禁用 spacy 管道的解析器部分,只要你添加句子分割器。这不是疯狂的快,但它绝对是一个改进——在测试中,时间看起来大约是我之前所做的事情的 1/3(当我只是禁用 'ner' 时)。这是我现在所拥有的:

nlp = spacy.load('en', disable=['ner', 'parser'])
nlp.add_pipe(nlp.create_pipe('sentencizer'))
Run Code Online (Sandbox Code Playgroud)


Dhr*_*hak 0

  • 一种快速且有效的优化是使用合适的内存结构或内存数据库(python dicts 或 redis/memcache)进行记忆。
  • 单词的词形还原形式及其上下文(例如词性)将是不变的,并且不会改变,因此无需一次又一次地在它们上花费计算能力。

  • 你的 300 万文本语料库中会有大量重复,而记忆会大大减少时间。

例子:

>>> import spacy
>>> nlp = spacy.load('en')
>>> txt1 = u"he saw the dragon, he saw the forest, and used a saw to cut the tree, and then threw the saw in the river." 
>>> [(x.text,x.pos_,x.lemma_) for x in nlp(txt1)]
[(u'he', u'PRON', u'-PRON-'), (u'saw', u'VERB', u'see'), (u'the', u'DET', u'the'), (u'dragon', u'NOUN', u'dragon'), (u',', u'PUNCT', u','), (u'he', u'PRON', u'-PRON-'), (u'saw', u'VERB', u'see'), (u'the', u'DET', u'the'), (u'forest', u'NOUN', u'forest'), (u',', u'PUNCT', u','), (u'and', u'CCONJ', u'and'), (u'used', u'VERB', u'use'), (u'a', u'DET', u'a'), (u'saw', u'NOUN', u'saw'), (u'to', u'PART', u'to'), (u'cut', u'VERB', u'cut'), (u'the', u'DET', u'the'), (u'tree', u'NOUN', u'tree'), (u',', u'PUNCT', u','), (u'and', u'CCONJ', u'and'), (u'then', u'ADV', u'then'), (u'threw', u'VERB', u'throw'), (u'the', u'DET', u'the'), (u'saw', u'NOUN', u'saw'), (u'in', u'ADP', u'in'), (u'the', u'DET', u'the'), (u'river', u'NOUN', u'river'), (u'.', u'PUNCT', u'.')]
Run Code Online (Sandbox Code Playgroud)

正如你所看到的,pos 标签+词形还原形式是不变的。