一、說明
????????本文介紹了一個示例,說明如何使用 spaCy(用于 NLP 的領先開源 Python 庫)從用戶輸入中提取含義。
二、如何從用戶輸入中提取含義
????????以編程方式從用戶輸入中提取含義可能非常具有挑戰性,但并非不可能。很明顯,你不能依賴句子中單個單詞的含義——同一個單詞可能會表達不同的含義,這取決于它在特定句子中的句法功能。這可以通過示例來最好地理解。請看以下兩句話:
I’d like to order a cake.
I want to cancel my order.
????????在這兩個話語中,你可以看到“順序”一詞。然而,在每種情況下,它都有不同的句法功能并具有不同的含義。在第一種情況下,“order”是一個動作(傳遞)動詞,作用于名詞“蛋糕”——句子的直接賓語。相比之下,第二個話語中的“order”是接收句子動作的名詞——也就是說,它充當句子的直接賓語,其中“取消”是傳遞動詞。
????????句子中單詞的語言特征(如上例中的及物動詞或直接賓語)也稱為語言特征。spaCy 會自動為應用了 spaCy 文本處理管道的句子中的每個標記分配語言特征。然后,分析語言特征可以幫助識別這個特定句子中單詞的含義。我們將在本文后面的 在 NLP 中使用語言特征 部分中討論如何使用語言特征來完成意義提取任務。
三、準備您的工作環境
????????若要按照本文中提供的代碼進行操作,需要在計算機上安裝以下軟件組件:
python 2.7+∕3.4+
spaCy v2.0+
預先訓練的spaCy英語模型
????????您可以在相應的站點上找到安裝說明。確保環境準備就緒的最快方法是,可以在 Python 會話中輸入以下代碼行:
import spacy
nlp = spacy.load('en')
????????如果一切正常,您應該沒有錯誤消息。
四、在 NLP 中使用語言特征
????????功能(如詞性標記和句法依賴關系標簽)專門設計用于支持開發能夠智能處理原始文本的應用程序。以下腳本說明了如何使用 spaCy 提取句子中每個單詞的語言特征:
import spacy
nlp = spacy.load('en')
doc = nlp(u'I have to send them a notification.')
for token in doc:print(token.text, token.pos_, token.tag_, token.dep_)
????????在上面的腳本中,您提取并輸出所提交句子中每個標記的粗粒度詞性標簽 (pos_)、細粒度詞性標簽 (tag_) 和語法依賴關系標簽 (dep_)。因此,腳本應提供以下輸出(為便于閱讀而列出):
I PRON PRP nsubj
have VERB VBP ROOT
to PART TO aux
send VERB VB xcomp
them PRON PRP dative
a DET DT det
notification NOUN NN dobj
. PUNCT . Punct
????????如果你不熟悉 spaCy,上面分別在第三列和第四列中輸出的細粒度詞性標簽和語法依賴關系標簽可能看起來有點混亂。要了解這些列中的值的含義,您可以在?Data formats · spaCy API Documentation?或使用 spacy.explain() 函數查看 spacy 的文檔,該函數返回給定語言特征的描述。在下面的循環中,您將輸出示例句子中每個標記的細粒度詞性標記的描述:
for token in doc:print(token.text, spacy.explain(token.tag_))
????????這應該會給你以下輸出:
I pronoun, personal
have verb, non-3rd person singular present
to infinitival to
send verb, base form
them pronoun, personal
a determiner
notification noun, singular or mass
. punctuation mark, sentence closer
????????同樣,您可以使用 spacy.explain() 函數獲取粗粒度詞性標記和語法依賴關系標簽的說明。
五、從話語中提取意向
????????現在讓我們看一個示例,說明如何利用語言功能從用戶輸入中提取含義。假設需要從提交的語句中提取意向。例如,點餐聊天機器人的用戶提交以下語句:
I want to order a photo cake.
????????顯然,“訂單”和“蛋糕”這兩個詞最能描述這句話所表達的意圖。在這種特殊情況下,這些詞分別表示及物動詞和直接賓語。實際上,在大多數情況下,在確定請求話語中表達的意圖時,傳遞謂詞/直接賓語對是最具描述性的。從圖表上看,這可能如下所示:
????????在許多請求話語中,及物謂詞及其直接賓語最能描述短語的意圖。
上圖中描述的操作可以在使用 spaCy 的 Python 腳本中輕松執行,如下所示:
import spacy
nlp = spacy.load('en')
doc = nlp(u'I want to order a photo cake.')
for token in doc:if token.dep_ == 'dobj':print(token.head.text + token.text.capitalize())
????????在此腳本中,將文本處理管道應用于示例句子,然后循環訪問標記,查找依賴項標簽為?dobj?的令牌。找到它后,您可以通過獲取直接對象的句法頭來確定相應的傳遞動詞。最后,連接及物動詞及其直接賓語,以單個單詞的形式表達意圖(這通常是處理腳本的要求)。
????????因此,腳本應生成:
orderCake
????????在實際應用程序中,用戶可能會對每個意向使用一組廣泛的短語。這意味著實際應用程序必須識別用戶輸入中的同義短語。有關這些細節,您可以查看我的新書《使用Python的自然語言處理》,其中包括許多關于使用spaCy執行不同NLP任務的示例。
????????此外,在我最近為 Oracle 雜志撰寫的?Oracle 數字助理技能的生成意圖和實體文章中可以找到意圖提取技術在實踐中可能使用的真實示例。