Machine learning 如何使用SpaCy Matcher更快地查找匹配?

Machine learning 如何使用SpaCy Matcher更快地查找匹配?,machine-learning,text,nlp,data-science,spacy,Machine Learning,Text,Nlp,Data Science,Spacy,每当句子中有被动语态时,我都会尝试使用这个词来检测匹配。我写了下面的模式,它能正确地找到被动动词和句子。虽然我现在的问题是速度。我有大约100万条记录,每条记录大约有10个句子。我想知道我是否能做些什么来提高搜索的效率?比如不返回结束和开始令牌 匹配者: matcher = Matcher(nlp.vocab) passive_rule1 = [{'DEP':'nsubjpass', 'OP':'*'}, {'DEP':'xcomp', 'OP':'*'}, {'DEP':'aux','OP':

每当句子中有被动语态时,我都会尝试使用这个词来检测匹配。我写了下面的模式,它能正确地找到被动动词和句子。虽然我现在的问题是速度。我有大约100万条记录,每条记录大约有10个句子。我想知道我是否能做些什么来提高搜索的效率?比如不返回结束和开始令牌

匹配者:

matcher = Matcher(nlp.vocab)
passive_rule1 = [{'DEP':'nsubjpass', 'OP':'*'}, {'DEP':'xcomp', 'OP':'*'}, {'DEP':'aux','OP':'*'},{'DEP':'auxpass'}, {'DEP':'nsubj', 'OP':'*'}, {'TAG':'VBN'}]
passive_rule2 =  [{'DEP': 'attr'}, {'DEP':'det', 'OP':'*'}, {'Tag':'NOUN', 'OP': '?'}, {'TAG':'VBN'}]

matcher.add('passive_rule1',None, passive_rule1)
matcher.add('passive_rule2 ', None, passive_rule2)
查找匹配项:

df.loc[:, 'PassiveVoice'] = df.Sentence.apply(lambda x:1 if len(matcher(nlp(x)))>0 else 0)

或者,如果有任何人有任何其他想法,我会很高兴听到

把你的100万。将文本输入pandas的
数据帧
,然后在循环中调用
nlp
1百万次是个坏主意。相反,通过
df[“句子”].tolist()
将文档放入列表中,并通过以下方式高效地处理它们:

导入空间
从spacy.matcher导入matcher
nlp=spacy.load(“en_core_web_md”,disable=[“ner”])
matcher=matcher(nlp.vocab)
被动规则1=[
{“DEP”:“nsubjpass”,“OP”:“*”},
{“DEP”:“xcomp”,“OP”:“*”},
{“DEP”:“aux”,“OP”:“*”},
{“DEP”:“auxpass”},
{“DEP”:“nsubj”,“OP”:“*”},
{“TAG”:“VBN”},
]
被动规则2=[
{“DEP”:“attr”},
{“DEP”:“det”,“OP”:“*”},
{“Tag”:“名词”,“OP”:“?”},
{“TAG”:“VBN”},
]
添加(“被动规则1”,无,被动规则1)
添加(“被动规则2”,无,被动规则2)
text=[“这是我的第一句话,关于某事”,“这是另一句话”]
#text=df[“句子”].tolist()
文档=nlp.pipe(文本,n_流程=2,批次大小=50)
对于文档中的文档:
如果匹配器(文档):
#做点什么

另外请注意,使用
nlp.pipe()
您可以使用
n\u process=2
(选择您的)启用多处理,并使用
batch\u size=50
(选择您的)批处理您的文本。

非常感谢您的回答。虽然我这里有一些问题。我在我的系统上运行了代码,不幸的是,在一个示例上运行了1分钟,我用这个示例运行了9秒!虽然当我在Colab上运行代码时,我可以得到大约2秒的时间,这是一个很大的改进。你能告诉我为什么我不能在自己的系统上做同样的事情吗?我看到我有12个内核,而Colab提供了2个。当你比较两台不同机器上相同代码的运行时,CPU/GPU规范才是最重要的。CPU频率,缓存大小,RAM类型,任何东西。你可以检查代码是否相同。这个任务完全依赖于CPU,不是吗?因此,它们的表现应该类似。我仍然在寻找为什么我不能得到更好的结果,你认为我应该有什么先决条件让这个管道运行得更快吗?(比如spacy nightly)多亏了@Sergey,我可以构造一个检测被动语态的好功能。虽然速度的问题最终证明是由于更换内核的开销造成的,但在使用大组记录和数据集时,这一点无关紧要。如果还有人对此有疑问。