Dice Tech Jobs - Dice.com 用於建立「概念搜尋引擎」的儲存庫,作者:Simon Hughes(Dice 資料科學家).此儲存庫包含用於在一組文件上訓練 Thomas Mikolov 的 Word2Vec 模型的 Python 程式碼。然後,可以使用同義詞檔案與一些 solr 外掛程式結合將此流程的輸出嵌入到 solr(或其他一些搜尋引擎)中,以在搜尋引擎內提供概念搜尋功能。輸出也可以在其他搜尋引擎中使用,只要它們支援同義詞檔案。概念搜尋也稱為語義搜索,它學習匹配域中的概念而不是關鍵字來提高召回率。
另請查看我的“搜尋中的向量”存儲庫,它擴展了這項工作。它還包含該演講中的幻燈片和影片的連結。
這些腳本包括用於預處理和標記文件、根據文件頻率提取常用術語和短語、使用 gensim 實現訓練 word2vec 模型以及使用 sci-kit learn 的聚類庫對生成的詞向量進行聚類的程式碼。 python 腳本輸出許多 solr 同義詞文件,當與一些自訂的 dice solr 插件結合使用時,這些文件可用於在 solr 中啟用概念搜尋功能。
請參閱 https://github.com/DiceTechJobs/SolrPlugins 以了解 solr 插件,以在 Apache Solr 搜尋引擎中利用學習到的向量和同義詞文件
請參閱 https://github.com/DiceTechJobs/SolrConfigExamples 以取得範例 solr 配置條目,用於在 solr 中配置概念搜索,包括設定插件。
這些腳本採用 Jupyter python 筆記本的形式,按順序運行(1、2、3 和 4 中的任何一個),如果您不想使用 Jupyter,則可以作為單獨的命令列腳本(見下文)運行。 python 腳本更乾淨,並與所有必需的設定共享通用配置文件,並且設計為從 shell 運行,因此這些腳本可能更容易啟動。這些筆記本和腳本將預處理文檔,並訓練 Word2Vec 模型。 ./Settings 資料夾包含每個腳本的範例設定文件,並在註釋中提供了每個設定的描述。若要呼叫命令列腳本,請傳入相關的設定檔作為唯一的參數,例如
python pre_process_documents.py ./Settings/pre_process_documents.cfg
命令列腳本應按順序運行:
pre_process_documents.py - 需要刪除一些標點符號(逗號、連字號等),如果需要的話解析 html,並分離出文件中的句子。如果您希望跳過此步驟並轉到步驟 2 或 3,請向步驟 2 和 3 提供一組文件,其中包含要刪除的所有標點符號,並且每個新句子都位於單獨的行中。
extract_keywords.py -(可選)如果您的網域中沒有一組良好且廣泛的關鍵字短語(例如您的前5,000 個搜尋關鍵字和短語,短語是重要部分),或者您希望增加此列表之外的覆蓋範圍,請執行該腳本提取高於指定文件頻率閾值的所有關鍵字和短語。
train_word2vec_model.py - 在 1 中的預處理文件上訓練並儲存 Word2Vec 模型。在幕後使用C 版本,否則將使用慢得多的python 實作。如果此功能不可用,您將在首次訓練模型時收到運行時警告。
此步驟包含多個文件,具體取決於所需的解決方案(請參閱我的演講):
向量輸出 - 即將推出!請參閱 Jupyter Notebook 4.a
generate_topn_synonyms_file.py - 為每個目標關鍵字或短語產生前 n 個同義詞。這會產生 2 個文件,一個包含有效負載的文件,一個不包含有效負載的文件。最簡單的用例是使用沒有負載的檔案。使用有效負載檔案透過相似性對同義詞進行加權可以獲得更好的效能。這可以在查詢時使用 queryboost 解析器來完成。請注意,要執行此操作,您需要在查詢時對逗號和空格進行標記,因為我們用逗號替換空格來解決多詞同義詞問題。或者(建議)在索引時使用同義詞擴展,以及 PayloadEdismax 查詢解析器、PayloadAwareDefaultSimilarity 類別(用作預設相似性或使用模式相似性來配置每個欄位),並確保這些欄位的 fieldType 包含術語「有效負載」或「向量」。
generate_cluster_synonyms_file.py - 從前面步驟產生的詞向量產生 k 個簇。這些可以透過同義詞檔案直接嵌入到 solr 中 - 不需要特殊的插件。我建議生成許多不同大小的不同同義詞簇,並將它們配置為單獨的字段,並將較高的字段權重應用於小簇(即使用較大的 k 值生成)。
使用 python 2.7.10 建置。未經 python 3 測試
Word2Vec 的實作是優秀的 gensim 套件的實作。包含 LSA、LDA、Word2Vec 和其他一些機器學習演算法的快速實現。
https://radimrehurek.com/gensim/models/word2vec.html
這是一個很棒的包,用於主題建模以及學習文件和單字的語義表示。
谷歌發布了一組預先訓練的詞向量,在谷歌新聞語料庫的 1000 億個單字上進行訓練。對於那些不專注於特定領域而是關注非常廣泛的文檔的人,例如構建新聞搜尋引擎的公司(如路透社、彭博社、政府機構等),您可以使用這個預先訓練的模型反而。然後,您可以跳過前 3 個步驟,直接使用上面的第 4 步腳本之一,該腳本採用預先訓練的模型併計算輸出同義詞文件,這就是您所需要的。這篇文章介紹了在哪裡取得預訓練向量:https://groups.google.com/forum/#!topic/gensim/_XLEbmoqVCg。然後您可以使用 gensim 的 Word2Vec 的 model.load 功能:
model = Word2Vec . load ( MODEL_FILE )
如果您使用 Solr 雲,Zookeeper 不喜歡任何設定檔大小超過 1M。因此,如果生成的同義詞檔案大於此值,您將必須1) 更改預設的Zookeeper 設置,2) 將同義詞檔案拆分為多個檔案並按順序應用同義詞過濾器,或者3) 使用以下命令從資料庫加載同義詞一個插件(例如https://github.com/shopping24/solr-jdbc-synonyms)
史丹佛大學的 NLP 研究者開發了一種與 Word2Vec 競爭的詞向量學習演算法,具有相似的精確度。如果你想嘗試一下,這個 python 套件將允許你這樣做:https://github.com/hans/glove.py 但我還沒有嘗試過,所以我現在不能保證它。
初始腳本需要一個包含原始 *.txt 或 html 檔案的資料夾。如果您有 html 內容,則腳本內部有解析 html 的邏輯,但 beautiful soup 可能有點不穩定,因此您最好在將它們推入管道之前先對其進行預解析。請注意,沒有特殊的文件格式,這似乎是大多數人在嘗試執行此腳本時遇到的問題。如果加載文件時出錯,我建議使用 python 腳本而不是筆記本,然後打開偵錯器看看發生了什麼。另外,請確保在 https://github.com/DiceTechJobs/ConceptualSearch/blob/master/Settings/pre_process_documents.cfg 中設定 config.file_mask 以符合要載入的檔案。預設為 .*.txt (它是正規表示式,而不是檔案 blob),因此如果您的檔案不是 .txt 文件,則需要更改它。
請將任何問題、錯誤或功能請求發佈到問題列表,並添加 @mention - @simonhughes22,以便我會及時收到包含您問題的電子郵件。有幾個人直接給我發電子郵件詢問有關此存儲庫的問題。雖然我不介意回覆電子郵件,但請提交 GitHub 問題並@提及我。這樣,其他人就可以看到問題和我的回答以供將來參考。
我最近做了一個關於向量搜尋的演講,程式碼如下。這是我所做的概念搜尋工作的自然延伸
請查看我們的 Solr 外掛: