Categories
程式開發

如何通過幾行 Python 代碼,使用BERT進行詞嵌入?


在自然語言處理領域中,誕生於 2018 年末的 BERT 非常的“火熱”。強悍如 BERT,在十多項 NLP 的任務上強勢屠榜,業界聲稱 BERT 將開創自然語言處理領域新的紀元。在本文中,作者 Anirudh_S 將展示如何只使用幾行 Python 代碼,就可以使用深度學習自然語言處理模型(BERT)將單詞嵌入到向量中。

本文最初發表於 Towards Data Science,經原作者 Anirudh_S 授權,InfoQ 中文站翻譯並分享。

詞嵌入:它們是什麼?

在自然語言處理領域中,以向量形式或詞嵌入表示單詞或句子的方式,為各種潛在應用打開了大門。這種將單詞編碼為向量的函數,對自然語言處理任務來說是一個強大的工具,例如計算單詞之間的語義相似度,人們可以用來構建語義搜索引擎,就像Google 將 BERT 應用於搜索一樣。可以說,BERT 是最強大的語言模型之一,在機器學習社區中非常流行。

BERT(Bidirectional Encoder Representations from Transformers)模型已使用大型句子語料庫進行預訓練。簡而言之,訓練是通過在一個句子中對一些單詞進行掩碼(根據論文作者的說法,大約為 15% 的單詞),然後讓模型去預測那些被掩碼的單詞。隨著模型的預測訓練,它學會了生成一個強大的單詞內部表示,即詞嵌入(Word embedding)。今天,我們將介紹如何輕鬆地構建並運行 BERT 模型,並將單詞編碼為詞嵌入。

BERT 詞嵌入模型設置

有一組可用的選項來運行帶 Python 和 TensorFlow 的 BERT 模型。但是,為了能夠讓你非常容易地獲得 BERT 模型,我們將使用一個 Python 庫,它可以幫助我們立即進行設置!

Bert-as-a-service(意為 BERT 即服務)是一個 Python 庫,它使我們能夠在本地機器上部署預訓練 BERT 模型並運行推理。它可以用於服務任何已發布的模型類型,甚至也可以服務於針對特定下游任務進行微調的模型。此外,它還需要後端的 TensorFlow 與預訓練模型一起工作。因此,我們將繼續在控制台中安裝 TensorFlow 1.15。

pip3 install tensorflow-gpu==1.15

接下來,我們將安裝 Bert-as-a-service 客戶端和服務器。同樣,這個庫並不支持 Python 2。因此,你要確保已經安裝的是 Python 3.5 或更高版本。

pip3 install -U bert-serving-server bert-serving-client

BERT 服務器將模型部署在本地機器上,客戶端可以訂閱它。此外,可以在同一台計算機上安裝這兩樣,也可以在一台機器上部署服務器並從另一台計算機訂閱。安裝完成之後,下載你選擇的 BERT 模型。你可以點擊此鏈接來找到所有模型的列表。

部署模型

現在,初始設置已經完成,讓我們使用以下命令啟動模型服務。

bert-serving-start -model_dir /path_to_the_model/ -num_workers=1

例如,如果模型名稱為 uncased_L-24_H-1024_A-16,且它位於 “/model” 目錄中,那麼,命令如下所示:

bert-serving-start -model_dir /model/uncased_L-24_H-1024_A-16/ -num_workers=1

其中, “num_workers” 參數用於初始化服務器可以處理的並發請求的數量。但是,我們只需設置 num_workers=1 就可以了,因為我們只是在單個客戶端上使用我們的模型。如果要部署多個客戶端進行訂閱的話,請相應為 “num_workers” 參數進行設置。

使用 BERT 客戶端訂閱

我們可以運行一個 Python 腳本,使用 BERT 服務將我們的單詞編碼成詞嵌入。有鑑於此,我們只需導入 BERT-client 庫並創建客戶端類的實例。完成這一步後,我們就可以提供想要編碼的單詞或句子的列表。

from bert-serving.client import BertClient()
client = BertClient()
vectors = client.encode(( “dog” ),( “cat” ),( “man” ))

我們應該將想要編碼的單詞作為 Python 列表提供。上面,我給出了三個列表,每個列表都有一個單詞。因此, “vectors” 對象的形狀為 (3,embedding_size)。通常,嵌入大小是 BERT 模型編碼的詞向量的長度。實際上,它將任意長度的單詞編碼為一個恆定長度的向量。但是,不同的 BERT 模型可能會有所不同。

計算詞之間的相似度

到現在為止,一切都還不錯!對於那些只是一些數字的向量該怎麼處理呢?正如前所述,這些向量表示單詞在 1024 維超空間(對此模型 uncased_L-24_H-1024_A-16 而言為 1024)中的編碼位置。此外,通過某種相似性函數比較不同詞的向量有助於確定它們之間的關聯程度。

餘弦相似度(Cosine similarity)就是這樣的一個函數,它給出的相似度得分在 0.0 到 1.0 之間。在這種情況下,1.0 表示單詞意思相同(100% 匹配),而 0.0 表示它們完全不同。下面是詞嵌入之間餘弦相似性的 scikit-learn 實現。

from sklearn.metrics.pairwise import cosine_similarity
cos_lib = cosine_similarity(vectors(1,:),vectors(2,:)) #similarity between #cat and dog

完成 BERT 詞嵌入

你還可以輸入整條句子,而不是單個單詞,服務器會處理它。詞嵌入可以通過多種方式集合在一起,形成連接(concatenation)這樣的句子嵌入。

作者介紹:

Anirudh_S,儀表工程師,熱衷於機器人、人工智能、機器學習和自主系統。

原文鏈接:

https://hackerstreak.com/word-embeddings-using-bert-in-python/