본문 바로가기

나 취준생/파이썬

자카드 유사도 + 카카오 문제

320x100

자카드 유사도는 두 문장을 각각의 집합으로 만든 뒤

두 집합을 통해 유사도를 측정하는 알고리즘이다.



그림 출처 : 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())







반응형

'나 취준생 > 파이썬' 카테고리의 다른 글

파이썬 knn  (0) 2021.02.22
카카오 비밀지도  (0) 2020.12.28
LRU 알고리즘 + 카카오 문제  (0) 2020.12.23
재귀함수  (0) 2020.12.23
탐욕 알고리즘  (0) 2020.12.23