NLP入門:做一個簡單的"人工智障"
這一篇文章與我們的NLP理論知識無關,甚至都沒有用得上什麼NLP方面的高深演算法知識,但是這卻是市場上各種助手類工具的一個簡化版.基本的邏輯和基本的功能都相仿,這一篇文章我希望能夠結合這個小例子,梳理下現在的"人工智障"
現如今市場上的巨頭早已經模塊化和平台化.我們普通的設計人員只需要想好自己的使用需求乖乖交錢調用就好.一個很典型的就是:
打開他們的開發文檔來看,
DuerOS開放平台 | 資源中心很多層面是真的"人工智慧",因為很多就是我們人工給定的...
而我們真正的自然語言處理的技術,更多地是用在了如何提升語音識別率這上邊,距離智能客服真正理解你還是任重道遠.
現在我們來用簡單的python代碼來實現一個簡單的人工小機器人,其主要的功能有以下幾個:
1:陪你聊天
2:訓練聊天
3:時間查詢
4:日曆查詢
5:單詞查詢
6:天氣查詢
問題來了,要做一個"人工智障"我們首先得知道會用到哪些學到的知識點:
- 字典:存儲機器人的相關對話內容,讓機器人有相關的「記憶」
- 循環(嵌套循環):一直去響應我們對應的問題
- 判斷: 執行流程操作
這些都是python3中的最簡單的基本操作.話不多說,直接上代碼:
1:聊天部分
這一個部分因為沒有使用到資料庫,所訓練的問題在一次之後再運行就沒有了,相比之下大公司因為有足夠的數據量和計算量,可以對語言助手收集的內容進行學習處理,因此效果提升的很明顯.我們可以簡單的把dict看成是一個資料庫,訓練小助手可以看做向助手的資料庫里增加問題.
import timeimport calendarimport baidu_translateimport weatherdict = { "你好":"你好", "很高興見到您" : "我也很能高興見到你", "你喜歡吃什麼水果 " : "我喜歡橘子", "你今年多大了" : "18歲了", "你很漂亮" : "謝謝", "現在的時間": time.strftime(%Y-%m-%d %H:%M:%S,time.localtime()), "這個月的陽曆" : calendar.month(2018,3),}flag = (A)work = Trueprint(你好,我是你的人工智障小助手
)print(讓我們一起聊聊天吧
)while flag == A or B: flag = input("A:陪我聊天,B:訓練我聊天,C:給我翻譯,D:天氣,E:結束
") if flag == "B": question = input("請輸入你想問的
") answer = input("請輸入問題的答案
") dict[str(question)] = str(answer) print("學習成功
") print("現在我已經學會了%d個問題
"%len(dict)) continue elif flag =="A": if len(dict) == 0: print("現在我還不會回答任何問題,請讓我先學習:
") continue chat_world = input(謝謝你跟我聊天,你想對我說點什麼?
) for key in sorted(dict.keys()): if str(chat_world) == key: work = True print(dict[key]) break else: work = False if work ==False: print("sorry,這個問題我回答不上來
") work = True elif flag == E: print("好的,我們下次再聊
") break else: continue elif flag == C: baidu_translate.translate(input("請輸入你想翻譯的語句!
")) elif flag == D: weather.weather_tool()
2:翻譯工具
這個翻譯爬蟲是我之前在弄百度翻譯爬蟲的時候寫的,現在正好用的到,就跟我們通常用一些語言助手,我們說一個自己不認識的英語單詞,告訴小助手,助手其實也是將這個單詞提交給其單詞查詢的介面,介面給小助手回復後,小助手在回復給你.
from urllib import request, parseimport jsondef translate(content): url = "http://fanyi.baidu.com/sug" data = parse.urlencode({"kw": content}) # 將參數進行轉碼 headers = { User-Agent: Opera/9.80 (Android 2.3.4; Linux; Opera Mobi/build-1107180945; U; en-GB) Presto/2.8.149 Version/11.10 } req = request.Request(url, data=bytes(data, encoding="utf-8"), headers=headers) r = request.urlopen(req) # print(r.code) 查看返回的狀態碼 html = r.read().decode(utf-8) # json格式化 html = json.loads(html) # print(html) for k in html["data"]: print(k["k"], k["v"])
3:天氣模塊
天氣模塊因為我沒有購買天氣提供商的API,所以這裡就只提供了簡單的模擬登陸的信息爬取,具體的有興趣的可以進行細化:
這裡最關鍵的是101010100,代表北京
其他的城市的代碼可以參照網上的資料
import requestsdef weather_tool(): r = requests.get(http://www.weather.com.cn/data/sk/101010100.html) r.encoding = utf-8 print (r.json()[weatherinfo][city],"風向:", r.json()[weatherinfo][WD],"溫度:", r.json()[weatherinfo][temp],)
總結:
在用戶不熟悉的場景下,咱們的"人工智障小助手"面對稍微專業一點的服務,就會遇到知識圖譜的問題。簡單來講,"人工智障小助手"要做推薦的前提是對推薦的內容得先有了解。好比,要向一位不懂酒的用戶推薦一款威士忌,那就不能依賴這位用戶自己提出的問題(很可能提不出要求),而得依賴「懂行」的自己對威士忌的理解的方方面面來引導用戶做合適他的選擇。一個助理顯然無法擁有所有服務所需的知識圖譜。
從知識圖譜的結構來看,是相對可被結構化。一個服務可以以各種方式被拆解成很多個方面,但大量的方面在當前是沒有結構化數據的(比如我們沒有每家餐廳的「營業面積」的數據);甚至很多方面無法用結構化數據來表達(比如每家餐廳有否「適合浪漫約會」的環境)。
因此,就算有了強大的NLP,還需要全面的知識圖譜(結構化數據)和處理並傳遞非結構化數據的能力——而這兩點,在目前是無解的。
而在這個路上,我們還需要走更遠
推薦閱讀:
TAG:機器學習 | 深度學習DeepLearning | 自然語言處理 |