基於余弦夾角計算句子相似度的應用 房型名稱匹配

2021-08-21 21:38:34 字數 3258 閱讀 7936

專案背景:

將平台所售賣的房型與競爭對手的房型進行匹配,以節省人力及提高效率和匹配準確率~

資料的處理:

競對的房型名稱相對於平台來說,顯得非常的複雜,但是配合平台的強大的業務能力,在和運營人員討論資料清洗規則方面花費了大量的時間,不過好在最後的資料清洗的已經足夠乾淨了,不過這部分資料量龐大,已經在hive上面進行清洗好了。(ps:個人認為資料庫真是的乙個強大的工具,尤其在hive平台上進行資料的清洗,帶來極大的便利~)

方法:利用jieba分詞與余弦夾角相似度演算法進行計算。

首先來說說余弦夾角即余弦相似度演算法:

三角形中余弦計算公式:

用向量可以表示為:

其中其是利用向量空間中兩個向量的夾角的余弦值作為度量兩個樣本或是個體之間的相似程度。當兩個向量的夾角越小時,余弦值就越大,兩個向量就越相似,此可稱為余弦相似性。

下面給出乙個例子來說明余弦夾角是如何計算句子的相似度。

舉乙個例子來說明,用上述理論計算文字的相似性。為了簡單起見,先從句子著手。

句子a:我在上海工作了一段時間

句子b:我在上海陸家嘴工作的時間有三個月

那麼句子a和句子b的相似度如何計算呢?

到這裡,問題就變成了如何計算這兩個向量的相似程度。我們可以把它們想象成空間中的兩條線段,都是從原點([0, 0, ...])出發,指向不同的方向。兩條線段之間形成乙個夾角,如果夾角為0度,意味著方向相同、線段重合,這是表示兩個向量代表的文字完全相等;如果夾角為90度,意味著形成直角,方向完全不相似;如果夾角為180度,意味著方向正好相反。因此,我們可以通過夾角的大小,來判斷向量的相似程度。夾角越小,就代表越相似。

將句子a和句子b的詞頻向量帶入到上式(1)中即可計算兩個句子的相似度。

**實現:

在筆者用到的這個案例中,由於房型名稱不像句子切割,詞向量的長度並不會那麼長,比如高階大床房和高階雙床房,兩者之間切割形成的長度可能只有四維,即[高階,大床,雙床,房];因此較為簡單,難點在於依據業務的規則進行資料的清洗,比如高階雙人床和高階大床代表的可能是乙個意思。

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

import pandas as pd

import jieba

import math

#計算關鍵字

def keywords(line1,line2):

word_freq={}

word_freq2={}

#分詞words1=jieba.cut(line1,cut_all=false)

words2=jieba.cut(line2,cut_all=false)

for word in words1:

word_freq[word]=1

freq_word =

for word, freq in word_freq.items():

for word2 in words2:

word_freq2[word2] = 1

freq_word2 =

for word2, freq2 in word_freq2.items():

return freq_word,freq_word2

def mergekeys(freq_word,freq_word2):

arraykey =

for i in range(len(freq_word)):

for i in range(len(freq_word2)):

if freq_word2[i][0] in arraykey:

pass

else: #合併

#計算詞頻 infobox可忽略tf-idf

arraynum1 = [0]*len(arraykey)

arraynum2 = [0]*len(arraykey)

#賦值arraynum1

for i in range(len(freq_word)):

key = freq_word[i][0]

value = freq_word[i][1]

j = 0

while j < len(arraykey):

if key == arraykey[j]:

arraynum1[j] = value

break

else:

j = j + 1

#賦值arraynum2

for i in range(len(freq_word2)):

key = freq_word2[i][0]

value = freq_word2[i][1]

j = 0

while j < len(arraykey):

if key == arraykey[j]:

arraynum2[j] = value

break

else:

j = j + 1

#print arraynum1

#print arraynum2

# print len(arraynum1),len(arraynum2),len(arraykey)

#計算兩個向量的點積

x = 0

i = 0

while i < len(arraykey):

x = x + arraynum1[i] * arraynum2[i]

i = i + 1

#print x

#計算兩個向量的模

i = 0

sq1 = 0

while i < len(arraykey):

sq1 = sq1 + arraynum1[i] * arraynum1[i] #pow(a,2)

i = i + 1

#print sq1

i = 0

sq2 = 0

while i < len(arraykey):

sq2 = sq2 + arraynum2[i] * arraynum2[i]

i = i + 1

#print sq2

result = float(x) / ( math.sqrt(sq1) * math.sqrt(sq2) )

return result

余弦相似度及基於python的余弦相似度實現

余弦相似度,又稱為余弦相似性,是通過計算兩個向量的夾角余弦值來評估他們的相似度。對於兩個向量,可以想象成空間中的兩條線段,都是從原點 0,0,出發,指向不同的方向。兩條線段之間形成乙個夾角 如果夾角為0度,則意味著方向相同 線段重合 如果夾角為90度,意味著形成直角,方向完全不相似 如果夾角為180...

余弦相似度計算

余弦相似度計算 余弦相似度用向量空間中兩個向量夾角的余弦值作為衡量兩個個體間差異的大小。余弦值越接近1,就表明夾角越接近0度,也就是兩個向量越相似,這就叫 余弦相似性 我們知道,對於兩個向量,如果他們之間的夾角越小,那麼我們認為這兩個向量是越相似的。余弦相似性就是利用了這個理論思想。它通過計算兩個向...

相似度計算之余弦相似度

一 定義及概念 余弦取值範圍為 1,1 求得兩個向量的夾角,並得出夾角對應的余弦值,此余弦值就可以用來表徵這兩個向量的相似性。夾角越小,趨近於0度,余弦值越接近於1,它們的方向更加吻合,則越相似。當兩個向量的方向完全相反夾角余弦取最小值 1。當余弦值為0時,兩向量正交,夾角為90度。因此可以看出,余...