建庫:
先來看兩個對話:
問:今天吃什麼答:麵條
問:今天吃麵條答:太好了
機械人要如何來記憶這兩組對話呢?
1、直接儲存
問題答案
今天吃什麼
火鍋今天吃麵條
不好吃這樣儲存當然沒有問題,但是顯然太土了,有沒有其它的辦法呢?
2、樹在儲存過程中,總是希望能夠去除冗餘,即相同的詞語能夠只儲存一次。很容易想到,把句子拆分成詞來儲存。
如圖所示,每個問題都拆分成詞,並以詞為節點建立樹。每個幾點可以與乙個答案(或者多個答案)關聯。這樣的儲存方式比直接儲存要精細很多,儲存空間小、查詢效率高。
實際建立的樹結構如下:
樹儲存特點介紹
ø 根節點不儲存任何資訊;
ø內部節點和葉子節點都可以與答案關聯;
ø 這棵樹類似於b樹的結構,即乙個節點可以有n個子節點;
ø 樹的高度與乙個句子中包含的詞語個數有關。
分詞
注意到以樹來記憶對話,需要把問題進行拆分,即分詞。
分詞是自然語言處理裡非常關鍵的一部分,用於把句子拆分成詞,進行儲存、匹配。分詞的實現包含兩個部分:
ø 分詞演算法
即按照什麼樣的規則來切割句子,比如從頭開始切還是從結尾開始切,有多種切割選擇時如何決策等等。
ø 知識庫
知識庫即一些常用的詞語,分詞演算法依賴知識庫來識別元詞(即由多個漢字組成的有意義的詞)。知識庫是否豐富,對演算法的精確度有很大的影響。
分詞演算法我是不太懂,這裡也不做過多的描述,有興趣可以去研究下比較有名的開源分詞軟體如:ik分詞器等。
比如在瀏覽器中輸入
返回json格式的結果:
[
,
,]
匹配
匹配演算法也很簡單,關鍵是幾個模糊匹配的規則。
假設資料庫中記錄了這樣乙個問題:abcd,其中,a、b、c、d分別代表乙個詞語。
而可能遇到的問題有如下幾種:
1. abc
由於資料庫中沒有abc對應的答案,而前幾個詞完全匹配,那麼繼續搜尋c的子節點,知道找到有答案的節點,將該答案作為abc的答案返回。比如,記錄的對話為:2. abcd問題:你 在 幹嘛 呢
答案:發呆
此時如果使用者提問:你 在 幹嘛,會匹配到「你在幹嘛呢」這個問題,並獲得答案「發呆」。
完全匹配,不多說。3. abcde
雖然前四個詞完全匹配,但是多了乙個e,則認為是乙個新問題,不能匹配,沒有答案。4. xabc5. xabcd6. xabcde
4、5、6這三種情況可分別轉換為1、2、3三種情況。當發現問題的首字不匹配時,則去掉首字,重新匹配。比如,記錄的對話為:7. cd問題:今天 還有 火車票 嗎
答案:賣完了
此時如果使用者提問:請問 今天 還有 火車票 嗎,首詞「請問」無法匹配,則去掉首詞,得到新的問題今天 還有 火車票 嗎,與原問題匹配,得到答案「賣完了」。
也遵循上面的處理原則,去掉不匹配的首詞,但c、d作為首詞均不能匹配到abcd,故該問題沒有答案。以上即使奇蹟蛋的自然語言模組的設計,很簡單吧^_^
關於**及資料庫實現會在後面以整個工程上傳,其實並不複雜,相信各位有更精妙的實現方法。
這裡的自然語言處理只是乙個簡化的實現,後面如果有時間,會去研究相關的資料,這裡也放出一些相關的資訊,各位感興趣的話可以去研究下,期待你的分享。
øaiml (artificial intelligence markup language)
國外乙個很優秀的開源人工智慧專案,有豐富的語料庫,很多聊天機械人都用它來實現。不過原版堆對中文的支援不好,需要修改下原始碼。
ølucence ø
ik分詞
這兩個我也只是掃了一眼,有興趣直接
吧。
智慧型電話機械人核心技術 自然語言處理
智慧型 機械人公司在介紹 機械人技術的時候,都會提到三大核心技術 asr nlp tts,也都會說是公司自主研發的技術.今天,我們來了解一下智慧型 機械人的其中乙個技術 自然語言處理,簡稱為nlp.什麼是自然語言處理?自然語言處理是電腦科學領域與人工智慧領域中的乙個重要方向.它研究能實現人與計算機之...
微信機械人扯淡聊天
這裡我用了簡單的別人開發的機械人介面,也可以使用比較強大點的機械人,比如小黃雞機械人,也僅僅是簡單的文字訊息,後面會加上一些豐富的表情和 我使用了php curl擴充套件,當然用php自帶函式get file content和socket同樣可以 我將這個功能放到了 robot.php 如下 cur...
c 做微信機械人
本節主要說下hook的原理,其實hook分很多種,我們最說的hook就是 inline hook,是用的最廣泛的也是自由度最大的,相交於其他hook 比如有 apihook 訊息hook 等等hook,他們都有侷限性,apihook只能hook windows 的api 訊息,他們侷限性太大了,所以...