Hey Tech

[NLP] 문서 유사도 분석: (3) 자카드 유사도(Jaccard Similarity) 본문

AI & 빅데이터/자연어처리(NLP)

[NLP] 문서 유사도 분석: (3) 자카드 유사도(Jaccard Similarity)

Tony Park (토니) 2022. 4. 20. 09:09
728x90
반응형

📌 Text 빅데이터분석 플랫폼 베타테스트 참가자 모집 중!(네이버페이 4만 원 전원 지급)

 

👋 안녕하세요, 코딩이 필요 없는 AI/빅데이터 분석 All in One 플랫폼 <DATA101> 개발팀입니다.
😊 저희 서비스를 사용해 보시고 경험담을 들려주세요 :)
💸 참여해 주신 "모든" 분들께 네이버페이 4만 원 쿠폰을 지급해 드립니다.

👨‍💻 참여 희망 시 카톡플러스친구 1:1 채팅 or 인스타그램 DM 부탁드립니다 :)

📆 참여기간 : 11/25(월)~11/29(금) 11:00~21:00 중 택1 (1시간 1타임)
👉 참여장소 : 강남역 인근 스터디카페 미팅Room
📍 소요시간 : 총 40분 내외(서비스 체험 및 인터뷰 포함)
✅ 참가조건 : Text 빅데이터 분석 업무 경험자

👉 참가 가능일정 조회하기 : https://url.kr/n8k8gu
- 카톡플친 : http://pf.kakao.com/_SxltHG/chat
- 인스타그램 : https://www.instagram.com/data101.official/


📚 목차

1.  자카드 유사도 개념
2.  자카드 유사고 실습

1.  자카드 유사도 개념

자카드 유사도(Jaccard Similarity)는 \(2\)개의 집합 \(A\), \(B\)가 있을 때 두 집합의 합집합 중 교집합의 비율입니다. 즉, 두 집합이 완전히 같을 때는 자카드 유사도가 \(1\)이며, 두 집합에 교집합이 없는 경우는 \(0\)입니다. 자카드 유사도를 \(J\)라고 할 때 두 집합 간의 자카드 유사도 수식은 아래와 같습니다.

 

$$ J(A, B) = \frac{|A \cap  B|}{|A \cup B|} = \frac{|A \cap B|}{|A| + |B| - |A \cap B|} $$

 

자카드 유사도 개념을 자연어처리 분야로 그대로 가져오면, 하나의 집합이 곧 하나의 문서가 해당하는 것입니다. 2개의 문서가 주어졌다면 자카드 유사도는 다음과 같이 계산할 수 있습니다.

 

$$ J(doc1, doc2) = \frac{doc1 \cap  doc2}{doc1 \cup doc2} $$

 

즉, 자연어처리 분야에서는 자카드 유사도는 문서 간 단어 합집합의 원소 개수와 교집합의 원소 개수의 비율로 계산합니다. 이를 통해 알 수 있는 것은 다음과 같습니다. 자카드 유사도는 문서 간 얼마나 많은 종류의 단어가 중복되었는지에 집중하고, 단어마다 중복 횟수는 고려하지 않는다는 점입니다. 즉, 자카드 유사도는 특정 단어가 여러 번 겹쳐도 얼마나 다른 종류의 단어가 겹치는지에 따라 문서 유사도를 계산합니다.

2.  자카드 유사도 실습

파이썬을 활용하여 두 문서의 자카드 유사도를 계산해 봅니다.

Step 1. 문서 샘플

doc1 = "The fat cat sat on the mat"
doc2 = "The lovely dog slept on the table"

Step 2. 문서 토큰화

doc1_tokenized = doc1.split()
doc2_tokenized = doc2.split()

간단하게, 띄어쓰기를 기준으로 토큰화를 수행해 보겠습니다.

print(f"doc1 토큰화 결과: {doc1_tokenized}")
print(f"doc2 토큰화 결과: {doc2_tokenized}")

토큰화 결과를 확인해 보겠습니다.

doc1 토큰화 결과: ['The', 'fat', 'cat', 'sat', 'on', 'the', 'mat']
doc2 토큰화 결과: ['The', 'lovely', 'dog', 'slept', 'on', 'the', 'table']

Step 3. 합집합 계산

자카드 유사도는 두 문서 간 합집합 대 교집합의 비율을 구하는 것이라 했습니다. 합집합을 구해 봅니다.

doc_union = set(doc1_tokenized).union(set(doc2_tokenized))

합집합 결과를 확인해 봅니다.

print(f"합집합 결과: {doc_union}")
합집합 결과: {'lovely', 'cat', 'table', 'the', 'mat', 'on', 'dog', 'The', 'sat', 'fat', 'slept'}

Step 4. 교집합 계산

doc_intersection = set(doc1_tokenized).intersection(set(doc2_tokenized))

교집합 결과를 확인해 봅니다.

print(f"교집합 결과: {doc_intersection}")
교집합 결과: {'the', 'on', 'The'}

Step 5. 합집합 대 교집합 비율 계산

jaccard_similarity = len(doc_intersection) / len(doc_union)
print(f"자카드 유사도: {jaccard_similarity:.2f}")

자카드 유사도는 합집합의 개수 대 교집합의 개수로 집합 간 비율을 계산할 수 있습니다. 소수점 아래 2자리까지만 출력하여 결과를 확인해 봅니다.

0.27

이를 통해 자카드 유사도는 문서 간 단어 합집합의 원소 개수와 교집합의 원소 개수의 비율을 고려하기 때문에, 어떤 특정 단어가 몇 번씩이나 중복되었는지는 고려하지 않고 단지 얼마나 많은 다른 종류의 단어가 중복되었는지만 고려한다는 것을 알 수 있습니다.

📚 참고할 만한 포스팅

1. [NLP] Bag of Words(BoW) 개념 및 실습
2. [NLP] 문서 단어 행렬(DTM) 개념 이해
3. [NLP] TF-IDF 개념 및 계산 방법
4. [NLP] Word Embedding의 이해: (1) 희소표현 및 밀집표현
5. [NLP] 언어모델(Language Model)의 개념 및 특징
6. [NLP] N-gram 언어 모델의 개념, 종류, 한계점
7. [NLP] 언어모델의 평가지표 'Perplexity' 개념 및 계산방법
8. [NLP] Word2Vec: (1) 개념
9. [NLP] Word2Vec: (2) CBOW 개념 및 원리
10. [NLP] Word2Vec: (3) Skip-gram
11. [NLP] Word2Vec: (4) Negative Sampling
12. [NLP] 문서 유사도 분석: (1) 코사인 유사도(Cosine Similarity)
13. [NLP] 문서 유사도 분석: (2) 유클리디안 거리(Euclidean Distance)
14. [NLP] 문서 유사도 분석: (3) 자카드 유사도(Jaccard Similarity)

오늘은 자카드 유사도의 개념을 알아보고, 간단한 파이썬 실습을 진행해 봤습니다.

포스팅 내용에 오류가 있거나 보완할 점이 있다면 아래에 👇👇👇 댓글 남겨주시면 감사드리겠습니다 :) 

그럼 오늘도 즐겁고 건강한 하루 보내시길 바랍니다. 

고맙습니다😊

728x90
반응형