快速过滤spacy中的句子

fast filtering of sentences in spacy

我正在使用 SpaCy 将文本分成句子,在每个句子上匹配正则表达式模式,并根据匹配结果使用一些逻辑。我从一个天真的方法开始,例如:

nlp = spacy.load("en_core_web_trf")
regex = re.compile(r'\b(foo|bar)\b')

for text in texts_list:
  doc = nlp(text)
  for sent in doc.sents:
    if re.search(regex, str(s)):
    [...]
    else:
    [...]

而且速度很慢。然后我用了一个管道:

for doc in nlp.pipe(texts_list, disable=['tagger', 'ner', 'attribute_ruler', 'lemmatizer'], n_process=4):
  for sent in doc.sents:
    if re.search(regex, str(s)):
    [...]
    else:
    [...]

但它仍然很慢。我错过了什么吗?

Transformer 模型对于拆分句子来说是大材小用,而且速度会很慢。相反,一个好的选择是来自 sm 模型的快速 senter

import spacy
nlp = spacy.load("en_core_web_sm", disable=["tok2vec", "tagger", "parser", "attribute_ruler", "lemmatizer", "ner"])
nlp.enable_pipe("senter")
for doc in nlp.pipe(texts, n_process=4):
    ...

如果您的句子以标点符号结尾,senter 应该能很好地工作。如果你有很多 运行-on 句子没有最后的标点符号,那么 parser 可能会做得更好。仅 运行 解析器,保留原始管道中的 tok2vecparser 组件,不要启用 senterparser 将比 senter.

慢 ~5-10 倍

如果您需要它更快,可以使用基于规则的 sentencizer(从空白 en 模型开始),这通常比 senter 因为它只拆分提供的标点符号。