它可以理解您的語音命令,搜尋新聞和知識來源,並為您總結和朗讀內容。
查看示範影片。
《Chatbots Magazine》將我的 Delbot 文章列入《Chatbots Magazine》前 100 篇文章中。
python app.py
以啟動 Web 服務。機器人仍然是一個熱門話題。每個人都在談論他們。
從頭開始建造一個怎麼樣?我們今天將建立的簡單模型將理解並回答以下問題:
我們的目標是從頭開始編寫機器人程式碼,並在過程中使用自然語言處理 (NLP)。
此外,如果您也完成網路應用程式部分,我們的機器人將支援語音且基於網路。最好的部分是我們不需要為語音識別和合成做任何花哨的事情:我們將使用現代網頁瀏覽器的內建功能。
在較高的層次上,我們希望能夠理解兩種廣泛類型的查詢。以下是流程圖。
我們可能會詢問訊息。例如:
《守護者》中《神奇動物在哪裡》的最新動態是什麼?
機器人會查詢所請求動態消息(如果未指定,則為《紐約時報》)的 API 並彙總結果:
[...] 將第一部《哈利波特》電影(2001 年的《哈利波特與魔法石》)與最後一部(2011 年的《哈利波特與死亡聖器第二部)進行比較,有點類似於將《小鹿斑比》與《落水狗》進行比較。我們第一次見到他是在 20 世紀 20 年代的紐約——這比哈利出生還要早 60 年——他在那裡 [...]
(資料來源:https://www.theguardian.com/books/2016/nov/25/jk-rowling-fantastic-beasts-screenplay)
我們可能會問一個知識問題。例如:
什麼是 RDF 三元組?
機器人會回答:
語意三元組(或簡稱三元組)是資源描述架構 中的原子資料實體。特別是,RDF 三元組的每個部分都可以透過唯一的URI 單獨尋址。 com/foaf/0.1/知道http://example.name#JohnDoe34。
(圖片來源:https://en.wikipedia.org/wiki/Semantic_triple)
我們定義一個簡單的規則來對輸入進行分類:如果查詢包含單字news或latest ,則它是新聞查詢。否則就是知識查詢。
QueryAnalyzer
類別的predict
函數是我們機器人的主要入口點。它執行上述分類。它調用其他函數
最後,它會傳回輸出和一個指示是否有錯誤的標誌。
我們假設輸入是以下形式之一。
《紐約時報》關於星際大戰的最新消息是什麼?
給我讀英國脫歐的最新消息。
請告訴我《衛報》關於2017 年漫威電影宇宙電影的新聞。
代幣 | 給 | 我 | 這 | 最新的 | 訊息 | 在 | 唐納 | 王牌 | 從 | 這 | 新的 | 約克 | 時代 | 。 |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
銷售點 | 動詞 | 普羅恩 | 乙二胺四乙酸 | 調整 | 名詞 | 腺苷二磷酸 | 丙二醇 | 丙二醇 | 腺苷二磷酸 | 乙二胺四乙酸 | 丙二醇 | 丙二醇 | 丙二醇 | 旁路CT |
標籤 | VB | 富血小板血漿 | DT | 錦江山 | 神經網路 | 在 | 國家NP | 國家NP | 在 | DT | 國家NP | 國家NP | 國家NP | 。 |
如上結構的句子有一個模式。介詞是關鍵。
搜尋的主題位於第一個介詞和最後一個介詞之間。請求的來源位於最後一個介詞之後。最後一個名詞區塊是來源。
如果未指定來源,如第二個範例所示,則假定第一個介詞之後的所有內容都是搜尋主題。
介詞,簡單來說就是介詞和後置詞。
在像英語這樣的中心詞首語中,介詞通常位於名詞片語之前。例如來自漫威電影宇宙的角色。在像古吉拉特語這樣的中心詞語言中,介詞位於名詞短語之後。這些是後置詞。例如માર્વેલચલચિત્રજગત_ના_પાત્રો,逐字翻譯為:漫威電影人物。
我們從QueryExtractor
類別呼叫get_news_tokens
,該類別從輸入中提取來源和查詢。在內部,它呼叫_split_text
從輸入中提取名詞區塊、詞性和完全解析的文字。我們對查詢中的術語進行詞形還原。
接下來,我們根據source對 media_aggregator.py 中的Aggregator
類別之一進行查詢來呼叫get_news
函數。這將傳回新聞 API 作為回應發送的新聞文章清單。我們目前支援衛報 API 和紐約時報 API。
最後,我們從回應清單中選擇第一項(預設)並使用shorten_news
函數對其進行總結。
我們假設輸入是以下形式之一。
約翰迪爾
聖女貞德
唐納德·特朗普是誰?
JRR托爾金是誰?
什麼是主詞謂語受詞?
告訴我有關粒子物理學的知識。
代幣 | 什麼 | 是 | 一個 | RDF | 三倍 | ? |
---|---|---|---|---|---|---|
銷售點 | 名詞 | 動詞 | 乙二胺四乙酸 | 丙二醇 | 名詞 | 旁路CT |
標籤 | 濕性粉劑 | VBZ | DT | 國家NP | 神經網路 | 。 |
代幣 | 告訴 | 我 | 關於 | 他 | - | 男人 | 和 | 這 | 大師 | 的 | 這 | 宇宙 | 。 |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
銷售點 | 動詞 | 普羅恩 | 腺苷二磷酸 | 普羅恩 | 旁路CT | 名詞 | 康傑 | 乙二胺四乙酸 | 名詞 | 腺苷二磷酸 | 乙二胺四乙酸 | 名詞 | 旁路CT |
標籤 | VB | 富血小板血漿 | 在 | 富血小板血漿 | HYPH | 神經網路 | 副本 | DT | 神經網路系統 | 在 | DT | 神經網路 | 。 |
如果我們找到一個助動詞,我們會將其第一次出現後的所有內容視為查詢。因此,在範例 1中,查詢是RDF Triple 。
否則,我們將第一個之後的所有名詞區塊視為查詢。因此,在範例 2中,查詢是he-man the masters the Universe 。
我們從QueryExtractor
類別呼叫get_knowledge_tokens
來提取查詢。
我們將其傳遞給get_gkg
函數,該函數透過維基百科Python 套件查詢維基百科 API,並傳回頂部結果的 5 句話摘要。
我使用 NLTK 文字摘要中的FrequencySummarizer
類別。或者,您可以使用 sumy。
除了包re 、 bs4 、 requests 、 Operator 、 collections 、 heapq 、 string和nltk之外,我們還將使用以下套件。
spaCy :請依照安裝 spaCy 文件中的規定進行設定。 spaCy 會幫我們做一些快速的 NLP。我們可以使用 NLTK,但 spaCy 會讓你走得更快。我們在這個專案中使用 spaCy。
維基百科:這有助於查詢維基百科 API。您可以在此處閱讀維基百科Python 套件的文檔。
Summarizer :我用的這個是從 JustGlowing 寫的 The Glowing Python 部落格借來的。它總結了冗長的內容。或者,您可以使用 sumy。
Flask-RESTful、Flask(可選) :這些用於建立 Web 應用程式並透過 RESTful Web 服務操作我們的機器人。
我們新增了一個很酷的網頁,您可以從中發出語音查詢並讓瀏覽器讀出回應內容。為此,我們使用 Web Speech API。
我們用不到 20 行程式碼就啟動並執行了基於 Flask 的 REST Web 服務。 QueryService
類別處理請求。
截至目前,我們只需要一次服務呼叫即可將網路應用程式的輸入傳送到機器人。這是透過QueryService
類別的post
函數完成的。 post
反過來呼叫predict
函數,這是上面提到的主要入口點。
我建立了一個基本網頁來示範該機器人。它使用 Web Speech API 接收語音輸入並讀出內容。您可以在 templates 資料夾中找到 index.html 檔案。確保您已安裝所有必需的軟體包和庫,並且在打開網站之前 Web 服務已啟動並正在運行。
我們的簡單機器人可以理解有限範圍的請求。它無法理解如下其他類型的請求。
具有不同結構的知識請求
向我解釋一下什麼是引導聚合。
告訴我一些關於計算神經科學的事情。
具有不同結構的新聞請求
《紐約時報》對羅傑費德勒的最新比賽有何評價?
網球世界正在發生什麼事?
其他類型的知識請求
起司是如何製作的?
JK羅琳出生在哪裡?
我們能在金星上建造一座天空之城嗎?
法國大革命是什麼時候發生的?
木星為什麼有大紅斑?
後續問題和背景
向我解釋一下什麼是引導聚合。
然後:它與隨機森林有何關係?
理解它在後續問題中所指的內容屬於所謂的照應解析。這是理解上下文的一部分。不同的字在不同的上下文中意味著不同的東西。雖然人類對這些有細緻的理解,但向機器傳授同樣的知識卻困難得多。
我們實現了根據我們定義的一些規則來建立機器人的目標。我們也使用了一些 NLP 技術。最後,我們將機器人部署到 Web 應用程式上。然而,我們的機器人能夠理解和回答的查詢類型有限。為什麼它的理解範圍如此狹窄?
總的來說,讓電腦真正理解語言是一個人工智慧難題。 NLP 中有一個稱為 NLU(自然語言理解)的領域專門致力於此。
我們可以實施基於機器學習的解決方案,這樣我們的機器人就有可能理解更廣泛的請求。
請務必閱讀此處使用的 API 的使用條款。