Как я могу расширить просторный интервал моего совпадающего текстового вывода, чтобы включить все до следующего совпадения? - PullRequest
0 голосов
/ 25 марта 2019

У меня есть код, который выглядит следующим образом:

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] или что-то в этом роде, но это жесткое программирование того, как далеко вперед идти, и я не буду знать, как далеко я должен расширить индекс.

Спасибо

Ответы [ 2 ]

0 голосов
/ 27 марта 2019

Я обнаружил, что spacy matcher упорядочивает индексы совпадающих терминов, даже если он находит термин, указанный в списке терминов, раньше, чем другой термин.Таким образом, я могу просто закончить интервал до следующего соответствующего индекса.Код, чтобы показать, что я имею в виду:

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)
0 голосов
/ 26 марта 2019

У меня есть идея, которая не использует 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']
...