乡下人产国偷v产偷v自拍,国产午夜片在线观看,婷婷成人亚洲综合国产麻豆,久久综合给合久久狠狠狠9

  • <output id="e9wm2"></output>
    <s id="e9wm2"><nobr id="e9wm2"><ins id="e9wm2"></ins></nobr></s>

    • 分享

      BERT實(shí)現(xiàn)QA中的問句語義相似度計(jì)算

       印度阿三17 2020-03-14

      1. BERT 語義相似度

      BERT的全稱是Bidirectional Encoder Representation from Transformers,是Google2018年提出的預(yù)訓(xùn)練模型,即雙向Transformer的Encoder,因?yàn)閐ecoder是不能獲要預(yù)測(cè)的信息的。模型的主要?jiǎng)?chuàng)新點(diǎn)都在pre-train方法上,即用了Masked LM和Next Sentence Prediction兩種方法分別捕捉詞語和句子級(jí)別的representation。

      有一個(gè)這樣的場(chǎng)景,QA對(duì)話系統(tǒng),希望能夠在問答庫(kù)中找到與用戶問題相似的句子對(duì),然后把答案返回給用戶。這篇就是要解決這個(gè)問題的。

      關(guān)于 BERT 的原理知識(shí)請(qǐng)?jiān)L問: http:///2019/09/28/NLP/BERT/

      下面介紹一個(gè)封裝好的 BERT 工具,利用該工具能夠快速的得到詞向量表示。該工具的名稱叫做: bert-as-service,從名稱就可以看出作者是把 BERT 作為一種服務(wù)了,只要調(diào)用該服務(wù)就能夠得到我們想要的向量表示,得到向量以后,就可以通過余弦相似度的計(jì)算公式計(jì)算向量之間的相似度。

      bert-as-service 源碼詳見: https://github.com/hanxiao/bert-as-service

      bert-as-service 使用文檔: https://bert-as-service./en/latest/index.html

      步驟如下:

      1. 安裝 bert-as-service 的服務(wù)端和客戶端。

      2. 預(yù)訓(xùn)練 BERT 模型。

      3. 客戶端編寫代碼請(qǐng)求服務(wù)端得到句向量。

      4. 句子與句子向量之間計(jì)算相似度,并返回 top_k 個(gè)結(jié)果。

      2. 安裝 bert-as-service

      1. 環(huán)境要求:

        Python版本 >= 3.5,Tensorflow版本 >= 1.10

        (本人環(huán)境,Python = 3.7 Tensorflow = 1.13.1)

      2. 安裝服務(wù)端和客戶端

        pip install -U bert-serving-server bert-serving-client

      3. 啟動(dòng) BERT 服務(wù)

      1. 下載預(yù)訓(xùn)練模型

        Google AI發(fā)布的經(jīng)過預(yù)訓(xùn)練的BERT模型。這里我們下載 BERT-Base, Chinese,12-layer, 768-hidden, 12-heads, 110M parameters。

        鏈接:

        https://pan.baidu.com/s/1jJudiTj__vbFb0WkEQUxWw

        密碼:mf4p

      2. 啟動(dòng)服務(wù)

        解壓縮后,運(yùn)行如下命令進(jìn)行啟動(dòng),目錄換成解壓后的路徑。(-num_worker指定使用多少個(gè)CPU)

        bert-serving-start -model_dir /Users/mantch/Downloads/chinese_L-12_H-768_A-12 -num_worker=4

        運(yùn)行后會(huì)看到如下結(jié)果:

            http_max_connect = 10
                   http_port = None
                mask_cls_sep = False
              max_batch_size = 256
                 max_seq_len = 25
                   model_dir = /Users/mantch/Downloads/chinese_L-12_H-768_A-12
        no_position_embeddings = False
            no_special_token = False
                  num_worker = 4
               pooling_layer = [-2]
            pooling_strategy = REDUCE_MEAN
                        port = 5555
                    port_out = 5556
               prefetch_size = 10
         priority_batch_size = 16
        show_tokens_to_client = False
             tuned_model_dir = None
                     verbose = False
                         xla = False

        其中就已經(jīng)顯示了port = 5555,port_out = 5556 等端口號(hào)信息。

        如果顯示以下信息就表示可以使用了

        I:WORKER-0:[__i:gen:559]:ready and listening!
        I:WORKER-3:[__i:gen:559]:ready and listening!
        I:WORKER-1:[__i:gen:559]:ready and listening!
        I:WORKER-2:[__i:gen:559]:ready and listening!
        I:VENTILATOR:[__i:_ru:164]:all set, ready to serve request!

      4. 相似度計(jì)算

      1. 數(shù)據(jù)集

        我們使用螞蟻金服語義相似度比賽的一份數(shù)據(jù)集,該數(shù)據(jù)集分為 4 列,第一列是索引,第二列和第三列是句子,第四列中的 1 表示這兩個(gè)句子是同義句,否則表示為 0。

        數(shù)據(jù)集下載地址: https://www./ia9dg8b

      2. 編寫代碼

        import pandas as pd
        import numpy as np
        from bert_serving.client import BertClient
        from termcolor import colored
        
        num = 100     # 采樣數(shù)
        topk = 5     # 返回 topk 個(gè)結(jié)果
        
        # 讀取數(shù)據(jù)集
        sentence_csv = pd.read_csv('atec_nlp_sim_train_all.csv', sep='\t', names=['idx', 's1', 's2', 'label'])
        sentences = sentence_csv['s1'].tolist()[:num]
        print('%d questions loaded, avg.len %d' % (len(sentences), np.mean([len(d) for d in sentences])))
        
        
        with BertClient(port=5555, port_out=5556) as bc:
        
            # 獲取句子向量編碼
            doc_vecs = bc.encode(sentences)
        
            while True:
                query = input(colored('your question:', 'green'))
                query_vec = bc.encode([query])[0]
        
                # 余弦相似度 分?jǐn)?shù)計(jì)算。
                # np.linalg.norm 是求取向量的二范數(shù),也就是向量長(zhǎng)度。
                score = np.sum(query_vec * doc_vecs, axis=1) / np.linalg.norm(doc_vecs, axis=1)
        
                '''
                     argsort()函數(shù)是將x中的元素從小到大排列,提取其對(duì)應(yīng)的index(索引)
        
                    [::-1]取從后向前(相反)的元素, 例如[ 1 2 3 4 5 ]
                    則輸出為[ 5 4 3 2 1 ]
                '''
                topk_idx = np.argsort(score)[::-1][:topk]
                print('top %d questions similar to "%s"' % (topk, colored(query, 'green')))
                for idx in topk_idx:
                    print('> %s\t%s' % (colored('%.1f' % score[idx], 'cyan'), colored(sentences[idx], 'yellow')))

      來源:https://www./content-4-659401.html

        本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
        轉(zhuǎn)藏 分享 獻(xiàn)花(0

        0條評(píng)論

        發(fā)表

        請(qǐng)遵守用戶 評(píng)論公約

        類似文章 更多