0

我的代码如下所示:

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)

我希望能够抓住一切,直到下一场比赛。所以比赛看起来像这样:

种类:猫

颜色:橙色和白色带黄色斑点

英尺数:4

我试图延长跨度,但我不知道如何在下一场比赛前停止。我知道我可以让它像 span = doc[start:end+4] 或其他东西,但这是硬编码要走多远,我不知道应该扩展索引多远。

谢谢

4

2 回答 2

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)
于 2019-03-26T21:35:45.833 回答
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']
于 2019-03-25T22:43:54.530 回答