-
Notifications
You must be signed in to change notification settings - Fork 38
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 的「時間詞彙」抽取功能,然後再展示利用 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)
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]}}]
]Droidtown Linguistic Tech.
Document | Blog | Twitter @DroidtownLing | Facebook @Articut | Website