微信機械人 04 自然語言處理簡單實現

2021-08-27 16:41:09 字數 2593 閱讀 2965

建庫:

先來看兩個對話:

問:今天吃什麼答:麵條

問:今天吃麵條答:太好了

機械人要如何來記憶這兩組對話呢?

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分詞

這兩個我也只是掃了一眼,有興趣直接

google

吧。

智慧型電話機械人核心技術 自然語言處理

智慧型 機械人公司在介紹 機械人技術的時候,都會提到三大核心技術 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 訊息,他們侷限性太大了,所以...