用sklearn比較句子或詞的相似度

2021-10-23 04:45:20 字數 2425 閱讀 2478

用bert模型對句子或詞進行向量化,然後用sklearn比較其相似度:

# -*- coding:utf-8 -*-

from bert_serving.client import bertclient

from sklearn.metrics.pairwise import cosine_similarity

# 先命令列啟動服務

# bert-serving-start -model_dir c:\users\jason\pycharmprojects\code\chinese_l-12_h-768_a-12 -num_worker=1

class encoding(object):

def __init__(self):

self.server_ip = "127.0.0.1"

self.bert_client = bertclient(ip=self.server_ip)

def encode(self, query):

tensor = self.bert_client.encode([query])

return tensor

def query_similarity(self, query_list):

tensors = self.bert_client.encode(query_list)

return cosine_similarity(tensors)[0][1]

s1 = "我們今天所取得的成績離不開與qualcomm  technologies等同樣致力於實現上述價值主張的行業領軍企業的密切合作。"

s2 = "康寧光通訊無線產品管理副總裁michelle engarto表示:「康寧與qualcomm technologies開展5g公釐波ran合作是為了給增值創新提供一條基準線。"

s3 = "oppo副總裁與全球銷售總裁吳強表示:「oppo與qualcomm technologies一直保持緊密合作關係。"

s4 = "此外,兩家公司正與廣和通合作開發 m.2 模組,該模組經過優化,可與英特爾客戶端平台整合。"

s5 = "今日,中興通訊對美國聯邦通訊委員會(fcc)「阻止美國電信運營商使用美國聯邦資金購買中國通訊網路裝置」提案進行了回應,在提交給fcc的申述檔案中稱,並不構成安全威脅。"

if __name__ == "__main__":

ec = encoding()

print(ec.encode("中國").shape) # (1, 768)

print(ec.encode("美國").shape)

print("中國和美國的向量相似度:", ec.query_similarity(["中國", "美國"])) # 中國和美國的向量相似度: 0.9300133

print("中國和地球的向量相似度:", ec.query_similarity(["中國", "澳大利亞"])) # 中國和地球的向量相似度: 0.8202904

print("張三和李四的向量相似度:", ec.query_similarity(["張三", "李四"])) # 張三和李四的向量相似度: 0.9328898

print("s1和s2的相似度:", ec.query_similarity([s1, s2]))

print("s1和s3的相似度:", ec.query_similarity([s1, s3]))

print("s1和s4的相似度:", ec.query_similarity([s1, s4]))

print("s1和s5的相似度:", ec.query_similarity([s1, s5]))

print("s2和s3的相似度:", ec.query_similarity([s2, s3]))

print("s2和s4的相似度:", ec.query_similarity([s2, s4]))

print("s2和s5的相似度:", ec.query_similarity([s2, s5]))

print("s3和s4的相似度:", ec.query_similarity([s3, s4]))

# s1和s2的相似度: 0.88187534

# s1和s3的相似度: 0.8883614

# s1和s4的相似度: 0.8948699 s1和s5的相似度: 0.8486718

# s2和s3的相似度: 0.9333299

# s2和s4的相似度: 0.906179 s2和s5的相似度: 0.87892824

# s3和s4的相似度: 0.89166194

# s = "此外,兩家公司正與廣和通合作開發 m.2 模組,該模組經過優化,可與英特爾客戶端平台整合。"

# bc = bertclient()

# li = ['中國', '美國', '澳大利亞', '張三', '李四光', '王五',s,]

# vecs = bc.encode(li)

句子相似度比較的歸一化

我們將不同長度的句子 預處理並分詞之後的長度 直接做比較其實是不公平的,舉個例子 sentence 1 長度為2 sentence 2 長度為1 sentence 3 長度為3 在取相似詞top4,exp 0.7,的情況下 即便sent2與sent1詞的組成完全不同,base similarity ...

LinuxTips cut或awk的比較

例如獲取所有包含python的程序的命令列 多的所有程序的詳細列表 ps ef 使用grep查詢包含的行且去除grep程序本身 grep v grep grep python 1 使用cut ps ef cut f8 上面的命令不能正常的工作,因為cut預設是以tab來分隔多個列的,但是ps的輸出是...

替換句子中的多個不同的詞 python 實現

對乙個句子中的多處不同的詞的替換,可以採用依次將句子中的每個詞分別和詞典進行匹配,匹配成功的進行替換來實現,可是這種方法直覺上耗時就很長,對於乙個篇幅很長的文件,會花費很多的時間,這裡介紹一種可以一次性替換句子中多處不同的詞的方法,如下 usr bin env python coding utf 8...