分享一个自然语言汉语时间语义识别的工具类

前言

目前,机器学习越来越流行,各种问答系统的应用也越来越广泛。其中,问答系统的知识库有些还是来源于关系型数据库。
往往我们的提问是这样的:“上个月有什么电影?”

但知识库中的数据是这样的:

ID Name Date
1 泰坦尼克号 YYYY-MM-DD
2 X战警 YYYY-MM-DD
3 阿凡达 YYYY-MM-DD

对此,我们需要将日常用语,表示时间的词语转换为YYYY-MM-DD格式。针对上述情况,笔者编写了一个java工具类,实现此功能。

描述

基于正则表达式关键字提取,自年、季度、月、周、日向下提取拼接成日期字符串,同时支持“从……到……”形式的范围日期查找。

日期 口语格式 同义词
去、前、今、本、明、后、前、近、最近 YYYY、YY
季度 这、本、上、下、前、近、最近、第 -
这、本、上、下、上、前、近、最近、半年 MM、M
这、本、上、下、前、近、最近 周、礼拜、星期
现在、昨、今、前、明、后、前、近、最近、半个月、月上旬、月中旬、月下旬 DD、D、天、日、号、星期X、周X、礼拜X

使用

代码

ZHSpokenDateFormat.AnalyzeResult analyzeResult = ZHSpokenDateFormat.analyzeStr("今年上半年有什么电影");

AnalyzeResult 类属性

// 是否有日期格式匹配
private boolean matchDate;
// 开始时间
private String beginDate;
// 结束时间
private String endDate;
// 去除日期字符串后剩余的字符串部分
private String remainingPart;

示例

代码


 public static void main(String[] args) {

        String[] questions = {
                "今年上半年有什么电影",
                "从2010年3月份到二零一九年十二月份有哪些动漫",
                "最近两个礼拜有什么电视剧",
                "七月上旬开了几场演唱会",
        };

        for (String question : questions) {

            ZHSpokenDateFormat.AnalyzeResult analyzeResult = ZHSpokenDateFormat.analyzeStr(question);

            System.out.println("原句:" + question);
            System.out.println("是否有日期格式匹配:" + analyzeResult.isMatchDate());
            System.out.println("开始时间:" + analyzeResult.getBeginDate());
            System.out.println("结束时间:" + analyzeResult.getEndDate());
            System.out.println("去除日期字符串后剩余的字符串部分:" + analyzeResult.getRemainingPart());

            // 当然你也可以通过以下方式获取匹配文字
            String matchStr = question.replaceAll(analyzeResult.getRemainingPart(), "");
            System.out.println("匹配文字:" + matchStr);

            System.out.println("\n");
        }

    }

结果

原句:今年上半年有什么电影
是否有日期格式匹配:true
开始时间:2020-01-01
结束时间:2020-06-30
去除日期字符串后剩余的字符串部分:有什么电影
匹配文字:今年上半年


原句:从2010年3月份到二零一九年十二月份有哪些动漫
是否有日期格式匹配:true
开始时间:2010-03-01
结束时间:2019-12-31
去除日期字符串后剩余的字符串部分:有哪些动漫
匹配文字:从2010年3月份到二零一九年十二月份


原句:最近两个礼拜有什么电视剧
是否有日期格式匹配:true
开始时间:2020-10-5
结束时间:2020-10-11
去除日期字符串后剩余的字符串部分:有什么电视剧
匹配文字:最近两个礼拜


原句:七月上旬开了几场演唱会
是否有日期格式匹配:true
开始时间:2020-07-01
结束时间:2020-07-10
去除日期字符串后剩余的字符串部分:开了几场演唱会
匹配文字:七月上旬

源码地址

https://github.com/wangnamu/ZHSpokenDateFormat

posted @   wangnamu  阅读(201)  评论(0编辑  收藏  举报
编辑推荐:
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
阅读排行:
· 在鹅厂做java开发是什么体验
· 百万级群聊的设计实践
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
· 永远不要相信用户的输入:从 SQL 注入攻防看输入验证的重要性
· 全网最简单!3分钟用满血DeepSeek R1开发一款AI智能客服,零代码轻松接入微信、公众号、小程
点击右上角即可分享
微信分享提示