1、jaccard系數的定義就兩個句子的交集除以句子的并集,網上基本有兩種實作,但是其實一種不太準确的。
第一種:利用了sklearn的CounterVectorizer類和numpy。
def add_space(s):
if isinstance(s,float):
s=str(s)
# pass # do something sensible with floats here
# return # something sensible
return ' '.join(list(s))
def jaccard_similarity(s1, s2):
print(s1,s2)
# 将字中間加入空格
s1, s2 = add_space(s1), add_space(s2)
# 轉化為TF矩陣
cv = CountVectorizer(tokenizer=lambda s: s.split())
print(cv.tokenizer)
corpus = [s1, s2]
vectors = cv.fit_transform(corpus).toarray()
print(vectors)
# 求交集
numerator = np.sum(np.min(vectors, axis=0))
# 求并集
denominator = np.sum(np.max(vectors, axis=0))
# 計算傑卡德系數
return 1.0 * numerator / denominator
第二種,主要用的set和list并交集。
def jaccard_sim(a, b):
print(set(a).union(set(b)))
unions = len(set(a).union(set(b)))
print(unions)
intersections = len(set(a).intersection(set(b)))
print(set(a).intersection(set(b)))
print(intersections)
return intersections / unions
a,b="app怎麼綁定銀行卡","app哪裡綁定銀行卡"
第一種計算jaccard相似度為:0.6666666,第二種結果是0.63636
第一種是準确的,因為句子裡重複的字應該要都算上。第二種直接去掉了。