NAV
Python

Articut

Articut 服務介紹

基於人類習得語言的機制,透過「語法規則」建立中文語言處理的斷詞系統。 只用結構就能解決中文斷詞問題,不需要大數據,修改快且離線就能跑。 沒有內建字典,不認識的詞彙都是 OOV,不需要擔心新詞彙出現,無法處理。 不只有斷詞,它還能推理詞性標記 (POS) 與命名實體 (NER)。 同時計算 中文斷詞 + 詞性標記 + 命名實體 讓電腦把詞彙以「在該句子內的意義」為單位切割出來。

使用 Articut API

範例程式:

from requests import post

url = "https://api.droidtown.co/Articut/API/"
payload = {
    "username": "test@email.com",
    "api_key":"anapikeyfordocthatdoesnwork@all",
    "input_str": "我想過過過兒過過的日子。"
}

response = post(url, json=payload)

回傳結果 (JSON 格式):

{
    "status": true,
    "msg": "Success!",
    "result_pos": ["<ENTITY_pronoun>我</ENTITY_pronoun><ACTION_verb>想</ACTION_verb><ACTION_quantifiedVerb>過過</ACTION_quantifiedVerb><ENTITY_pronoun>過兒</ENTITY_pronoun><VerbP>過過</VerbP><FUNC_inner>的</FUNC_inner><ENTITY_noun>日子</ENTITY_noun>", "。"],
    "result_obj": [[{"text": "我", "pos": "ENTITY_pronoun"},
                    {"text": "想", "pos": "ACTION_verb"},
                    {"text": "過過", "pos": "ACTION_quantifiedVerb"},
                    {"text": "過兒", "pos": "ENTITY_pronoun"},
                    {"text": "過過", "pos": "VerbP"},
                    {"text": "的", "pos": "FUNC_inner"},
                    {"text": "日子", "pos": "ENTITY_noun"}],
                   [{"text": "。", "pos": "PUNCTUATION"}]],
    "result_segmentation": "我/想/過/過/過兒/過/過/的/日子/。",
    "exec_time": 0.015885591506958008,
    "version": "v183",
    "level": "lv2",
    "word_count_balance": 1991
}

範例程式:

from requests import post

url = "https://api.droidtown.co/Articut/API/"
payload = {
    "username": "test@email.com",
    "api_key":"anapikeyfordocthatdoesnwork@all",
    "input_str": "蔡英文總統在今年五月二十日就職。",
    "time_ref": "2016-01-01 00:00:00",
    "level": "lv3",
}

response = post(url, json=payload)

回傳結果 (JSON 格式):

{
    "entity": [[[3, 5, "總統"]]],
    "event": [["總統", "就職"]],
    "exec_time": 0.02642345428466797,
    "input": [[0, 15]],
    "number": {},
    "person": [[[0, 3, "蔡英文"]]],
    "site": [[]],
    "status": true,
    "time": [[{"absolute": true,
               "datetime": "2016-05-20 00:00:00",
               "text": "五月二十日",
               "time_span": {"day": [20, 20],
                             "hour": [0, 23],
                             "minute": [0, 59],
                             "month": [5, 5],
                             "second": [0, 59],
                             "time_period": "night",
                             "weekday": [5, 5],
                             "year": [2016, 2016]}}]],
    "user_defined": [[]],
    "utterance": ["ㄘㄞˋ ㄧㄥ ㄨㄣˊ /ㄗㄨㄥˇ ㄊㄨㄥˇ /ㄗㄞˋ /ㄐㄧㄣ ㄋㄧㄢˊ /ㄨˇ ㄩㄝˋ /ㄦˋ ㄕˊ ㄖˋ /ㄐㄧㄡˋ ㄓˊ "],
    "level": "lv3",
    "msg": "Success!",
    "version": "v224"
}

詳細的使用範例可參考 Github 上 ArticutAPI

HTTP Request

POST https://api.droidtown.co/Articut/API/

參數說明

參數 型態 預設 功能
username str "" 您在本站註冊時所使用的帳號 (email)。
api_key str "" 在本站購買斷詞服務額度,完成付費後取得的一個具有 31 字符長度的字串。
input_str str "" 將要送上 Articut 進行斷詞暨詞性標記處理的文字。
注意!每次最大長度不得超過 2000 個字符。
version str "latest" 指定版本是選用的。如果此項留白,或指定 "latest",則 Articut 將使用最新版本的演算法對您上傳的文字進行斷詞。此外,您也能指定 Articut 的演算法版本。例如,若在此項輸入字串 "v001",則將會使用 v001 版本的斷詞演算法對您上傳的文字進行斷詞。
level str "lv2" 可為 "lv1" 或 "lv2"。指定為 lv1 時,將直接透過句子本身的語法結構進行推算,可視為「沒有百科知識」,只有語法能力的斷詞結果。若指定為 lv2 時,則會額外引入卓騰的百科知識庫輔助運算。
user_defined_dict_file dict {} 使用者自定詞典,必須是 dictionary 格式。
(e.g. UserDefinedDICT = {"key": ["value1", "value2",...],...})。
opendata_place bool False 政府開放平台 OpenData 中存有「交通部觀光局蒐集各政府機關所發佈空間化觀光資訊」。Articut 可取用其中的資訊,並標記為 <KNOWLEGED_place>
wikidata bool False 取自 Wikidata 資料的中文名稱 (Label),並標記為<KNOWLEGED_wikiData>
Wikidata 不包含以下類型:
- 單一文字 (不含週期表元素)
- 電影、戲劇、節目名稱 (含系列)
- 電玩遊戲名稱 (含系列)
- 漫畫、動畫名稱
- 小說、書本名稱
- 專輯、歌曲名稱
- 藝術作品名稱
- 提名或入圍獎項
- 動詞、時間
- Wikimedia、Wikidata 列表
chemical bool True Articut 能夠辨識出化學成分,並標記爲<KNOWLEDGE_chemical>
如果文本中沒有化學物質,可關閉以加快速度。
time_ref str "" "lv3" 功能,時間格式:"yyyy-mm-dd HH:MM:SS",將 input_str 的句子內的時間依據此參數時間為基準,計算句子裡的相對時間或絕對時間並回傳 datetime 格式。

例如:
input_str = "蔡英文總統在今年五月二十日就職"
time_ref = "2016-01-01 00:00:00"
結果為 datetime = "2016-05-20 00:00:00"

若無,則會依據系統時間為基準計算最接近的時間,
假設目前系統時間 = 2020-10-01
結果為 datetime = "2020-05-20 00:00:00"
pinyin str "BOPOMOFO" "lv3" 提供 "BOPOMOFO""HANYU" 兩種,文字轉聲音的標記 (包含破音字)。

回傳內容說明

