No, of course not. This is what I got so far (you might want to read nltk book grammar parsing section, too):
I left only verb tags to simplify the task a little bit, then used nltk's RegexpParser.
def tense_detect(tagged_sentence):
verb_tags = ['MD','MDF',
'BE','BEG','BEN','BED','BEDZ','BEZ','BEM','BER',
'DO','DOD','DOZ',
'HV','HVG','HVN','HVD','HVZ',
'VB','VBG','VBN','VBD','VBZ',
'SH',
'TO',
'JJ' # maybe?
]
verb_phrase = []
for item in tagged_sentence:
if item[1] in verb_tags:
verb_phrase.append(item)
grammar = r'''
future perfect continuous passive: {<MDF><HV><BEN><BEG><VBN|VBD>+}
conditional perfect continuous passive:{<MD><HV><BEN><BEG><VBN|VBD>+}
future continuous passive: {<MDF><BE><BEG><VBN|VBD>+}
conditional continuous passive: {<MD><BE><BEG><VBN|VBD>+}
future perfect continuous: {<MDF><HV><BEN><VBG|HVG|BEG>+}
conditional perfect continuous: {<MD><HV><BEN><VBG|HVG|BEG>+}
past perfect continuous passive: {<HVD><BEN><BEG><VBN|VBD>+}
present perfect continuous passive: {<HV|HVZ><BEN><BEG><VBN|VBD>+}
future perfect passive: {<MDF><HV><BEN><VBN|VBD>+}
conditional perfect passive: {<MD><HV><BEN><VBN|VBD>+}
future continuous: {<MDF><BE><VBG|HVG|BEG>+ }
conditional continuous: {<MD><BE><VBG|HVG|BEG>+ }
future indefinite passive: {<MDF><BE><VBN|VBD>+ }
conditional indefinite passive: {<MD><BE><VBN|VBD>+ }
future perfect: {<MDF><HV><HVN|BEN|VBN|VBD>+ }
conditional perfect: {<MD><HV><HVN|BEN|VBN|VBD>+ }
past continuous passive: {<BED|BEDZ><BEG><VBN|VBD>+}
past perfect continuous: {<HVD><BEN><HVG|BEG|VBG>+}
past perfect passive: {<HVD><BEN><VBN|VBD>+}
present continuous passive: {<BEM|BER|BEZ><BEG><VBN|VBD>+}
present perfect continuous: {<HV|HVZ><BEN><VBG|BEG|HVG>+}
present perfect passive: {<HV|HVZ><BEN><VBN|VBD>+}
future indefinite: {<MDF><BE|DO|VB|HV>+ }
conditional indefinite: {<MD><BE|DO|VB|HV>+ }
past continuous: {<BED|BEDZ><VBG|HVG|BEG>+}
past perfect: {<HVD><BEN|VBN|HVD|HVN>+}
past indefinite passive: {<BED|BEDZ><VBN|VBD>+}
present indefinite passive: {<BEM|BER|BEZ><VBN|VBD>+}
present continuous: {<BEM|BER|BEZ><BEG|VBG|HVG>+}
present perfect: {<HV|HVZ><BEN|HVD|VBN|VBD>+ }
past indefinite: {<DOD><VB|HV|DO>|<BEDZ|BED|HVD|VBN|VBD>+}
infinitive: {<TO><BE|HV|VB>+}
present indefinite: {<DO|DOZ><DO|HV|VB>+|<DO|HV|VB|BEZ|DOZ|BER|HVZ|BEM|VBZ>+}
'''
cp = nltk.RegexpParser(grammar)
result = cp.parse(verb_phrase)
display(result)
tenses_set = set()
for node in result:
if type(node) is nltk.tree.Tree:
tenses_set.add(node.label())
return result, tenses_set
This works just OK. Even with odd complex sentences. The big problem are the causatives, like "I have my car washed every day". Removing everything but the verbs results in " have washed", which gives Present Perfect.
You gotta tweak it anyway.
I've just fixed the computer and don't have nltk installed yet to show the outcome. Will try to do it tomorrow.