Java/Grails - PrettyTime NLP Возможно разделить не дату?

Я использую PrettyTimeNLP, чтобы найти даты из списка.

Example

ABC High School March 5, 2016
XYZ High School 08/20/2016 Gym

Когда я анализирую с помощью PrettyTimeNLP, он дает мне список дат в этом формате.

Sat Aug 20 10:05:27 EDT 2016

У меня вопрос, можно ли разобрать строку, а затем разбить ее до или после даты, чтобы я мог иметь

string1 = 'XYZ High School'
stirng2 = '08/20/2016'
string3 = 'Gym' 

Я знаю, что могу использовать RegEx для выполнения этой работы, но пример здесь простой. Мой документ будет иметь длину 1-10 страниц и будет содержать различные форматы дат.

Будут оценены любые примеры того, как манипулировать PrettyTime.

1 ответ

Решение

DateGroup предоставлено PrettyTimeParser.parseSyntax() содержит некоторую информацию, необходимую для ответа на ваш вопрос. Остальная информация может быть определена из исходного текста.

@GrabResolver(name='sonatype-snapshots', root='https://oss.sonatype.org/content/repositories/snapshots/')
@Grab('org.ocpsoft.prettytime:prettytime-nlp:4.0.1.Final')

import org.ocpsoft.prettytime.nlp.PrettyTimeParser

def list = [
    'ABC High School March 5, 2016',
    'XYZ High School 08/20/2016 Gym'
]

def parser = new PrettyTimeParser()

list.collect {
    [rawText: it, dateGroup: parser.parseSyntax(it).head()]
}.collect {
    def before = 0..<it.dateGroup.position
    def after = it.dateGroup.position + it.dateGroup.text.size()..<it.rawText.size()

    [
        before: it.rawText[before].trim(),
        date: it.dateGroup.dates.head(),
        dateString: it.dateGroup.text,
        after: it.rawText[after].trim()
    ]
}

ПРИМЕЧАНИЕ: не используйте @Grabs в Grails, у вас уже должны быть настроены зависимости.

Как это устроено

В приведенном выше примере используется весь исходный текст, а также позиция, в которой Pretty Time нашла дату, и текст, который был проанализирован в дату, для создания двух диапазонов: один для текста до даты, а другой для текста после Дата. Эти два диапазона затем используются для всего исходного текста, чтобы извлечь три компонента. Хорошо... четыре, я добавил Date, Вывод выглядит так:

[
    [
        before:ABC High School, 
        date:Sat Mar 05 11:45:56 EST 2016, 
        dateString:March 5, 2016, 
        after:
    ], 
    [
       before:XYZ High School, 
       date:Sat Aug 20 11:45:56 EDT 2016, 
       dateString:08/20/2016, 
       after:Gym
    ]
]
Другие вопросы по тегам