分享一個自然語言漢語時間語義識別的工具類

wangnamu發表於2020-11-09

前言

目前,機器學習越來越流行,各種問答系統的應用也越來越廣泛。其中,問答系統的知識庫有些還是來源於關係型資料庫。
往往我們的提問是這樣的:“上個月有什麼電影?”

但知識庫中的資料是這樣的:

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

相關文章