我有如下代码:
data = u"Species:cat color:orange and white with yellow spots number feet: 4"
from spacy.matcher import PhraseMatcher
import en_core_web_sm
nlp = en_core_web_sm.load()
data=data.lower()
matcher = PhraseMatcher(nlp.vocab)
terminology_list = [u"species",u"color", u"number feet"]
patterns = list(nlp.tokenizer.pipe(terminology_list))
matcher.add("TerminologyList", None, *patterns)
doc = nlp(data)
for idd, (match_id, start, end) in enumerate(matcher(doc)):
span = doc[start:end]
print(span.text)
我希望能够抢到下一场比赛之前的一切。这样匹配看起来像这样:
species:cat
颜色:橙色和白色,带有黄色斑点
数字尺:4
我正在尝试扩大跨度,但我不知道怎么说再下一场比赛就停下来。我知道我可以像span = doc [start:end + 4]之类的东西,但是很难编码要走多远,而且我不知道我应该将索引扩展多远。
谢谢
答案 0 :(得分:0)
我有一个不使用spaCy的想法。
首先,我将字符串分成令牌
split = "Species:cat color:orange and white with yellow spots number feet: 4".replace(": ", ":").split()
然后我遍历令牌列表,保存密钥,然后只要有新密钥,就将值合并到密钥中
goal = []
key_value = None
for token in split:
print(token)
if ":" in token:
if key_value:
goal.append(kv)
key_value = token
else:
key_value = token
else:
key_value += " " + token
goal.append(key_value)
goal
>>>
['Species:cat', 'color:orange and white with yellow spots number', 'feet:4']
答案 1 :(得分:0)
我发现,即使Spacy匹配器找到了早于另一个术语的术语列表中列出的术语,它也会对匹配术语的索引进行排序。因此,我可以在下一个匹配的索引之前将跨度恰好结束。 代码来显示我的意思:
data = u"Species:cat color:orange and white with yellow spots number feet: 4"
from spacy.matcher import PhraseMatcher
import en_core_web_sm
nlp = en_core_web_sm.load()
data=data.lower()
matcher = PhraseMatcher(nlp.vocab)
terminology_list = [u"species",u"color", u"number feet"]
patterns = list(nlp.tokenizer.pipe(terminology_list))
matcher.add("Terms", None, *patterns)
doc = nlp(data)
matches=matcher(doc)
matched_phrases={}
for idd, (match_id, start, end) in enumerate(matches):
key_match = doc[start:end]
if idd != len(matches)-1:
end_index=matches[idd+1][1]
else:
end_index=len(doc)
phrase = doc[end:end_index]
if phrase.text != '':
matched_phrases[key_match] = phrase
print(matched_phrases)