2.2 匹配
可以被描述成如下流程:S1:用戶通過聊天界面向系統提出一個話題;S2:系統對該話題進行分詞處理;S3:在系統知識庫中尋找與該話題匹配的話語回復用戶。
基于詞典的分詞算法分為詞典加載、預處理、最大匹配、歧義消解幾個階段。
其具體流程如下:
S1:預處理階段,按照特殊字符(英文字母、數字、標點符號等)將待分析文本進行斷句,將待切分的文本切分為只有中文的短句子,這些句子是下一步分詞處理的基本單位;
(舉個栗子:輸入“asdfadf東北師范大學哈哈哈dfadflakfl(*^__^*) 嘻嘻……”,simi只會對其中的中文“東北師范大學哈哈哈嘻嘻”做出響應;輸入“(*^__^*)”時,輸出“I have no response.”)
S2:對斷句出來的句子進行雙向最大匹配(雙向匹配,長詞優先)分詞,分詞后的結果作為S3的輸入;
(舉個栗子:輸入“東京古巴比倫”,正向與反向切詞結果均為《東京,古巴比倫》,長詞優先,所以simi只對“古巴比倫”做出響應;輸入“古巴比倫埃菲爾鐵塔”,正向與反向切詞結果均為《古巴比倫,埃菲爾鐵塔》,此時Simi對“埃菲爾鐵塔”做出響應)
S3:對上一步分詞得到的結果進行比較,判斷是否存在歧義,如果存在歧義,就進行一定的歧義消解;
S4:重復S2、S3,直到處理完步驟一中斷句所切分出的所有句子單元。
算法流程如圖所示:

這里給出與小黃雞對話的例子:我問小黃雞:“埃菲爾鐵塔上45度角仰望星空”。
S1:雙向最大匹配分詞:正向反向均為《埃菲爾鐵塔上,45度角,仰望星空》,沒有歧義。長詞優先,系統選擇了“埃菲爾鐵塔上”作為關鍵詞;
S2:系統在知識庫中用剛才說的哈希函數f(埃菲爾鐵塔上),找到比如[埃,11,P] 的表項,順著指針找到6字詞的索引,順著索引找到6字詞表,遍歷詞表,找到<埃菲爾鐵塔上,…>結構體;
S3:系統隨機選擇該結構體Ans域中的一個回答(也有可能是根據頻率高低來選擇)。比如“兩年之后等著你”。
S4:輸出回答,匹配結束。
Part 3 如何自制小黃雞
根據第二部分所介紹的原理,個人想要真正完成整個小黃雞的制作是有難度的。如果能做出一個智能較高的聊天機器人,那直接可以去申請專利開公司了~
所以在這里我們介紹兩種比較簡單易行的方法,跳過對智能算法的研究,直接調用SimSimi的庫。
3.1 通過獲取Cookies方法
首先我們來看人人網小黃雞是怎么做的。
原作者團隊在github上給出了源代碼,網址https://github.com/wong2/xiaohuangji,他們使用Python語言,獲取Cookies,通過人人網的接口,將Simi的庫連接到人人上。
也就是說,人人網小黃雞并沒有真正研究第二部分講到的 AI聊天機器人的算法,而是通過調用人家Simi的庫!這就是人人網小黃雞跟Simi的關系。
Cookies:指某些網站為了辨別用戶身份、進行session跟蹤而儲存在用戶本地終端上的數據(通常經過加密)。利用網頁代碼中的HTTP頭信息進行傳遞。
(舉個栗子,我們第一次登錄保研論壇時輸入用戶名與密碼,然后選擇保存密碼,就相當于保存Cookies,下次再打開eeban就不用再登錄了~
Cookies作為一個大有用處的存在,同時也極大地危害著網絡信息安全。因為是可以通過例如JS腳本等方法竊取Cookies的。想想看,別人獲取了你的Cookies,都不用知道你的用戶名密碼就能以你的身份查看郵件,瀏覽網頁等等……當然這是題外話,有興趣的我們以后討論~所以希望大家能經常清理自己的Cookies,不給壞人可乘之機~~)
回到我們的小黃雞,下圖是人人網小黃雞源代碼中關于獲取Cookies的一段:

我們要自制呢,就不用他們那么麻煩~咱們只要幾行小代碼就可以了~
簡單介紹一下核心算法:
S1:利用session對象獲取本機在http://www.simsimi.com/talk.htm 上的Cookies
(session,在網絡應用中被稱為“會話”。簡單地說,它就像在網站頂層的一個盒子,無論網頁怎么跳轉,都能夠保存用戶的信息。這里注意!Talk頁是Simi免費的聊天頁面,這一點很重要!)
S2:構造頭信息,準備將Cookies添加在HTTP頭部信息中
S3:從SimSimi API接口中獲取本機的響應
(剛才說過,Cookies利用HTTP頭信息進行傳遞,所以我們將剛才talk頁上的Cookies添加在 API頁上,相當于是talk頁在調用API!!!這一點很重要。
舉個栗子,我們拿著一把鎖,去找talk頁,talk給了我們一把鑰匙,但是我們開鎖手法我們不知道,于是我們將鎖+鑰匙一起送給API,然后它幫我們打開了盒子~~~bling~~bling~~)
來,我們看看原理圖:

下面是我用這個方法做的小黃雞1號:

確切的說是這是一只小黃雞與一只小黃鴨的互掐。哈哈!
想要做小黃雞,這是一個省時省力的方法,但是。。。不得不說這是在盜用SimSimi的勞動成果。。。人家指望它的API庫賣錢的呢。。。。額額額
所以接下來我們來看正版的制作方法~~
3.2 通過key調用API接口
下面這個網址給出了SimSimi的官方API文檔:http://developer.simsimi.com/api

文檔已經寫得非常清晰了,http://api.simsimi.com/request.p?key=your key&lc=en&ft=1.0&text=hi這一行代碼就是在調用官方API接口!也就是說,只要你申請到了key,就能調用simi的API,是不是想想就很爽?~最開始我給大家的小黃雞2號就是正版雞有木有~現在來講解一下怎么做。我選擇J2EE平臺,MVC模式,JSP+JAVA語言。
最核心的思想是這樣的:我們將從表單中獲取的字符串,送去調用官方API接口,用request對象返回結果,再打到屏幕上~~是不是很簡單?
下面介紹詳細算法流程:
S1:talk.jsp——用戶填寫表單內容,將參數String text傳遞給chuil.jsp;
S2:chuli.jsp——request對象獲取傳遞來的參數,調用API,用Content類中的getContent(urls)方法獲取網頁的內容,返回結果String ans,將ans傳遞給talk.jsp;
S3:talk.jsp——request對象獲取傳遞來的參數ans,將ans打印到屏幕上。結束。
*其中Content類用于獲取網頁內容,直接上網找的,都不用自己寫~hiahia
這是小黃雞2號的效果圖:

正版的方法就是簡單~但是因為是正版的,就得付出代價,key是要錢的。我現在用的是試用版,key的有效期限是90天,并且每天只有100次響應,也就是說你一天只能調戲它100次。。。是不是很桑感。
總結
經過這么多的介紹,大家是不是對類似小黃雞(SimSimi)的人工智能聊天機器人有了初步的認識。其實你可以做很多只“小黃雞”,但它的核心都是Simsimi的庫,是人家的東西。所以說偶們新時代的年輕人應該要有自己創新意識~讓我們來開發自己的智能算法~做自己的小黃雞、小黃鴨、小黃狗、小黃瓜吧!~~
問答環節
訓練的話玩家調戲它的數據會被錄入作為以后回答別人的參考么?還是需要相應權限才能存入庫里?
這個就是教學界面。會的。玩家教給它的話題,會在切詞之后,打包它的回答,一起存入詞庫。別人觸發相似的關鍵詞,也有可能回答剛剛你教過的答案。
那一個問題有不同答案,如何選擇呢?
一個關鍵詞下鏈接了好幾種不同的回答,系統會隨機選擇一個,比如輸入“哈哈”,回答有可能是“呵呵”“笑什么笑”……
以前的這個詞表里面對于每個可能出現的詞已經有了確定的答案的意思嗎?
對,構建詞庫的時候,還有訓練的時候都已經寫進去了
但是訓練的時候不能隨便的吧?萬一教他的是錯誤的知識呢?
誰都可以~~但是一般會有過濾系統,要審核的,像simi就有做任務這個玩法,任務就是,給你別人的回答,讓你判斷是否可以給不滿16歲的孩子看,也有存進去的時候設置敏感詞什么的。
