Как найти даты в предложении, используя NLP, RegEx в Python - PullRequest
3 голосов
/ 28 сентября 2010

Может кто-нибудь предложить мне какой-нибудь способ поиска и анализа дат (в любом формате: «Aug06», «Aug2006», «2 августа 2008», «19 августа 2006», «08-06», «01-08- 06 ") в питоне.

Я сталкивался с этим вопросом, но это в perl ... Извлечение некорректно отформатированной даты из строки (разбор даты, НЛП)

Любое предложение будет полезным.

Ответы [ 2 ]

4 голосов
/ 28 сентября 2010

Это находит все даты в вашем примере предложения:

for match in re.finditer(
    r"""(?ix)             # case-insensitive, verbose regex
    \b                    # match a word boundary
    (?:                   # match the following three times:
     (?:                  # either
      \d+                 # a number,
      (?:\.|st|nd|rd|th)* # followed by a dot, st, nd, rd, or th (optional)
      |                   # or a month name
      (?:(?:Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)[a-z]*)
     )
     [\s./-]*             # followed by a date separator or whitespace (optional)
    ){3}                  # do this three times
    \b                    # and end at a word boundary.""", 
    subject):
    # match start: match.start()
    # match end (exclusive): match.end()
    # matched text: match.group()

Это определенно не идеально и может пропустить некоторые даты (особенно, если они не на английском языке - 21. Mai 2006 потерпит неудачу, а также4ème décembre 1999), и соответствовать ерунде, как August Augst Aug, но поскольку в ваших примерах почти все не является обязательным, вы не можете многое сделать на уровне регулярных выражений.

Следующим шагом будет кормить всехсовпадения в синтаксический анализатор и посмотреть, может ли он проанализировать их в разумную дату.

Регулярное выражение не может правильно интерпретировать контекст.Представьте себе (глупый) текст, такой как You'll find it in box 21. August 3rd will be the shipping date. Он будет соответствовать 21. August 3rd, который, конечно, не может быть проанализирован.

2 голосов
/ 28 сентября 2010
from dateutil import parser


texts = ["Aug06", "Aug2006", "August 2 2008", "19th August 2006", "08-06", "01-08-06"]
for text in texts:
    print text, parser.parse(text)


Aug06            2010-08-06 00:00:00
Aug2006          2006-08-28 00:00:00
August 2 2008    2008-08-02 00:00:00
19th August 2006 2006-08-19 00:00:00
08-06            2010-08-06 00:00:00
01-08-06         2006-01-08 00:00:00

И если вы хотите найти эти даты в более длинном тексте, то попробуйте найти группы чисел и месяцев и попытаться передать их этому анализатору.Он выдаст исключение, если текст не похож на дату.

months = ['January', 'February',...]
months.extend([mon[:3] for mon in months])

# search for numeric dates:
/[\d \-]+/

# search for dates:
for word in sentence.split():
    if word in months:
        ...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...