2010-04-06 112 views
12

我正在寻找一个Java库来帮助解析用户输入的代表日历应用程序的“约会”的文本。例如:约会的自然语言解析?

午餐与麦克11:30周二

17:00欢乐时光周五

,我发现了一些好的苗头像https://github.com/samtingleff/jchronichttp://www.datejs.com/这可以解析日期 - 但我也需要能够提取事件的标题,如“与迈克午餐”。

如果这样的API不存在,我也有兴趣从编码的角度来看如何最好地处理这个问题。

+0

可能重复(HTTP分布:/ /stackoverflow.com/questions/1410408/natural-language-date-and-time-parser-for-java) – nawfal 2014-01-30 08:18:14

回答

0

我不能想到任何事情会在我的头顶,这将符合您的规格。您可以尝试Stanford NLP Java包或OpenNLP。然而,这可能是你想要做的事情的大锤解决方案。

或者,您可以尝试自己解析它。如果要处理更多输入,请使用JFlex扫描输入并标记化,并使用CUP创建语法。

9

扩展JChronic可能是你最好的选择。我认为,鉴于对this question的回应,为此存在一个预先构建的库是不太可能的(尽管看起来这样的事情可能有用......我猜测解析自然语言日期的主要用例是如果他们有能力从用户提供的字符串中提取更多数据,那么它们会更有用)。执行方面,可能是最直接的做法是扩展JChronic,因为它支持你的用例的相当大的一部分,但是更多的不应该被框架忽略。 幸运的是,如果你看看the main class,扩展/修改/包装parse()方法以支持事件标题的自定义扫描程序应该不会太困难。 (我个人偏好这些将会包装框架而不是分叉并修改它,因为这样可以更容易地从底层代码的任何改进中受益)。

最终,可能证明最简单的做法是生成一个正则表达式解析器,它忽略了JChronic试图捕获的大部分内容(这意味着要深入熟悉JChronic源代码)。

与任何NLP类型的项目一样,成功实现这一点的关键在于尽可能多地获取例子,最好是作为自动化单元测试(最终,即使测试用例测试多次复制相同的功能,最好有更多的例子而不是更少的例子)。幸运的是,由于我们谈论的是自然语言,因此这些测试用例应该特别容易获得,因为即使是非程序员的朋友,家人等也应该能够为您提供“事件描述”(或者您想要调用的任何内容他们)。您还需要特别关注日期解析位可能会干扰位置/标题解析位的边缘情况(例如,在“晚上8点的时候”,“at”显然是时间的一部分,而在“派对在菲比的星期六“显然不是)。

我意识到我对JChronic有很多了解,但是我觉得这是你的问题的一个自然选择,因为它已经涵盖了很多解析自然语言“约会”的“难题”,即模糊性我们使用的关于时间的语言,并且已经以您要定位的语言实施。

2

尝试提取约会名称有两种相对直接的方式。

使用序列标签封装

如果你有标记的数据集,你可以训练序列模型,使用包像CRF++Yamcha,拉出像“午餐与麦克”预约标题。

使用命名实体和规则

如果没有标记的数据集,你很可能得到一些milage出使用named entity recognizer标记所有的人,地点和组织在约会文本。作为奖励,这也会给你时间&日期,所以你不需要编写自己的代码来把它们拉出来。对于所有标记的命名实体而言,编写一些规则以提取或构建每个约会的标题应该是相当直接的。

如果你正在寻找一个基于Java NER恶搞,你可以使用一个由Stanford释放,或者一个与OpenNLP

[自然语言的日期和时间解析器的java]的