兩種開源聊天機器人的效能測試(一)——ChatterBot

CopperDong發表於2017-11-16

因為最近在學習自然語言處理的相關知識,QQ小冰這個東西最近又很熱,所以就試著玩了下兩個開源聊天機器人,在這裡分享一點小經驗,希望對有共同興趣的人能起到那麼一點作用。

      我主要測試了兩個聊天機器人,一個是ChatterBot,另外一個是基於tensorflow的chatbot。我們首先看一下ChatterBot。

      ChatterBot是Python自帶的基於機器學習的語音對話引擎,可以基於已知的對話庫來產生迴應。ChatterBot獨特的語言設計可以使它可以通過訓練來用任何一種語言進行對話。該專案的開原始碼連結:https://github.com/gunthercox/ChatterBot

      語料庫:語料庫連結

      我的測試是通過和聊天機器人進行閒聊型、任務型、知識型三種話題的互動進行的,下面正式進入測試。

      首先我的測試環境是Ubuntu14.04(64位),Pycharm-Edu-4.0。基於tensorflow的chatbot基本環境也是如此。

      具體的步驟如下:

      1.安裝:命令列下輸入sudo pip install chatterbot

如果安裝了pip3建議使用sudo pip3 install chatterbot,這樣就不需要第2步操作,可以直接進入第三步測試。

      2.預設情況下,chatterbot是安裝在python2下的,而要想使用中文語料庫進行訓練,需要在python3下才可以,否則會報UnicodeDecodeError。這裡我們使用超級管理員身份登陸系統,然後將剛才安裝的chatterbot及其依賴從python2(/usr/local/lib/python2.7/dist-packages/)下複製到python3(/usr/local/lib/python3.4/dist-packages/)下。具體資料夾如下圖:

      (如果這些資料夾不好找出來,可以看右側的已修改時間,時間最新的即是)

      複製好資料夾後進入Pycharm新建一個工程MyChatterBot,然後點選File>>Settings找到Project:MyChatterBot點開下三角,點選ProjectInterpreter,點選視窗右上方Project Interpreter下三角選擇python3.4然後Apply,如圖所示:

      3.測試效能

  • 首先測試閒聊。

      由於在正式測試之前我嘗試了一下它的訓練功能,所以關於問答它多學了幾句,以下測試都是基於我的簡單訓練的基礎上。先把我訓練的程式碼放上來:

[python] view plain copy
  1. #!/usr/bin/python  
  2. # -*- coding: utf-8 -*-  
  3. from chatterbot import ChatBot  
  4. from chatterbot.trainers import ListTrainer  
  5. my_bot = ChatBot("Training demo")  
  6. my_bot.set_trainer(ListTrainer)  
  7. my_bot.train([  
  8.     "你叫什麼名字?",  
  9.     "我叫ChatterBot。",  
  10.     "今天天氣真好",  
  11.     "是啊,這種天氣出去玩再好不過了。",  
  12.     "那你有沒有想去玩的地方?",  
  13.     "我想去有山有水的地方。你呢?",  
  14.     "沒錢哪都不去",  
  15.     "哈哈,這就比較尷尬了",  
  16. ])  
  17. while True:  
  18.     print(my_bot.get_response(input("user:")))  
      下面正式開始聊天。

      其中user表示使用者,前方無標註的為機器人。

      測試程式碼如下:

[python] view plain copy
  1. #!/usr/bin/python  
  2. # -*- coding: utf-8 -*-  
  3. from chatterbot import ChatBot  
  4. from chatterbot.trainers import ChatterBotCorpusTrainer  
  5.    
  6. chatbot = ChatBot("myBot")  
  7. chatbot.set_trainer(ChatterBotCorpusTrainer)  
  8.    
  9. # 使用中文語料庫訓練它  
  10. chatbot.train("chatterbot.corpus.chinese")  
  11. lineCounter = 1  
  12. # 開始對話  
  13. while True:  
  14.     print(chatbot.get_response(input("(" + str(lineCounter) + ") user:")))  
  15.     lineCounter += 1  
      測試結果如下:

(1) user:你好

你好

(2) user:你叫什麼名字

   我叫ChatterBot。

(3) user:你多大了

你好

(4) user:你是男的還是女的

它是什麼樣的?

(5) user:長方形的,裡面充滿了文字

我也還不錯

(6) user:什麼還不錯

那很好.

(7) user:那是什麼

你想了解哪方面?

(8) user:關於計算機的

它是什麼樣的?

(9) user:我也不知道什麼樣子的

你想了解哪方面?

(10) user:關於程式設計師的

你使用什麼語言呢?

(11) user:C++和python

我不怎麼喜歡 Java.

(12) user:我又沒問你喜不喜歡。你是程式設計師嗎?

我是個程式設計師

(13) user:你使用什麼語言?

我經常使用 Python,Java 和 C++ .

(14) user:我不怎麼喜歡Java

什麼使你心煩?

(15) user:我不心煩啊,我只是學你說話

我也不錯.

(16) user:不錯個啥?

那很好.

(17) user:你真蠢

你好

(18) user:好啊。你聽說過圖靈測試嗎?

