下面基于上篇文章使用到的 Chinese-medical-dialogue-data
中文醫(yī)療對話數(shù)據(jù)作為知識內(nèi)容進(jìn)行實(shí)驗(yàn)。
本篇實(shí)驗(yàn)使用 ES
版本為:7.14.0
二、Chinese-medical-dialogue-data 數(shù)據(jù)集
GitHub
地址如下:
https://github.com/Toyhom/Chinese-medical-dialogue-data
數(shù)據(jù)分了 6
個(gè)科目類型:
數(shù)據(jù)格式如下所示:
其中 ask
為病癥的問題描述,answer
為病癥的回答。
由于數(shù)據(jù)較多,本次實(shí)驗(yàn)僅使用 IM_內(nèi)科
數(shù)據(jù)的前 5000
條數(shù)據(jù)進(jìn)行測試。
三、Embedding 模型
Embedding
模型使用開源的 chinese-roberta-wwm-ext-large
,該模型輸出為 1024
維。
huggingface
地址:
https://huggingface.co/hfl/chinese-roberta-wwm-ext-large
基本使用如下:
from transformers import BertTokenizer, BertModel
import torch
模型下載的地址
model_name = ‘D:\AIGC\model\chinese-roberta-wwm-ext-large’
def embeddings(docs, max_length=300):
tokenizer = BertTokenizer.from_pretrained(model_name)
model = BertModel.from_pretrained(model_name)
對文本進(jìn)行分詞、編碼和填充
input_ids = []
attention_masks = []
for doc in docs:
encoded_dict = tokenizer.encode_plus(
doc,
add_special_tokens=True,
max_length=max_length,
padding=‘max_length’,
truncation=True,
return_attention_mask=True,
return_tensors=‘pt’
)
input_ids.append(encoded_dict[‘input_ids’])
attention_masks.append(encoded_dict[‘a(chǎn)ttention_mask’])
input_ids = torch.cat(input_ids, dim=0)
attention_masks = torch.cat(attention_masks, dim=0)
前向傳播
with torch.no_grad():
outputs = model(input_ids, attention_mask=attention_masks)
提取最后一層的CLS向量作為文本表示
last_hidden_state = outputs.last_hidden_state
cls_embeddings = last_hidden_state[:, 0, :]
return cls_embeddings
if name == ‘__main__’:
res = embeddings([“你好,你叫什么名字”])
print(res)
print(len(res))
print(len(res[0]))
運(yùn)行后可以看到如下日志:
四、ElasticSearch 存儲向量
創(chuàng)建向量索引
PUT http://127.0.0.1:9200/medical_index
{
“settings”: {
“number_of_shards”: 3,
“number_of_replicas”: 1
},
“mappings”: {
“properties”: {
“ask_vector”: {
“type”: “dense_vector”,
“dims”: 1024
},
“ask”: {
“type”: “text”,
“analyzer”: “ik_max_word”,
“search_analyzer”: “ik_smart”
},
“answer”: {
“type”: “text”,
“analyzer”: “ik_max_word”,
“search_analyzer”: “ik_smart”
}
}
}
}
其中 dims
為向量的長度。
查看創(chuàng)建的索引:
GET http://127.0.0.1:9200/medical_index
數(shù)據(jù)存入 ElasticSearch
引入 ElasticSearch
依賴庫:
pip install elasticsearch -i https://pypi.tuna.tsinghua.edu.cn/simple
from elasticsearch import Elasticsearch
from transformers import BertTokenizer, BertModel
import torch
import pandas as pd
def embeddings_doc(doc, tokenizer, model, max_length=300):
encoded_dict = tokenizer.encode_plus(
doc,
add_special_tokens=True,
max_length=max_length,
padding=‘max_length’,
truncation=True,
return_attention_mask=True,
return_tensors=‘pt’
)
input_id = encoded_dict[‘input_ids’]
attention_mask = encoded_dict[‘a(chǎn)ttention_mask’]
前向傳播
with torch.no_grad():
outputs = model(input_id, attention_mask=attention_mask)
提取最后一層的CLS向量作為文本表示
last_hidden_state = outputs.last_hidden_state
cls_embeddings = last_hidden_state[:, 0, :]
return cls_embeddings[0]
def add_doc(index_name, id, embedding_ask, ask, answer, es):
body = {
“ask_vector”: embedding_ask.tolist(),
“ask”: ask,
“answer”: answer
}
result = es.create(index=index_name, id=id, doc_type=“_doc”, body=body)
return result
def main():
模型下載的地址
model_name = ‘D:\AIGC\model\chinese-roberta-wwm-ext-large’
ES 信息
es_host = “http://127.0.0.1”
es_port = 9200
es_user = “elastic”
es_password = “elastic”
index_name = “medical_index”
數(shù)據(jù)地址
path = “D:\AIGC\dataset\Chinese-medical-dialogue-data\Chinese-medical-dialogue-data\Data_數(shù)據(jù)\IM_內(nèi)科\內(nèi)科5000-33000.csv”
分詞器和模型
tokenizer = BertTokenizer.from_pretrained(model_name)
model = BertModel.from_pretrained(model_name)
ES 連接
es = Elasticsearch(
[es_host],
port=es_port,
http_auth=(es_user, es_password)
)
讀取數(shù)據(jù)寫入ES
data = pd.read_csv(path, encoding=‘ANSI’)
for index, row in data.iterrows():
寫入前 5000 條進(jìn)行測試
if index >= 500:
break
ask = row[“ask”]
answer = row[“answer”]
文本轉(zhuǎn)向量
embedding_ask = embeddings_doc(ask, tokenizer, model)
result = add_doc(index_name, index, embedding_ask, ask, answer, es)
print(result)
if name == ‘__main__’:
main()
五、相似性搜索
1. 余弦相似度算法:cosineSimilarity
from elasticsearch import Elasticsearch
from transformers import BertTokenizer, BertModel
import torch
def embeddings_doc(doc, tokenizer, model, max_length=300):
encoded_dict = tokenizer.encode_plus(
doc,
add_special_tokens=True,
max_length=max_length,
padding=‘max_length’,
truncation=True,
return_attention_mask=True,
return_tensors=‘pt’
)
input_id = encoded_dict[‘input_ids’]
attention_mask = encoded_dict[‘a(chǎn)ttention_mask’]
前向傳播
with torch.no_grad():
outputs = model(input_id, attention_mask=attention_mask)
提取最后一層的CLS向量作為文本表示
last_hidden_state = outputs.last_hidden_state
cls_embeddings = last_hidden_state[:, 0, :]
return cls_embeddings[0]
def search_similar(index_name, query_text, tokenizer, model, es, top_k=3):
query_embedding = embeddings_doc(query_text, tokenizer, model)
print(query_embedding.tolist())
query = {
“query”: {
“script_score”: {
“query”: {“match_all”: {}},
“script”: {
“source”: “cosineSimilarity(params.queryVector, ‘a(chǎn)sk_vector’) + 1.0”,
“l(fā)ang”: “painless”,
“params”: {
“queryVector”: query_embedding.tolist()
}
}
}
},
“size”: top_k
}
res = es.search(index=index_name, body=query)
hits = res[‘hits’][‘hits’]
similar_documents = []
for hit in hits:
similar_documents.append(hit[‘_source’])
return similar_documents
def main():
模型下載的地址
model_name = ‘D:\AIGC\model\chinese-roberta-wwm-ext-large’
ES 信息
es_host = “http://127.0.0.1”
es_port = 9200
es_user = “elastic”
es_password = “elastic”
index_name = “medical_index”
分詞器和模型
tokenizer = BertTokenizer.from_pretrained(model_name)
model = BertModel.from_pretrained(model_name)
ES 連接
es = Elasticsearch(
[es_host],
port=es_port,
http_auth=(es_user, es_password)
)
query_text = “我有高血壓可以拿黨參泡水喝嗎”
similar_documents = search_similar(index_name, query_text, tokenizer, model, es)
for item in similar_documents:
print(“================================”)
print(‘a(chǎn)sk:’, item[‘a(chǎn)sk’])
print(‘a(chǎn)nswer:’, item[‘a(chǎn)nswer’])
if name == ‘__main__’:
main()
打印日志如下:
================================ ask: 我有高血壓這兩天女婿來的時(shí)候給我拿了些黨參泡水喝,您好高血壓可以吃黨參嗎? answer: 高血壓病人可以口服黨參的。黨參有降血脂,降血壓的作用,可以徹底消除血液中的垃圾,從而對冠心病以及心血管疾病的患者都有一定的穩(wěn)定預(yù)防工作作用,因此平時(shí)口服黨參能遠(yuǎn)離三高的危害。另外黨參除了益氣養(yǎng)血,降低中樞神經(jīng)作用,調(diào)整消化系統(tǒng)功能,健脾補(bǔ)肺的功能。感謝您的進(jìn)行咨詢,期望我的解釋對你有所幫助。
ask: 我準(zhǔn)備過兩天去看我叔叔,順便帶些人參,但是他有高血壓,您好人參高血壓可以吃嗎? answer: 人參有一定的調(diào)壓作用,主要用來氣虛體虛的患者,如果有氣血不足,氣短乏力,神經(jīng)衰弱,神經(jīng)衰弱健忘等不適癥狀的話,可以適當(dāng)口服人參調(diào)養(yǎng)身體,但是對于高血壓的病人,如果長期食用人參的話,可能會對血壓引發(fā)一定影響,所以,比較好到醫(yī)院中醫(yī)科實(shí)施辨證論治調(diào)治,看如何適合食用人參。
ask: 我媽媽有點(diǎn)高血壓,比較近我朋友送了我一些丹參片,我想知道高血壓能吃丹參片嗎?
answer: 丹參片具備活血化瘀打通血管的作用可以致使血液粘稠度減低,所以就容易致使血管內(nèi)血液供應(yīng)便好防止出現(xiàn)血液粘稠,致使血壓下降,所以對降血壓是有一定幫助的,高血壓患者是經(jīng)常使用丹參片實(shí)施治療的??梢灶A(yù)防,因?yàn)檠赫吵硪齺淼墓谛牟⌒慕g痛以及外周血管腦水腫癥狀。
自我介紹一下,小編13年上海交大畢業(yè),曾經(jīng)在小公司待過,也去過華為、OPPO等大廠,18年進(jìn)入阿里一直到現(xiàn)在。
深知大多數(shù)大數(shù)據(jù)工程師,想要提升技能,往往是自己摸索成長或者是報(bào)班學(xué)習(xí),但對于培訓(xùn)機(jī)構(gòu)動則幾千的學(xué)費(fèi),著實(shí)壓力不小。自己不成體系的自學(xué)效果低效又漫長,而且極易碰到天花板技術(shù)停滯不前!
因此收集整理了一份《2024年大數(shù)據(jù)全套學(xué)習(xí)資料》,初衷也很簡單,就是希望能夠幫助到想自學(xué)提升又不知道該從何學(xué)起的朋友。
既有適合小白學(xué)習(xí)的零基礎(chǔ)資料,也有適合3年以上經(jīng)驗(yàn)的小伙伴深入學(xué)習(xí)提升的進(jìn)階課程,基本涵蓋了95%以上大數(shù)據(jù)開發(fā)知識點(diǎn),真正體系化!
由于文件比較大,這里只是將部分目錄大綱截圖出來,每個(gè)節(jié)點(diǎn)里面都包含大廠面經(jīng)、學(xué)習(xí)筆記、源碼講義、實(shí)戰(zhàn)項(xiàng)目、講解視頻,并且后續(xù)會持續(xù)更新文章來源:http://www.zghlxwxcb.cn/news/detail-848106.html
如果你覺得這些內(nèi)容對你有幫助,可以添加VX:vip204888 (備注大數(shù)據(jù)獲?。?/strong>
片轉(zhuǎn)存中…(img-SVhQZqLx-1712552759258)]
[外鏈圖片轉(zhuǎn)存中…(img-dzge6J1x-1712552759258)]
[外鏈圖片轉(zhuǎn)存中…(img-Nv693j9X-1712552759259)]
[外鏈圖片轉(zhuǎn)存中…(img-ltsO6P3y-1712552759259)]
既有適合小白學(xué)習(xí)的零基礎(chǔ)資料,也有適合3年以上經(jīng)驗(yàn)的小伙伴深入學(xué)習(xí)提升的進(jìn)階課程,基本涵蓋了95%以上大數(shù)據(jù)開發(fā)知識點(diǎn),真正體系化!
由于文件比較大,這里只是將部分目錄大綱截圖出來,每個(gè)節(jié)點(diǎn)里面都包含大廠面經(jīng)、學(xué)習(xí)筆記、源碼講義、實(shí)戰(zhàn)項(xiàng)目、講解視頻,并且后續(xù)會持續(xù)更新
如果你覺得這些內(nèi)容對你有幫助,可以添加VX:vip204888 (備注大數(shù)據(jù)獲取)
[外鏈圖片轉(zhuǎn)存中…(img-oTutXL7x-1712552759259)]文章來源地址http://www.zghlxwxcb.cn/news/detail-848106.html
到了這里,關(guān)于使用 ElasticSearch 作為知識庫,存儲向量及相似性搜索_elasticsearch cosinesimilarity(1)的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!