1. 程式人生 > >第六章(1.4)自然語言處理實戰——時間語義抽取

第六章(1.4)自然語言處理實戰——時間語義抽取

一、簡介

本工具是由復旦NLP中的時間分析功能修改而來,做了一些細節和功能的優化,經SpringBoot封裝成web工具。

  • 泛指時間的支援,如:早上、晚上、中午、傍晚等。
  • 時間未來傾向。 如:在週五輸入“週一早上開會”,則識別到下週一早上的時間;在下午17點輸入:“9點送牛奶給隔壁的漢- 子”則識別到第二天上午9點。
  • 多個時間的識別,及多個時間之間上下文關係處理。如:”下月1號下午3點至5點到圖書館還書”,識別到開始時間為下月1號下午三點。同時,結束時間也繼承上文時間,識別到下月1號下午5點。
  • 可自定義基準時間:指定基準時間為“2016-05-20-09-00-00-00”,則一切分析以此時間為基準。

二、運用

package com.time.nlp;

import java.util.regex.Pattern;

import com.time.nlp.time.TimeNormalizer;
import com.time.nlp.time.TimeUnit;
import com.time.nlp.time.util.DateUtil;

public class TimeAnalyseTest {

    public static void main(String[] args) {
//      String path = TimeNormalizer.class.getResource
("").getPath(); // String classPath = path.substring(0, path.indexOf("/com/time")); // System.out.println(classPath + "/TimeExp.m"); // TimeNormalizer normalizer = new TimeNormalizer(classPath + "/TimeExp.m"); // // String content = "明天上午9點半在大明湖畔召開需求評審會議。"; // normalizer.parse(content);// 抽取時間
// TimeUnit[] unit = normalizer.getTimeUnit(); // System.out.println(content); // for (TimeUnit timeUnit : unit) { // System.out.println(DateUtil.formatDateDefault(timeUnit.getTime()) + "-" + timeUnit.getIsAllDayTime()); // } test(); } public static void test() { String path = TimeNormalizer.class.getResource("").getPath(); String classPath = path.substring(0, path.indexOf("/com/time")); System.out.println(classPath + "/TimeExp.m"); TimeNormalizer normalizer = new TimeNormalizer(classPath + "/TimeExp.m"); normalizer.parse("Hi,all.下週一下午三點開會");// 抽取時間 TimeUnit[] unit = normalizer.getTimeUnit(); System.out.println("Hi,all.下週一下午三點開會"); System.out.println(DateUtil.formatDateDefault(unit[0].getTime()) + "-" + unit[0].getIsAllDayTime()); normalizer.parse("早上六點起床");// 注意此處識別到6天在今天已經過去,自動識別為明早六點(未來傾向,可通過開關關閉:new // TimeNormalizer(classPath+"/TimeExp.m", // false)) unit = normalizer.getTimeUnit(); System.out.println("早上六點起床"); System.out.println(DateUtil.formatDateDefault(unit[0].getTime()) + "-" + unit[0].getIsAllDayTime()); normalizer.parse("週一開會");// 如果本週已經是週二,識別為下週週一。同理處理各級時間。(未來傾向) unit = normalizer.getTimeUnit(); System.out.println("週一開會"); System.out.println(DateUtil.formatDateDefault(unit[0].getTime()) + "-" + unit[0].getIsAllDayTime()); normalizer.parse("下下週一開會");// 對於上/下的識別 unit = normalizer.getTimeUnit(); System.out.println("下下週一開會"); System.out.println(DateUtil.formatDateDefault(unit[0].getTime()) + "-" + unit[0].getIsAllDayTime()); normalizer.parse("6:30 起床");// 嚴格時間格式的識別 unit = normalizer.getTimeUnit(); System.out.println("6:30 起床"); System.out.println(DateUtil.formatDateDefault(unit[0].getTime()) + "-" + unit[0].getIsAllDayTime()); normalizer.parse("6-3 春遊");// 嚴格時間格式的識別 unit = normalizer.getTimeUnit(); System.out.println("6-3 春遊"); System.out.println(DateUtil.formatDateDefault(unit[0].getTime()) + "-" + unit[0].getIsAllDayTime()); normalizer.parse("6月3 春遊");// 殘缺時間的識別 (打字輸入時可便捷使用者) unit = normalizer.getTimeUnit(); System.out.println("6月3 春遊"); System.out.println(DateUtil.formatDateDefault(unit[0].getTime()) + "-" + unit[0].getIsAllDayTime()); normalizer.parse("明天早上跑步");// 模糊時間範圍識別(可在RangeTimeEnum中修改 unit = normalizer.getTimeUnit(); System.out.println("明天早上跑步"); System.out.println(DateUtil.formatDateDefault(unit[0].getTime()) + "-" + unit[0].getIsAllDayTime()); normalizer.parse("本週日到下週日出差");// 多時間識別 unit = normalizer.getTimeUnit(); System.out.println("本週日到下週日出差"); System.out.println(DateUtil.formatDateDefault(unit[0].getTime()) + "-" + unit[0].getIsAllDayTime()); System.out.println(DateUtil.formatDateDefault(unit[1].getTime()) + "-" + unit[1].getIsAllDayTime()); normalizer.parse("週四下午三點到五點開會");// 多時間識別,注意第二個時間點用了第一個時間的上文 unit = normalizer.getTimeUnit(); System.out.println("週四下午三點到五點開會"); System.out.println(DateUtil.formatDateDefault(unit[0].getTime()) + "-" + unit[0].getIsAllDayTime()); System.out.println(DateUtil.formatDateDefault(unit[1].getTime()) + "-" + unit[1].getIsAllDayTime()); // 新聞隨機抽取長句識別(201667日新聞,均以當日0點為基準時間計算) // 例1 normalizer.parse("昨天上午,第八輪中美戰略與經濟對話氣候變化問題特別聯合會議召開。中國氣候變化事務特別代表解振華表示,今年中美兩國在應對氣候變化多邊程序中政策對話的重點任務,是推動《巴黎協定》儘早生效。", "2016-06-07-00-00-00"); unit = normalizer.getTimeUnit(); System.out.println("昨天上午,第八輪中美戰略與經濟對話氣候變化問題特別聯合會議召開。中國氣候變化事務特別代表解振華表示,今年中美兩國在應對氣候變化多邊程序中政策對話的重點任務,是推動《巴黎協定》儘早生效。"); for (int i = 0; i < unit.length; i++) { System.out.println("時間文字:" + unit[i].Time_Expression + ",對應時間:" + DateUtil.formatDateDefault(unit[i].getTime())); } // 例2 normalizer.parse("《遼寧日報》今日報道,6月3日遼寧召開省委常委擴大會,會議從下午兩點半開到六點半,主要議題為:落實中央巡視整改要求。", "2016-06-07-00-00-00"); unit = normalizer.getTimeUnit(); System.out.println("《遼寧日報》今日報道,6月3日遼寧召開省委常委擴大會,會議從下午兩點半開到六點半,主要議題為:落實中央巡視整改要求。"); for (int i = 0; i < unit.length; i++) { System.out.println("時間文字:" + unit[i].Time_Expression + ",對應時間:" + DateUtil.formatDateDefault(unit[i].getTime())); } // 例3 normalizer.parse("去年11月起正式實施的刑法修正案(九)中明確,在法律規定的國家考試中,組織作弊的將入刑定罪,最高可處七年有期徒刑。另外,本月剛剛開始實施的新版《教育法》中也明確...", "2016-06-07-00-00-00"); unit = normalizer.getTimeUnit(); System.out.println("去年11月起正式實施的刑法修正案(九)中明確,在法律規定的國家考試中,組織作弊的將入刑定罪,最高可處七年有期徒刑。另外,本月剛剛開始實施的新版《教育法》中也明確..."); for (int i = 0; i < unit.length; i++) { System.out.println("時間文字:" + unit[i].Time_Expression + ",對應時間:" + DateUtil.formatDateDefault(unit[i].getTime())); } } /** * 測試正則表示式是否載入成功 */ public void editTimeExp() { String path = TimeNormalizer.class.getResource("").getPath(); String classPath = path.substring(0, path.indexOf("/com/time")); System.out.println(classPath + "/TimeExp.m"); /** 寫TimeExp */ Pattern p = Pattern.compile("your-regex"); try { TimeNormalizer.writeModel(p, classPath + "/TimeExp.m"); } catch (Exception e) { e.printStackTrace(); } } }

三、執行結果

Hiall.下週一下午三點開會
2018-03-19 15:00:00-false
早上六點起床
2018-03-13 06:00:00-false
週一開會
2018-03-19 00:00:00-true
下下週一開會
2018-03-26 00:00:00-true
6:30 起床
2018-03-13 06:30:00-false
6-3 春遊
2018-06-03 00:00:00-true
6月3  春遊
2018-06-01 00:00:00-true
明天早上跑步
2018-03-13 08:00:00-false
本週日到下週日出差
2018-03-18 00:00:00-true
2018-03-25 00:00:00-true
週四下午三點到五點開會
2018-03-15 15:00:00-false
2018-03-15 17:00:00-false
昨天上午,第八輪中美戰略與經濟對話氣候變化問題特別聯合會議召開。中國氣候變化事務特別代表解振華表示,今年中美兩國在應對氣候變化多邊程序中政策對話的重點任務,是推動《巴黎協定》儘早生效。
時間文字:昨天上午,對應時間:2016-06-06 10:00:00
時間文字:今年,對應時間:2016-01-01 00:00:00
《遼寧日報》今日報道,6月3日遼寧召開省委常委擴大會,會議從下午兩點半開到六點半,主要議題為:落實中央巡視整改要求。
時間文字:今日,對應時間:2016-06-07 00:00:00
時間文字:6月3日,對應時間:2016-06-03 00:00:00
時間文字:下午2點半,對應時間:2016-06-03 14:30:00
時間文字:6點半,對應時間:2016-06-03 18:30:00
去年11月起正式實施的刑法修正案(九)中明確,在法律規定的國家考試中,組織作弊的將入刑定罪,最高可處七年有期徒刑。另外,本月剛剛開始實施的新版《教育法》中也明確...
時間文字:去年11月,對應時間:2015-11-01 00:00:00
時間文字:本月,對應時間:2016-06-01 00:00:00