【问题标题】:Natural Language parsing of an appointment?约会的自然语言解析?
【发布时间】:2011-02-04 23:18:09
【问题描述】:

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

周二 11:30 与 Mike 共进午餐

或

周五下午 5 点欢乐时光

我发现了一些很有前途的线索,例如 https://github.com/samtingleff/jchronic 和 http://www.datejs.com/,它们可以解析日期 - 但我还需要能够提取活动的标题,例如“与 Mike 共进午餐”。

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

【问题讨论】:

标签: java datetime parsing nlp


【解决方案1】:

我想不出有什么可以按照您的要求做到这一点。你可以试试 Stanford NLP Java package 或 OpenNLP。但是,对于您尝试做的事情,这可能是一个大锤解决方案。

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

【讨论】:

    【解决方案2】:

    扩展 JChronic 可能是您最好的选择。我认为,鉴于对this question 的回复,不太可能存在为此预先构建的库(尽管看起来这样的东西可能很有用......我猜测解析自然语言的主要用例如果日期能够从用户提供的字符串中提取更多数据,那么日期会更加有用)。

    在实现方面,可能最直接的做法是扩展 JChronic,因为它支持您的用例的相当重要的部分,但更多的是 as you can see from the unit test 框架应该已经忽略了无关信息. 同样幸运的是,如果您查看the main class,扩展/修改/包装 parse() 方法以支持事件标题的自定义扫描器应该不会太难。 (我自己的偏好是封装框架而不是分叉和修改它,因为这样可以让您更轻松地从对底层代码的任何改进中受益)。

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

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

    我意识到我对 JChronic 说了很多,但我觉得它是解决您的问题的自然选择,因为它已经涵盖了解析自然语言“约会”的大部分“困难部分”,即我们的模糊性我们在时间上使用的语言,并且已经以您的目标语言实现。

    【讨论】:

      【解决方案3】:

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

      使用序列标签包

      如果您有一个带标签的数据集,您可以训练一个序列模型,使用 CRF++ 或 Yamcha 之类的包来提取“与 Mike 共进午餐”之类的约会标题。

      使用命名实体和规则

      如果您没有标记的数据集,您可能会从使用named entity recognizer 标记约会文本中的所有人员、位置和组织中获得一些好处。作为奖励,这还将为您提供时间和日期,因此您无需编写自己的代码即可将其提取出来。

      所有命名实体都被标记后,编写一些规则来提取或构造每个约会的标题应该很简单。

      如果您正在寻找基于 Java 的 NER 标记器,您可以使用Stanford 发布的那个或OpenNLP 发布的那个

      【讨论】:

        猜你喜欢
        • 2013-09-12
        • 1970-01-01
        • 1970-01-01
        • 2012-07-05
        • 1970-01-01
        • 1970-01-01
        • 2010-10-10
        • 2011-12-17
        相关资源
        最近更新 更多