자카드 유사도는 두 문장을 각각의 집합으로 만든 뒤
두 집합을 통해 유사도를 측정하는 알고리즘이다.
그림 출처 : https://lsjsj92.tistory.com/443
두 문장의 교집합 개수는 6개, 합집합 개수는 24개로
자카드 유사도는 0.25가 된다.
예제 : 두 집합의 유사도 구하기1
A={1,2,3} B= {2,3,4}
J(AnB)={2,3}
J(AUB)={1,2,3,4}
J(A,B)= 2 / 4 = 0.5
예제 : 두 집합의 유사도 구하기2
A={FR,RA,AN,NC,CE} B= {FR,RE,EN,NC,CH}
J(AnB)={FR,RC}
J(AUB)={FR,RA,AN,NC,CE,RE,EN,CH}
J(A,B)= 2 / 8 = 0.25
# 파이썬으로 집합 자료구조 만들기
a={1,2,3,4}
b={2,4,5}
print(type(a)) # 집합 자료구조
키 값을 안 썼기 때문에 사전이 아니다!
a={1,2,3,4,1}
print(a) # {1,2,3,4}
요소가 중복되지도 않는다!
# 합집합, 교집합 구하기
a={1,2,3,4}
b={2,4,5}
result1=a.intersection(b)
print(result1) # {2,4}
result2=a.union(b)
print(result2) # {1,2,3,4,5}
print(len(result1)/len(result2)) # 0,4
# 리스트로 합집합, 교집합 구하기
def Jaccard():
str1=input('문자열을 입력해주세요 : ').lower()
str2=input('문자열을 입력해주세요 : ').lower()
if len(str1)==0 and len(str2)==0:
return 65536
else:
x=[]
y=[]
for i in range(len(str1)-1):
if str1[i].isalpha() and str1[i+1].isalpha():
x.append(str1[i]+str1[i+1])
for i in range(len(str2)-1):
if str2[i].isalpha() and str2[i+1].isalpha():
y.append(str2[i]+str2[i+1])
gong=[]
for i in x:
if i in y:
gong.append(i)
hap=[]
hap=x+y
for i in gong:
if i in hap:
hap.pop(hap.index(i))
if len(hap)==0:
return 65536
else:
return int((len(gong)/len(hap))*65536)
print(Jaccard())