也來寫機器人 – 後半

原本寫的機器人,是在做Line跟Facebook的機器人平台串接測試,所以後台的功能一模一樣,算是重複且浪費,尤其是後來一直增加功能,要在兩邊不斷的copy/paste,很傻。

因此,我把前後台切開,原本寫的功能只留下Line跟Facebook平台串接功能,後端的文字服務就獨立的寫在

https://github.com/orsonwang/text_Service

裡面的程式就很單純的,扮演nats的服務接收端,等待前面的服務要求,找出對應的回應來回覆給前端。

使用RegExp來做文字服務只有一個大原則,『從大從長優先』,對照的指令,關鍵字越長的要擺在前面,字數越多的要擺在前面,最後再擺上短句,這樣就不會出錯了。

裡面應用了golang的空switch多重case的語法,也就是在以前要寫長長的if-else if敘述的部分,用case處理,乾淨點也好整理調整。

以下是範例

   case matchString("(美元|美金|USD)+.*匯率+.*", strAfterCut):
        strResult = "美金匯率\n" +
            "現金買入 " + exRates["美金"].inCashRate + "\n" +
            "現金賣出 " + exRates["美金"].outCashRate + "\n" +
            "即期買入 " + exRates["美金"].inRate + "\n" +
            "即期賣出 " + exRates["美金"].outRate
        break
    case matchString("匯率+.*(美元|美金|USD)+.*", strAfterCut):
        strResult = "美金匯率\n" +
            "現金買入 " + exRates["美金"].inCashRate + "\n" +
            "現金賣出 " + exRates["美金"].outCashRate + "\n" +
            "即期買入 " + exRates["美金"].inRate + "\n" +
            "即期賣出 " + exRates["美金"].outRate
        break
    case matchString("(美元|美金|USD)+.*", strAfterCut):
        strResult = "美金匯率\n" +
            "現金買入 " + exRates["美金"].inCashRate + "\n" +
            "現金賣出 " + exRates["美金"].outCashRate + "\n" +
            "即期買入 " + exRates["美金"].inRate + "\n" +
            "即期賣出 " + exRates["美金"].outRate
        break

先處理「幣別」-匯率,然後處理倒裝的匯率-「幣別」,最後沒東西了,送給使用者「幣別」的預設處理,這樣就完成了在一個句子裡查詢單一匯率的功能。

當然,如果你想要對應來亂的一個句子放兩個幣別,甚至於穿插其他關鍵字,那你就需要使用/撰寫具有NLU(Natural Language Understanding)能力的文字處理引擎,如果你有寫好了,請告訴我,我想用。

發表迴響

你的電子郵件位址並不會被公開。 必要欄位標記為 *