Определение структуры предложения - spacy

Я намереваюсь определить структуру предложения на английском языке, используя простор и текст.

Например: Кот сел на циновку - СВО, Кот прыгнул и поднял бисквит - СВВ0. Кот съел бисквит и печенье. - SVOO.

Программа должна читать абзац и возвращать вывод для каждого предложения в виде SVO, SVOO, SVVO или других настраиваемых структур.

На данный момент усилия:

# -*- coding: utf-8 -*-
#!/usr/bin/env python
from __future__ import unicode_literals
# Load Library files
import en_core_web_sm
import spacy
import textacy
nlp = en_core_web_sm.load()
SUBJ = ["nsubj","nsubjpass"] 
VERB = ["ROOT"] 
OBJ = ["dobj", "pobj", "dobj"] 
text = nlp(u'The cat sat on the mat. The cat jumped and picked up the biscuit. The cat ate biscuit and cookies.')
sub_toks = [tok for tok in text if (tok.dep_ in SUBJ) ]
obj_toks = [tok for tok in text if (tok.dep_ in OBJ) ]
vrb_toks = [tok for tok in text if (tok.dep_ in VERB) ]
text_ext = list(textacy.extract.subject_verb_object_triples(text))
print("Subjects:", sub_toks)
print("VERB :", vrb_toks)
print("OBJECT(s):", obj_toks)
print ("SVO:", text_ext)

Выход:

(u'Subjects:', [cat, cat, cat])
(u'VERB :', [sat, jumped, ate])
(u'OBJECT(s):', [mat, biscuit, biscuit])
(u'SVO:', [(cat, ate, biscuit), (cat, ate, cookies)])
  • Проблема 1: SVO перезаписаны. Почему?
  • Вопрос 2: Как определить предложение как SVOO SVO SVVO и т. д.?

Изменить 1:

Какой-то подход, который я концептуализировал.

from __future__ import unicode_literals
import spacy,en_core_web_sm
import textacy
nlp = en_core_web_sm.load()
sentence = 'I will go to the mall.'
doc = nlp(sentence)
chk_set = set(['PRP','MD','NN'])
result = chk_set.issubset(t.tag_ for t in doc)
if result == False:
    print "SVO not identified"
elif result == True: # shouldn't do this
    print "SVO"
else:
    print "Others..."

Изменить 2:

Сделал дальнейшие набеги

from __future__ import unicode_literals
import spacy,en_core_web_sm
import textacy
nlp = en_core_web_sm.load()
sentence = 'The cat sat on the mat. The cat jumped and picked up the biscuit. The cat ate biscuit and cookies.'
doc = nlp(sentence)
print(" ".join([token.dep_ for token in doc]))

Токовый выход:

det nsubj ROOT Prep det pobj punct det nsubj ROOT ccconconnect prt det dobj punct det nsubj ROOT dobj cc конъюнкт.

Ожидаемый результат:

SVO SVVO SVOO

Идея состоит в том, чтобы разбить теги зависимостей на простые субъект-глагол и объектную модель.

Думаю о достижении этого с помощью регулярного выражения, если нет других вариантов. Но это мой последний вариант.

Изменить 3:

Изучив эта ссылка, получил некоторые улучшения.

def testSVOs():
    nlp = en_core_web_sm.load()
    tok = nlp("The cat sat on the mat. The cat jumped for the biscuit. The cat ate biscuit and cookies.")
    svos = findSVOs(tok)
    print(svos)

Токовый выход:

[(u'cat', u'sat', u'mat'), (u'cat', u'jumped', u'biscuit'), (u'cat', u'ate', u'biscuit'), (u'cat', u'ate', u'cookies')]

Ожидаемый результат:

Я ожидаю обозначения предложений. Хотя я могу извлечь SVO о том, как преобразовать его в нотацию SVO. Это скорее идентификация паттернов, чем само содержание предложения.

SVO SVO SVOO

Это может помочь добавить ожидаемый результат в дополнение к фактическому результату.

CAB 27.03.2018 20:40

См. Редактирование 2.

Programmer_nltk 28.03.2018 01:43
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
8
2
4 996
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Issue 1: The SVO are overwritten. Why?

Это проблема textacy. Эта часть работает не очень хорошо, см. Этот блог

Issue 2: How to identify the sentence as SVOO SVO SVVO etc.?

Вам следует проанализировать дерево зависимостей. SpaCy предоставляет информацию, вам просто нужно написать набор правил для ее извлечения, используя атрибуты .head, .left, .right и .children.

>>for word in text: 
    print('%10s %5s %10s %10s %s'%(word.text, word.tag_, word.dep_, word.pos_, word.head.text_))

        The    DT        det        DET cat 
        cat    NN      nsubj       NOUN sat 
        sat   VBD       ROOT       VERB sat 
         on    IN       prep        ADP sat 
        the    DT        det        DET mat
        mat    NN       pobj       NOUN on 
          .     .      punct      PUNCT sat 
         of    IN       ROOT        ADP of 
        the    DT        det        DET lab
        art    NN   compound       NOUN lab
        lab    NN       pobj       NOUN of 
          .     .      punct      PUNCT of 
        The    DT        det        DET cat 
        cat    NN      nsubj       NOUN jumped 
     jumped   VBD       ROOT       VERB jumped 
        and    CC         cc      CCONJ jumped 
     picked   VBD       conj       VERB jumped 
         up    RP        prt       PART picked 
        the    DT        det        DET biscuit
    biscuit    NN       dobj       NOUN picked 
          .     .      punct      PUNCT jumped 
        The    DT        det        DET cat 
        cat    NN      nsubj       NOUN ate 
        ate   VBD       ROOT       VERB ate 
    biscuit    NN       dobj       NOUN ate 
        and    CC         cc      CCONJ biscuit 
    cookies   NNS       conj       NOUN biscuit 
          .     .      punct      PUNCT ate 

Я рекомендую вам взглянуть на этот код, просто добавьте pobj в список OBJECTS, и вы получите свои SVO и SVOO. Немного повозившись, вы также можете получить SVVO.

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