本篇簡單使用一個語句相似型的模型,做為往後可利用的工具。這可以利用在檢查是否是同類文章或抄襲之類的,效果普普,不過也算是加減用,有需要再找更強大的。
基本環境安裝
一些基本的環境 (如 anaconda、共用 script) 的設定,已經寫在【共同操作】 這篇文章裡,請先看一下,確保所以指令可以正確運作。
建立 conda env
由於每個專案的相依性都不同,這裡會為每個案子都建立環境。
1 |
conda create -n simcompare python=3.9 |
安裝環境
安裝下面套件。
1 |
pip install sentence_transformers==2.2.2 |
程式碼
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
# coding=UTF-8 from sentence_transformers import SentenceTransformer, util #model = SentenceTransformer('all-MiniLM-L6-v2') model = SentenceTransformer('paraphrase-xlm-r-multilingual-v1') #two columns with indexes corresponding to pairs col1=["蛋蛋的哀傷!新竹市有一台「蛋車」行經延平路一段時,因車上的11箱雞蛋掉到馬路 上,讓整條路就像被蓋了黃色地毯。目前路面已進行灑水清理,其他車輛也都能正常通行。"] col2=["台積電美國亞利桑那州新廠預計2024年就要投產,關鍵的美國晶片法案上周公布補助 細節,卻讓台積電董事長劉德音罕見表態,坦言「有些條件無法接受」。南韓半導體廠也發>聲,直呼美國「太超過」"] #Compute encodings for both lists vectors1 = model.encode(col1, convert_to_tensor=True) vectors2 = model.encode(col2, convert_to_tensor=True) #Computing the cosine similarity for every pair cosine_scores = util.cos_sim(vectors1, vectors2) #Display cosine similarity score for the computed embeddings for i,(sent1,sent2) in enumerate(zip(col1,col2)): if cosine_scores[i][i]>=0.5: label="相似("+str(cosine_scores[i][i].item())+")" else: label="不同("+str(cosine_scores[i][i].item())+")" print("sentence 1:{} | sentence 2:{}| \nprediction: {}".format(sent1,sent2,label)) |
程式碼內容是使用用 huggingface 的網站下載模型,列表可在此頁面看到。
根據不認真的觀察,此程式會把list col1 和 col2 的每句話做比較,然後將其相似度存在 consine_scores 裡面. 分數由 0~1, 數值越大就代表越相似,網上抄到的範例程式是以0.5為基準來判斷。
上面的2句話,其相似度是 0.227,所以是不相似。
原始碼內是依 cosine_scores[i][i] 來判斷,這是因為其原始例子是在 col1, col2 是一對一的做比較,所以才會有這樣的寫法。若是n句話對m句話的相似度對比,則 consine_socre[0][5]代表 col1第0句話與 col2的第5句話的相似度。