解析基于SpaCy规则的匹配器的结果?

时间:2018-06-20 11:08:07

标签: python nlp matcher spacy

我已经创建了一个匹配器,但是我很难进一步解析匹配器的结果。

我的匹配器如下所示:

matcher.add('ZeroToMany', None, [{'DEP':'nsubj', 'OP' : '+'}, {'LEMMA': 'can'}, {},{'DEP':'dobj', 'OP' : '+'}]

matches = matcher(doc) for match_id, start, end in matches: span = doc[start:end] print(span.text)

哪个会产生这样的输出:

客户可以下订单

现在,我想通过对某些依赖项进行分类来继续解析结果(例如,为每个结果生成标记为nsubj的标记列表,等等(基于原始句子中的依赖项)。

我已经写了一些代码来对文档中的句子执行此操作:

objects = ["nsubj", "nsubjpass"] #dependency parameters for objects
dependents1 = ["dobj"] #dependency parameters for first-order dependents
dependents2 = ["nmod", "iobj", "pobj"] #dependency parameters for second-order dependents

#identify possible objects and dependents for each sentence based on dependency parameters, for each sentence add row to dataframe  

a = []
for sent in doc.sents:
        obj_toks =  [tok for tok in sent if (tok.dep_ in objects) ]
        dep1_toks = [tok for tok in sent if (tok.dep_ in dependents1) ]
        dep2_toks = [tok for tok in sent if (tok.dep_ in dependents2) ]
        relation1 = [tok.head for tok in obj_toks]
        relation2 = [tok.head for tok in dep2_toks]
        a.append([obj_toks, relation1, dep1_toks, relation2, dep2_toks])


#create dataframe    

df = pd.DataFrame(a, columns=['obj', 'rel1', 'dep1', 'rel2', 'dep2'])

#'unstack' 'objects' column 

lst_col = 'obj'

df = pd.DataFrame({col:np.repeat(df[col].values, df[lst_col].str.len()) for col in df.columns.difference([lst_col])}).assign(**{lst_col:np.concatenate(df[lst_col].values)})[df.columns.tolist()]

print(df)

现在,我想回收此代码以进一步对匹配器输出的结果进行解析/分类。问题在于匹配器的输出是一个span元素,显然与句子不同。关于如何进行操作以使Matcher的输出与上面的代码兼容的任何想法吗?将结果转换回整个句子(例如通过使用span.sent)不是一种选择,因为我只对匹配器检索到的特定片段感兴趣。

关于如何进行此操作的任何想法?

0 个答案:

没有答案