networkx 에 접근하여 메소드를 추가해보았다.
환경은 Mac OS
수정해야 되는 파일 접근 경로는
/Library/Frameworks/Python.framework/Versions/7.3/lib/python2.7/site-packages/networkx-1.7-py2.7.egg/networkx/classes
(각자의 환경별로 경로가 다를 수 있습니다)
*** 주의 ***
밑의 코드에서 한글 주석이 붙어있는경우 인코딩에러뜨며 실행이 안될 경우 한글 주석 지워주세요...
***********
안에 있는 graph.py 를 수정하여
jaccard_similarity , cosine_similarity
그리고
수정된 jaccard_similarity , 수정된 cosine_similarity
를 추가해보았다.
jaccard_similarity
= | Ni ∩ Nj | / | Ni ∪ Nj | = | Ni ∩ Nj | / ( | Ni | + | Nj | - | Ni ∩ Nj | )
cosine_similarity
= | Ni ∩ Nj | / √( | Ni | * | Nj | )
=== 코 드 ===
def my_jaccard(self, node1, node2):
#self 는 자기자신 graph 를 나타내고 neighbors 는 그 노드의 이웃 노드들을 list형식으로 반환해준다.
list1 = self.neighbors(node1)
list2 = self.neighbors(node2)
#반환된 두개의 list에서 서로 겹치는 부분(교집합)을 찾아내는 함수 intersection 사용하고 len을 이용하여 갯수 저장
n = len(set(list1).intersection(set(list2)))
# return 값으로 jaccard_simiarity 를 계산하여 반환해준다.
return n / float(len(list1) + len(list2) - n )
def my_jaccard_modify(self, node1, node2):
list1 = self.neighbors(node1)
list2 = self.neighbors(node2)
# 위와 똑같은 방식으로 진행 되며 추가된것은 list에 자기자신 노드가 더 추가되는것
# list에 item 추가하기 list.append()
list1.append(node1)
list2.append(node2)
n = len(set(list1).intersection(set(list2)))
return n / float(len(list1) + len(list2) - n )
def my_cosine(self, node1, node2):
list1 = self.neighbors(node1)
list2 = self.neighbors(node2)
n = len(set(list1).intersection(set(list2)))
return n / (math.sqrt( len(list1) * len(list2) ) )
#math.sqrt 를 사용하기 위해서는 상단에 import math 가 필요하다.
def my_cosine_modify(self, node1, node2):
list1 = self.neighbors(node1)
list2 = self.neighbors(node2)
list1.append(node1)
list2.append(node2)
n = len(set(list1).intersection(set(list2)))
return n / (math.sqrt( len(list1) * len(list2) ) )
'Python' 카테고리의 다른 글
python 디렉토리(폴더) 안애 파일 목록 불러오기 (0) | 2013.04.04 |
---|---|
python 스트링 값 비교 ( string compare) (0) | 2013.04.04 |
Twitter, Facebook 소셜 그래프 특성 분석 (0) | 2013.03.28 |
Python 한글 인코딩 에러 (0) | 2013.03.17 |
Networkx Classic Graph (0) | 2013.03.16 |