Как разобрать глаголы, используя 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
            ...

Обратите внимание, что это будет работать только с одним экземпляром глагола на каждое входное предложение, но оно должно дать вам представление о том, как поступить.

Другие вопросы по тегам