回傳訊息 型態 說明
status bool 若成功執行並收到斷詞結果,回傳 True;失敗,則回傳 False
msg str 可能為以下的文字:
- Success!: 順利完成斷詞作業。
- Specified version does not exist.: 無法找到您指定的演算法版本。請再檢查一次您指定的演算法版本值。
- Specified level does not exist.: 無法找到您指定的知識程度。知識程度只能為 "lv1"、"lv2" 或 "lv3"。
- Authtication failed.: 無法驗証您的帳號。請再檢查一次您使用的帳號是否正確。
- API_Key failed.: 無效的 api_key。請再檢查一次您的 api_key 是否正確。
- Your input_str is too long. (over 2000 characters.): input_str 超過 2000 字符。
- Insufficient word count balance.: 您帳號下的字數餘額不足以處理本次斷詞需求。
- Internal server error. (Your word count balance is not consumed, don't worry. System will reboot in 5min, please try again later.): 嗯…似乎我們的伺服器出了點狀況。我們正在努力修復中,5 分鐘內會自動重啟,請稍後再試一次。別擔心,在無法正常回傳斷詞結果的情況下,您帳號的餘額不會被扣除。
- Invalid content_type.: 上傳格式必須為 Json 格式 (application/json)。
- Invalid arguments.: 上傳參數錯誤,請重新檢查上傳時的參數是否符合規則名稱。
- UserDefinedDICT Parsing ERROR. (Please check your the format and encoding.): 使用者自定詞典無法載入,請檢查格式 (Dict) 或編碼 (UTF-8) 是否正確。
- Maximum UserDefinedDICT file size exceeded! (UserDefinedDICT file shall be samller than 10MB.): 使用者自定詞典檔案大小超過 10MB。
result_pos list 列表中含有每一句各自分開的斷詞結果,詞組前後另外加上了詞性標記 (Part-Of-Speech)。
result_obj list 列表中含有每一句各自分開的斷詞物件結果,包含詞組與詞性標記(Part-Of-Speech)。
result_segmentation str 完整的輸入文句已經斷詞處理並以斜線 ( / ) 標出詞彙斷點。回傳時以字串回傳。
exec_time float 本次斷詞作業耗費的伺服器時間。
version str 本次斷詞作業所使用的演算法版本。
level str 本次斷詞作業所使用的知識能力等級。
word_count_balance int 您帳號下剩餘可用的字數值。

取得目前所有版本

範例程式:

from requests import post

url = "https://api.droidtown.co/Articut/Versions/"
payload = {
    "username": "test@email.com",
    "api_key": "anapikeyfordocthatdoesnwork@all"
}

response = post(url, json=payload)

回傳結果 (JSON 格式):

{
    "status": true,
    "msg": "Success!",
    "versions": [
        {
            "version": "latest",
            "release_date": "2020-08-13",
            "level": ["lv1", "lv2", "lv3"],
        },
        {   
            "version": "v210"
            "release_date": "2020-08-13",
            "level": ["lv1", "lv2", "lv3"],
        },
        {
            "version": "v209"
            "release_date": "2020-08-05",
            "level": ["lv1", "lv2", "lv3"],
        }
    ]
}

HTTP Request

POST https://api.droidtown.co/Articut/Versions/

參數說明

參數 型態 預設 功能
username str "" 您在本站註冊時所使用的帳號 (email)。
api_key str "" 在本站購買斷詞服務額度,完成付費後取得的一個具有 31 字符長度的字串。

回傳內容說明

回傳訊息 型態 說明
status bool 若成功執行並取回結果,回傳 True;失敗,則回傳 False
msg str 可能為以下的文字:
- Success!: 順利完成斷詞作業。
- Authtication failed.: 無法驗証您的帳號。請再檢查一次您使用的帳號是否正確。
- Internal server error. (Your word count balance is not consumed, don't worry. System will reboot in 5min, please try again later.): 嗯…似乎我們的伺服器出了點狀況。我們正在努力修復中,5 分鐘內會自動重啟,請稍後再試一次。別擔心,在無法正常回傳斷詞結果的情況下,您帳號的餘額不會被扣除。
- Invalid content_type.: 上傳格式必須為 Json 格式 (application/json)。
- Invalid arguments.: 上傳參數錯誤,請重新檢查上傳時的參數是否符合規則名稱。
versions  dict 目前可使用的 Articut 版本。
- version: 版本號。
- release_date: 釋出日期。
- level: 可指定的演算法版本。

使用自定義辭典

範例程式:

from requests import post

url = "https://api.droidtown.co/Articut/API/"
payload = {
    "username": "test@email.com",
    "api_key": "anapikeyfordocthatdoesnwork@all",
    "input_str": "我正在計劃地球人類補完計劃",
    "user_defined_dict_file": {"地球人類補完計劃": ["人類補完計劃", "補完計劃"]}
}

response = post(url, json=payload)

回傳結果 (JSON 格式):

{
    "exec_time": 0.013453006744384766,
    "level": "lv2",
    "msg": "Success!",
    "result_obj": [[{"pos": "ENTITY_pronoun", "text": "我"},
                    {"pos": "ASPECT", "text": "正在"},
                    {"pos": "ACTION_verb", "text": "計劃"},
                    {"pos": "UserDefined", "text": "地球人類補完計劃"}]],
    "result_pos": ["<ENTITY_pronoun>我</ENTITY_pronoun><ASPECT>正在</ASPECT><ACTION_verb>計劃</ACTION_verb><UserDefined>地球人類補完計劃</UserDefined>"],
    "result_segmentation": "我/正在/計劃/地球人類補完計劃",
    "status": true,
    "version": "v132",
    "word_count_balance": 99987
}

因為 Articut 只處理「語言知識」而不處理「百科知識」。
我們提供「使用者自定義」詞彙表的功能,並標記為 <UserDefined>
使用 Dictionary 格式,請自行編寫。

HTTP Request

POST https://api.droidtown.co/Articut/API/

參數說明

參數 型態 預設 功能
username str "" 您在本站註冊時所使用的帳號 (email)。
api_key str "" 在本站購買斷詞服務額度,完成付費後取得的一個具有 31 字符長度的字串。
input_str str "" 將要送上 Articut 進行斷詞暨詞性標記處理的文字。
注意!每次最大長度不得超過 2000 個字符。
user_defined_dict_file dict {} 使用者自定詞典,必須是 dictionary 格式。
(e.g. UserDefinedDICT = {"key": ["value1", "value2",...],...})。

回傳內容說明

回傳訊息 型態 說明
status   bool 其值為 TrueFalse
msg str 可能為以下的文字:
- Success!: 順利完成斷詞作業。
- UserDefinedDICT Parsing ERROR. (Please check your the format and encoding.): 使用者自定詞典無法載入,請檢查格式 (Dict) 或編碼 (UTF-8) 是否正確。
- Maximum UserDefinedDICT file size exceeded! (UserDefinedDICT file shall be samller than 10MB.): 使用者自定詞典檔案大小超過 10MB。

調用觀光資訊資料庫

範例程式:

from requests import post

url = "https://api.droidtown.co/Articut/API/"
payload = {
    "username": "test@email.com",
    "api_key": "anapikeyfordocthatdoesnwork@all",
    "input_str": "花蓮的原野牧場有一間餐廳",
    "opendata_place": true
}

response = post(url, json=payload)

回傳內容 (JSON 格式):

{
    "exec_time": 0.013453006744384766,
    "level": "lv1",
    "msg": "Success!",
    "result_pos": ["<LOCATION>花蓮</LOCATION><FUNC_inner>的</FUNC_inner><KNOWLEDGE_place>原野牧場</KNOWLEDGE_place><ACTION_verb>有</ACTION_verb><ENTITY_classifier>一間</ENTITY_classifier><ENTITY_noun>餐廳</ENTITY_noun>"],
    "result_segmentation": "花蓮/的/原野牧場/有/一間/餐廳",
    "status": true,
    "version": "v137",
    "word_count_balance": 99988
}

政府開放平台中存有「交通部觀光局蒐集各政府機關所發佈空間化觀光資訊」。
Articut 可取用其中的資訊,並標記為 <KNOWLEDGE_place>

HTTP Request

POST https://api.droidtown.co/Articut/API/

詞性標記 (Part-of-speech, POS)

我(ENTITY_pronoun) 終生(ENTITY_nouny) 所(FUNC_inner) 追尋(ACTION_verb) 的(FUNC_inner) 標的(ENTITY_nouny)

只有斷詞結果,無法處理句子的意義,需要 POS 才能進行語意分析與理解。 主要依據詞彙意義對詞進行劃分每個單詞在句子內所扮演的詞性。

標記類別

類別 標記名稱
實體類 ENTITY
動詞類 ACTION、ASPECT、MODAL、AUX
時間類 TIME
修飾詞 IDIOM、MODIFIER、MODIFIER_color、ModifierP、DegreeP、QUANTIFIER
功能詞 FUNC
句型詞 CLAUSE
NER類 LOCATION、KNOWLEDGE、UserDefined、RANGE

實體類 (Entity)

「實詞」是詞類的一種,又稱「名詞」,可以獨立成句。可指代人、物、事、時、地、情感、概念、方位的名詞等實體或抽象事物的詞。

有幾個詞組組合規則如下:

標記名稱 說明
<ENTITY_num> 單純數字表示
<ENTITY_classifier> 量詞 (或中文系稱的「分類詞」)
<ENTITY_measurement> 量測詞 (表示是一個測量值。例如「一公斤」、「30公分」…等)
<ENTITY_person> 名詞,且系統推測應該指某個「人類」。(以漢人常見三字名、單名為主)
<ENTITY_pronoun> 代名詞。
(若有需要,可再細分「專指代名詞」(e.g., 爸爸) 或「泛指代名詞」(e.g., 老公公))
<ENTITY_possessive> 所有格名詞。
<ENTITY_noun> 系統已認得的名詞。
<ENTITY_nounHead> 名詞組的中心語。
<ENTITY_nouny> 系統推測應該是名詞。
<ENTITY_oov> 系統不知道是什麼,但把它當名詞用。
<ENTITY_DetPhrase> 限定詞詞組,由一個「限定詞 (這、那)」和一個「量詞 (一部,兩台)」組成。
e.g., <ENTITY_DetPhrase>這一台</ENTITY_DetPhrase>

動詞類 (Verb)

「動詞」用來表示動作、發生或是存在的狀態,可以單獨存在或與不同的修飾詞、助詞和主詞組成句子。

標記名稱 說明
<ACTION_lightVerb> 輕動詞 (e.g., 被、把、弄…)
<ACTION_verb> 動詞
<ACTION_eventQuantifier> 動作量詞,長得很像名詞的量詞。 e.g., 一部、兩台
它的測量目標是「動作的次數」,而不是「名詞的數量」。 e.g., 跑 <ACTION_eventQuantifier>一趟</ACTION_eventQuantifier>
<ACTION_quantifiedVerb> 量化動詞,表示該動作只做了一定程度的量。 e.g., 看一看、瞧瞧、嚐嚐看…等
<VerbP> 動詞組,指的是一個動詞 (Verb)加上時態 (ASPECT)受詞 (ENTITY)的動詞。 e.g.,
<ACTION\_verb></ACTION\_verb><ENTITY\_DetPhrase>這本</ENTITY\_DetPhrase><ENTITY\_noun></ENTITY\_noun>
<VerbP>讀過</VerbP><ENTITY\_DetPhrase>這本</ENTITY\_DetPhrase><ENTITY\_noun></ENTITY\_noun>
<ASPECT> 時態標記 (了、著…等)
<AUX> 助動詞 (e.g., 是、為…)
<MODAL> 情態標記詞 (e.g., 可以、能、會…)

時間類 (Time)

與時間相關的詞彙,包含相對時間、絕對時間與中文傳統的時間單位。

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

修飾詞 (Modifier)

用來修飾句子,使句子所要表達的意思更豐富、完整。

標記名稱 說明
<DegreeP> 程度詞詞組:由一個「形容詞」加上一個「程度中心語 (e.g.,很、非常…)」組成。
e.g., <DegreeP>很明顯</DegreeP>
<IDIOM> 成語或諺語。
<MODIFIER> 形容詞及副詞。
<MODIFIER_color> 顏色形容詞。
<ModifierP> 形容詞或副詞詞組。由一個「形容詞/副詞」加上一「…地」組成。
e.g., <ModifierP>明顯地</ModifierP>
<QUANTIFIER> 量化詞標記 (都、全…等)

功能詞 (Function Word)

指的是中文詞彙中沒有實際意義的詞,且無法獨立成句。
例如:副詞、介詞、連接詞、助詞、歎詞等。

標記名稱 說明
<FUNC_conjunction> 連接功能詞
<FUNC_degreeHead> 形容詞組的程度中心語(很、極、非常…等)。表示形容詞到這裡就不會再疊加了。其旁邊形容詞會和此程度中心語形成一個用來「描述程度」的修飾、形容用語。
<FUNC_determiner> 定冠詞 (或中文系稱的「定語」)
<FUNC_inner> 內向功能詞 (完整語意可在本句以內滿足。e.g., 在…)
<FUNC_inter> 外向功能詞 (完整語意需在本句以外滿足。e.g., 然而…)
<FUNC_modifierHead> 形容詞及副詞組的中心語。
<FUNC_negation> 否定功能詞

句型詞 (Clause)

問句類 (wh-問句及 yes-no 問句) 或直述句類。

標記名稱 說明
<CLAUSE_AnotAQ> 「A-not-A」問句
<CLAUSE_YesNoQ> 「是非」問句
<CLAUSE_WhoQ> 「誰」問句
<CLAUSE_WhatQ> 「物」問句
<CLAUSE_WhereQ> 「何地」問句
<CLAUSE_WhenQ> 「何時」問句
<CLAUSE_WhyQ> 「原因」問句
<CLAUSE_HowQ> 「程度/過程」問句
<CLAUSE_particle> 沒什麼特別意義,就只是一個句子裡的小元素。(e.g., 啊、啦、喔…)

命名實體類 (Named Entity Recognition, NER)

實體指一個真實世界的物件,可能是地方、人物、組織、產品、抽象或具體的東西等具有專有名稱的物件。
識別文本中具有特定意義的實體 (中文人名、行政地名、其他名詞...等)

標記名稱 說明
<LOCATION> 地名
<RANGE_locality> 地名範圍標記
<RANGE_period> 時間範圍標記
<UserDefined> 使用者自定義的詞彙
<KNOWLEDGE_addTW> 台灣地址
<KNOWLEDGE_currency> 金錢。例如: <KNOWLEDGE_currency>100美元</KNOWLEDGE_currency><KNOWLEDGE_currency>100元</KNOWLEDGE_currency><ENTITY_noun>美金</ENTITY_noun>
<KNOWLEDGE_lawTW> 法條索引
<KNOWLEDGE_place> 政府開放平台中的觀光景點
<KNOWLEDGE_routeTW> 台灣道路名稱
<KNOWLEDGE_url> 網址
<KNOWLEDGE_wikiData> WikiData 開放資料
<KNOWLEDGE_chemical> 化學物質

進階功能

Articut Addons

範例程式:

from requests import post

url = "https://api.droidtown.co/Articut/Addons/"
payload = {
"username": "test@email.com",
"api_key": "anapikeyfordocthatdoesnwork@all",
"result_pos": ["<MODIFIER>剛剛</MODIFIER><ACTION_verb>得知</ACTION_verb><KNOWLEDGE_place>435藝文特區</KNOWLEDGE_place><AUX>是</AUX><ENTITY_classifier>個</ENTITY_classifier><ACTION_verb>遛</ACTION_verb><ENTITY_nouny>小孩</ENTITY_nouny><FUNC_inner>的</FUNC_inner><MODIFIER>好</MODIFIER><ENTITY_noun>地方</ENTITY_noun>",
               ",",
               "<ENTITY_pronoun>你</ENTITY_pronoun><CLAUSE_YesNoQ><AUX>是</AUX><FUNC_negation>否</FUNC_negation></CLAUSE_YesNoQ><ACTION_verb>知道</ACTION_verb><TIME_day>傍晚</TIME_day><MODAL>可以</MODAL><ACTION_verb>到</ACTION_verb><KNOWLEDGE_place>觀音亭</KNOWLEDGE_place><ACTION_verb>去</ACTION_verb><ACTION_verb>看</ACTION_verb><ENTITY_nouny>夕陽</ENTITY_nouny><CLAUSE_particle>喔</CLAUSE_particle>",
               "!",
               "<TIME_day>今日</TIME_day><TIME_day>傍晚</TIME_day><FUNC_inner>在</FUNC_inner><LOCATION>新竹市</LOCATION><LOCATION>北區</LOCATION><ACTION_verb>溜</ACTION_verb><ENTITY_nouny>小狗</ENTITY_nouny>",
               "。"],
"func": ["get_all"],
"index_with_pos": true
}

response = post(url, json=payload)

回傳結果 (JSON 格式):

{
"msg": "Success!",
"status": true,
"results": {"addtw_list": [[], [], [], [], [], []],
            "chemical_list": [[], [], [], [], [], []],
            "content_word_list": [[[10, 12, "剛剛"],
                                   [36, 38, "得知"],
                                   [159, 160, "遛"],
                                   [188, 190, "小孩"],
                                   [241, 242, "好"],
                                   [266, 268, "地方"]],
                                  [],
                                  [[122, 124, "知道"],
                                   [191, 192, "到"],
                                   [257, 258, "去"],
                                   [285, 286, "看"],
                                   [314, 316, "夕陽"]],
                                  [],
                                  [[132, 133, "溜"], [161, 163, "小狗"]],
                                  []],
            "currency_list": [[], [], [], [], [], []],
            "currency_greedy_list": [[], [], [], [], [], []],
            "location_stem_list": [[],
                                   [],
                                   [],
                                   [],
                                   [[82, 85, "新竹市"], [106, 108, "北區"]],
                                   []],
            "noun_stem_list": [[[188, 190, "小孩"],
                                [266, 268, "地方"]],
                               [],
                               [[314, 316, "夕陽"]],
                               [],
                               [[161, 163, "小狗"]],
                               []],
            "opendata_place_list": [[[69, 76, "435藝文特區"]],
                                    [],
                                    [[223, 226, "觀音亭"]],
                                    [],
                                    [],
                                    []],
            "person_and_pronoun_list": [[],
                                        [],
                                        [[16, 17, "你"]],
                                        [], 
                                        [], 
                                        []],
            "person_list": [[], [], [], [], [], []],
            "question_list": [[],
                              [],
                              [["<CLAUSE_YesNoQ>", "你是否知道傍晚可以到觀音亭去看夕陽喔"]],
                              [],
                              [],
                              []],
            "time_list": [[],
                          [],
                          [[148, 150, "傍晚"]],
                          [],
                          [[10, 12, "今日"],
                           [33, 35, "傍晚"]],
                          []],
            "verb_stem_list": [[[36, 38, "得知"], 
                                [159, 160, "遛"]],
                               [],
                               [[122, 124, "知道"],
                                [191, 192, "到"],
                                [257, 258, "去"],
                                [285, 286, "看"]],
                               [],
                               [[132, 133, "溜"]],
                               []],
            "wikidata_list": [[], [], [], [], [], []]}
}

可以依需求找出「名詞」、「動詞」或是「形容詞」…等詞彙語意本身已經完整的詞彙。

HTTP Request

POST https://api.droidtown.co/Articut/Addons/

參數說明

參數 型態 預設 功能
result_pos dict Articut 斷詞結果標記。
index_with_pos bool True 計算所擷取的字串位置時,是否包含詞性標記 (POS)。
func list ["get_all"] 可設置為以下參數:
- get_all: 取出以下所有參數的結果。
- get_person: 取出斷詞結果中的人名 (person)。每個句子內的人名為一個 list。
- get_person_and_pronoun: 取出斷詞結果中的人名 (person) 與代名詞 (pronoun)。每個句子內的人名與代名詞為一個 list。
- get_content_word: 取出斷詞結果中的實詞 (content word)。每個句子內的實詞為一個 list。
- get_verb_stem: 取出斷詞結果中的動詞 (verb)。此處指的是 ACTION_verb 標記的動詞詞彙。每個句子內的動詞為一個 list。
- get_noun_stem: 取出斷詞結果中的名詞 (noun)。此處指的是 ENTITY_nounENTITY_nounyENTITY_nounHeadENTITY_oov 標記的名詞詞彙。每個句子內的名詞為一個 list。
- get_time: 取出斷詞結果中的時間 (time)。每個句子內的時間列為一個 list。
- get_opendata_place: 取出斷詞結果中的景點 (KNOWLEDGE_place)。此處指的是景點 KNOWLEDGE_place 標記的非行政地點名稱詞彙,例如「鹿港老街」、「宜蘭運動公園」。每個句子內的景點為一個 list。
- get_location_stem: 取出斷詞結果中的地理位置 (location)。此處指的是地理位置標記的行政區地名詞彙,例如「台北」、「桃園」、「墨西哥」。每個句子內的地理位置列為一個 list。
- get_question: 取出斷詞結果中含有 <CLAUSE_Q> 標籤的句子。例如「是非問句:你認識他嗎?」
- get_addtw: 取出斷詞結果中含有 <KNOWLEDGE_addTW> 標籤的台灣地址字串。例如「台北市中山區民權東路二段109號」。
- get_currency: 取出斷詞結果中含有 <KNOWLEDGE_currency> 標籤的貨幣金額字串。每個句子內的貨幣金額為一個 list。
- get_currency_greedy: 取出斷詞結果中含有 <KNOWLEDGE_currency> 標籤與 <ENTITY_noun> <ENTITY_num> 組合標籤的貨幣金額字串。每個句子內的貨幣金額為一個 list。
- get_wikidata: 取出斷詞結果中含有 <KNOWLEDGE_wikiData> 標籤的 Wikidata 標題字串。每個句子內的 Wikidata 標題文字為一個 list。
- get_chemical: 取出斷詞結果中含有 <KNOWLEDGE_chemical> 標籤的化學物質。每個句子內的化學物質為一個 list。

法律檢索工具

範例程式:

from requests import post

url = "https://api.droidtown.co/Toolkit/Laws/"
payload = 
{
    "username": "test@email.com",
    "api_key": "anapikeyfordocthatdoesnwork@all",
    "result_pos": ["<ENTITY_nouny>被告</ENTITY_nouny><MODIFIER>前</MODIFIER><FUNC_inter>因</FUNC_inter><MODIFIER>非法</MODIFIER><ACTION_verb>持有</ACTION_verb><ENTITY_nouny>槍械</ENTITY_nouny>",
                   ",",
                   "<CLAUSE_particle>業</CLAUSE_particle><ACTION_verb>經</ACTION_verb><ENTITY_nouny>前案</ENTITY_nouny><ACTION_verb>判決</ACTION_verb><MODIFIER>非法</MODIFIER><ACTION_verb>持有</ACTION_verb><MODAL>可</MODAL><ACTION_verb>發射</ACTION_verb><ENTITY_nouny>子彈</ENTITY_nouny><ENTITY_nouny>具</ENTITY_nouny><ENTITY_nouny>殺傷力</ENTITY_nouny><FUNC_inner>之</FUNC_inner><ENTITY_nouny>槍枝</ENTITY_nouny><ENTITY_nouny>罪</ENTITY_nouny>",
                   ",",
                   "<ACTION_verb>處</ACTION_verb><MODIFIER>有期</MODIFIER><ENTITY_nounHead>徒刑</ENTITY_nounHead><TIME_year>參年</TIME_year><TIME_month>陸月</TIME_month>",
                   ",",
                   "<ACTION_verb>併</ACTION_verb><ENTITY_nounHead>科罰金</ENTITY_nounHead><ENTITY_noun>新臺幣</ENTITY_noun><KNOWLEDGE_currency>拾萬元</KNOWLEDGE_currency>",
                   "。",
                   "<FUNC_inner>於</FUNC_inner><ENTITY_nouny>前案</ENTITY_nouny><ACTION_verb>偵查</ACTION_verb><ENTITY_noun>過程</ENTITY_noun><RANGE_locality>中</RANGE_locality>",
                   ",",
                   "<ENTITY_nouny>南投縣</ENTITY_nouny><ENTITY_noun>政府</ENTITY_noun><ENTITY_nouny>警察局</ENTITY_nouny><LOCATION>集集</LOCATION><ENTITY_oov>分局</ENTITY_oov><FUNC_inner>之</FUNC_inner><ENTITY_nouny>員警</ENTITY_nouny>",
                   ",",
                   "<ACTION_verb>持</ACTION_verb><ENTITY_nouny>本院</ENTITY_nouny><ACTION_verb>核發</ACTION_verb><FUNC_inner>之</FUNC_inner><TIME_year>105年度</TIME_year><ENTITY_oov>聲</ENTITY_oov><VerbP>搜字</VerbP><KNOWLEDGE_lawTW>第165號</KNOWLEDGE_lawTW><ACTION_verb>搜索</ACTION_verb><ENTITY_nouny>票</ENTITY_nouny><ACTION_verb>搜索</ACTION_verb>",
                   "。"],
    "func": ["get_all"]
}

回傳內容 (JSON 格式):

{
    "msg": "Success!",
    "status": true,
    "results": {"law_article_list": ["第165號"],
                "crime_list": ["非法持有可發射子彈具殺傷力之槍枝罪"],
                "criminal_responsibility_list": ["有期徒刑參年陸月"],
                "event_ref_list": []}
}

HTTP Request

POST https://api.droidtown.co/Articut/Toolkit/Laws/

參數說明

參數 型態 預設 功能
result_pos dict Articut 斷詞結果標記。
func list ["get_all"] 可設置為以下參數:
- get_all: 取出以下所有參數的結果。
- get_law_article: 取出斷詞結果中含有 <KNOWLEDGE_lawTW> 標籤的法條索引。
- get_crime: 取出斷詞結果中的犯罪罪名。
- get_criminal_responsibility: 取出斷詞結果中的判決刑責。
- get_event_ref: 取出斷詞結果中的事件參照。

TF-IDF

範例程式:

from requests import post

url = "https://api.droidtown.co/Articut/Toolkit/TFIDF/"
payload = {
    "username": "test@email.com",
    "api_key": "anapikeyfordocthatdoesnwork@all",
    "result_segmentation": "沒有/人/可以/決定/你/的/命運/,/命運/在/自己/的/手/上/。",
    "with_weight": True
}

response = post(url, json=payload)

回傳結果 (JSON 格式):

{
    "msg": "Success!",
    "status": true,
    "tfidf": [["命運", 0.27356173082825286],
              ["你", 0.13678086541412643],
              ["手", 0.11362471190151249],
              ["決定", 0.10007923043569088],
              ["自己", 0.06731240487628462],
              ["人", 0.05667373578657066]]
}

基於 TF-IDF 算法的關鍵詞抽取

HTTP Request

POST https://api.droidtown.co/Articut/Toolkit/TFIDF/

參數說明

參數 型態 預設 功能
result_segmentation str Articut 斷詞結果,提取關鍵詞的文本。
top_k int 50 提取幾個 TF-IDF 的關鍵詞。
with_weight bool False 為是否返回關鍵詞權重值。
allow_pos list 預設為空值,亦即全部抽取。抽取指定詞性。

TextRank

範例程式:

from requests import post

url = "https://api.droidtown.co/Articut/Toolkit/TextRank/"
payload = {
    "username": "test@email.com",
    "api_key": "anapikeyfordocthatdoesnwork@all",
    "result_pos": ["<FUNC_negation>沒有</FUNC_negation><ENTITY_nouny>人</ENTITY_nouny><MODAL>可以</MODAL><ACTION_verb>決定</ACTION_verb><ENTITY_pronoun>你</ENTITY_pronoun><FUNC_inner>的</FUNC_inner><ENTITY_nouny>命運</ENTITY_nouny>",
                   ",",
                   "<ENTITY_oov>命運</ENTITY_oov><FUNC_inner>在</FUNC_inner><ENTITY_pronoun>自己</ENTITY_pronoun><FUNC_inner>的</FUNC_inner><ENTITY_nouny>手</ENTITY_nouny><RANGE_locality>上</RANGE_locality>",
                   "。"],
    "with_weight": True
}

response = post(url, json=payload)

回傳結果 (JSON 格式):

{
    "msg": "Success!",
    "status": true,
    "textrank": [["命運", 5.591625666787958],
                 ["自己", 3.4637188376903927],
                 ["你", 3.4637188376903927],
                 ["決定", 3.4637188376903927],
                 ["手", 2.959546855830475],
                 ["人", 2.9595468558304745]]
}

基於 TextRank 算法的關鍵詞抽取

將待抽取關鍵詞的文本斷詞。
以固定的窗格大小 (預設值為 5,通過 span 屬性調整),詞之間的共現關係,建構出不帶權圖。
計算途中節點的 PageRank。
算法論文:TextRank: Bringing Order into Texts

HTTP Request

POST https://api.droidtown.co/Articut/Toolkit/TextRank/

參數說明

參數 型態 預設 功能
result_pos list Articut 斷詞結果標記,提取關鍵詞的文本。
top_k int 10 提取幾個關鍵詞。
with_weight bool False 為是否返回關鍵詞權重值。
allow_pos list 預設為空值,亦即全部抽取。抽取指定詞性。

KeyMoji

KeyMoji 服務介紹

KeyMoji 關鍵情緒偵測 (SENSE2、SENSE8、Tension) 採用不同於其它「素人標記」和「純機器學習」的文本情緒偵測分析工具,結合了「句型」、「邏輯語意」和「詞彙模型」,設計出一個完整的「情緒計算過程」。
並依中文的句法結構,定義了幾種句型:

此外,KeyMoji 同時整合了「句法知識」和「詞彙模型」,將 Rule-based 和 Data-driven 兩種方法 Hybrid 在一起。

Emotions in Formula

情緒的組成是由:詞彙 + 句型 + 語境 + 個人習慣 構成。

關鍵情緒偵測

KeyMoji 透過「句型」+「詞彙模型」的混合式演算法,將每一句的情緒偵測結果投射到二維 (SENSE2) 及八維 (SENSE8) 的情緒空間裡。另將「句型」本身的權重效果獨立成「情緒張力」(Tension) 的結果。

Context Sensitivity (語境敏感功能)

KeyMoji 有 Context_Sensitivity (語境敏感開關) 的設計。 如果前幾句是「正向描述」而這一句是「中性描述」的話,那麼這個「中性描述」也會被前文裡「正向描述」的情緒延續,使分數拉高一點。這麼一來,就能呈現「因前後文的語境」帶出的正負向情緒計算了。

舉個例子:

「終於買到 PS5 啦!」(正向描述)
「還有維京紀元」(中性描述,被前文帶出正向)
「黑色行動」(中性描述,被前文帶出正向)
「也一起入手了」(中性描述,被前文帶趨近正向)

語境敏感開關

Scoping

在語言裡還有一個叫 "Scope" 的概念,它是用來計算某些語意的控制範圍的
比如說「每個」和「某個」都是屬於帶有 "Scope" 的運算子 (operator)。那麼,以這個句子為例:

簡單地說,這些含有 "socping" 語意功能的詞彙,會影響句子語意的計算結果。而我們已經知道像是「每個」、「」、「」、「沒有」…這些詞彙都是帶有 "scoping" 語意功能的詞彙。因此在 KeyMoji 裡,我們也加入了計算 Operator 的 "Scope" 的處理。如下圖:
Socping_1
Socping_2

KeyMoji 在設計時,涉及了許多語言學典範轉移以後,對人類認知系統的許多理解的計算公式,然後利用形式語意學裡計算 Scope 的方法,最後再加上詞彙自帶的正負面表示,綜合起來得到的情緒正負面計算結果。

SENSE2

範例程式:

from requests import post

url = "https://api.droidtown.co/KeyMoji/API/"
payload = {
    "username": "test@email.com",
    "keymoji_key":"anapikeyfordocthatdoesnwork@all",
    "input_str": "高興的要死。",
    "sense": "sense2",
    "context_sensitivity": True
}

response = post(url, json=payload)

回傳結果 (JSON 格式):

{
    "status": true,
    "msg": "Success!",
    "results": [{"cursing": false,
                 "input_str": "高興的要死",
                 "score": 0.7483,
                 "sentiment": "positive"}],
    "sense": "sense2"
}

HTTP Request

POST https://api.droidtown.co/KeyMoji/API/

參數說明

參數 型態 預設 功能
username str "" 您在本站註冊時所使用的帳號 (email)。
keymoji_key str "" 在本站購買KeyMoji服務,完成付費後取得的一個具有 31 字符長度的字串。
input_str str "" 將要送上 KeyMoji 情緒偵測處理的文字。
注意!每次最大長度不得超過 6000 個字符
sense str "" 可為 "sense2"、"sense8" 或 "tension",不可為空值。
將情緒偵測結果投射到二維 (SENSE2)、八維 (SENSE8) 的情緒空間或是文本權重效果獨立成「情緒張力」(Tension) 的結果。
此範例為 sense2。
context_sensitivity bool True 語境敏感開關,預設為 True。此參數為 True 時,前句的句子若有分數,若此句計算的結果無分數,則前句的分數會延續影響此句分數,直到下一句計算的結果有分數。
例如:
context_sensitivity = True
input_str = "好不容易離開思念的軌跡,回憶將我聯繫到過去"
結果為:
"好不容易離開思念的軌跡" => -0.6043, "回憶將我聯繫到過去" => -0.4532
反之,參數為 False 時,"回憶將我聯繫到過去" => 0

回傳內容說明

回傳訊息 型態 說明
status bool 若成功執行並收到情緒偵測結果,回傳 True;失敗,則回傳 False
msg str 可能為以下的文字:
- Success!: 順利完成情緒偵測作業。
- Invalid arguments.: 上傳參數錯誤,請重新檢查上傳時的參數是否符合規則名稱。
- Invalid content_type.: 上傳格式必須為 Json 格式 (application/json)。
- Your input_str is too long (over 6000 characters.): input_str 超過 6000 字符。
- Authentication Failed.: 無法驗証您的帳號,或是未購買KeyMoji方案。請再檢查一次您使用的帳號是否正確。
- Invalid KeyMoji_Key.: 無效的 keymoji_key。請再檢查一次您的 keymoji_key 是否正確。
- Invalid sense.: sense 所指定的參數不存在。
- request['context_sensitivity'] only takes True/False.: context_sensitivity 只能是 boolean 格式。
- request['sense'] should be set as 'tension', 'sense2' or 'sense8', other settings don't make any sense to KeyMoji.: sense 需要指定其參數為 'tension', 'sense2' 或 'sense8' 字串。
- Interval Server Error. (System will reboot in 5min, please try again later.): 嗯…似乎我們的伺服器出了點狀況。我們正在努力修復中,5 分鐘內會自動重啟,請稍後再試一次。
sense str 此次情緒偵測所使用的功能。
此範例為 sense2。
results list 以句子為一個單位,將計算結果存儲至 dict,內容包含以下
- input_str: 單句的文字字串。
- cursing: input_str 是否含有國罵的文字內容,例:XX娘。
- score: 計算 input_str 的情緒分數。context_sensitivity== **True** 時,會受到前句的結果影響,不同於單句計算的分數。
- sentiment: 依據語意計算結果判斷 input_str 的表述,屬於在人類情緒光譜上哪個分佈位置:
     --positive: 正向表述 (0.2, 1]
     --negative: 負向表述 [-1, -0.2)
     --neutral: 中性表述 [-0.2, -0.2]

SENSE8

情緒又稱「情感」,是動物出於本能與生俱來的多種感覺、思想和行為綜合產生的心理和生理狀態,並與我們生活息息相關。有些複雜情緒必須經過與他人互動才能學習到,因此每個人所擁有的情緒數量和對情緒的定義都不一樣。
KeyMoji 依據美國心理學家 Robert Plutchik 提出八種主要的成對兩極核心情緒,分別為 AngerAnticipationDisgustFearJoySadnessSurpriseTrust 來做計算。

情緒輪

範例程式:

from requests import post

url = "https://api.droidtown.co/KeyMoji/API/"
payload = {
    "username": "test@email.com",
    "keymoji_key":"anapikeyfordocthatdoesnwork@all",
    "input_str": "高興的要死。",
    "sense": "sense8"
}

response = post(url, json=payload)

回傳結果 (JSON 格式):

{
    "status": true,
    "msg": "Success!",
    "results": [{
        "input_str": "高興的要死",
        "Anger": 2.0356,
        "Anticipation": 7.4765,
        "Disgust": 1.2923,
        "Fear": 2.4753,
        "Joy": 7.7804,
        "Sadness": 3.1816,
        "Surprise": 7.7534,
        "Trust": 7.5461,
    }],
    "sense": "sense8"
}

HTTP Request

POST https://api.droidtown.co/KeyMoji/API/

參數說明

參數 型態 預設 功能
username str "" 您在本站註冊時所使用的帳號 (email)。
keymoji_key str "" 在本站購買KeyMoji服務,完成付費後取得的一個具有 31 字符長度的字串。
input_str str "" 將要送上 KeyMoji 情緒偵測處理的文字。
注意!每次最大長度不得超過 6000 個字符
sense str "" 可為 "sense2"、"sense8" 或 "tension",不可為空值。
將情緒偵測結果投射到二維 (SENSE2)、八維 (SENSE8) 的情緒空間或是文本權重效果獨立成「情緒張力」(Tension) 的結果。
此範例為 sense8。

PS.關於SENSE8八個維度參考的來源。

回傳內容說明

回傳訊息 型態 說明
status bool 若成功執行並收到情緒偵測結果,回傳 True;失敗,則回傳 False
msg str 可能為以下的文字:
- Success!: 順利完成情緒偵測作業。
- Invalid arguments.: 上傳參數錯誤,請重新檢查上傳時的參數是否符合規則名稱。
- Invalid content_type.: 上傳格式必須為 Json 格式 (application/json)。
- Your input_str is too long (over 6000 characters.): input_str 超過 6000 字符。
- Authentication Failed.: 無法驗証您的帳號,或是未購買KeyMoji方案。請再檢查一次您使用的帳號是否正確。
- Invalid KeyMoji_Key.: 無效的 keymoji_key。請再檢查一次您的 keymoji_key 是否正確。
- Invalid sense.: sense 所指定的參數不存在。
- request['context_sensitivity'] only takes True/False.: context_sensitivity 只能是 boolean 格式。
- request['sense'] should be set as 'tension', 'sense2' or 'sense8', other settings don't make any sense to KeyMoji.: sense 需要指定其參數為 'tension', 'sense2' 或 'sense8' 字串。
- Interval Server Error. (System will reboot in 5min, please try again later.): 嗯…似乎我們的伺服器出了點狀況。我們正在努力修復中,5 分鐘內會自動重啟,請稍後再試一次。
sense str 此次情緒偵測所使用的功能。
此範例為 sense8。
results list 以句子為一個單位,將計算結果存儲至 dict,內容包含四種 正/負向情緒,共八種情緒分數[0, 12.5]
- input_str: 單句的文字字串。
- Anger: 負向情緒分數,在 input_str 裡存在「憤怒」語意意涵的指數。
- Disgust: 負向情緒分數,在 input_str 裡存在「噁心」語意意涵的指數。
- Fear: 負向情緒分數,在 input_str 裡存在「恐懼」語意意涵的指數。
- Sadness: 負向情緒分數,在 input_str 裡存在「悲傷」語意意涵的指數。
- Joy: 正向情緒分數,在 input_str 裡存在「歡樂」語意意涵的指數。
- Anticipation: 正向情緒分數,在 input_str 裡存在「期待」語意意涵的指數。
- Surprise: 正向情緒分數,在 input_str 裡存在「驚喜」語意意涵的指數。
- Trust: 正向情緒分數,在 input_str 裡存在「信任」語意意涵的指數。

PS.八維度核心情緒分類請參考下表:

八維度核心情緒

Tension

範例程式:

from requests import post

url = "https://api.droidtown.co/KeyMoji/API/"
payload = {
    "username": "test@email.com",
    "keymoji_key":"anapikeyfordocthatdoesnwork@all",
    "input_str": """我想向各位更新我們的努力成果,曝光在那荒謬、漫長的11月3日選舉中所發生的大面積選舉舞弊和各種不正常的現象。
我們以前有所謂的「選舉日」,現在卻拖延成好幾個選舉週、選舉月,這段時間裡許多不好的事發生了,特別是我們得去證明那些原本我們不需要去驗證的事,才得以執行我們最偉大的特權——選舉權。
作為總統,我責無旁貸,保護這個國家的法律和憲法,所以我決心保障我們的選舉系統。
而這個系統正遭受合謀攻擊。在總統選舉前的幾個月,我們被多次警告,不要過早宣告我們的勝選;我們反覆被告知,這場選舉將耗時幾週甚至幾個月來分出勝、來數缺席者選票,並確認結果。
我的對手被告知:「可以與選舉保持距離,不需要競選活動。我們不需要你。我們搞定了,這場選舉已經結束。」
實際上,他們的表現得好像他們早已知道了這場選舉的結果。一切都在他們的掌控之中。很可能是這樣,這對我們的國家來說是非常悲哀的。
這一切(發生的事情)都非常奇怪。在選舉後的幾天,我們見證了這場試圖決定勝者的操作。即使許多關鍵州仍然在計算選票。
我們必須繼續依循憲法流程,為維護選舉的誠信,我們將確保計算每張合法選票,不計算任何一張非法選票。這不只是為了尊重那7,400萬選我的美國人,也是為了確保美國人能對這場選舉、以致未來的選舉還能保有信心。
今天我將詳細說明我們近幾週所揭露的那些驚人、不符合常規的濫權舞弊行為,呈現給各位我們所發現的證據中的一小部分。事實上我們有大量的證據。
我想先和各位解釋腐敗的郵寄選票系統。
民主黨是如何系統性地策劃,特別使搖擺州的選票得以被修改。因為他們必須在(那幾個州)獲得勝選。他們不知道的是,事情比他們預期的要困難許多,因為我們在所有搖擺州都遙遙領先,比他們認為的多太多了。
我們老早就知道,民主黨的政治機器是如何參與選舉舞弊。從底特律到費城,從密爾沃基市到亞特蘭大,太多地方。
今年所不同的是,民主黨積極推動印刷並寄出數十、數百萬張郵寄選票。寄到不知名的收件人手裡,沒有任何保護措施。這讓舞弊和濫權演變到前所未見的程度。
利用疫情作為藉口,民主黨的法官和政客,在投票前幾個月甚至幾週前大肆修改選舉章程。
11月3號的選舉,我們的立法者很少參與其中,但按憲法要求他們是該參與其中。但非常罕見。不過,你會看到隨著我們持續提起訴訟,所發生的一切,這場選舉絕對都是違憲的。
包括內華達和加州等許多州,向選民名單上的每個人郵寄了(總數)超百萬的有效選票,無論這些人是否要求郵寄選票,無論是死是活,他們都收到了選票。
在其它州,如明尼蘇達、密歇根州或威斯康星州,在今年年中就發起了普遍缺席選票,(他們)向所有名單上的選民發送缺席選票申請表。無論這些人的身分為何,如此大量的擴充投票數量使欺詐的閘門大大敞開。
眾所周知的事實是,這些選票中塞滿了沒有合法投票權的人的選票,包括那些死者、搬走的、甚至是在我們國家沒有公民身分的人。更有甚者,這些紀錄充斥著各種錯誤,錯誤地址、重複輸入和其它問題,而這些錯誤都沒有被質疑,從來沒有被質疑過。
在搖擺州的許多縣內,登記選民的人數遠超出合格適齡的選民人數,包括密歇根州的67個縣。所有這些都是證據。
在威斯康辛,該州的選舉委員會無法證實其中超過十萬人的居民身分,卻拒絕將這些人從選民名冊中移除。他們知道為什麼這樣。
我知道,他們是非法選民。荒謬的是,儘管到了2020年,我們竟沒有任何方法來核實那些投票選民的合法性。
而這是一次如此重要的選舉,我們無法確定他們是誰?是否是該州居民?甚或是他們是否是美國公民?
我們無法得知。我們(發現)在所有搖擺州都有重大違規或徹底的欺詐行為。其票數遠遠超過反轉一個州的(選舉)結果所需的票數。
換句話說,以威斯康星州為例。我們在選舉日當晚(得票)遠遠超前,他們最終使我們奇蹟般地輸掉了2萬票。
我可以在這裡向您展示,在威斯康星州,我們領先了許多,然而在凌晨3點42分出現了這樣一個大量的灌票,大多數是拜登,幾乎全是給拜登。直到今天,每個人都在試圖弄清楚它的來源。
但我從大贏變成小輸,就在這凌晨3點42分,就在威斯康星。
這是一件糟糕、糟糕、非常糟糕的事。但是,我們將擁有超出許多倍的、與推翻該州所需的2萬張選票相比的票數。
如果我們對舞弊的了解正確,喬·拜登不能當總統。
我們談的是數十萬的選票。我們談論的數字是前所未見的。
舉個例子,在某個州,我們落後7000票,但後來我們找到2萬、5萬、10萬、20萬的異議或舞弊選票,其中包括那些未經共和黨監票員驗證的選票。因為這些監票員被鎖在門外不被允許查看這些選票。
還有那些11月3日參加現場投票的人,他們都為能投票感到興奮,他們很開心,以身為美國公民為傲。他們在現場表示他們想要投票,然而他們被告知他們不能投票。
「很抱歉」,他們被告知,「很抱歉,你已經投過郵寄選票了。恭喜你,我們已經收到了你們的選票,你們不能投票。」他們不知道該如何是好,他們投訴無門,只好離開現場,說這很奇怪。但是也有許多人強烈地抗議、投訴。
在很多情況下,他們填寫了臨時選票,但他們的選票沒被用上。事實上,這些選票全是投給川普的。換句話說,他們去現場投票,卻被告知已經投過票了,但他們其實尚未投票,他們只好離開,感到非常喪氣。他們失去了對我們選舉系統的信心。""",
    "sense": "tension"
}

response = post(url, json=payload)

回傳結果 (JSON 格式):

{
    "status": true,
    "msg": "Success!",
    "results": [0.1791, 0.1667, 0.1, 0.1622, 0.1558, 0.1528, 0.1061, 0.2083, 0.1026, 0.1951, 0.24],
    "sense": "tension",
}

在文章中修飾用詞「形容詞、副詞 MODIFIER」、「成語、諺語 IDIOM」 與「程度中心語 DegreeHead (e.g., 很、非常)」能提高整個句子的情緒張力 Tension
KeyMoji 利用 Articut 斷詞後的 POS,取出每 180 個字符裡修飾用詞數除以句子的詞彙數 WordCount。試圖呈現文章中「平滑化後,每 180 個字符所呈現的情緒張力」係數。

情緒張力公式

情緒張力公式

HTTP Request

POST https://api.droidtown.co/KeyMoji/API/

參數說明

參數 型態 預設 功能
username str "" 您在本站註冊時所使用的帳號 (email)。
keymoji_key str "" 在本站購買KeyMoji服務,完成付費後取得的一個具有 31 字符長度的字串。
input_str str "" 將要送上 KeyMoji 情緒偵測處理的文字。
注意!每次最大長度不得超過 6000 個字符
sense str "" 可為 "sense2"、"sense8" 或 "tension",不可為空值。
將情緒偵測結果投射到二維 (SENSE2)、八維 (SENSE8) 的情緒空間或是文本權重效果獨立成「情緒張力」(Tension) 的結果。
此範例為 tension。

回傳內容說明

回傳訊息 型態 說明
status bool 若成功執行並收到情緒偵測結果,回傳 True;失敗,則回傳 False
msg str 可能為以下的文字:
- Success!: 順利完成情緒偵測作業。
- Invalid arguments.: 上傳參數錯誤,請重新檢查上傳時的參數是否符合規則名稱。
- Invalid content_type.: 上傳格式必須為 Json 格式 (application/json)。
- Your input_str is too long (over 6000 characters.): input_str 超過 6000 字符。
- Authentication Failed.: 無法驗証您的帳號,或是未購買KeyMoji方案。請再檢查一次您使用的帳號是否正確。
- Invalid KeyMoji_Key.: 無效的 keymoji_key。請再檢查一次您的 keymoji_key 是否正確。
- Invalid sense.: sense 所指定的參數不存在。
- request['context_sensitivity'] only takes True/False.: context_sensitivity 只能是 boolean 格式。
- request['sense'] should be set as 'tension', 'sense2' or 'sense8', other settings don't make any sense to KeyMoji.: sense 需要指定其參數為 'tension', 'sense2' 或 'sense8' 字串。
- Interval Server Error. (System will reboot in 5min, please try again later.): 嗯…似乎我們的伺服器出了點狀況。我們正在努力修復中,5 分鐘內會自動重啟,請稍後再試一次。
sense str 此次情緒偵測所使用的功能。
此範例為 Tension。
results list 以 180 個字符為一個單位,將計算結果存儲至 list,分數區間為 [0, 1]。

SENSE2 Visual

範例程式:

from requests import post

url = "https://api.droidtown.co/KeyMoji/Toolkit/"
payload = {
    "username": "test@email.com",
    "keymoji_key":"anapikeyfordocthatdoesnwork@all",
    "sense": "sense2",
    "results": [{"cursing": false,
                 "input_str": "高興的要死",
                 "score": 0.7483,
                 "sentiment": "positive"}]
}

response = post(url, json=payload)

回傳結果 (JSON 格式):

{
    "status": true,
    "msg": "Success!",
    "result": {"name": "sense2.png",
               "base64": "iVBORw0KGgoAAAANSUhEUgAAA+gAAAH0CAYAAACuKActAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAPYQAAD2EBqD+naQAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4xLjEsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy8QZhcZAAAgAElEQVR4nOzdf5BkVX0//Pc5597b3bPDLgsLu2zgG1axVBTYiHGzPqYq6paLsfKFMrHAig+6T8QK+WIF53nQLKWLCBWMIQSNJKQQIn6fGIlPEiopU6tkK5tUyhUihFJTrKUGRAOz7ILLzHT3/XXOef64P6Z7pudH39s9c7vn/aKGnb5z+87tntvd93M/53w+wlprQURERERERETrSq73DhARERERERERA3QiIiIiIiKiSmCATkRERERERFQBDNCJiIiIiIiIKoABOhEREREREVEFMEAnIiIiIiIiqgAG6EREREREREQVwACdiIiIiIiIqAIYoBMRERERERFVAAN0IiIiIiIiogpggE5ERERERERUAQzQiYiIiIiIiCqAAToRERERERFRBTBAJyIiIiIiIqoABuhEREREREREFcAAnYiIiIiIiKgCGKATERERERERVQADdCIiIiIiIqIKYIBOREREREREVAEM0ImIiIiIiIgqgAE6ERERERERUQUwQCciIiIiIiKqAAboRERERERERBXAAJ2IiIiIiIioAhigExEREREREVUAA3QiIiIiIiKiCmCATkRERERERFQBDNCJiIiIiIiIKoABOhEREREREVEFMEAnIiIiIiIiqgAG6EREREREREQVwACdiIiIiIiIqAIYoBMRERERERFVAAN0IiIiIiIiogpggE5ERERERERUAQzQiYiIiIiIiCqAAToRERERERFRBTBAJyIiIiIiIqoABuhEREREREREFcAAnYiIiIiIiKgCGKATERERERERVQADdCIiIiIiIqIKYIBORERE"},
    "sense": "sense2"
}

HTTP Request

POST https://api.droidtown.co/KeyMoji/Toolkit/

參數說明

參數 型態 預設 功能
username str "" 您在本站註冊時所使用的帳號 (email)。
keymoji_key str "" 在本站購買KeyMoji服務,完成付費後取得的一個具有 31 字符長度的字串。
sense str "" 可為 "sense2"、"sense8" 或 "tension",不可為空值。
將情緒偵測結果投射到二維 (SENSE2)、八維 (SENSE8) 的情緒空間或是文本權重效果獨立成「情緒張力」(Tension) 的結果。
此範例為 sense2。
results list [] 對應參數sense結果的results欄位,不可為空值。

回傳內容說明

回傳訊息 型態 說明
status bool 若成功執行並收到情緒偵測結果,回傳 True;失敗,則回傳 False
msg str 可能為以下的文字:
- Success!: 順利完成情緒偵測作業。
- Invalid arguments.: 上傳參數錯誤,請重新檢查上傳時的參數是否符合規則名稱。
- Invalid content_type.: 上傳格式必須為 Json 格式 (application/json)。
- Your input_str is too long (over 6000 characters.): input_str 超過 6000 字符。
- Authentication Failed.: 無法驗証您的帳號,或是未購買KeyMoji方案。請再檢查一次您使用的帳號是否正確。
- Invalid KeyMoji_Key.: 無效的 keymoji_key。請再檢查一次您的 keymoji_key 是否正確。
- Invalid result.: results內容不符合指定參數sense
- Invalid sense.: sense 所指定的參數不存在。
sense str 此次情緒偵測所使用的功能。
此範例為 sense2。
result dict 將繪製的圖表結果存儲至 dict,內容包含以下
- name: 圖表的檔案名稱。
- base64: base64格式的圖檔。

SENSE8 Visual

範例程式:

from requests import post

url = "https://api.droidtown.co/KeyMoji/Toolkit/"
payload = {
    "username": "test@email.com",
    "keymoji_key":"anapikeyfordocthatdoesnwork@all",
    "sense": "sense8",
    "results": [{
        "input_str": "高興的要死",
        "Anger": 2.0356,
        "Anticipation": 7.4765,
        "Disgust": 1.2923,
        "Fear": 2.4753,
        "Joy": 7.7804,
        "Sadness": 3.1816,
        "Surprise": 7.7534,
        "Trust": 7.5461,
    }]
}

response = post(url, json=payload)

回傳結果 (JSON 格式):

{
    "status": true,
    "msg": "Success!",
    "result": {"name": "sense8.zip",
               "base64": "UEsDBBQAAAAAAGkzcFKGd7SCHAQDABwEAwAMAAAAc2Vuc2U4XzEucG5niVBORw0KGgoAAAANSUhEUgAABLAAAAOECAYAAACxbcj6AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAPYQAAD2EBqD+naQAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4xLjEsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy8QZhcZAAAgAElEQVR4nOzde3zP9f//8ft7Z8xmb2Y2Y3MeJpFDoRz6lUWOHVR86KASIikUOiB8OpAcSjmXclZOKUKfnBlClNlmzNjsbNjs8P79sa93e9vZNu+Z2/VyeV/2er3ez9fz9XhvHbjveTCYTCaTAAAAAAAAgFLKxtoFAAAAAAAAAHkhwAIAAAAAAECpRoAFAAAAAACAUo0ACwAAAAAAAKUaARYAAAAAAABKNTtrFwAAAKxr6dKlWrZsmby9vTV58mS5ubndlueaTCZt3rxZ33//vapVq6b//ve/srHJ/N1aenq64uPjlddmyQ4ODnJxcbktta5evVpBQUHq1q2bGjduXOD7du3apdWrV6tDhw7q3r17CVYIAABQthlMef3JEAAAlGlRUVHy8vJSenq6JOmDDz7Q+++/X6LPvHbtmpYsWaLPP/9cf//9t/n67t27ZTQaNXjwYO3cuVPXr1/Pty+j0ahBgwZpwoQJWrp0qV577TVdvXrV/L6Dg4Nq1qypgQMHavTo0bdU76ZNm9S1a1dJUpUqVRQZGWkO2vISHR0tHx8fcz1//fWXGjVqdEs1AAAA3O2YQggAwF3s3Llz5vBKks6cOVOiz5s9e7Zq1qypQYMGWYRXHh4eqlmzpp566ilt27atQOGVJMXGxmry5Mn65ptvtHLlSovwSpKuX7+u06dPa8yYMfrhhx9uqeY9e/aYj2NiYpSRkVGg+9auXWtRT3Jy8i09P6vY2Fi1bt1adnZ2MhgMVn1V..."},
    "sense": "sense8"
}

HTTP Request

POST https://api.droidtown.co/KeyMoji/Toolkit/

參數說明

參數 型態 預設 功能
username str "" 您在本站註冊時所使用的帳號 (email)。
keymoji_key str "" 在本站購買KeyMoji服務,完成付費後取得的一個具有 31 字符長度的字串。
sense str "" 可為 "sense2"、"sense8" 或 "tension",不可為空值。
將情緒偵測結果投射到二維 (SENSE2)、八維 (SENSE8) 的情緒空間或是文本權重效果獨立成「情緒張力」(Tension) 的結果。
此範例為 sense8。
results list [] 對應參數sense結果的results欄位,不可為空值。

回傳內容說明

回傳訊息 型態 說明
status bool 若成功執行並收到情緒偵測結果,回傳 True;失敗,則回傳 False
msg str 可能為以下的文字:
- Success!: 順利完成情緒偵測作業。
- Invalid arguments.: 上傳參數錯誤,請重新檢查上傳時的參數是否符合規則名稱。
- Invalid content_type.: 上傳格式必須為 Json 格式 (application/json)。
- Your input_str is too long (over 6000 characters.): input_str 超過 6000 字符。
- Authentication Failed.: 無法驗証您的帳號,或是未購買KeyMoji方案。請再檢查一次您使用的帳號是否正確。
- Invalid KeyMoji_Key.: 無效的 keymoji_key。請再檢查一次您的 keymoji_key 是否正確。
- Invalid result.: results內容不符合指定參數sense
- Invalid sense.: sense 所指定的參數不存在。
sense str 此次情緒偵測所使用的功能。
此範例為 sense8。
result dict 將繪製的圖表結果存儲至 dict,內容包含以下
- name: 圖表壓縮檔的名稱。
- base64: base64格式的壓縮檔。

Tension Visual

範例程式:

from requests import post

url = "https://api.droidtown.co/KeyMoji/Toolkit/"
payload = {
    "username": "test@email.com",
    "keymoji_key":"anapikeyfordocthatdoesnwork@all",
    "sense": "tension",
    "results": [0.1791, 0.1667, 0.1, 0.1622, 0.1558, 0.1528, 0.1061, 0.2083, 0.1026, 0.1951, 0.24]
}

response = post(url, json=payload)

回傳結果 (JSON 格式):

{
    "status": true,
    "msg": "Success!",
    "result": {"name": "tension.png",
               "base64": "iVBORw0KGgoAAAANSUhEUgAAA+gAAAH0CAYAAACuKActAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAPYQAAD2EBqD+naQAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4xLjEsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy8QZhcZAAAgAElEQVR4nOzde5Qc1X0v+u+uRz/mqZEEIwkGhM0bW8iRkOIEbJwoKMldcbDNNeacZXFZiXNsjvFZkY2B5Foyy+ZIYCfGsbiwDlk5yc01Aef6kcS+FicIyca2DFgyEGPEGwkEeiJppl/13PeP6l1dPZoZzVT1o7r7+1kLNNPTXVPdXdVTv/377d8WUkoJIiIiIiIiImorrd07QEREREREREQM0ImIiIiIiIhSgQE6ERERERERUQowQCciIiIiIiJKAQboRERERERERCnAAJ2IiIiIiIgoBRigExEREREREaUAA3QiIiIiIiKiFGCATkRERERERJQCDNCJiIiIiIiIUoABOhEREREREVEKMEAnIiIiIiIiSgEG6EREREREREQpwACdiIiIiIiIKAUYoBMRERERERGlAAN0IiIiIiIiohRggE5ERERERESUAgzQiYiIiIiIiFKAAToRERERERFRCjBAJyIiIiIiIkoBBuhEREREREREKcAAnYiIiIiIiCgFGKATERERERERpQADdCIiIiIiIqIUYIBORERERERElAIM0ImIiIiIiIhSgAE6ERERERERUQowQCciIiIiIiJKAQboRERERERERCnAAJ2IiIiIiIgoBRigExEREREREaUAA3QiIiIiIiKiFGCATkRERERERJQCDNCJiIiIiIiIUoABOhEREREREVEKMEAnIiIiIiIiSgEG6EREREREREQpwACdiIiIiIiIKAUYoBMRERERERGlAAN0IiIiIiIiohRggE5ERERERESUAgzQiYiIiIiIiFKAAToRERERERFRCjBA..."},
    "sense": "tension",
}

HTTP Request

POST https://api.droidtown.co/KeyMoji/Toolkit/

參數說明

參數 型態 預設 功能
username str "" 您在本站註冊時所使用的帳號 (email)。
keymoji_key str "" 在本站購買KeyMoji服務,完成付費後取得的一個具有 31 字符長度的字串。
sense str "" 可為 "sense2"、"sense8" 或 "tension",不可為空值。
將情緒偵測結果投射到二維 (SENSE2)、八維 (SENSE8) 的情緒空間或是文本權重效果獨立成「情緒張力」(Tension) 的結果。
此範例為 tension。
results list [] 對應參數sense結果的results欄位,不可為空值。

回傳內容說明

回傳訊息 型態 說明
status bool 若成功執行並收到情緒偵測結果,回傳 True;失敗,則回傳 False
msg str 可能為以下的文字:
- Success!: 順利完成情緒偵測作業。
- Invalid arguments.: 上傳參數錯誤,請重新檢查上傳時的參數是否符合規則名稱。
- Invalid content_type.: 上傳格式必須為 Json 格式 (application/json)。
- Your input_str is too long (over 6000 characters.): input_str 超過 6000 字符。
- Authentication Failed.: 無法驗証您的帳號,或是未購買KeyMoji方案。請再檢查一次您使用的帳號是否正確。
- Invalid KeyMoji_Key.: 無效的 keymoji_key。請再檢查一次您的 keymoji_key 是否正確。
- Invalid result.: results內容不符合指定參數sense
- Invalid sense.: sense 所指定的參數不存在。
sense str 此次情緒偵測所使用的功能。
此範例為 tension。
result dict 將繪製的圖表結果存儲至 dict,內容包含以下
- name: 圖表的檔案名稱。
- base64: base64格式的圖檔。

Loki

Loki 服務介紹

Loki 全文是 Linguistic Oriented Keyword Interface (語言導向的關鍵詞介面),是新一代的自然語言理解 (Natural Language Understanding, NLU) 引擎。

基於句法分析的方式,自動產生 Python 的 Regular Expression (正則表示式) 的條件式 (if...else...) 區塊程式碼。

Loki 相較於微軟的 LUIS 或 Google DiaglogFlow 等利用機器學習或統計機率的傳統方案,在訓練資料量的需求上,能省下極大的功夫。

參考連結:
Loki 的釋出說明影片
Loki 自然語言理解引擎 佈署優勢
用 Loki 解中文的數學應用問題

Loki 快速上手指南

登入 Loki

https://api.droidtown.co/loki/ 登入開始使用Loki

建立專案

輸入專案名稱 (僅接受英文 [a-z, A-Z]、數字 [0-9] 和底線 [_]),點擊[建立專案]

專案名稱

建立專案意圖

  1. 進入[專案]後點擊[建立意圖]

    建立意圖

  2. 輸入意圖名稱 (僅接受英文 [a-z, A-Z]、數字 [0-9] 和底線 [_]),點擊[建立意圖]

    意圖名稱

  3. 若有自定義詞彙,可以自行新增;若無,則進入下一步。

    自定義詞彙

  4. 輸入意圖文句後點擊[單句分析],建議一次一句,若有標點符號,系統會自動忽略。可大量輸入完再點擊[全句分析]

    文本分析

  5. 勾選意圖所需[參數] (通常是會變動的值或詞彙,電腦需要計算的實體)。

    意圖參數

  6. 輸入版本號,點擊[生成模型]

    生成模型

  7. 輸入文句點擊[意圖分析],測試意圖文句,確認是否有偵測到第 4 步所勾選的意圖參數

    測試意圖

  8. 重複 4 至 6 步驟,直到全部訓練的文句皆可偵測其意圖

讀取模型

登入 Loki

https://api.droidtown.co/loki/ 登入開始使用Loki

建立專案

輸入專案名稱 (僅接受英文 [a-z, A-Z]、數字 [0-9] 和底線 [_]),點擊[建立專案]

專案名稱

讀取模型

  1. 讀取 ArticutModel

    在專案下方選擇 ArticutModel 並依序點擊 [瀏覽] > 選擇 ref 檔 (最多 10 個) > [讀取意圖]。

    讀取意圖

  2. 讀取 TXT 純文字

    在專案下方選擇 Txt 並依序點擊 [瀏覽] > 選擇 txt 檔 (最多 10 個) > [讀取意圖]。

    建立意圖

  3. 讀取 LUIS 模型

    在專案下方選擇 LUIS 並依序點擊 [瀏覽] > 選擇 json 檔 (最多 10 個) > [讀取意圖]。

    建立意圖

  4. 讀取 DialogFlow 模型

    在專案下方選擇 DialogFlow 並依序點擊 [瀏覽] > 選擇 json 檔 (最多 10 個) > [讀取意圖]。

    建立意圖

分析並生成模型

後續請從 快速上手指南步驟 4 繼續完成。

更換 Articut 版本

Loki 專案預設使用最新版的 Articut,也能讓使用者選擇偏好的版本。

登入 Loki

https://api.droidtown.co/loki/ 登入開始使用Loki

更換專案 Articut 版本

  1. 在 Articut 下拉選單中選擇要使用的版本,轉換版本需要一點時間,請耐心等待。

    更換 Articut 版本

  2. 更換版本後,進入意圖4. 勾選意圖所需參數區塊中重新勾選紅底的參數。

    意圖參數

  3. 完成後點擊[生成模型]

使用 Loki 範本

Loki 目前提供 Python 和 Java (Android) 兩種程式範本,未來會支援更多的程式語言。

編譯專案意圖的計算邏輯

  1. 回到 Loki 首頁,點擊[專案範本]的程式語言 (如:Python) 開始下載。

    專案範本

    解壓縮 .zip 檔案。檔案目錄結構如下:

    Project.py

    intent/Loki_Intent.py

  2. Project.py檔案,填上USERNAME (使用者帳號)LOKI_KEY (專案金鑰)

    Loki 參數

  3. intent/Loki_Intent.py檔案,開始編譯意圖語意的計算方法。

    意圖範本

  4. 導入專案開始使用Loki

更新 Loki 範本意圖

Loki 目前提供 Python 的意圖更新工具。

  1. 下載新的 Loki 範本,並將intent資料夾放入範本的project/intent/目錄下,並改名爲intent_new

    意圖更新工具目錄

  2. 執行Updater.py並指定新舊意圖的目錄位置。

    • -o指定意圖目錄位置
    • -n指定意圖目錄位置
    • python3 Updater.py -o ./ -n ./intent_new

    意圖更新工具

  3. 執行完畢後,如果意圖有變動的話,將會產生Loki_意圖_updated.py,並將更新的 utterance 放至最下方。

    意圖更新工具結果

使用 Loki API

範例程式:

from requests import post

url = "https://api.droidtown.co/Loki/API/"
payload = {
    "username": "test@email.com",
    "loki_key": "alokikeyfordocthatdoesnwork@all",
    "input_str": "100美金能換多少台幣"
} 

response = post(url, json=payload)

回傳結果 (JSON 格式):

{
    "status": true,
    "msg": "Success!",
    "version": "v193",
    "word_count_balance": 99988,
    "results": [
        {"intent": "Exchange",
         "pattern": "<KNOWLEDGE_currency>[^<]*?</KNOWLEDGE_currency>(<MODAL>[^<]*?</MODAL>)?((<ACTION_verb>[^<不]*?[換][^<不]*?</ACTION_verb>)|(<VerbP>[^<不]*?[換][^<不]*?</VerbP>))<CLAUSE_HowQ>[^<]*?</CLAUSE_HowQ><ENTITY_UserDefined>[^<]*?</ENTITY_UserDefined>",
         "utterance": "[100美金]能換多少[台幣]",
         "argument": ["100美金", "台幣"]}
    ]
} 

HTTP Request

POST https://api.droidtown.co/Loki/API/

參數說明

參數 型態 預設 功能
username str "" 您在本站註冊時所使用的帳號 (email)。
loki_key str "" 在本站使用 Loki 服務,建立專案後會取得一個具有 31 字符長度的字串。
可建立多個意圖專案。
input_str str "" 將要送上 Loki 分析意圖的文字。
注意!每次最大長度不得超過 2000 個字符。
filter_list list [] 預設為空列表,亦即檢查所有意圖。檢查指定的意圖。

回傳內容說明

回傳訊息 型態 說明
status bool 其值為 TrueFalse
msg str 可能為以下的文字:
- Success!: 順利完成意圖偵測。
- No Match Intent!: 專案內未檢查到符合的意圖。
- Invalid content_type.: 上傳格式必須為 Json 格式 (application/json)。
- Invalid arguments.: 上傳參數錯誤,請重新檢查上傳時的參數是否符合規則名稱。
- Authentication Failed.: 無法驗証您的帳號。請再檢查一次您使用的帳號是否正確。
- Invalid Project.: 無效的 loki_key。請再檢查一次您的 loki_key 是否正確,並確保專案內所有模型都已生成。
- Internal server error. (Your word count balance is not consumed, don't worry. System will reboot in 5min, please try again later.): 嗯…似乎我們的伺服器出了點狀況。我們正在努力修復中,5 分鐘內會自動重啟,請稍後再試一次。別擔心,在無法正常回傳斷詞結果的情況下,您帳號的餘額不會被扣除。
version str 本次斷詞作業所使用的演算法版本。
word_count_balance int 您帳號下剩餘可用的字數值。

使用 Loki Bulk API

範例程式:

from requests import post

url = "https://api.droidtown.co/Loki/BulkAPI/"
payload = {
    "username": "test@email.com",
    "loki_key": "alokikeyfordocthatdoesnwork@all",
    "input_list": [
        "100美金能換多少台幣",
        "台幣3000元能換多少美金"
    ]
} 

response = post(url, json=payload)

回傳結果 (JSON 格式):

{
    "status": true,
    "msg": "Success!",
    "version": "v225",
    "word_count_balance": 99976,
    "result_list": [
        {"status": true,
          "msg": "Success!",
          "results": [
              {"intent": "Exchange",
               "pattern": "<KNOWLEDGE_currency>[^<]*?</KNOWLEDGE_currency>(<MODAL>[^<]*?</MODAL>)?((<ACTION_verb>[^<不]*?[換][^<不]*?</ACTION_verb>)|(<VerbP>[^<不]*?[換][^<不]*?</VerbP>))<CLAUSE_HowQ>[^<]*?</CLAUSE_HowQ><ENTITY_UserDefined>[^<]*?</ENTITY_UserDefined>",
               "utterance": "[100美金]能換多少[台幣]",
               "argument": ["100美金", "台幣"]}
           ]},
        {"status": true,
          "msg": "Success!",
          "results": [
               {"intent": "Exchange",
                "pattern": "<ENTITY_UserDefined>[^<]*?</ENTITY_UserDefined><KNOWLEDGE_currency>[^<]*?</KNOWLEDGE_currency>(<MODAL>[^<]*?</MODAL>)?((<ACTION_verb>[^<不]*?[兌換][^<不]*?</ACTION_verb>)|(<VerbP>[^<不]*?[兌換][^<不]*?</VerbP>))<CLAUSE_HowQ>[^<]*?</CLAUSE_HowQ><ENTITY_UserDefined>[^<]*?</ENTITY_UserDefined>",
                "utterance": "[美金][100元]可以兌換多少[台幣]",
                "argument": ["台幣", "3000元", "美金"]}
          ]}
    ]
} 

HTTP Request

POST https://api.droidtown.co/Loki/BulkAPI/

參數說明

參數 型態 預設 功能
username str "" 您在本站註冊時所使用的帳號 (email)。
loki_key str "" 在本站使用 Loki 服務,建立專案後會取得一個具有 31 字符長度的字串。
可建立多個意圖專案。
input_list list [] 將要送上 Loki 分析意圖的文字。
注意!每次最多 20 句且每句長度不得超過 2000 個字符。
filter_list list [] 預設為空列表,亦即檢查所有意圖。檢查指定的意圖。

回傳內容說明

回傳訊息 型態 說明
status bool 其值為 TrueFalse
msg str 可能為以下的文字:
- Success!: 順利完成意圖偵測。
- No Match Intent!: 專案內未檢查到符合的意圖。
- Invalid content_type.: 上傳格式必須為 Json 格式 (application/json)。
- Invalid arguments.: 上傳參數錯誤,請重新檢查上傳時的參數是否符合規則名稱。
- Your input is too many (over 20 sentence).: input_list 超過 20 個句子。
- Authentication Failed.: 無法驗証您的帳號。請再檢查一次您使用的帳號是否正確。
- Invalid Project.: 無效的 loki_key。請再檢查一次您的 loki_key 是否正確,並確保專案內所有模型都已生成。
- Internal server error. (Your word count balance is not consumed, don't worry. System will reboot in 5min, please try again later.): 嗯…似乎我們的伺服器出了點狀況。我們正在努力修復中,5 分鐘內會自動重啟,請稍後再試一次。別擔心,在無法正常回傳斷詞結果的情況下,您帳號的餘額不會被扣除。
version str 本次斷詞作業所使用的演算法版本。
word_count_balance int 您帳號下剩餘可用的字數值。

使用 Loki Command

範例程式:

from requests import post

url = "https://api.droidtown.co/Loki/Command/"
payload = {
    "username": "test@email.com",
    "loki_key": "alokikeyfordocthatdoesnwork@all",
    "intent": "Exchange",
    "utterance": [
        "100美金能換多少台幣",
        "台幣3000元能換多少美金"
    ]
} 

response = post(url, json=payload)

回傳結果 (JSON 格式):

{
    "status": true,
    "msg": "Success!",
    "result_list": [
        {"status": true, "msg": "Success!"},
        {"status": true, "msg": "Success!"}
    ]
} 

使用 Loki Command 來爲意圖快速且大量地增加句子。

HTTP Request

POST https://api.droidtown.co/Loki/Command/

參數說明

參數 型態 預設 功能
username str "" 您在本站註冊時所使用的帳號 (email)。
loki_key str "" 在本站使用 Loki 服務,建立專案後會取得一個具有 31 字符長度的字串。
intent str "" Loki 專案內的意圖名稱。
注意!若意圖不存在將會失敗。
utterance list [] 將要新增至意圖的句子。

回傳內容說明

回傳訊息 型態 說明
status bool 其值為 TrueFalse
msg str 可能為以下的文字:
- Success!: 順利將句子新增至意圖中。
- Invalid content_type.: 上傳格式必須為 Json 格式 (application/json)。
- Invalid arguments.: 上傳參數錯誤,請重新檢查上傳時的參數是否符合規則名稱。
- Authentication failed.: 無法驗証您的帳號。請再檢查一次您使用的帳號是否正確。
- Invalid project.: 無效的金鑰。請再檢查一次您的 loki_key 是否正確。
- Invalid intent.: 專案內不存在此意圖。請再檢查一次您的 intent 是否正確。
- Utterance already exist.: 意圖已存在相同的句子。

CopyToaster

CopyToaster 服務介紹

CopyToaster 的概念是由家喻戶曉的漫畫「Doraemon」中,未來 21 世紀的道具「記憶吐司」而來。記憶吐司使是能夠複製紙張中的內容,並讓吃下去的人馬上記住複製內容的神奇道具。

CopyToaster 的操作就如同記憶吐司,只要將文件內容複製並且貼上 CopyToaster,就能利用各家 Chatbot 搜尋文件。不僅如此,搜尋結果還會依據使用者做個人化調整,成爲私人文件管理的最佳選擇。

CopyToaster 不單單只是搜尋引擎而已,而是結合了 Articut 中文詞性標記語意計算 (Semantic),經過嚴謹的演算法處理以後,令結果更加符合使用者的期待!

CopyToaster 快速上手指南

登入 CopyToaster

https://api.droidtown.co/copyToaster/ 登入開始使用CopyToaster

建立專案

輸入專案名稱,並點擊[建立專案]

專案名稱

建立機器人

進入[專案]後至頁面最下方輸入機器人名稱,並點擊[建立機器人]

機器人名稱

建立文件

  1. 進入[機器人]後點擊[建立文件]

    建立文件

  2. 輸入自定義詞典 (非必要),如產品名稱等特殊名詞。

  3. 輸入文件標題 (非必要)。

  4. 輸入文件內容 (必要),將文件所有內容貼上。

  5. 輸入關鍵字 (非必要),CopyToaster 搜尋時會優先查找關鍵字。

  6. 輸入完以上內容後點擊[儲存]

    建立文件內容

製作記憶吐司

  1. 進入[機器人]後至頁面最下方點擊[製作記憶吐司]

    建立文件

  2. [機器人]的狀態將顯示製作中,製作的時間與文件數量成正比。

    建立文件

  1. 當狀態顯示爲成功時,代表記憶吐司製作完成,下一步請參閱連接 Chatbot

    建立文件

申請 Chatbot (Line 爲例)

登入 Line Developers

https://developers.line.biz/console/ 登入開始建立 Chatbot。

建立帳號

輸入您的名稱與信箱後點擊[Create my account]

建立Account

建立 Provider

  1. 點擊[Create a new provider]

    建立Provider

  2. 輸入 Provider 名稱後點擊[Create]

    Provider名稱

建立 Messaging API channel

  1. 點擊[Create a Messaging API channel]

    建立Messaging API channel

  2. 填寫 Channel 基本資料。

    Channel基本資料

  3. 填寫完畢後點擊最下方的[Create]

    建立Channel

設定 Chatbot 模式

  1. Basic settings標籤下的Basic Information中點擊LINE Official Account Manager連結。

    LINE Official Account Manager

  2. 左側清單點擊回應設定後將回應模式選擇爲聊天機器人自動回應訊息選擇停用並將Webhook選擇啟用後即可關閉LINE Official Account Manager

    Chatbot config

取得 Chatbot 資訊

  1. Basic settings標籤下可以取得Channel secret

    Channel secret

  2. Messaging API標籤下可以取得Channel access token

    Channel access token

連接 Chatbot (Line 爲例)

Webhook URL

https://api.droidtown.co/CopyToaster/{Line/Telegram}/{你的 copytoaster_key}/

設定Webhook

  1. 進入[專案]後點擊[新增 Chatbot 平台]

    新增 Chatbot 平台

  2. 選擇 Chatbot 平台,輸入完 Chatbot 資訊後,點擊[增加平台]

    輸入 Chatbot 資訊

  3. 完成連接 Chatbot 平台後,請將通關密碼給予要加入 Chatbot 的用戶,爲確保安全性,建議定時更換通關密碼,下一步請參閱權限管理

    平台資訊

權限管理

CopyToaster除了使用通關密碼防堵他人使用之外,更提供群組管理,方便管理者調整用戶所能擁有的機器人使用權,進一步加強資訊安全。

  1. 進入[專案]後輸入群組名稱,並點擊[新增群組]

    新增群組

  2. 進入[群組]後勾選群組允許操作的機器人,將預訂成員由左側人員清單中移至右側群組成員中,並點擊[儲存]完成群組權限及人員設定,下一步請參閱開始使用 CopyToaster

    設定群組

開始使用 CopyToaster

  1. 加入 Chatbot 輸入通關密碼暱稱 (不能重複)

    使用者驗證

  2. 當管理員已將您加入群組中,或是[專案]沒有群組的情況下,將會收到CopyToaster搜尋的結果。

    有機器人使用權

  3. 如果[專案]有群組的情況下,而您不是群組成員,將會收到您未擁有使用機器人的權限!的回覆。

    無機器人使用權

使用 CopyToaster API

範例程式:

from requests import post

url = "https://api.droidtown.co/CopyToaster/API/"
payload = {
    "username": "test@email.com",
    "copytoaster_key": "anapikeyfordocthatdoesnwork@all",
    "input_str": "DT_BOT 國內疫情的狀況"
}

response = post(url, json=payload)

回傳結果 (JSON 格式):

{
    "status": true,
    "msg": "Success!",
    "results": [
        {"title": "[新聞] 增2例本土!周志浩開會一半「快跑離席」", "document": "內文 ..."},
        {"title": "[新聞] 國發會:明年經濟成長目標上看4.2% 每人", "document": "內文 ..."},
        {"title": "[新聞] 防疫撐經濟》今年台灣經濟成長 有望超越", "document": "內文 ..."}
    ]
} 

CopyToaster 除了能夠使用各家的 Chatbot 快速串接之外,亦提供了呼叫 API 的模式,讓使用者有更大的彈性設計屬於自己的記憶吐司。

HTTP Request

POST https://api.droidtown.co/CopyToaster/API/

參數說明

參數 型態 預設 功能
username str "" 您在本站註冊時所使用的帳號 (email)。
copytoaster_key str "" 在本站使用 CopyToaster 服務,建立專案後會取得一個具有 31 字符長度的字串。
input_str str "" 爲兩個部分組合,機器人名稱加上尋找內容的自然語言描述。
例:小精靈 我要找請假文件。

回傳內容說明

回傳訊息 型態 說明
status bool 其值為 TrueFalse
msg str 可能為以下的文字:
- Success!: 成功尋找到相關文件。
- No match document.: 找不到相關的文件。
- Invalid content_type.: 上傳格式必須為 Json 格式 (application/json)。
- Invalid arguments.: 上傳參數錯誤,請重新檢查上傳時的參數是否符合規則名稱。
- Authentication failed.: 無法驗証您的帳號。請再檢查一次您使用的帳號是否正確。
- Invalid project.: 無效的金鑰。請再檢查一次您的 key 是否正確。
- Invalid bot.: 專案內不存在此機器人。請再檢查一次您的 input_str 中包含的機器人是否正確。

使用 CopyToaster Command

範例程式:

from requests import post

url = "https://api.droidtown.co/CopyToaster/Command/"
payload = {
    "username": "test@email.com",
    "copytoaster_key": "anapikeyfordocthatdoesnwork@all",
    "bot": "DT_BOT",
    "document": [{"title": "標題 (選填)",
                  "document": "內文 (必填)",
                  "hashtag": "關鍵字 (選填)"}]
}

response = post(url, json=payload)

回傳結果 (JSON 格式):

{
    "status": true,
    "msg": "Success!"
} 

使用 CopyToaster Command 來爲機器人快速且大量地增加文件。

HTTP Request

POST https://api.droidtown.co/CopyToaster/Command/

參數說明

參數 型態 預設 功能
username str "" 您在本站註冊時所使用的帳號 (email)。
copytoaster_key str "" 在本站使用 CopyToaster 服務,建立專案後會取得一個具有 31 字符長度的字串。
bot str "" CopyToaster 專案內的機器人名稱。
注意!若機器人不存在將會失敗。
document list [] 將要存入機器人文件庫的文件。

回傳內容說明

回傳訊息 型態 說明
status bool 其值為 TrueFalse
msg str 可能為以下的文字:
- Success!: 順利將文件新增至機器人中。
- Invalid content_type.: 上傳格式必須為 Json 格式 (application/json)。
- Invalid arguments.: 上傳參數錯誤,請重新檢查上傳時的參數是否符合規則名稱。
- Authentication failed.: 無法驗証您的帳號。請再檢查一次您使用的帳號是否正確。
- Invalid project.: 無效的金鑰。請再檢查一次您的 key 是否正確。
- Invalid bot.: 專案內不存在此機器人。請再檢查一次您的 bot 是否正確。
- Document create failed.: 請再重試一次,如果依然無法解決,請 來信 或至 Facebook 粉絲頁 通報!

SPACE

SPACE 服務介紹

空間資訊是語言中「很.重.要」的一部份!

SPACE 是專為台灣設計的 [地址] - [座標] 查詢系統!可進行「座標」與「地址、行政區名稱甚至是景點」之間的雙向查詢。

此外,更整合了中文地址時最常用的:
1. 郵遞區號 (是最新的 3+3 的版本)
2. 中文地址翻譯成英文地址 等功能。

[台灣地點] → [座標]

範例程式:

from requests import post

url = "https://api.droidtown.co/Space/API/"
payload = {
    "username": "test@email.com",
    "api_key": "anapikeyfordocthatdoesnwork@all",
    "type": "geocoding",
    "site": "台北市信義區信義路五段7號"
}

response = post(url, json=payload)

回傳結果 (JSON 格式):

{
    "status": true,
    "msg": "Success!",
    "input_str": "台北市信義區信義路五段7號",
    "results": [{
        "adm1": "臺灣",
        "adm2": "台北市",
        "adm3": "信義區",
        "zipcode": "110615", (3+3郵遞區號)
        "addr": "No. 7, Sec. 5, Xinyi Rd., Xinyi Dist., Xinyi Dist. 110, Taiwan (R.O.C.)", (英文地址)
        "lat": "25.03352417862818",
        "lng": "121.5646039976071"
    }],
    "balance": 2999
}

Geocoding ([台灣地點] → [座標])
能查詢地點 (大安區)、景點 (法鼓山) 或地址 (台北市信義區信義路五段7號)

HTTP Request

POST https://api.droidtown.co/Space/API/

參數說明

參數 型態 預設 功能
username str "" 您在本站註冊時所使用的帳號 (email)。
api_key str "" 在本站購買斷詞服務額度,完成付費後取得的一個具有 31 字符長度的字串。
type str "" 可為 geocodingreversegeocoding
指定為 geocoding 時,您將進行地理資訊查詢。
若指定為 reversegeocoding 將進行反向地理資訊查詢。
如果此項留白,將無法順利進行 SAPCE 服務。
site str "" type 指定為 geocoding 時,將要送上 Space 進行地理資訊查詢的台灣地點或是台灣地址。

回傳內容說明

回傳訊息 型態 說明
status bool 若成功執行並取得查詢結果,回傳 True;失敗,則回傳 False
msg str 可能為以下的文字:
- Success!: 順利完成地理資訊查詢作業。
- Authtication failed.: 無法驗証您的帳號。請再檢查一次您使用的帳號是否正確。
- API_Key failed.: 無效的 api_key。請再檢查一次您的 api_key 是否正確。
- Insufficient word count balance.: 您帳號下的地理資訊查詢次數餘額不足以處理本次查詢需求。
- Invalid arguments.: 上傳參數錯誤,請重新檢查上傳時的參數是否符合規則名稱。
- Internal server error. (Your word count balance is not consumed, don't worry. System will reboot in 5min, please try again later.): 嗯…似乎我們的伺服器出了點狀況。我們正在努力修復中,5 分鐘內會自動重啟,請稍後再試一次。別擔心,在無法正常回傳地理資訊查詢結果的情況下,您帳號的餘額不會被扣除。
input_str str/dict 進行 geocoding 查詢時,為查詢台灣地點或台灣地址。
balance int 您帳號下剩餘可用的查詢次數。
results list 列表中含有查詢到的地理資訊 dict。
str - adm1: 地點/地址所在的中華民國第一行政區名稱。
str - adm2: 地點/地址所在的中華民國第二行政區名稱。
str - adm2: 地點/地址所在的中華民國第三行政區名稱。
str - lat: 地點/地址所在緯度。
str - lng: 地點/地址所在經度。
str - zipcode: 地址 3+3 郵遞區號。
str - addr: 地址英譯。

[台灣座標] → [地點]

範例程式:

from requests import post

url = "https://api.droidtown.co/Space/API/"
payload = {
    "username": "test@email.com",
    "api_key": "anapikeyfordocthatdoesnwork@all",
    "type": "reversegeocoding",
    "lat": "25.03352417862818",
    "lng": "121.5646039976071"
}
response = post(url, json=payload)

回傳結果 (JSON 格式):

{
    "status": true,
    "msg": "Success!",
    "input_str": {"lat": "25.03352417862818", "lng": "121.5646039976071"},
    "results": [{
        "adm1": "臺灣",
        "adm2": "台北市",
        "adm3": "信義區",
        "street": "松廉路",
        "place": null,
    }],
    "balance": 2998
}

ReverseGeocoding ([台灣座標] → [地點])

HTTP Request

POST https://api.droidtown.co/Space/API/

參數說明

參數 型態 預設 功能
username str "" 您在本站註冊時所使用的帳號 (email)。
api_key str "" 在本站購買斷詞服務額度,完成付費後取得的一個具有 31 字符長度的字串。
type str "" 可為 geocodingreversegeocoding
指定為 geocoding 時,您將進行地理資訊查詢。
若指定為 reversegeocoding 將進行反向地理資訊查詢。
如果此項留白,將無法順利進行 SAPCE 服務。
lat str "" type 指定為 reversegeocoding 時,將要送上 Space 進行反向地理資訊查詢的緯度。
lng str "" type 指定為 reversegeocoding 時,將要送上 Space 進行反向地理資訊查詢的經度。

回傳內容說明

回傳訊息 型態 說明
status bool 若成功執行並取得查詢結果,回傳 True;失敗,則回傳 False
msg str 可能為以下的文字:
- Success!: 順利完成地理資訊查詢作業。
- Authtication failed.: 無法驗証您的帳號。請再檢查一次您使用的帳號是否正確。
- API_Key failed.: 無效的 api_key。請再檢查一次您的 api_key 是否正確。
- Insufficient word count balance.: 您帳號下的地理資訊查詢次數餘額不足以處理本次查詢需求。
- Invalid arguments.: 上傳參數錯誤,請重新檢查上傳時的參數是否符合規則名稱。
- Internal server error. (Your word count balance is not consumed, don't worry. System will reboot in 5min, please try again later.): 嗯…似乎我們的伺服器出了點狀況。我們正在努力修復中,5 分鐘內會自動重啟,請稍後再試一次。別擔心,在無法正常回傳地理資訊查詢結果的情況下,您帳號的餘額不會被扣除。
input_str str/dict 進行 reversegeocoding 時,為查詢台灣座標的地理資訊。
balance int 您帳號下剩餘可用的查詢次數。
results list 列表中含有查詢到的地理資訊 dict。
str - adm1: 座標所在的中華民國第一行政區名稱。
str - adm2: 座標所在的中華民國第二行政區名稱。
str - adm2: 座標所在的中華民國第三行政區名稱。
str - lat: 進行查詢的緯度。
str - lng: 進行查詢的經度。
str - street: 離座標最近的台灣道路。
str - place: 離座標 100 公尺內最近的台灣景點,若無回傳 null。