如何扩展匹配文本输出的有效范围,以包括下一次匹配之前的所有内容?

时间:2019-03-25 18:55:45

标签: python nlp spacy natural-language-processing

我有如下代码:

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]之类的东西,但是很难编码要走多远,而且我不知道我应该将索引扩展多远。

谢谢

2 个答案:

答案 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)