在這篇文章中,我們將手動(dòng)構(gòu)建一個(gè)語義相似性搜索引擎,該引擎將單個(gè)論文作為“查詢”輸入,并查找Top-K的最類似論文。主要包括以下內(nèi)容:
1.搭建milvus矢量數(shù)據(jù)庫
2.使用MILVUS矢量數(shù)據(jù)庫搭建語義相似性搜索引擎
3.從Kaggle下載ARXIV數(shù)據(jù),使用dask將數(shù)據(jù)加載到Python中,并構(gòu)建一個(gè)論文搜索引擎
1. 搭建milvus矢量數(shù)據(jù)庫
? ? milvus數(shù)據(jù)庫的安裝比較簡單,可以直接使用docker安裝,建議安裝2.1.x以上版本,功能更豐富,其分為標(biāo)準(zhǔn)版和集群版本,這里只安裝標(biāo)準(zhǔn)版本。
?① docker 在線安裝:
https://milvus.io/docs/v2.1.x/install_standalone-docker.md
② docker 離線安裝:若服務(wù)器存在網(wǎng)絡(luò)限制,可使用離線安裝策略,官方文檔如下:
https://milvus.io/docs/v2.1.x/install_offline-docker.md
這里展示我自己參考官方離線安裝文檔,但有些不同的的安裝方式,即自己手動(dòng)下載容器,在手動(dòng)上傳至服務(wù)器:
(1)首先在這里下載docker-compose.yml,查看需要的容器:
http://$ wget https://github.com/milvus-io/milvus/releases/download/v2.1.1/milvus-standalone-docker-compose.yml -O docker-compose.yml
主要包括以下三個(gè):
? ? image: quay.io/coreos/etcd:v3.5.0
? ??image: minio/minio:RELEASE.2022-03-17T06-34-49Z
? ??image: milvusdb/milvus:v2.1.1
(2)在docker hub找到需要下載的容器:
https://hub.docker.com/
?
?(3)復(fù)制pull命令到如下網(wǎng)址進(jìn)行在線下載,并打包成tar:
https://pullimage.passerma.com/
這一步可參考博客:
在線下載Docker Hub鏡像,打成tar包下載_passerma的博客-CSDN博客_dockerhub下載鏡像
(4)后續(xù)步驟按照離線官方文檔下這一步開始執(zhí)行:
?
?出現(xiàn)以下顯示,并通過docker-compose ps查看容器狀態(tài),出現(xiàn)以下結(jié)果則安裝成功:
?
2.使用MILVUS矢量數(shù)據(jù)庫搭建語義相似性搜索引擎
? 參考官方文檔:
??https://github.com/milvus-io/bootcamp/tree/master/solutions/text_search_engine/quick_deploy
?我這里由于服務(wù)器網(wǎng)絡(luò)限制原因沒有用第一種方案,如果使用第一種方案,前面的步驟1:搭建milvus矢量數(shù)據(jù)庫,可直接跳過:
?
?第二種方案:以源碼部署
第一步安裝milvus已經(jīng)在步驟一完成,跳過:
?
第二步:使用docker安裝mysql,離線安裝和在線安裝都可以,離線安裝參照上面miluv安裝步驟,下載mysql5.7.tar包,上傳至服務(wù)器,然后加載容器:
docker load -i mysql:5.7.tar
開啟mysql服務(wù):
docker run -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7
?后續(xù)步驟按照教程走即可。
注意事項(xiàng):
?
?這里的let endpoint 要填服務(wù)器地址加端口號(hào)。示例:http://12.88.8.104:8000
3.從Kaggle下載ARXIV數(shù)據(jù),使用dask將數(shù)據(jù)加載到Python中,并構(gòu)建一個(gè)論文搜索引擎
這個(gè)可參考文章:https://blog.csdn.net/deephub/article/details/126343422
我這里的改進(jìn)如下:
可以直接將arxiv的json格式通過dask包讀取后另存為csv格式,然后將數(shù)據(jù)通過serverapi上傳即可:
?papers_df = papers_db.to_dataframe(meta=schema)
在這后面加上一句:
papers_df.to_csv(path,single_file=True)
出現(xiàn)的問題:
1.加載arxiv.csv文件時(shí)由于其源碼是使用pandas一次轉(zhuǎn)化為一個(gè)list,一次上傳,這樣會(huì)導(dǎo)致內(nèi)存暴:milvus docker 會(huì)出現(xiàn) exit(137)錯(cuò)誤?
2.使用dask加載csv文件出現(xiàn)亂碼的問題。
解決方法:
使用dask庫加載:
dd_file = dask.dataframe.read_csv(file_dir,blocksize='10MB')blocksize表示一次加載的分片大小
for partition in tqdm(range(dd_file.npartitions)):
subset_df = dd_file.get_partition(partition)
if len(subset_df.index) !=0:
data = [subset_df[col].values.compute().tolist() for col in ['title','text']]
#若使用上述方法出現(xiàn)亂碼,可使用下述方法:
#先使用pandas加載
pd_file = pd.read_csv(file)
dd_file = dask.dataframe.from_pandas(pd_file, npartitions=10)
for partition in tqdm(range(dd_file.npartitions)):
subset_df = dd_file.get_partition(partition)
if len(subset_df.index) !=0:
data = [subset_df[col].values.compute().tolist() for col in ['title','text']]
附dask官方文檔:
https://docs.dask.org/en/latest/dataframe-create.html
3.在將數(shù)據(jù)進(jìn)行上傳時(shí),出現(xiàn)mysql數(shù)據(jù)庫 1366編碼錯(cuò)誤的問題:文章來源:http://www.zghlxwxcb.cn/news/detail-488014.html
在mysql_helpers.py修改如下兩個(gè)地方:文章來源地址http://www.zghlxwxcb.cn/news/detail-488014.html
def __init__(self):
self.conn = pymysql.connect(host=MYSQL_HOST, user=MYSQL_USER, port=MYSQL_PORT,
password=MYSQL_PWD,
#1. 增加charset='utf8mb4'
charset='utf8mb4',
local_infile=True)
def create_mysql_table(self, table_name):
self.test_connection()
sql = "create table if not exists " + table_name +"(milvus_id TEXT, title TEXT, text TEXT);"
try:
self.cursor.execute(sql)
#使用sql語句改變表編碼格式
self.cursor.execute("alter table "+table_name + " convert to charcter set utf8mb4;")
到了這里,關(guān)于從零開始構(gòu)建基于milvus向量數(shù)據(jù)庫的文本搜索引擎的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!