Я намереваюсь определить структуру предложения на английском языке, используя простор и текст.
Например: Кот сел на циновку - СВО, Кот прыгнул и поднял бисквит - СВВ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)])
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
См. Редактирование 2.






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.
Это может помочь добавить ожидаемый результат в дополнение к фактическому результату.