<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          Github13K!相似搜索百寶箱,文本匹配入門必備!

          共 4595字,需瀏覽 10分鐘

           ·

          2021-03-30 12:50


          面筋地址:https://github.com/km1994/NLP-Interview-Notes

          個人筆記:https://github.com/km1994/nlp_paper_study





          每個人都有網(wǎng)購的經(jīng)歷,當你打開淘寶、京東app進入店鋪,是怎樣找到自己心儀商品的呢?
          最直白的方法,拉到“全部商品”頁,從頭一件件看。但這樣做明顯效率不高,如果有上千件商品,可能想買的沒買到,還加購了一堆自己原本不想買的東西。

          所以,你一般會直接在已有分類欄中選擇感興趣的類別,比如“男鞋”,“女大衣”;或者在搜索框中輸入關(guān)鍵詞。總之,目的只有一個:縮小搜索范圍,避免無關(guān)商品刷屏。

          在自然語言處理基礎(chǔ)任務(wù)文本匹配中,也存在搜索問題。例如,現(xiàn)在有一個包含了1000個常見高頻問題(即FAQ)的問答知識庫,用戶提出一個新問題,工程師們希望以最快速定位知識庫中和它最相似的問題,并返回答案。
          當數(shù)據(jù)規(guī)模在1K或1W時,線性搜索(暴力法)是一種省事兒的好方法。但是當數(shù)據(jù)增加到百萬、千萬級別時,O(n)的時間開銷可能會讓用戶們抓狂,內(nèi)存中也無法存放所有的數(shù)據(jù)。當數(shù)據(jù)漲到億級別,問題更加棘手了
          莫慌,今天小徐我來推薦一個牛X的開源項目。通過簡單的講解,只用不到10行代碼,就能實現(xiàn)任意規(guī)模數(shù)據(jù)集的相似搜索。
            0.Faiss是什么?
            1.Faiss如何使用?
            2.項目小結(jié)
          上車出發(fā)。

          0. 一個神奇的相似搜索工具


          Faiss:集眾多算法于一身的相似搜索工具箱
          Github Star:12.8K
          特點:算法豐富,安全可靠,底層C++實現(xiàn),提供完整Python接口;部分算法支持GPU加速
          項目連接
          https://github.com/facebookresearch/faiss
          使用文檔
          https://faiss.ai/
          FaceBook在推薦新聞和用戶時,使用了自家研究院開發(fā)的Faiss庫。Faiss是一個高效的相似性搜索(KNN)和密集向量聚類庫,包含的算法可以在任意大小的向量集合中進行搜索
          官方推薦使用anaconda包和conda指令安裝Faiss:
          # CPU-only version
          $ conda install -c pytorch faiss-cpu

          # GPU(+CPU) version
          $ conda install -c pytorch faiss-gpu
          測試后發(fā)現(xiàn)國內(nèi)會有網(wǎng)絡(luò)不通暢的問題,易安裝失敗。這里我推薦另一種方法,使用pip和國內(nèi)鏡像,約1分鐘搞定。

          # CPU-only version
          $ pip install faiss-cpu -i https://pypi.douban.com/simple

          # GPU(+CPU) version
          $ pip install faiss-gpu -i https://pypi.douban.com/simple

          1. Faiss使用教程

          Faiss構(gòu)建索引一般分為基于原始數(shù)據(jù)構(gòu)建全量索引,以及加入新的數(shù)據(jù)構(gòu)建增量索引。"Train"在某些算法中可以省略,“Add”是必須的。

          下面,我以線性搜索和乘積量化算法為例,介紹Faiss的上手方法。

          IndexFlatl2:暴力搜索

          最簡單的方法是基于歐式距離度量的暴力搜索法。
          首先,指定特征向量的維度d,通過詞向量或預(yù)訓練語言模型獲取原始文本的語義特征。隨后,構(gòu)建 IndexFlatl2 索引對象,并將文本特征加入到索引。屬性“ntotal”,可以查看當前索引中到數(shù)據(jù)規(guī)模。
          import faiss
          d = 768 # embedding 維度
          # 構(gòu)建 IndexFlatL2 索引,它是最簡單的索引類型,只執(zhí)行強力L2距離搜索
          faiss_l2_index = faiss.IndexFlatL2(d)
          print(faiss_l2_index.is_trained) # True

          # 在索引中添加原始特征
          # faq_texts_emb 是特征向量,維度 [6417, 768]
          faiss_l2_index.add(faq_texts_emb)
          print(faiss_l2_index.ntotal) # 查看數(shù)據(jù)規(guī)模:6417
          下面開始KNN搜索流程。指定需返回的最相似數(shù)據(jù)量k,假設(shè)現(xiàn)在用戶輸入了新問題q,通過編碼器獲得特征向量后,直接調(diào)用faiss索引,可以得到原始數(shù)據(jù)中和q最相似的k個問題,以及相應(yīng)的空間距離。
          # 查找 k 近鄰
          k = 3
          q = '我咋沒收到交費的通知呢?'
          q_emb = bc.encode([q]) # 獲得特征
          # dis_res:距離矩陣,由小到大排序
          # idx_res:數(shù)據(jù)索引id
          dis_res, idx_res = faiss_l2_index.search(q_emb, k)
          print(idx_res.shape, dis_res.shape) # [1,3], [1,3]
          為了檢驗結(jié)果是否正確,可以打印變量的值看看:
          print(idx_res) # [[107, 111, 75]]
          print(dis_res) # [[18.602684 20.919521 21.184694]]
          # labels[i] 先映射到訓練集文本對應(yīng)的真實意圖 label_id,再轉(zhuǎn)換為 label 標簽
          print(list(id2name[labels[i]] for i in idx_res[0]))
          """['未收到催費短信', '未收到催費短信', '未收到催費短信']"""
          查找的topk標準問題都是“未收到催費短信”,和真實提問“我咋沒收到交費的通知呢”一致。

          IndexPQ:乘積量化

          Faiss調(diào)用的套路基本是類似的。再來看另一種更高效的搜索方法,乘積量化。
          所謂量化,就是將連續(xù)的空間離散化,目的是為了優(yōu)化距離計算的速度。對原理感興趣對小伙伴,可以閱讀參考文獻[1],之后小徐會單獨開一篇文章介紹,歡迎關(guān)注!
          這里先介紹調(diào)用方法。乘積量化有一個聚類過程,所以需要顯式調(diào)用索引對象的“train”方法,再添加向量文件。預(yù)測過程,和“暴力搜索”類似。
          # m: 特征拆分子空間的數(shù)量
          m, d = 8768
          # 每一個子空間分配的bit大小
          n_bits = 8
          # 創(chuàng)建乘積量化索引
          faiss_pq_index = faiss.IndexPQ(d, m, n_bits)        
          # train 階段
          faiss_pq_index.train(faq_texts_emb)
          # add 階段
          faiss_pq_index.add(faq_texts_emb)

          k = 3
          q = '我妹夫家的租戶不交電費,這樣子會影響我妹夫的信用不?'
          q_emb = bc.encode([q])
          dis_res, idx_res = faiss_pq_index.search(q_emb, k)
          print(idx_res.shape, dis_res.shape) # [1,3], [1,3]
          print(idx_res) # [[2563 2575 2547]]
          print(dis_res) # [[11.660806 11.660806 11.660806]]
          print(list(id2name[labels[i]] for i in idx_res[0]))
          """['租戶不交電費是否影響戶主信用', '租戶不交電費是否影響戶主信用', '租戶不交電費是否影響戶主信用']"""
          最終結(jié)果和預(yù)期一致。
          Faiss中還有非常多好用高效的相似搜索方法,例如點積計算IndexFlatIP、改進版乘積量化、加入倒排索引的量化搜索“IndexIVFPQ等等,更多??可以查看Github上的tutorial文件夾。
          對源碼感興趣又有C++基礎(chǔ)的同學,可以從 AutoTone.cpp 文件開始,閱讀源碼。

          2. Faiss 項目總結(jié)

          回顧Faiss框架,這是一個用于相似檢索的算法集大成者。檢索目標不僅僅是文本,還包括圖片、音頻、視頻等等多模態(tài)形式,只要能將目標轉(zhuǎn)換為特征向量。
          除了開源項目,作者還提供了完整的文檔體系[2],方便大家快速上手。

          如果你的實驗或項目中涉及相似匹配任務(wù),不妨嘗試一下Faiss框架,畢竟FaceBook自家產(chǎn)品都在用,質(zhì)量還是有保障滴。如果通過調(diào)用接口,順便弄懂了算法原理,恭喜你,在檢索匹配領(lǐng)域你離成為巨佬又近了一步!


          深度學習資源下載

          在NLP情報局公眾號后臺回復(fù)“三件套”,即可獲取深度學習三件套:
          《PyTorch深度學習》,《Hands-on Machine Learning》,《Python深度學習》
          推 薦 閱 讀

          參 考 文 獻

          [1] Faiss-PQ/IVF介紹:https://blog.csdn.net/u013066730/article/details/106252573
          [2] Faiss文檔:https://faiss.ai/

          原創(chuàng)不易,有收獲的幫忙點擊點贊分享在看吧??

          瀏覽 41
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  操逼视频网站免费看 | 爱爱的免费视频 | A片黄色网 | 久久久极品 | 四川人妻第二次3p |