Spacy dependencymatcher 模式不返回匹配项
Spacy dependencymatcher pattern not returning matches
我正在尝试使用 spacy DependencyMatcher 创建、添加模式并从中获取结果。
我为句子创建了一个模式:“从星期一到星期五”
完整模式:
pattern = [
{
"RIGHT_ID": "node0",
"RIGHT_ATTRS": {'DEP': 'ROOT', 'POS': 'ADP', 'TAG': 'IN'}
},
{
"LEFT_ID": "node0",
"REL_OP": ">",
"RIGHT_ID": "node1",
"RIGHT_ATTRS": {'DEP': 'pobj', 'POS': 'PROPN', 'TAG': 'NNP'},
},
{
"LEFT_ID": "node1",
"REL_OP": "$--",
"RIGHT_ID": "node2",
"RIGHT_ATTRS": {'DEP': 'prep', 'POS': 'ADP', 'TAG': 'IN'},
},
{
"LEFT_ID": "node2",
"REL_OP": ">",
"RIGHT_ID": "node3",
"RIGHT_ATTRS":{'DEP': 'pobj', 'POS': 'PROPN', 'TAG': 'NNP'},
},
]
更简单的模式是:
pattern = [
{
"RIGHT_ID": "node0",
"RIGHT_ATTRS": {"POS": "ADP"}
},
{
"LEFT_ID": "node0",
"REL_OP": ">",
"RIGHT_ID": "node1",
"RIGHT_ATTRS": {"POS": "PROPN"},
},
{
"LEFT_ID": "node1",
"REL_OP": "$--",
"RIGHT_ID": "node2",
"RIGHT_ATTRS": {"POS": "ADP"},
},
{
"LEFT_ID": "node2",
"REL_OP": ">",
"RIGHT_ID": "node3",
"RIGHT_ATTRS":{'POS': 'PROPN'},
},
]
我的问题是,为什么这个模式没有给出任何匹配项,而不是完整模式或更简单的模式?
import spacy
from spacy.matcher import DependencyMatcher
nlp = spacy.load("en_core_web_sm")
matcher = DependencyMatcher(nlp.vocab)
text="From monday to friday"
doc = nlp(text)
matcher.add("pattern1", [pattern])
matches = matcher(doc)
# Each token_id corresponds to one pattern dict
match_id, token_ids = matches[0]
spacy 版本:
spaCy v3.0.6
命名 SPACY 版本
en_core_web_sm >=3.0.0,<3.1.0 3.0.0 ✔
你的 REL_OP
for node2
是倒退的。应该是 $++
.
为了给出完整的解释,这段代码对我有用。
import spacy
from spacy.matcher import DependencyMatcher
nlp = spacy.load("en_core_web_sm")
matcher = DependencyMatcher(nlp.vocab)
text="From Monday to Friday"
doc = nlp(text)
pattern = [
{
"RIGHT_ID": "node0",
"RIGHT_ATTRS": {'POS': 'ADP', 'TAG': 'IN'}
},
{
"LEFT_ID": "node0",
"REL_OP": ">",
"RIGHT_ID": "node1",
"RIGHT_ATTRS": {'POS': 'PROPN'},
},
{
"LEFT_ID": "node1",
"REL_OP": "$++",
"RIGHT_ID": "node2",
"RIGHT_ATTRS": {'POS': 'ADP'},
},
{
"LEFT_ID": "node2",
"REL_OP": ">",
"RIGHT_ID": "node3",
"RIGHT_ATTRS":{'POS': 'PROPN'},
},
]
matcher.add("pattern1", [pattern])
matches = matcher(doc)
print(matches)
print("-----")
# this part is just for reference
for word in doc:
print(word.pos_, word.tag_, word.dep_, word, sep="\t")
关于此的几点说明:
- 你的第二个模式更好,你应该不需要为英文指定tag和pos(tag决定pos)
- 在 v3 小型模型中,除非大写,否则“星期一”和“星期五”不是专有名词(看起来您的显示输出来自使用 v2 的 public 演示)
我正在尝试使用 spacy DependencyMatcher 创建、添加模式并从中获取结果。
我为句子创建了一个模式:“从星期一到星期五”
完整模式:
pattern = [
{
"RIGHT_ID": "node0",
"RIGHT_ATTRS": {'DEP': 'ROOT', 'POS': 'ADP', 'TAG': 'IN'}
},
{
"LEFT_ID": "node0",
"REL_OP": ">",
"RIGHT_ID": "node1",
"RIGHT_ATTRS": {'DEP': 'pobj', 'POS': 'PROPN', 'TAG': 'NNP'},
},
{
"LEFT_ID": "node1",
"REL_OP": "$--",
"RIGHT_ID": "node2",
"RIGHT_ATTRS": {'DEP': 'prep', 'POS': 'ADP', 'TAG': 'IN'},
},
{
"LEFT_ID": "node2",
"REL_OP": ">",
"RIGHT_ID": "node3",
"RIGHT_ATTRS":{'DEP': 'pobj', 'POS': 'PROPN', 'TAG': 'NNP'},
},
]
更简单的模式是:
pattern = [
{
"RIGHT_ID": "node0",
"RIGHT_ATTRS": {"POS": "ADP"}
},
{
"LEFT_ID": "node0",
"REL_OP": ">",
"RIGHT_ID": "node1",
"RIGHT_ATTRS": {"POS": "PROPN"},
},
{
"LEFT_ID": "node1",
"REL_OP": "$--",
"RIGHT_ID": "node2",
"RIGHT_ATTRS": {"POS": "ADP"},
},
{
"LEFT_ID": "node2",
"REL_OP": ">",
"RIGHT_ID": "node3",
"RIGHT_ATTRS":{'POS': 'PROPN'},
},
]
我的问题是,为什么这个模式没有给出任何匹配项,而不是完整模式或更简单的模式?
import spacy
from spacy.matcher import DependencyMatcher
nlp = spacy.load("en_core_web_sm")
matcher = DependencyMatcher(nlp.vocab)
text="From monday to friday"
doc = nlp(text)
matcher.add("pattern1", [pattern])
matches = matcher(doc)
# Each token_id corresponds to one pattern dict
match_id, token_ids = matches[0]
spacy 版本:
spaCy v3.0.6
命名 SPACY 版本
en_core_web_sm >=3.0.0,<3.1.0 3.0.0 ✔
你的 REL_OP
for node2
是倒退的。应该是 $++
.
为了给出完整的解释,这段代码对我有用。
import spacy
from spacy.matcher import DependencyMatcher
nlp = spacy.load("en_core_web_sm")
matcher = DependencyMatcher(nlp.vocab)
text="From Monday to Friday"
doc = nlp(text)
pattern = [
{
"RIGHT_ID": "node0",
"RIGHT_ATTRS": {'POS': 'ADP', 'TAG': 'IN'}
},
{
"LEFT_ID": "node0",
"REL_OP": ">",
"RIGHT_ID": "node1",
"RIGHT_ATTRS": {'POS': 'PROPN'},
},
{
"LEFT_ID": "node1",
"REL_OP": "$++",
"RIGHT_ID": "node2",
"RIGHT_ATTRS": {'POS': 'ADP'},
},
{
"LEFT_ID": "node2",
"REL_OP": ">",
"RIGHT_ID": "node3",
"RIGHT_ATTRS":{'POS': 'PROPN'},
},
]
matcher.add("pattern1", [pattern])
matches = matcher(doc)
print(matches)
print("-----")
# this part is just for reference
for word in doc:
print(word.pos_, word.tag_, word.dep_, word, sep="\t")
关于此的几点说明:
- 你的第二个模式更好,你应该不需要为英文指定tag和pos(tag决定pos)
- 在 v3 小型模型中,除非大写,否则“星期一”和“星期五”不是专有名词(看起来您的显示输出来自使用 v2 的 public 演示)