【问题标题】:Deep copying PhraseMatcher object in spacy is not workingspacy 中的深度复制 PhraseMatcher 对象不起作用
【发布时间】:2018-09-29 20:42:27
【问题描述】:

我想运行一些多处理模块来并行运行文档上的一些短语匹配。为此,我想在一个进程中创建短语匹配对象,然后通过创建 PhraseMatcher 对象的副本在多个进程之间共享。代码似乎失败了,没有给出任何错误。为了让事情变得更容易,我尝试了这个来展示我想要实现的目标

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

我被困在这几天了。任何帮助将不胜感激。

谢谢。

【问题讨论】:

    标签: python python-3.x nltk spacy


    【解决方案1】:

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

    引用自this StackOverflow 问题的接受答案:

    Cython 不喜欢对具有函数/方法引用变量的类进行深度复制。这些变量副本将失败。

    但是,还有其他选择。如果你想并行运行 PhraseMatcher 到多个文档,你可以使用多线程和 PhraseMatcher 的管道方法。

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

    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)
    

    希望对你有帮助!

    【讨论】:

    • .pipe 方法上的关键字参数 n_threads 现在已弃用,因为 v2.x 模型无法释放全局解释器锁。 (未来版本可能会引入一个 n_process 参数,用于通过多处理进行并行推理。)Source
    猜你喜欢
    • 1970-01-01
    • 2016-07-07
    • 2021-06-20
    • 2012-12-15
    • 1970-01-01
    • 2018-01-28
    • 1970-01-01
    • 2021-04-05
    • 2023-03-17
    相关资源
    最近更新 更多