鼎鼎大名的 Bert 算法相信大部分同學都聽說過,它是Google推出的NLP領域“王炸級”預訓練模型,其在NLP任務中刷新了多項記錄,并取得state of the art的成績。
但是有很多深度學習的新手發現BERT模型并不好搭建,上手難度很高,普通人可能要研究幾天才能勉強搭建出一個模型。
沒關系,今天我們介紹的這個模塊,能讓你在3分鐘內基于BERT算法搭建一個問答搜索引擎。它就是 bert-as-service 項目。這個開源項目,能夠讓你基于多GPU機器快速搭建BERT服務(支持微調模型),并且能夠讓多個客戶端并發使用。
1.準備
開始之前,你要確保Python和pip已經成功安裝在電腦上,如果沒有,可以訪問這篇文章:超詳細Python安裝指南 進行安裝。
**(可選1) **如果你用Python的目的是數據分析,可以直接安裝Anaconda:Python數據分析與挖掘好幫手—Anaconda,它內置了Python和pip.
**(可選2) **此外,推薦大家用VSCode編輯器,它有許多的優點:Python 編程的最好搭檔—VSCode 詳細指南。
請選擇以下任一種方式輸入命令安裝依賴 :
- Windows 環境 打開 Cmd (開始-運行-CMD)。
- MacOS 環境 打開 Terminal (command+空格輸入Terminal)。
- 如果你用的是 VSCode編輯器 或 Pycharm,可以直接使用界面下方的Terminal.
pip install bert-serving-server # 服務端
pip install bert-serving-client # 客戶端
請注意,服務端的版本要求: Python >= 3.5 ,Tensorflow >= 1.10 。
此外還要下載預訓練好的BERT模型,在 https://github.com/hanxiao/bert-as-service#install 上可以下載。
也可在Python實用寶典后臺回復 bert-as-service 下載這些預訓練好的模型。
下載完成后,將 zip 文件解壓到某個文件夾中,例如 /tmp/english_L-12_H-768_A-12/
2.Bert-as-service 基本使用
安裝完成后,輸入以下命令啟動BERT服務:
bert-serving-start -model_dir /tmp/english_L-12_H-768_A-12/ -num_worker=4
-num_worker=4 代表這將啟動一個有四個worker的服務,意味著它最多可以處理四個并發請求。超過4個其他并發請求將在負載均衡器中排隊等待處理。
下面顯示了正確啟動時服務器的樣子:
使用客戶端獲取語句的編碼
現在你可以簡單地對句子進行編碼,如下所示:
from bert_serving.client import BertClient
bc = BertClient()
bc.encode(['First do it', 'then do it right', 'then do it better'])
作為 BERT 的一個特性,你可以通過將它們與 |||
(前后有空格)連接來獲得一對句子的編碼,例如
bc.encode(['First do it ||| then do it right'])
遠程使用 BERT 服務
你還可以在一臺 (GPU) 機器上啟動服務并從另一臺 (CPU) 機器上調用它,如下所示:
# on another CPU machine
from bert_serving.client import BertClient
bc = BertClient(ip='xx.xx.xx.xx') # ip address of the GPU machine
bc.encode(['First do it', 'then do it right', 'then do it better'])
3.搭建問答搜索引擎
我們將通過 bert-as-service 從FAQ 列表中找到與用戶輸入的問題最相似的問題,并返回相應的答案。
FAQ列表你也可以在 Python實用寶典后臺回復 bert-as-service 下載。
首先,加載所有問題,并顯示統計數據:
prefix_q = '##### **Q:** '
with open('README.md') as fp:
questions = [v.replace(prefix_q, '').strip() for v in fp if v.strip() and v.startswith(prefix_q)]
print('%d questions loaded, avg. len of %d' % (len(questions), np.mean([len(d.split()) for d in questions])))
# 33 questions loaded, avg. len of 9
一共有33個問題被加載,平均長度是9.
然后使用預訓練好的模型:uncased_L-12_H-768_A-12 啟動一個Bert服務:
bert-serving-start -num_worker=1 -model_dir=/data/cips/data/lab/data/model/uncased_L-12_H-768_A-12
接下來,將我們的問題編碼為向量:
bc = BertClient(port=4000, port_out=4001)
doc_vecs = bc.encode(questions)
最后,我們準備好接收用戶的查詢,并對現有問題執行簡單的“模糊”搜索。
為此,每次有新查詢到來時,我們將其編碼為向量并計算其點積 ** doc_vecs
**然后對結果進行降序排序,返回前N個類似的問題:
while True:
query = input('your question: ')
query_vec = bc.encode([query])[0]
# compute normalized dot product as score
score = np.sum(query_vec * doc_vecs, axis=1) / np.linalg.norm(doc_vecs, axis=1)
topk_idx = np.argsort(score)[::-1][:topk]
for idx in topk_idx:
print(' > %st%s' % (score[idx], questions[idx]))
完成! 現在運行代碼并輸入你的查詢,看看這個搜索引擎如何處理模糊匹配:
完整代碼如下,一共23行代碼(在后臺回復關鍵詞也能下載):
上滑查看完整代碼
import numpyas np
from bert_serving.clientimport BertClient
from termcolorimport colored
prefix_q ='##### **Q:** '
topk =5
with open('README.md')as fp:
questions = [v.replace(prefix_q,'').strip()for vin fpif v.strip()and v.startswith(prefix_q)]
print('%d questions loaded, avg. len of %d' % (len(questions), np.mean([len(d.split())for din questions])))
with BertClient(port=4000, port_out=4001)as bc:
doc_vecs = bc.encode(questions)
while True:
query = input(colored('your question: ','green'))
query_vec = bc.encode([query])[0]
# compute normalized dot product as score
score = np.sum(query_vec * doc_vecs, axis=1) / np.linalg.norm(doc_vecs, axis=1)
topk_idx = np.argsort(score)[::-1][:topk]
print('top %d questions similar to "%s"' % (topk, colored(query,'green')))
for idxin topk_idx:
print(' > %st%s' % (colored('%.1f' % score[idx],'cyan'), colored(questions[idx],'yellow')))
夠簡單吧?當然,這是一個基于預訓練的Bert模型制造的一個簡單QA搜索模型。
你還可以微調模型,讓這個模型整體表現地更完美,你可以將自己的數據放到某個目錄下,然后執行 run_classifier.py 對模型進行微調,比如這個例子:
https://github.com/google-research/bert#sentence-and-sentence-pair-classification-tasks
-
gpu
+關注
關注
28文章
4703瀏覽量
128718 -
算法
+關注
關注
23文章
4601瀏覽量
92664 -
搜索引擎
+關注
關注
0文章
117瀏覽量
13351 -
模型
+關注
關注
1文章
3177瀏覽量
48725
發布評論請先 登錄
相關推薦
評論