第六章(1.4)自然語言處理實戰——時間語義抽取
阿新 • • 發佈:2019-02-09
一、簡介
本工具是由復旦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());
// 新聞隨機抽取長句識別(2016年6月7日新聞,均以當日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();
}
}
}
三、執行結果
Hi,all.下週一下午三點開會
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