Мне нужно автоматизировать извлечение логического утверждения (SWRL) из предложений на английском языке - PullRequest
0 голосов
/ 18 октября 2018

(извините за мой английский, я тоже новичок в этом, так что будьте нежны, спасибо)

Я пытаюсь извлечь логическое утверждение (SWRL) из любого возможного предложения, содержащего действияи условия

Это логическое утверждение, которое я хотел бы получить:

IF (СОСТОЯНИЕ) THEN (ДЕЙСТВИЕ | НЕ ДЕЙСТВИЕ | ДЕЙСТВИЕ ИЛИ ДЕЙСТВИЕ)

Я пытался применить некоторые техники НЛП с Spacy и Стэнфордской библиотекой НЛП , но мое отсутствие знаний о грамматических структурах английского языкаделает это почти невозможным для меня.

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

Например:

import nltk
import spacy
nlp = spacy.load('en_core_web_sm')

sent="The speed limit is 90 kilometres per hour on roads outside built-up areas."
doc=nlp(sent)

Получение рута:

def sent_root(sent):
    for index,token in enumerate(sent):
        if token.head == token:
            return token, index

Выход: (есть, 3)

Получение предмета:

def sent_subj(sent):
    for index,token in enumerate(sent):
        if token.dep_ == 'nsubj':
            return token, index

Out: (предел, 2)

Получение детей (зависимостислова):

def sent_child(token):
    complete_subj = ''
    for child in token.children:
        if(child.is_punct == False):
            if(child.dep_ == 'compound'):
                complete_subj += child.text + ' ' + token.text+' '
            else:
                complete_subj += child.text + ' '
            for child_token in child.children:
                if(child.is_punct == False):
                    complete_subj += child_token.text+' '

    return complete_subj

Out: «Ограничение скорости»

Документация + root:

def doc_ents_root(sent, root):
    ents_root = root.text+' '
    for token in sent.ents:
        ents_root += token.text + ' '

    return ents_root

Выход: «90 километров в час»

Извлечение действия:

def action(sent):
    #Obtaining the sent root
    root, root_idx = sent_root(sent)

    #Obtaining the subject
    subj, subj_idx = sent_subj(sent)

    #Obtaining the whole subject (subj + comps)
    complete_subj = sent_child(subj)

    complete_ents = doc_ents_root(sent, root)

    return complete_subj + complete_ents

Применениевсе функции

action(doc)

Out: «Светофор с сигналом указывает»

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...