在我的NLP管道的第一步中,我正在使用spaCy(版本2.0.11)进行词条识别,但是不幸的是,这花费了很长时间。显然这是我处理流程中最慢的部分,我想知道是否可以进行改进。我将管道用作:
nlp.pipe(docs_generator, batch_size=200, n_threads=6, disable=['ner'])
在8核计算机上,并且我已验证该计算机正在使用所有核。
在大约300万条短文本的语料库中,该文本总容量接近2gb,几乎需要24小时来定格并写入磁盘。合理吗?
我尝试禁用处理流水线的几个部分,发现它破坏了词形化(解析器,标记器)。
除命名实体识别之外,默认处理管道中是否还有不需要进行词法分离的任何部分?
还有其他方法可以加快spaCy词法化过程吗?
在旁边:
似乎文档也没有列出解析管道中的所有操作。在spacy语言类的顶部,我们有:
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
}
其中包括此处文档未涵盖的一些项目: https://spacy.io/usage/processing-pipelines
由于它们未被涵盖,所以我真的不知道哪些可能被禁用,也不知道它们的依赖性是什么。
答案 0 :(得分:2)
我发现只要添加句子分割器,您也可以禁用spacy管道的解析器部分。这并不是疯狂的快,但绝对是一个进步-在测试中,时间似乎是我以前所做的事情的1/3(当我只是禁用“ ner”时)。这是我现在拥有的:
nlp = spacy.load('en', disable=['ner', 'parser'])
nlp.add_pipe(nlp.create_pipe('sentencizer'))
答案 1 :(得分:0)
单词的词法化形式以及其词性(如词性)将保持不变,并且不会发生变化,因此无需一次又一次地花费计算能力。
< / li>您的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'.')]
您会看到pos标记+修饰词形式是恒定的。