2020国产成人精品视频,性做久久久久久久久,亚洲国产成人久久综合一区,亚洲影院天堂中文av色

分享

將斯坦福 GloVe 詞向量數(shù)據(jù)集索引到 Easysearch 以實現(xiàn)語義搜索

 銘毅天下 2025-05-16 發(fā)布于廣東

本文將通過一個 Python 實現(xiàn),詳細(xì)講解如何加載斯坦福公開預(yù)訓(xùn)練的 GloVe 詞向量并將其索引到 Easysearch,以實現(xiàn)高效的語義搜索。


https://nlp./projects/glove/

我們將逐步分析數(shù)據(jù)源、Easysearch 連接、索引邏輯以及關(guān)鍵注意事項,確保整個流程邏輯清晰、層次分明。

1、引言

GloVe(Global Vectors for Word Representation)是一種詞向量模型,能夠?qū)卧~映射到密集向量空間,捕捉語義關(guān)系,非常適合語義搜索或文本相似性任務(wù)。

https://nlp./projects/glove/

Easysearch支持密集向量字段和k近鄰(k-NN)搜索,是存儲和查詢這些向量的強(qiáng)大工具。

本文將展示如何使用Python將兩者結(jié)合,重點講解數(shù)據(jù)源、連接設(shè)置和索引邏輯。

2、前提條件

