from sentence_transformers import SentenceTransformer
import scipy.spatial
import pandas as pd
'''
短文本推荐 模型 sentence bert
1.文本向量 对 词向量 的好处
2，sentence bert 对 bert 的好处
余弦相似度常用于文本相似度计算
而欧几里得距离和曼哈顿距离常用于数值型数据的相似度计算
Jaccard相似度常用于集合的相似度计算
'''

embedder = SentenceTransformer('bert-base-chinese')

df = pd.read_excel('../datas/骨科.xlsx', sheet_name='Sheet1')
corpus = df['ask'].to_numpy()

corpus_embeddings = embedder.encode(corpus)

# 待查询的句子
queries = ['3月来，患者左髋部，左膝部及左下肢出现疼痛，症状持续，左膝关节：左膝关节内半月板后角、外侧半月板信号局部增高，考虑变性。关节腔少量积液；髌下脂肪垫内絮状高信号影；c上囊滑囊，腘肌滑囊信号增高。膝关节后方静脉曲张？左侧股骨头形态改变，双侧股骨头及左侧髋臼异常信号，考虑缺血坏死。双侧髋关节骨质增生。左侧髋关节周围软组织水肿；肌肉萎缩']
query_embeddings = embedder.encode(queries)
closest_n = 20
# 对于每个句子，使用余弦相似度查询最接近的个句子closest n = 2
for query, query_embedding in zip(queries, query_embeddings):
    distances = scipy.spatial.distance.cdist([query_embedding], corpus_embeddings, "cosine")[0]
    # 按照距离逆序
    results = zip(range(len(distances)), distances)
    results = sorted(results, key=lambda x: x[1])
    print("====================================")
    print("Query:", query)
    print("Result:Top 20 most similar sentences in corpus:")
    for idx, distance in results[0:closest_n]:
        print(corpus[idx].strip(), "(Score: %.4f)" % (1 - distance))

