基于规则的实体匹配器
Rule-based matcher of entities with spacy
我想使用 python 库 spacy 来匹配文本中的标记(添加标签作为语义参考)。然后,我想使用匹配来提取标记之间的关系。我的第一个是利用 spacy 的 matcher.add
和 matcher.add_pattern
。 matcher.add
工作正常,我可以找到令牌,我的代码到现在:
import spacy
nlp = spacy.load('en')
def merge_phrases(matcher, doc, i, matches):
if i != len(matches)-1:
return None
spans = [(ent_id, label, doc[start : end]) for ent_id, label, start, end in matches]
for ent_id, label, span in spans:
span.merge('NNP' if label else span.root.tag_, span.text, nlp.vocab.strings[label])
matcher = spacy.matcher.Matcher(nlp.vocab)
matcher.add(entity_key='1', label='FINANCE', attrs={}, specs=[[{spacy.attrs.ORTH: 'financial'}, {spacy.attrs.ORTH: 'instrument'}]], on_match=merge_phrases)
matcher.add(entity_key='2', label='BUYER', attrs={}, specs=[[{spacy.attrs.ORTH: 'acquirer'}]], on_match=merge_phrases)
matcher.add(entity_key='3', label='CODE', attrs={}, specs=[[{spacy.attrs.ORTH: 'Code'}]], on_match=merge_phrases)
这很好用并且输出了很好的结果:
doc = nlp(u'Code used to identify the acquirer of the financial instrument.')
# Output
['Code|CODE', 'used|', 'to|', 'identify|', 'the|', 'acquirer|BUYER', 'of|', 'the|', 'financial instrument|FINANCE', '.|']
我的问题是,如何使用 matcher.add_patern
来匹配标记之间的关系,例如
matcher.add_pattern("IS_OF", [{BUYER}, {'of'}, {FINANCE}])
对于输出:
doc = nlp(u'Code used to identify the acquirer of the financial instrument.')
# Output
[acquirer of financial instrument]
我尝试过不同的方法来实现它,但显然不行,我想我对 matcher.add_pattern
的理解有问题。
- 可以请一些人告诉我正确的方向如何做到这一点
宽敞?
- 是否可以在此处添加正则表达式来查找模式,如何?
- 如何添加多个具有相同标签的令牌,或以某种方式创建
同一标签的标记列表,例如。 "FINANCE"?
如有任何意见,我将不胜感激。
您的匹配器会识别标记,但要找到它们之间的关系,您必须进行依赖性解析。
这是 visual example from spacy :
然后您可以遍历树以查找标记之间的关系。
https://spacy.io/docs/usage/dependency-parse#navigating
每个标记的 dep(枚举)和 dep_(详细名称)属性将为您提供与其子标记的关系
我想使用 python 库 spacy 来匹配文本中的标记(添加标签作为语义参考)。然后,我想使用匹配来提取标记之间的关系。我的第一个是利用 spacy 的 matcher.add
和 matcher.add_pattern
。 matcher.add
工作正常,我可以找到令牌,我的代码到现在:
import spacy
nlp = spacy.load('en')
def merge_phrases(matcher, doc, i, matches):
if i != len(matches)-1:
return None
spans = [(ent_id, label, doc[start : end]) for ent_id, label, start, end in matches]
for ent_id, label, span in spans:
span.merge('NNP' if label else span.root.tag_, span.text, nlp.vocab.strings[label])
matcher = spacy.matcher.Matcher(nlp.vocab)
matcher.add(entity_key='1', label='FINANCE', attrs={}, specs=[[{spacy.attrs.ORTH: 'financial'}, {spacy.attrs.ORTH: 'instrument'}]], on_match=merge_phrases)
matcher.add(entity_key='2', label='BUYER', attrs={}, specs=[[{spacy.attrs.ORTH: 'acquirer'}]], on_match=merge_phrases)
matcher.add(entity_key='3', label='CODE', attrs={}, specs=[[{spacy.attrs.ORTH: 'Code'}]], on_match=merge_phrases)
这很好用并且输出了很好的结果:
doc = nlp(u'Code used to identify the acquirer of the financial instrument.')
# Output
['Code|CODE', 'used|', 'to|', 'identify|', 'the|', 'acquirer|BUYER', 'of|', 'the|', 'financial instrument|FINANCE', '.|']
我的问题是,如何使用 matcher.add_patern
来匹配标记之间的关系,例如
matcher.add_pattern("IS_OF", [{BUYER}, {'of'}, {FINANCE}])
对于输出:
doc = nlp(u'Code used to identify the acquirer of the financial instrument.')
# Output
[acquirer of financial instrument]
我尝试过不同的方法来实现它,但显然不行,我想我对 matcher.add_pattern
的理解有问题。
- 可以请一些人告诉我正确的方向如何做到这一点 宽敞?
- 是否可以在此处添加正则表达式来查找模式,如何?
- 如何添加多个具有相同标签的令牌,或以某种方式创建 同一标签的标记列表,例如。 "FINANCE"?
如有任何意见,我将不胜感激。
您的匹配器会识别标记,但要找到它们之间的关系,您必须进行依赖性解析。 这是 visual example from spacy :
然后您可以遍历树以查找标记之间的关系。 https://spacy.io/docs/usage/dependency-parse#navigating
每个标记的 dep(枚举)和 dep_(详细名称)属性将为您提供与其子标记的关系