【问题标题】:Java/Grails - PrettyTime NLP Possible to split non date part?Java/Grails - PrettyTime NLP 可以拆分非日期部分吗?
【发布时间】:2016-03-17 15:03:13
【问题描述】:

我正在使用 PrettyTime NLP 从列表中查找日期。

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 的示例都将不胜感激。

【问题讨论】:

  • 没有分隔符、固定宽度字段,或者使用正则表达式来处理所有预期的日期格式,您如何知道日期在字符串中的开始和结束位置?
  • @EmmanuelRosa,是的...我希望自从 PrettyTime NLP 已经识别自然语言日期以来,也许有办法获取该变量和其余部分。我试图破译密码,但我不是专家。昨天我正在努力解决这个想法,我想我将使用 PTNLP 来识别日期,然后使用 RegEx 来提取日期和行的其余部分。谢谢伊曼纽尔。

标签: java regex grails nlp prettytime


【解决方案1】:

PrettyTimeParser.parseSyntax() 提供的DateGroup 包含回答您的问题所需的一些信息。其余信息可以根据原文确定。

@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()
    ]
}

注意:不要在 Grails 中使用 @Grabs,您应该已经设置了依赖项。

工作原理

上面的示例使用整个原始文本以及 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
    ]
]

【讨论】:

  • 非常感谢,伙计。这正是我想要的。在你回答后我搜索了DateGroup,我确实读过它,但没有任何线索。现在它是有道理的,还有其他有趣的方法。再次感谢。
  • 你好~我试图理解你的代码并且有几个问题。为什么你使用parseSyntax.head() 而不仅仅是parse()?我理解其余的代码,但那两个。 List&lt;Date&gt;List&lt;DateGroup&gt; 之间还有什么区别?我似乎找不到明确的答案。谢谢。
  • 我选择了parseSyntax() 而不是parse(),因为parse() 返回一个java.util.Date,它显然不包含任何关于被解析以产生Date 的文本的信息。另一方面,parseSyntax() 返回 Pretty Time DateGroups 的列表。 head() 返回集合中的第一项,用于抓取第一个 DateGroup。所以我的例子期望每行只有一个日期。
  • 非常感谢!!我非常感谢您的时间和才华。
猜你喜欢
  • 1970-01-01
  • 2010-11-08
  • 2021-12-24
  • 2021-04-14
  • 1970-01-01
  • 1970-01-01
  • 2014-06-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多