我對你的感情,是人類和bot之間獨有的信任和友誼 你可以把它叫做愛。

(19) user:這才沒聊幾句,就談感情啊

還有其他美味的東西?

(20) user:沒有了,已經被我吃完了

其他東西也行

(21) user:有個糖你要嗎?

我對你的感情,是人類和bot之間獨有的信任和友誼 你可以把它叫做愛。

(22) user:你腦子有問題吧?

什麼問題?

(23) user:迴路有點長

謝謝

(24) user:真是無語了

我能幫你什麼嗎?

(25) user:拜託你回答的正常點

吃喝睡 還有旅行。 你喜歡旅行嗎?

(26) user:喜歡啊。你呢?

太棒了,找個時間我們一起去周遊世界吧!

(27) user:說的好聽。你有錢嗎?

我對你的感情,是人類和bot之間獨有的信任和友誼 你可以把它叫做愛。

(28) user:好了好了,我知道了。說點別的吧

說的好聽。你有錢嗎?

(29) user:我沒錢,你有錢啊?

我也還不錯

(30) user:你想去哪玩?

我想去有山有水的地方。你呢?

(31) user:和你一樣吧。推薦個地方吧?

我想去有山有水的地方。你呢?

(32) user:我也想去有山有水的地方,你想去哪?

沒錢哪都不去

(33) user:好吧好吧,你喜歡看電影嗎?

愛麗絲漫遊仙境

(34) user:這部電影怎麼樣?

沒什麼.

(35) user:說說嘛

我沒錢,你有錢啊?

(36) user:別老談錢,談錢傷感情

我也還不錯

(37) user:行了,我不想跟你聊了。拜拜

那你有沒有想去玩的地方?

 

      現在給出關於閒聊話題的正確率:我們認為(1)(2)(10)(11)(12)(13)(20)(22)(26)(30)(32)(33)(34)是正確的,正確率約為35.14%。其中(2)(30)(32)是經過我簡單訓練後才回答正確的,所以去除這些,如果用github上的原始語料庫,正確率約為27.03%。

  • 任務型

      測試程式碼仍然使用上述程式碼。測試結果如下:

(1) user:幫我查詢武漢到北京今天的火車票

是啊,這種天氣出去玩再好不過了。

(2) user:幫我查詢武漢火車站附近酒店

那很好.

(3) user:明天天氣

是啊,這種天氣出去玩再好不過了。

(4) user:查詢明天上海迪士尼樂園餘票

非常感謝你.

(5) user:查詢武漢漢口站光谷未來之光的路線

它是什麼樣的?

(6) user:查詢電腦里名為ChatterBot的資料夾的位置

今天天氣真好

(7) user:查詢本機作業系統型別

仙女座星系.

(8) user:幫我上網查詢Talor Swift最新的一首歌叫什麼名字

我叫ChatterBot。

(9) user:統計我已經問過你的文字字數

繼續,問吧.

(10) user:查下明天橫店影視城下午都有什麼電影放映

我可以借用一杯糖嗎?

 

      很明顯,正確率為0。

  • 知識型

      測試程式碼仍然使用上述程式碼。測試結果如下:

(1) user:中國有多大?

別老談錢,談錢傷感情

(2) user:中國的首都在哪裡?

吃喝睡 還有旅行。 你喜歡旅行嗎?

(3) user:中國的人口有多少?

我沒錢,你有錢啊?

(4) user:中國第一大島是哪個島?

大不列顛聯合王國

(5) user:中華人命共和國在哪一年成立?

1963

(6) user:安徽省省會是哪個城市?

大不列顛聯合王國

(7) user:英國由哪幾部分組成?

我對你的感情,是人類和bot之間獨有的信任和友誼你可以把它叫做愛。

(8) user:第一個登上月球的人類叫什麼名字?

我叫ChatterBot。

(9) user:什麼是圖靈測試

愛, 在我的理解裡,是對他人的接受,包容和理解。同時,也是對這個世界的和自己的接受包容和理解。

(10) user:winter的中文意思是什麼

吃喝睡 還有旅行。 你喜歡旅行嗎?

 

      顯然,正確率仍然為0。

  • 數學和時間問題

      下面給出測試程式碼:

[python] view plain copy
  1. # -*- coding: utf-8 -*-  
  2. from chatterbot import ChatBot  
  3. from chatterbot.trainers import ChatterBotCorpusTrainer  
  4. chatbot = ChatBot(  
  5.     "Math & Time Bot",  
  6.     # 設定logicAdapter用以處理時間問題和數學問題  
  7.     logic_adapters=[  
  8.         "chatterbot.logic.MathematicalEvaluation",  
  9.         "chatterbot.logic.TimeLogicAdapter"  
  10.     ],  
  11.     # 設定輸入輸出Adapter  
  12.     input_adapter="chatterbot.input.VariableInputTypeAdapter",  
  13.     output_adapter="chatterbot.output.OutputAdapter"  
  14. )  
  15. chatbot.set_trainer(ChatterBotCorpusTrainer)  
  16. # 使用中文語料庫訓練它  
  17. chatbot.train("chatterbot.corpus.chinese")  
  18. lineCounter = 1  
  19. # 每次使用者執行一次迴圈  
  20. while True:  
  21.     try:  
  22.         print(chatbot.get_response(input("(" + str(lineCounter) + ") user:")))  
  23.         lineCounter += 1  
  24.     # 按ctrl-c 或 ctrl-d 鍵以退出  
  25.     except (KeyboardInterrupt, EOFError, SystemExit):  
  26.         break  

      下面給出測試結果:

