Как разобрать глаголы, используя Spacy
Я пытаюсь разобрать глаголы в корпусе, перечислить их в словарях и посчитать, сколько раз каждый глагол появляется как переходный, непереходный и дитранзитивный. Мне было интересно, как я мог бы использовать spacy, чтобы разобрать глаголы и записать их как переходные, непереходные и дитранзитивные.
2 ответа
Здесь я суммирую код из Mirith/Verb-categorizer
, По сути, вы можете перебрать VERB
отметьте и посмотрите на своих детей, чтобы классифицировать их как транзитивных, непереходных или дитранзитивных. Пример таков.
Во-первых, импорт spacy
,
import spacy
nlp = spacy.load('en')
Предположим, у вас есть пример токенов,
tokens = nlp('I like this dog. It is pretty good. I saw a bird. We arrived at the classroom door with only seven seconds to spare.')
Вы можете создать следующую функцию для преобразования VERB
в новый тип, как вы хотите:
def check_verb(token):
"""Check verb type given spacy token"""
if token.pos_ == 'VERB':
indirect_object = False
direct_object = False
for item in token.children:
if(item.dep_ == "iobj" or item.dep_ == "pobj"):
indirect_object = True
if (item.dep_ == "dobj" or item.dep_ == "dative"):
direct_object = True
if indirect_object and direct_object:
return 'DITRANVERB'
elif direct_object and not indirect_object:
return 'TRANVERB'
elif not direct_object and not indirect_object:
return 'INTRANVERB'
else:
return 'VERB'
else:
return token.pos_
пример
[check_verb(t) for t in tokens] # ['PRON', 'TRAN', 'DET', 'NOUN', 'PUNCT', ...]
Нечто подобное должно сработать.
intransitive_dict = {}
...
def parse_verb(d):
# find sentence root
root = list(filter(lambda x: x.head==x, [t for t in d]))[0]
# if it's a verb, find its children that are objects
if root.pos_ == 'VERB':
children = list(filter(lambda x: (x.root.dep_ == 'dobj' | x.root.dep_ == 'pobj') and x.root.head == root, d.noun_chunks))
if not children:
# intransitive case
if root.lemma_ in intransitive_dict.keys():
intransitive_dict[root.lemma_] = intransitive_dict[root.lemma_] + 1
else:
intransitive_dict[root.lemma_] = 1
elif len(children) == 1:
# transitive case
...
elif len(children) == 2:
# bitransitive case
...
Обратите внимание, что это будет работать только с одним экземпляром глагола на каждое входное предложение, но оно должно дать вам представление о том, как поступить.