Я намереваюсь определить структуру предложения на английском языке, используя простор и текст.
Например: Кот сел на циновку - SVO, Кот прыгнул и поднял бисквит - SVV0. Кот съел бисквит и печенье. - 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 cc Cong 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