【问题标题】:fast filtering of sentences in spacy快速过滤spacy中的句子
【发布时间】:2021-06-28 00:55:19
【问题描述】:

我正在使用 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:
    [...]

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

【问题讨论】:

    标签: python nlp spacy transformer sentence


    【解决方案1】:

    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 应该可以很好地工作。如果你有很多连续句子没有最后的标点符号,那么parser 可能会做得更好。要仅运行解析器,请保留原始管道中的 tok2vecparser 组件,并且不要启用 senterparser 将比 senter 慢约 5-10 倍。

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

    【讨论】:

    • 谢谢,我需要子词标记化和代码其他部分的解析器,但我想知道为什么切换到 pipe 并使用多个进程并没有加快速度。
    • 仅在与正则表达式匹配的内容上运行解析器对您有帮助吗?您可以使用小模型进行句子标记化,然后根据需要应用 trf 模型。
    • @polm23 是的,这是个好主意。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-12
    • 2015-10-27
    • 1970-01-01
    • 2010-09-17
    • 2014-06-06
    • 2018-10-22
    相关资源
    最近更新 更多