Как узнать, есть ли в предложении «Полное предложение» даты? - PullRequest
0 голосов
/ 25 июня 2019

Я видел некоторые посты, в которых рассказывается о том, может ли возможная строка быть датой или нет, но, похоже, ни одна из них не имеет отношения к тому, может ли предложение содержать потенциальные даты или нет.

Iиспользовали функцию синтаксического анализатора dateutil, которая, по-видимому, эффективна при распознавании дат в строках, только если дата является единственным компонентом строки.

from dateutil.parser import parse

def is_date(string, fuzzy=False):
    """
    Return whether the string can be interpreted as a date.

    :param string: str, string to check for date
    :param fuzzy: bool, ignore unknown tokens in string if True
    """
    try: 
        parse(string, fuzzy=fuzzy)
        return True

    except ValueError:
        return False

>>> is_date("1990-12-1")
True
>>> is_date("foo 1990-12-1 bar")
False

Ответы [ 3 ]

1 голос
/ 25 июня 2019

Вы можете использовать простой шаблон регулярных выражений

import re
def is_date(regex, str):
    return bool(re.match(regex, s))

regex = r'.*? \d{4}-\d\d?-\d\d? .*?'

>>> is_date(regex, "foo bar")
False
>>> is_date(regex, "1990-12-1")
True
>>> is_date(regex, "foo 1990-12-1 bar")
True

Это будет соответствовать любой дате в формате "#### - # [#] - # [#]", где # в квадратных скобках:необязательный.Вы можете изменить этот шаблон регулярных выражений в соответствии с вашими потребностями.

Подробнее о регулярных выражениях

1 голос
/ 25 июня 2019

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

def is_date(string, fuzzy=False):
    """
    Return whether the string can be interpreted as a date.

    :param string: str, string to check for date
    :param fuzzy: bool, ignore unknown tokens in string if True
    """
    def parse_date(date_string):
        try: 
            return parse(date_string, fuzzy=fuzzy)
        except ValueError:
            return False

    return any(parse_date(s) for s in string.split())

>>> is_date("1990-12-1")
True

>>> is_date("foo 1990-12-1 bar")
True

>>> is_date("foo 1990-13-1 bar")
False

>>> is_date('Book by appt. for Dec. 31, 2019')
True  # Both 'Dec.' and '2019' successfully parse to a date.

# But be wary of false positives.
>>> is_date('I had 2019 hits on my website today')
True  
0 голосов
/ 25 июня 2019

Одна из возможностей - проверить все возможные (непрерывные) подстроки исходной строки. Это решение имеет ужасную производительность (N ^ 2 обращений к OP is_date), но оно не полагается на эвристику для разделения токенов в определениях строк или регулярных выражений: по определению оно соответствует тогда, когда is_date будет соответствовать подстроке.

def get_all_substrings(input_string):
    # From https://stackoverflow.com/questions/22469997/how-to-get-all-the-contiguous-substrings-of-a-string-in-python
    # could be made a generator to save space, but we are not making a performant solution anyway
    length = len(input_string)
    return [input_string[i:j+1] for i in xrange(length) for j in xrange(i,length)]

def contains_date(string):
    for substring in get_all_substrings(string):
        if is_date(substring): return True
    return False
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...