Python spacy中的深层复制短语匹配器对象不工作

Python spacy中的深层复制短语匹配器对象不工作,python,python-3.x,nltk,spacy,Python,Python 3.x,Nltk,Spacy,我想运行一些多处理模块来并行地在文档上运行一些短语匹配。为此,我考虑在一个进程中创建短语匹配对象,然后通过创建短语匹配器对象的副本在多个进程之间共享。代码似乎失败了,但没有给出任何错误。为了让事情变得更简单,我试着用这个来证明我正在努力实现的目标 import copy import spacy from spacy.matcher import PhraseMatcher nlp = spacy.load('en') color_patterns = [nlp(text) for text

我想运行一些多处理模块来并行地在文档上运行一些短语匹配。为此,我考虑在一个进程中创建短语匹配对象,然后通过创建短语匹配器对象的副本在多个进程之间共享。代码似乎失败了,但没有给出任何错误。为了让事情变得更简单,我试着用这个来证明我正在努力实现的目标

import copy
import spacy
from spacy.matcher import PhraseMatcher


nlp = spacy.load('en')
color_patterns = [nlp(text) for text in ('red', 'green', 'yellow')]
product_patterns = [nlp(text) for text in ('boots', 'coats', 'bag')]
material_patterns = [nlp(text) for text in ('silk', 'yellow fabric')]

matcher = PhraseMatcher(nlp.vocab)
matcher.add('COLOR', None, *color_patterns)
matcher.add('PRODUCT', None, *product_patterns)
matcher.add('MATERIAL', None, *material_patterns)


matcher2 = copy.deepcopy(matcher)

doc = nlp("yellow fabric")
matches = matcher2(doc)
for match_id, start, end in matches:
    rule_id = nlp.vocab.strings[match_id]  # get the unicode ID, i.e. 'COLOR'
    span = doc[start : end]  # get the matched slice of the doc
    print(rule_id, span.text)
使用
matcher2
对象,它不会给出任何输出,但是使用
matcher
对象,我能够得到结果

COLOR yellow
MATERIAL yellow fabric
我被困在这几天了。任何帮助都将不胜感激


谢谢。

问题的根源在于PhraseMatcher是一个Cython类,在matcher.pyx文件中定义和实现,Cython不能与deepcopy一起正常工作

参考StackOverflow问题的公认答案:

Cython不喜欢在具有函数/方法引用变量的类上使用deepcopy。这些变量副本将失败

然而,还有其他选择。如果您想对多个文档并行运行PhraseMatcher,可以使用PhraseMatcher的pipe方法进行多线程处理

您的问题可能的解决方法:

import copy
import spacy
from spacy.matcher import PhraseMatcher


nlp = spacy.load('en_core_web_sm')
color_patterns = [nlp(text) for text in ('red', 'green', 'yellow')]
product_patterns = [nlp(text) for text in ('boots', 'coats', 'bag')]
material_patterns = [nlp(text) for text in ('silk', 'yellow fabric')]

matcher = PhraseMatcher(nlp.vocab)
matcher.add('COLOR', None, *color_patterns)
matcher.add('PRODUCT', None, *product_patterns)
matcher.add('MATERIAL', None, *material_patterns)

doc1 = nlp('yellow fabric')
doc2 = nlp('red lipstick and big black boots')

for doc in matcher.pipe([doc1, doc2], n_threads=4):
    matches = matcher(doc)
    for match_id, start, end in matches:
        rule_id = nlp.vocab.strings[match_id]
        span = doc[start : end]
        print(rule_id, span.text)

希望有帮助

由于v2.x模型无法释放全局解释器锁,因此.pipe方法上的关键字参数n_threads现在已被弃用。(未来版本可能会引入n_过程参数,用于通过多处理进行并行推理。)