在開始之前,請確保準(zhǔn)備好以下內(nèi)容:

  • Easysearch集群:一個運(yùn)行中的實例(例如https://127.0.0.1:9200/)并具備訪問憑據(jù)。
  • GloVe文件:預(yù)訓(xùn)練的GloVe 向量文件(例如glove.6B.50d.txt)。
  • Python依賴:安裝必要的Python庫:
    pip install Easysearch urllib3 numpy
  • 索引映射:Easysearch中已創(chuàng)建的索引(knn-test),并配置了支持50維向量的密集向量字段(my_vec)。
    極限控制臺創(chuàng)建索引

3、數(shù)據(jù)源:GloVe 向量

3.1 什么是 GloVe?

GloVe 是由斯坦福NLP團(tuán)隊開發(fā)的詞向量模型,通過在大規(guī)模文本語料庫(如Wikipedia或Common Crawl)上訓(xùn)練生成。每個單詞被表示為一個密集向量(例如50維、100維或300維),這些向量能夠捕捉單詞的語義信息。

本項目使用glove.6B.50d.txt文件,包含40萬個單詞,每個單詞對應(yīng)一個50維向量。

https://www./datasets/watts2/glove6b50dtxt

3.2 文件結(jié)構(gòu)

GloVe 文件是一個純文本文件,每行表示一個單詞及其嵌入向量:

word1 0.123 0.456 -0.789 ... (50個浮點數(shù))
word2 0.234 -0.567 0.890 ... (50個浮點數(shù))
  • 第一列:單詞(例如“the”、“dog”)。
  • 其余列:50個浮點數(shù),表示該單詞的向量。

3.3 加載GloVe模型

load_glove_model函數(shù)將GloVe文件加載到Python字典中:

def load_glove_model(file_path):
    print("加載GloVe模型")
    glove_model = {}
    with open(file_path, 'r', encoding='utf-8'as f:
        for line in f:
            split_line = line.strip().split()
            word = split_line[0]
            embedding = np.array(split_line[1:], dtype=np.float64)
            glove_model[word] = embedding
    print(f"已加載{len(glove_model)}個單詞!")
    return glove_model
  • 處理流程
    1. 使用UTF-8編碼打開文件,以支持特殊字符。
    2. 將每行拆分為單詞和其向量。
    3. 將向量轉(zhuǎn)換為NumPy數(shù)組,便于計算。
    4. 將單詞和向量存儲到字典glove_model中。
  • 輸出:一個字典,將單詞映射到50維NumPy數(shù)組(例如,glove_model["dog"]返回一個50維向量)。
  • 注意事項
    • 文件較大(glove.6B.50d.txt約167MB),加載可能需要幾秒鐘。
    • UTF-8編碼確保兼容非ASCII單詞。
      40萬個單詞加載

4、Easysearch 設(shè)置

4.1 連接配置

腳本使用Easysearch Python客戶端連接到Easysearch集群:

url = "https://127.0.0.1:9200/"
user_passwd = ('admin''dffXXXXXXXXXXXXc57')
es = Easysearch(
    [url],
    http_auth=user_passwd,
    verify_certs=False,
)
  • URL:指向Easysearch實例。
  • 認(rèn)證:使用HTTP基本認(rèn)證,提供用戶名和密碼。
  • SSL驗證:為簡化流程,禁用SSL驗證(verify_certs=False),但生產(chǎn)環(huán)境中應(yīng)使用合法證書以確保安全。
  • 警告處理:通過urllib3.disable_warningswarnings.filterwarnings禁用SSL相關(guān)警告(生產(chǎn)環(huán)境不建議)。

4.2 集群健康檢查(僅測試demo用,本示例可以刪除)

在索引之前,腳本會檢查集群狀態(tài):

health = es.cluster.health()
pprint(health)

此調(diào)用返回集群狀態(tài)(green、yellowred)、節(jié)點數(shù)量和分片分配等信息,確保集群可用于索引。

4.3 索引映射

目標(biāo)索引(knn-test)需預(yù)先配置支持密集向量的映射。典型的映射如下:

{
  "mappings": {
    "properties": {
      "word": { "type""keyword" },
      "my_vec": { "type""dense_vector""dims"50 }
    }
  }
}
  • word:以keyword類型存儲單詞,用于精確匹配。
  • my_vec:一個50維的dense_vector字段,用于存儲GloVe向量。

5、索引邏輯

index_glove_to_es函數(shù)將 GloVe 嵌入分批索引到 Easysearch:

def index_glove_to_es(glove_model, index_name="knn-test", batch_size=1000):
    print(f"正在將GloVe向量索引到{index_name}")
    actions = []
    count = 0

    for word, vector in glove_model.items():
        if len(vector) != 50:
            print(f"由于向量維度錯誤,跳過單詞'{word}':{len(vector)}")
            continue

        action = {
            "_index": index_name,
            "_source": {
                "word": word,
                "my_vec": vector.tolist()
            }
        }
        actions.append(action)
        count += 1

        if len(actions) >= batch_size:
            from Easysearch.helpers import bulk
            success, failed = bulk(es, actions, raise_on_error=False)
            print(f"索引{success}個文檔,{failed}個失敗")
            actions = []

        if count % 10000 == 0:
            print(f"已處理{count}個單詞")

    if actions:
        from Easysearch.helpers import bulk
        success, failed = bulk(es, actions, raise_on_error=False)
        print(f"索引{success}個文檔,{failed}個失敗")

    print(f"共處理{count}個單詞")
    return count

5.1 核心組件

  1. 分批處理

    • 文檔以每批1000個(batch_size=1000)的方式索引,平衡內(nèi)存使用和性能。
    • 使用Easysearch.helpersbulk API實現(xiàn)高效索引。
    • 每批完成后清空actions列表,釋放內(nèi)存。
  1. 文檔結(jié)構(gòu)

    • word:GloVe模型中的單詞。
    • my_vec:50維向量,轉(zhuǎn)換為Python列表(Easysearch不支持直接使用NumPy數(shù)組)。
    • 每個文檔包含:
    • _index字段指定目標(biāo)索引(knn-test)。
  2. 錯誤處理

    • 檢查向量維度是否為50(len(vector) == 50),跳過無效向量并記錄警告。
    • bulk API設(shè)置raise_on_error=False,防止失敗中斷流程,失敗的文檔會被記錄。
  3. 進(jìn)度跟蹤

    • 每處理10,000個單詞記錄一次進(jìn)度。
    • 每批及最后報告成功和失敗的文檔數(shù)量。

5.2 執(zhí)行流程

主程序塊協(xié)調(diào)整個流程:

if __name__ == "__main__":
    glove_file = "glove.6B.50d.txt"
    index_name = "knn-test"
    glove_model = load_glove_model(glove_file)
    index_glove_to_es(glove_model, index_name)
  1. 指定GloVe文件路徑和目標(biāo)索引。
  2. 將GloVe模型加載到內(nèi)存。
  3. 將所有向量索引到Easysearch。

6、性能考慮

  • 內(nèi)存使用:加載40萬個詞向量需要約170MB內(nèi)存。分批索引可避免內(nèi)存峰值。
  • 索引速度:每批1000個文檔適用于大多數(shù)系統(tǒng),可根據(jù)集群容量和網(wǎng)絡(luò)延遲調(diào)整。
  • 集群負(fù)載:索引40萬個文檔可能需要幾分鐘,具體取決于集群的節(jié)點數(shù)和資源。
  • 錯誤處理:跳過無效向量確保流程魯棒性,但可記錄這些問題以便進(jìn)一步分析。

7、潛在改進(jìn)

  1. 并行索引:使用concurrent.futures并行處理批次,提升索引速度。
  2. 動態(tài)映射:如果索引不存在,程序化創(chuàng)建正確的映射。
  3. 數(shù)據(jù)驗證:檢查GloVe文件中是否存在重復(fù)單詞或格式錯誤。
  4. 安全性:生產(chǎn)環(huán)境中啟用SSL驗證,并使用環(huán)境變量存儲憑據(jù)。
  5. 監(jiān)控:集成Easysearch的_cat/indices API,實時監(jiān)控索引增長。

8、結(jié)論

本流程展示了如何加載GloVe向量并將其索引到 Easysearch,用于語義搜索應(yīng)用。

通過分批處理、錯誤處理和 Easysearch Python 客戶端(本質(zhì)是 Elasticsearch 客戶端,由于 Elasticsearch 7.10.2 以后變更了許可模式,所以本文使用的 7.13.1 的客戶端),我們實現(xiàn)了一個可擴(kuò)展且魯棒的解決方案。

GloVe數(shù)據(jù)源提供了豐富的語義表示,而 Easysearch 的k-NN搜索功能支持高效的相似性查詢。通過小調(diào)整,此設(shè)置可擴(kuò)展到其他嵌入模型或更大規(guī)模的數(shù)據(jù)集。

完整代碼請參考如下鏈接:

https://articles./id_4p2rr0g6bm3j.html

更多優(yōu)化實踐,歡迎留言交流 ??

參考

[1] https://www.cnblogs.com/infinilabs/p/18313184

[2] https://docs./easysearch/main/docs/references/search/knn_api/

[3] https:///questions/37793118/load-pretrained-glove-vectors-in-python

短時間快習(xí)得多干貨!

和全球2000+ Elastic 愛好者一起精進(jìn)!

elastic6.cn——ElasticStack進(jìn)階助手

圖片

搶先一步學(xué)習(xí)進(jìn)階干貨

    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多