def Jaccard(str1,str2):
arr1=[]
arr2=[]
gyo = 0
for i in range(len(str1)-1):
if str1[i].isalpha() and str1[i+1].isalpha(): #알파벳 짝이 맞는 것만 arr에 추가
arr1.append(str1[i:i+2].upper()) #주어진 문자열을 2개의 문자씩 arr1에 넣음. 대문자로 통일
for i in range(len(str2)-1):
if str2[i].isalpha() and str2[i+1].isalpha(): #알파벳 짝이 맞는 것만 arr에 추가
arr2.append(str2[i:i+2].upper()) #대문자로 통일
print(arr1,arr2)
for i in arr1:
for j in arr2:
if i == j and i != '@': #arr1과 arr2에 있는 @가 아닌 원소가 같다면
gyo += arr1.count(i) if arr1.count(i) <= arr2.count(j) else arr2.count(j) #교집합인거 세면 @로 바꿈
for l in range(len(arr1)):
if i == arr1[l]: #교집합에 속하는 원소를 @로 만듦
arr1[l] = '@'
for l in range(len(arr2)):
if i == arr2[l]:
arr2[l] = '@'
hap = len(arr1)+len(arr2)-gyo #합집합은 전체 개수를 센다음, 교집합의 개수를 한번 빼면 된다. 동일한 문자 중 개수가 많을 것이 합집합의 개수에 포함되므로 전체에서 교집합을 뺀다.
if gyo == 0 and hap ==0: #문자가 아닌것은 공집합 교집합을 모두 1로 만든다.
gyo = 1
hap = 1
print('교집합 수', gyo, '합집합 수', hap, '자카드 유사도', int(gyo / hap * 65536))
Jaccard('FRANCE','french')
Jaccard('handshake','shake hands')
Jaccard('aa1+aa2','AAAA12')
Jaccard('E=M*C^2','e=m*c^2')