Путь зависимости - это способ описания построения предложений в предложении. У SpaCy есть действительно хороший пример в своих документах, здесь, с предложением Apple is looking at buying U.K. startup for $1 billion.
Прошу прощения за отсутствие здесь хорошей визуализации, но давайте проработаем ваш пример:
A misty ridge uprises from the surge.
В spaCy мы следуем их примеру, чтобы получить зависимости:
import spacy
nlp = spacy.load('en_core_web_lg')
doc = nlp("A misty ridge uprises from the surge.")
for chunk in doc.noun_chunks:
print(chunk.text, chunk.root.text, chunk.root.dep_, chunk.root.head.text)
Так вы получите «пункты», из которых состоит ваше предложение. Ваш результат будет выглядеть так:
Text | root.text| root.dep_ | root.head.text
A misty ridge uprises uprises ROOT uprises
the surge surge pobj from
chunk.text
- это текст, который составляет ваше предложение о зависимости (обратите внимание, что может быть перекрытие в зависимости от структуры предложения). root.text
дает корень (или голову) дерева зависимостей. head
дерева является объектом spaCy token
и имеет дочерние элементы, по которым вы можете выполнять итерацию, чтобы проверить, находится ли другой токен в дереве зависимостей.
def find_dependencies(doc, word_to_check=None, dep_choice=None):
"""
word_to_check is the word you'd like to see on the dependency tree
example, word_to_check="misty"
dep_choice is the text of the item you'd like the dependency check
to be against. Example, dep_choice='ridge'
"""
tokens, texts = [], []
for tok in doc:
tokens.append(tok)
texts.append(tok.text)
# grabs the index/indices of the token that you are interested in
indices = [i for i,text in enumerate(texts) if text==dep_choice]
words_in_path = []
for i in indices:
reference = tokens[i]
child_elements = [t.text for t in reference.get_children()]
if word_to_check in child_elements:
words_in_path.append((word_to_check, reference))
return words_in_path
Код не самый красивый, но таким образом вы можете получить список кортежей, содержащих слово, которое вы хотите проверить, по сравнению с соответствующим родительским токеном. Надеюсь, это поможет
РЕДАКТИРОВАТЬ:
В интересах немного большей адаптации к вашему варианту использования (и значительного упрощения того, как выглядит мой исходный ответ):
# This will give you 'word':<spaCy doc object> key value lookup capability
tokens_lookup = {tok.text:tok for tok in doc}
if "misty" in tokens_lookup.get("ridge").children:
# Extra logic here
person
C.Nivs
schedule
10.07.2018