快速过滤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
可能会做得更好。仅 运行 解析器,保留原始管道中的 tok2vec
和 parser
组件,不要启用 senter
。 parser
将比 senter
.
慢 ~5-10 倍
如果您需要它更快,可以使用基于规则的 sentencizer
(从空白 en
模型开始),这通常比 senter
因为它只拆分提供的标点符号。
我正在使用 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
可能会做得更好。仅 运行 解析器,保留原始管道中的 tok2vec
和 parser
组件,不要启用 senter
。 parser
将比 senter
.
如果您需要它更快,可以使用基于规则的 sentencizer
(从空白 en
模型开始),这通常比 senter
因为它只拆分提供的标点符号。