Правильный ответ - собрать большой набор данных, помеченный так, как вы хотите, а затем обучить его изучению машины.Если это занимает слишком много времени, самый простой способ - запустить POS-тегер и обработать его вывод с помощью регулярных выражений.Здесь самое сложное - найти самое длинное совпадение:
s = "They all like to go there on 5th November 2010, but I am not interested."
DATE = re.compile(r'^[1-9][0-9]?(th|st|rd)? (January|...)( [12][0-9][0-9][0-9])?$')
def custom_tagger(sentence):
tagged = pos_tag(word_tokenize(sentence))
phrase = []
date_found = False
i = 0
while i < len(tagged):
(w,t) = tagged[i]
phrase.append(w)
in_date = DATE.match(' '.join(phrase))
date_found |= bool(in_date)
if date_found and not in_date: # end of date found
yield (' '.join(phrase[:-1]), 'DATE')
phrase = []
date_found = False
elif date_found and i == len(tagged)-1: # end of date found
yield (' '.join(phrase), 'DATE')
return
else:
i += 1
if not in_date:
yield (w,t)
phrase = []
Todo: разверните DATE
re, вставьте код для поиска CUSTOM
фраз, сделайте его более сложным, сопоставив POS-теги и токеныи решить, должна ли 5th
сама по себе считаться датой.(Вероятно, нет, поэтому отфильтруйте даты, длина которых содержит только порядковый номер.)