Skip to content

08_抽出所有的時間 (time) 及轉譯時間詞彙

Droidtown Linguistic. Tech. Co., Ltd edited this page May 14, 2021 · 4 revisions

Articut 內建支援好幾種不同長度的時間詞彙的偵測、斷詞以及 POS/NER 標記。完整的列表如下:

POS/NER 標記 說明
<TIME_holiday> 和節日相關的時間。
<TIME_justtime> 和現在或瞬時相關的時間。
<TIME_day> 和以「天」為單位相關的時間。
<TIME_week> 和以「週」為單位相關的時間。
<TIME_month> 和以「月」為單位相關的時間。
<TIME_season> 和以「季」為單位相關的時間。
<TIME_year> 和以「年」為單位相關的時間。
<TIME_decade> 和以「比年還要長的時間」為單位相關的時間。

除了 ArticutAPI 具有把這些與時間相關的詞彙抽出的功能外,Articut 本身也有個 lv3 的語意斷詞分析的能力,可以把時間字串轉譯成為 datetime 的格式,以方便 NLP 工程師存取與操作文本的內容。以下將先說明 ArticutAPI 的「時間詞彙」抽取功能,然後再展示利用 Articutlv3 語意斷詞分析能力來轉譯 datetime 的功能。

輸入要分析的句子字串 "昨天半夜11點多傳訊息給媒體,說今天早上十點會安排巴士"

from ArticutAPI import Articut
from pprint import pprint
username = "" #這裡填入您在 https://api.droidtown.co 使用的帳號 email。若使用空字串,則預設使用每小時 2000 字的公用額度。
apikey   = "" #這裡填入您在 https://api.droidtown.co 登入後取得的 api Key。若使用空字串,則預設使用每小時 2000 字的公用額度。
articut = Articut(username, apikey)

inputSTR = "昨天半夜傳訊息給媒體,說今天早上十點會安排巴士。"
resultDICT = articut.parse(inputSTR)
pprint(resultDICT["result_pos"])

列出所有的時間相關詞彙

timeLIST = articut.getTimeLIST(resultDICT)    
pprint(timeLIST)

輸出結果如下

[
 [(10, 12, '昨天'), (33, 35, '半夜')],
 [],
 [(38, 40, '今天'), (61, 63, '早上'), (89, 91, '十點')],
 []
]

這些「昨天半夜」和「今天早上十點」就是從輸入的句子裡抽出來,指涉「時間」的詞彙。

轉譯時間相關詞彙:不指定參考時間 (預設參考時間為今日)

除了抽詞以外,我們也可以利用 Articut 本身的 lv3 功能來轉譯描寫時間詞彙的字串,讓它成為 datetime 的格式來操作。

from ArticutAPI import Articut
from pprint import pprint
username = "" #這裡填入您在 https://api.droidtown.co 使用的帳號 email。若使用空字串,則預設使用每小時 2000 字的公用額度。
apikey   = "" #這裡填入您在 https://api.droidtown.co 登入後取得的 api Key。若使用空字串,則預設使用每小時 2000 字的公用額度。
articut = Articut(username, apikey)

inputSTR = "昨天半夜傳訊息給媒體,說今天早上十點會安排巴士。"
resultDICT = articut.parse(inputSTR, level="lv3")  # 不同於原本預設的 lv2 設定。在這裡調整 level 參數,使用 lv3 的話,
pprint(resultDICT["time"])                         # resultDICT 的內容就會變得不一樣。直接印出 resultDICT["time"] 的內容

轉譯結果如下:

[
 [{'absolute': False,
   'datetime': '2021-05-13 22:00:00',   #注意!Articut lv3 的時間計算,會依「當下時間」做為預設參考值。
   'text': '昨天半夜',                  #在本頁撰寫時,是 2021/5/14,故「昨天半夜」將會推算成 2021/5/13
   'time_span': {'day': [13, 13],
                 'hour': [22, 2],
                 'minute': [0, 59],
                 'month': [5, 5],
                 'second': [0, 59],
                 'time_period': 'night',
                 'weekday': [4, 4],
                 'year': [2021, 2021]}}],
 [{'absolute': False,
   'datetime': '2021-05-13 10:00:00',   #注意!Articut lv3 計算時間時,若有前項的時間 (例如前一句提到 2021/5/13),
   'text': '今天早上十點',              #則後句將以前句的時間做為計算時間的新參考值。意即,在2021/5/13 提到「今天」
   'time_span': {'day': [13, 13],       #故「早上十點」也是以 2021/5/13 這天,當做「今天」的時間來計算「早上十點」。
                 'hour': [10, 10],
                 'minute': [0, 0],
                 'month': [5, 5],
                 'second': [0, 59],
                 'time_period': 'morning',
                 'weekday': [4, 4],
                 'year': [2021, 2021]}}]
]

轉譯時間相關詞彙:指定參考時間。

相對於前例的「不指定參考時間」,如果在使用時「有指定參考時間」,則轉譯的時間會依參考時間做推算。

from ArticutAPI import Articut
from pprint import pprint
username = "" #這裡填入您在 https://api.droidtown.co 使用的帳號 email。若使用空字串,則預設使用每小時 2000 字的公用額度。
apikey   = "" #這裡填入您在 https://api.droidtown.co 登入後取得的 api Key。若使用空字串,則預設使用每小時 2000 字的公用額度。
articut = Articut(username, apikey)

inputSTR = "昨天半夜傳訊息給媒體,說今天早上十點會安排巴士。"
resultDICT = articut.parse(inputSTR, level="lv3", timeRef='2021-1-1 00:00:00')  # 不同於前例,我們指定了 timeRef 為2021的第一天。
pprint(resultDICT["time"]) 

轉譯結果如下:

[
  [{'absolute': False,
    'datetime': '2020-12-31 22:00:00',  #由於給定的參考時間是 2021 的第一天,因此相對於參考時間而言「昨天半夜」就是 2020 的最後一天。
    'text': '昨天半夜',
    'time_span': {'day': [31, 31],
                  'hour': [22, 2],
                  'minute': [0, 59],
                  'month': [12, 12],
                  'second': [0, 59],
                  'time_period': 'night',
                  'weekday': [4, 4],
                  'year': [2020, 2020]}}],
  [{'absolute': False,
    'datetime': '2020-12-31 10:00:00',  #繼續以前一句做為參考時間,因此相對於參考時間而言「今天」仍是 2020 的最後一天。
    'text': '今天早上十點',
    'time_span': {'day': [31, 31],
                  'hour': [10, 10],
                  'minute': [0, 0],
                  'month': [12, 12],
                  'second': [0, 59],
                  'time_period': 'morning',
                  'weekday': [4, 4],
                  'year': [2020, 2020]}}]
]

Clone this wiki locally