繁体   English   中英

自然语言解析约会?

[英]Natural Language parsing of an appointment?

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

周二11:30与迈克共进午餐

要么

星期五下午5点欢乐时光

我找到了一些很有前途的线索,比如https://github.com/samtingleff/jchronichttp://www.datejs.com/ ,可以解析日期 - 但我还需要能够提取事件的标题,如“与迈克共进午餐”。

如果这样的API不存在,我也对从编码角度如何最好地解决问题的任何想法感兴趣。

扩展JChronic可能是您最好的选择。 我认为,鉴于对这个问题的回答 ,不太可能存在预先构建的库(虽然看起来这样的事情可能有用......我猜测解析自然语言日期的主要用例如果他们能够从用户提供的字符串中提取额外的数据,那将会更有用。

在实现方面,可能最直接的做法是扩展JChronic,因为它支持你的用例中相当大的一部分,但是从单元测试中可以看到更多的外部信息应该已经被忽略了框架。 幸运的是,如果你看一下主类 ,扩展/修改/包装parse()方法以支持事件标题的自定义扫描程序应该不会太难。 (我自己对这些的偏好是包装框架而不是fork并修改它,因为这样可以更容易地从底层代码的任何改进中受益)。

最终,可以证明最直接的方法是生成一个正则表达式解析器,忽略JChronic尝试捕获的大部分内容(这意味着对JChronic源代码非常熟悉)。

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

我意识到我对JChronic说了很多,但我觉得这对你的问题来说是一个很自然的选择,因为它已经涵盖了解析自然语言“约会”的大部分“难点”,即我们语言的模糊性。使用时间,并已使用您所针对的语言实施。

尝试提取约会名称有两种相对简单的方法。

使用序列标签包

如果你有一个标签数据集,你可以使用像CRF ++Yamcha这样的软件包培训一个序列模型来提取预约标题,比如“与Mike 共进午餐”。

使用命名实体和规则

如果您没有标记数据集,则可能会使用命名实体识别器来标记约会文本中的所有人员,位置和组织。 作为奖励,这也将为您提供时间和日期,因此您不需要编写自己的代码来解决这些问题。

由于命名实体都已标记,因此编写一些规则以提取或构建每个约会的标题应该非常简单。

如果您正在寻找基于Java的NER标记器,您可以使用斯坦福发布的或与OpenNLP一起发布的标记。

我无法想到任何符合您规格的东西。 您可以尝试使用Stanford NLP Java包或OpenNLP。 然而,这可能是你试图做的大锤解决方案。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM