用.NET開發MSN聊天機器人

http://www.sincnc.com
2004年12月30日21:56
新迅

用.NET開發MSN聊天機器人 - MSN聊天機器人開發揭祕。



寫在前面:
我不是開發人員,不是高手,就是自己比較愛玩。在技術上,沒有什麼喜歡摸索的精神,而是喜歡投機取巧。在這篇文章裏,你也不能"少勞而獲"地通過我的機器人修改出一個自己的機器人,因爲自己覺得程序寫的比較臭,所以不會open source。但是,如果你對.net或者C#有點了解的話,相信從這篇文章裏,你可以找到一切所需的資源,來開發一個自己的,絕對可用的msn機器人。要和我的機器人聊天,可以加[email protected],名字叫“塔奇克馬”,是從動畫片攻殼機動隊得名。同時,你也可以去http://www.guanqun.com,那裏有一個和這個MSN機器人一樣的網頁聊天機器人,可以先聊聊看,儘量用中文聊。


這不是一篇新手入門的文章,如果你不知道什麼是.NET,不瞭解數據庫方面的哪怕是一丁點東西,建議你先看看。同時,也希望真正的高手不要笑話打擊我,畢竟一個普通的,非開發人員的電腦愛好者通過摸索,並告訴大家怎樣做一個好玩的東西,不是一件錯事。


一、爲什麼要做MSN聊天機器人


1 我能想到的原因


最重要的是因爲很好玩。你的MSN機器人說的話,一定體現你的性格(如果你希望這樣的話)。當然,這是我的理由,作這個機器人的初衷僅僅是突然有一天自己想做。也許你也希望你的機器人可以幫助你做一些事情,類似一個專家系統或是客服系統等等。


2 現在的MSN聊天機器人


現在MSN機器人有很多,如果你加過MSN機器人,我想你列表上最多的是一個叫做“小布”或者是他兄弟姐妹一大堆的傢伙們(http://www.9zi.com),可能基於負載的考慮,每次上線你都可能被他們一家子的一堆加入好友的請求包圍。還有一些所謂的“免費短信”機器人,我一直就是做SP的,我直接說,爲了不耽誤你們賺錢,我不對這種機器人加以什麼評論。可以提一下MsgerAI([email protected])這個機器人,開發它的這位老兄非常希望做一個可以像人一樣具有智能的東西,雖然可能在他有生之年都無法完成,不過我還是祝他成功。畢竟有夢想就是好的,而且這個機器人現在也可以爲他完成些工作(http://www.funnyok.net/nlp)。還有一些其他的MSN機器人,比如專門提供信息查詢服務的,幫你搜索google的等等。MSN進行時裏面有列表(http://www.msning.com),自己去看看就好了。


二、爲什麼用.NET


其實理由很簡單。C#和Java很像,但是Java我實在找不出一個非常好用的,符合自己使用習慣的IDE來。而C#就不同,Vs.NET(http://msdn.microsoft.com/vstudio/) 當然最好用,C# Builder(http://www.borland.com/csharpbuilder/)也不錯,連SharpDevelop(http://www.icsharpcode.net/OpenSource/SD/)用起來都相當舒服。所以選擇.NET比較好。


另外,.NET在開發上非常方便,只要你有一點點開發基礎,用.NET寫程序就不是很難。我是站在一個使用者而非開發者的角度,不用去鑽研太多技術層面,或是優化的東西,我沒那能力也不想進微軟研究院。


建議你使用最新版Visual Studio.NET,可以省去很多麻煩的事兒。


同時,.NET開發可以找到的資源也有很多,我們接下來會提。


三、你要一個什麼樣的聊天機器人


1 開發前的設想


我這裏討論的就是“聊天機器人”這個概念,意思是,他能做的就是陪你聊天。你要有一個程序去“教”他說話,同時要讓他明白話語中包含的大概意義,還能夠做基本上不怎麼離譜的回答。


2 還可以讓他做什麼


你還可以讓他做很多其他的事情,比如查詢ip,手機號碼,註冊號,航班號,或者直接讓他去查google,幫你搜索。這些也都不是什麼麻煩的事情,只要你想。


四、先讓機器人開口說話


不管你的機器人聰不聰明,讓他能在MSN上象摸象樣地回答是最重要的。所以,你需要有一個MSN帳號,連接到MSN服務器,取得各種服務器的消息,同時發送消息回服務器。


當然,你可以分析MSN的協議(http://www.hypothetic.org/docs/msn/index.php),自己寫通訊部分。不過我提過,我是個喜歡投機取巧的人,所以,找個能用的接口用就好了。所以,我找了些MSN的開發接口。


MSNHelper:
http://sourceforge.net/projects/msnphelper/


dotMSN:
http://members.home.nl/b.geertsema/dotMSN/


這兩個都是爲.NET開發的,我用dotMSN,它使用MSNP8協議。注意dotMSN不要用sourceforge上的版本,要用上面給出的地址。
接下來,下載這個例子:
http://members.home.nl/b.geertsema/dotMSN/...ple/Example.zip


用vs.net打開,編譯,執行。


看懂了吧。登錄之後隨便雙擊列表上的某個人,會發送給這個人一句"Hello world!"。你已經可以不通過MSN原來的程序,而直接和人說話了。


這部分的代碼是這樣的:


private void ContactJoined(Conversation sender, ContactEventArgs e)
{
// someone joined our conversation! remember that this also occurs when you are
// only talking to 1 other person. Log this event.
Log.Text += e.Contact.Name + " joined the conversation./r/n";


// now say something back. You can send messages using the Conversation object.
sender.SendMessage("Hello world!");
}


意思是當對方加入聊天后,你就給他發一個"Hello world!"的消息過去。這時候如果你列表上的人雙擊你的名字,也同樣會收到一個Hello World!。


五、讓機器人懂中文


1 數據庫


因爲我們要做中文聊天機器人,語料庫的大小直接關係到你的機器人是不是聰明。由於自己的習慣,我用了mysql作爲存放語料庫和中文分詞庫的數據庫。而且mysql速度極快。當然,你要用Access或者Sql Server,完全可以,而且更容易些。.NET調用Mysql的庫可以在這裏找到MySQL Driver CS
http://sourceforge.net/projects/mysqldrivercs/



2 整句匹配


整句匹配這個概念很簡單。聊天嘛,不認識的人一般都會要上來就說“你好”,或者“hi~~”之類的。這種話通常很簡單,而且沒有什麼太多的變化,直接讓機器人回答就行了。比如對方說“你好”,機器人看到這個“你好”,就直接回答“你好”,就可以了。或者對方說"88",你可以讓機器人說“再見”,或者88什麼的。。這就叫整句匹配。就是機器人拿到整個的句子,在庫裏面一查,啊,庫裏有這句話怎麼回答,挑出一句回答過去,對方不會覺得這個機器人笨。


甚至如果對方說“你好笨”,你讓機器人回答“我纔不笨呢”,對方一定會覺得,這個機器人還行,還知道別人說他笨。


3 中文分詞


一個聊天機器人當然要懂些中文。中文處理的基礎就是中文分詞。分詞是什麼?“分詞就是將連續的字序列按照一定的規範重新組合成詞序列的過程。”這個定義是我抄的。請查閱這篇文章:http://www.hylanda.com/center/knowledge.htm 他們做中文分詞應該有一定成績。國內的分詞系統,ICTCLAS做得也比較好。有VC的源代碼,可以下來看看。
http://www.nlp.org.cn/project/project.php?proj_id=6


有人會說,這個東西我不懂,我也沒研究過。其實我也不懂。只不過,如果不做中文分詞,聊天機器人就只能停留在證據匹配的地步。我們可以使用最大匹配法,對聊天機器人接收到的話做簡單的分詞。關於算法,請參閱詹衛東先生的這個講義,估計你一看就明白了。


課程名稱:中文信息處理基礎


http://ccl.pku.edu.cn/doubtfire/Course/Chi...2002_2003_1.htm


下載這個PPT講義:http://ccl.pku.edu.cn/doubtfire/Course/Chinese%20Information%20Processing/contents/Chapter_07_1.ppt


分詞算法不需要太複雜,簡單點就好。


另外分詞算法需要一箇中文分詞庫。我提供了一個mysql的,這裏可以下載。導入到你的mysql裏面就可以。其他數據庫其實把sql語句簡單改改也可以用。
中文分詞庫下載:http://www.guanqun.com/down/wordlist.rar


4 詞語的匹配


僅僅會分詞還不夠,如果真的要讓機器人瞭解人說的話,肯定需要一些人工智能的算法。我們就是做個機器人玩玩,沒必要研究的那麼深。人工智能走到現在,太聰明的聊天機器人也少之又少。而且,讓專業的研究人員去研究就好了,我們僅僅就是玩玩。所以呢……我們就用一個最簡單的辦法。我們的方法是,讓機器人找這一句話的關鍵詞,這句話大概的詞性搭配,再去語料庫裏面找到符合這樣規則的回答的話。


舉個簡單的例子:
比如對方說:


“你真好玩”


我們先用分詞算法,把這句話分成


“你 真 好玩”,


然後找出關鍵詞“好玩”。同時把這句話的詞性搭配也記錄下來。 這樣,當找到關鍵詞“好玩”在語料庫中的時候,我們再來找是否有類似這這句話詞性搭配的回答,如果有,隨機回答出一句:“哈哈。。。我就喜歡你這麼說。”,這樣,可以給聊天者比較好的感覺。


那麼問題來了,如何找出關鍵詞呢? 我的方法是……(比較爛,但是通常有效),找出這句話中長度最長的詞作爲關鍵詞。沒有爲什麼,因爲這樣速度會快些。如果一句話中所有的詞都被掃描成爲關鍵詞,再去查庫,會出現些匹配上的問題。(不科學,但是通常有效)。


五、讓機器人再“聰明”些


1 整句匹配語料庫的設計


第一步當然是做你的整句匹配語料庫。語料庫都要自己寫的,不要偷懶。找出別人最常說的話,比如你好謝謝對不起什麼的,多放些回答在裏面,免得每次回答都是一樣的,然後要回答的時候,先寫一句sql來查詢,如


select * from reply where `key` = '"+sentense+"' order by rand() limit 1


把找到的話直接回復過去就可以了。如果找不到整句匹配,再做分詞處理。


2 分詞匹配語料庫的設計


因爲我們分詞算法也沒有經過什麼優化,同時,我們找出關鍵字的辦法也不是那麼的好,所以,你給出的回答一定要不那麼清晰。說白了就是,回答的話要有些“含糊不清”纔可以。目標就是,讓人覺得機器人對他說的話已經理解了,回答出來的還算比較“對路”。不要求100%對路,只要有40%以上對路,聊天的人基本就可能會接受。同時,回答的語料庫,最好可以引導對方再次回答的時候,可以說出你語料庫裏面有的,最好是可以整句匹配的句子。


舉個好玩的例子:


問題:你是男的還是女的?/你是男的還是女的/你是男的還是女的? (是否有標點符號沒關係,我們要記錄句子的詞性搭配,同時,要對標點符號做些處理)


像這樣一句話,我們可以通過分詞,找出關鍵詞:“還是”,而且通過判斷詞性,可以知道,這是一句問句。而且問的是在兩種情況之間選擇。(當然,我們通過簡單的算法,沒法知道這句話其實是問性別)


對於這樣的問題,你的機器人怎麼回答?其實很簡單,首先,回答要“對路”,儘量不讓人覺得答非所問,至少讓人覺得,你的機器人是知道對方在問什麼的。所以,我的機器人這樣回答:


機器人回答:都是。。。哈哈


因爲回答的是聊天用語,而且帶點開玩笑的意味,所以會使聊天者覺得,這個機器人還不是那麼笨。


這只是一個簡單的例子。很多具體的句子還得你自己去分析。當然,語料庫越多,機器人懂的就越多,也就越聰明瞭。


3 匹配不到關鍵字怎麼辦


語料庫不是很多的情況下,很可能我們的分詞算法匹配不到合適的回答來應付。所以我們還要另外做一個語料庫,用來在實在匹配不到關鍵詞的時候,進行回答。這樣的回答比較需要類似“算卦”的人的回答技巧,因爲對方可能說任何話,而我們的機器人不明白。所以,要想辦法“矇混過關”,同時,儘量引導對方向你機器人可能回答的方面說。你可以試着跟“小布”聊聊天,會發現它回答不出來的時候,就會隨便挑一句“佛經”來說。


其實最重要的一個技巧就是,學習一下算卦的人說的話,都是雲裏霧裏的,讓人摸不到頭腦,還覺得可能是對的。我們就要讓機器人學習這種技巧,來達到看上去“聰明”的目的。



最後的話:
其實寫這樣的一個機器人程序很快的,如果熟悉些的話,估計一天應該就可以寫出來。我大概用了一天半,還加上準備些語料庫的時間。如果你真想做個稍稍“聰明些”的機器人來玩,這篇文章應該可以爲你剩下至少3-5個小時的找資料的時間。如果你懶得自己研究,也有別的公司做的只能整句匹配的程序可以下載,自己下一個玩玩也就算了。

 
發佈了7 篇原創文章 · 獲贊 1 · 訪問量 8萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章