(1) user:4+9=?

4 + 9 = 13

(2)  user:四加九等於多少

The current time is 09:32 PM

(3) user:現在什麼時間

The current time is 09:33 PM

(4) user:1-1/2

( 0.5 ) = 0.5

(5) user:(1-1)/2

0.0 = 0.0

(6) user:3乘以5=

The current time is 09:33 PM

(7) user:What time is it?

The current time is 09:33 PM

(8)  user:小明以1m/s的速度跑10秒,距離為多少米?

The current time is 09:35 PM

(9) user:2^8

( 10 ) = 10

(10) user:2^3=

8

 

      可以看到正確的結果為(1)(3)(4)(7)(10)正確率為50%。

      現在整體看下來測試結果並不理想,但也有可能是因為中文語料庫資源太少所以才這樣。那麼我們再測一下英文吧。

  • 英文閒聊

      測試程式碼:

[python] view plain copy
  1. #!/usr/bin/python  
  2. # -*- coding: utf-8 -*-  
  3. from chatterbot import ChatBot  
  4. from chatterbot.trainers import ChatterBotCorpusTrainer  
  5. chatbot = ChatBot("myBot")  
  6. chatbot.set_trainer(ChatterBotCorpusTrainer)  
  7. # 使用英文語料庫訓練它  
  8. chatbot.train("chatterbot.corpus.english")  
  9. lineCounter = 1  
  10. # 開始對話  
  11. while True:  
  12.     try:  
  13.         print(chatbot.get_response(input("(" + str(lineCounter) + ") user:")))  
  14.         lineCounter += 1  
  15.      # 按ctrl-c 或 ctrl-d 鍵以退出  
  16.     except (KeyboardInterrupt, EOFError, SystemExit):  
  17.         break  

      測試結果:

(1) user:hello

Hi

(2) user:What's your name?

I am still young

(3) user:How old are you?

Who? Who is but a form following thefunction of what

(4) user:Where are you come from?

A man in a mask.

(5) user:Are you a boy?

Yes I am.

(6) user:Do you have a girlfriend?

i certainly have lost many friends over theyears.

(7) user:OK.Do you like dogs?

not especially. i am not into violence.

(8) user:Do you like sports?

not especially. i am not into violence.

(9) user:you are handsome

you are crazy

(10) user:It's a nice day today

only to other robots.

 

      從上述結果來看,我們的機器人回答合適的只有(1)和(5),正確率20%。

  • 英文任務型:

      仍以上述程式碼進行測試。

      測試結果如下:

 

(1) user:Inquire about the weather tomorrow

do you think thesouth was right?

(2) user:Pleasebook me a ticket from Hefei to Wuhai tomorrow

i prefer to nothurt your feelings.

(3) user:Checkthe hotel near Hefei South Station

Relationshipsare simple for me.

(4)user:Inquirey Disney Shanghai single day tickets

That's my name.

(5) user:Checkwhether the Shanghai Metro Line 1 has Nanjing West Road

Europe

(6) user:Howmany characters does "Iine" have?

Apple makeshardware and softwares to run on them. Microsft only makes OS. HP makes onlycomputers. These are just few names among hundred others.

(7) user:Helporder a Xiaomi phone from Jingdong

my favoritemovie is lord of the rings

(8) user:executethe command sudo reboot in the console

No.

(9) user:Printthe file on the desktop print.txt

andrew jackson.

(10) user:Playthe music "Heal the world"

Too much.

 

      很不幸,正確率再次為0。

  • 英文知識型

      仍使用上述測試程式碼。

      測試結果如下所示:

 

(1) user:Howlarge is China's land area?

vineland is anovel by thomas pynchon.

(2) user:Whichstate is Britain in?

an invitation toa burial

(3) user:Whatare the parts of England?

i'm not aphysicist, but i think this has something to do with heat, entropy, andconservation of energy, right?

(4) user:Howmany bits of an integet data in Python?

If theimplementation is hard to explain, it's a bad idea.

(5) user:Whichyear did the second world war break out?

its hard to saybut The ENIAC is regarded as the first computer. It was developed at Universityof Pennsylvania in 1946.

 

      ChatterBot再次敗北,正確率為0。

      所以,綜合以上各種測試,ChatterBot回答問題的正確率遠低於50%,很多問題都為0。對於閒聊型問題還可以回答正確幾個,但是對於任務型、知識型問題一竅不通,這應該是開源專案裡沒有設定相應的模組、語料庫資源過少,也不能夠主動上網查詢。要想使其能夠回答和提問基本吻合還需要大量的工作。另外,其速度也不是很理想,有的情況會有少許卡頓。

相關文章