지난 글에서 실패했던 걸 발판 삼아.. 다시 시작!
위 글을 참조하여 작성하였습니다.
pip install neo4j
이미 설치했지만 한 번 더 언급하기
pip을 이용해서 neo4j 설치한다.
1. 새 프로젝트 만들기
좌측 상단의 +New를 이용하여 새 프로젝트를 만들 것이다.
네이버 기사를 크롤링 해볼 예정이므로, Project name은 다음과 같이 바꿨다.
그리고 우측 상단의 +Add를 늘러 Local DBMS를 눌러준다.
그러면 화면과 같이 Name 과 Password를 치라고 나와있는데, 자신이 쓰는 편한 걸로 그냥 만들면 된다. 그 후 create를 클릭!
만들어진 project를 누르면 start 버튼이 나올 것이다. 그걸 눌러서 실행을 해주고, 로딩이 끝나면 open을 눌러준다. 그러면 위와 같은 DBMS가 열릴 것이다.
좌측 상단에 있는 Database Information 탭을 눌러주면 connected as가 보이는데, 여기는 user를 관리할 수 있다.
Admin 아래에 있는 user add를 눌러 python에서 접근할 계정을 하나 만들어준다.
이렇게 하면 준비 과정은 끝!
2. crawling
https://news.naver.com/main/ranking/popularDay.naver?mid=etc&sid1=111
네이버 기사는 위의 랭킹뉴스에서 가져올 것이다.
어제 안됐던게 학교 서버에서 사용해서 그런 듯하다.
로컬에서 실행하니까 아주 잘 된다! 근데 로컬 서버 gpu는 작아서 걱정 ㅠㅠ 일단 이게 되는지 먼저 확인하기!
3. DB를 가지고 실행해 보기
neo4j에서 설정한 user name과 password를 이용해서 driver를 통해 연결을 만든다.
session을 열고, cypher 언어를 통해 graph data의 node와 relationship을 추가해줘야 한다.
크롤링한 data를 이용하여 'article' node를 만든다. 여기서 'article'의 property를 이용하는데, 'article'을 발행한 'media'와 'keyword'를 생성한다.
관계는 다음과 같이 정의된다.
(:Media)-[:Publish]->(:Article)->[:include]->(:Keyword)
cyper에서 ( * )는 노드, [ * ]는 relationship이다.
CYPER 언어를 아주 간단히 설명하자면..
- CREATE : node, relationship을 생성. 대상이 이미 있는 경우, 한 개 더 만듦 (자동으로 생성되는 id로 구분됨)
- MATCH : 기존 node, relationship을 검색. WHERE와 함께, 조건부 검색을 가능케 함. RETURN이나 WITH로 매칭되는 대상을 반환할 수 있으며, 해당 대상의 관람 및 편집이 가능해짐.
- MERGE : CREATE와 MATCH를 합친 함수. 대상이 없는 경우에는 CREATE, 있는 경우 MATCH의 특징을 가짐. 'ON CREATE SET'이나 'ON MATCH SET' 같은 명령을 이용해서 각각의 상황에 맞는 property set이 가능.
좌측을 보면 node와 relationship이 생긴 걸 볼 수 있다.
저기서 Article을 눌러보면 다음과 같은 그림이 보인다.
오.. 나름 뭔가 뜨는 게 신남
relationship까지 눌렀더니 저런 연관성을 보여준다.
여기서 매일경제와 서울신문에서 발행하는 기사들의 keyword 연관성을 직접 검색해보자.
검색은 상단의 neo4j$ 옆에 써주면 되는데, 위에서 언급한 cyper를 이용하면 된다.
MATCH path=(a:Media)-[:Publish]->(:Article)-[:Include]->(:Keyword)<-[:Include]-(:Article)<-[:Publish]-(b:Media)
WHERE a.name='매일경제' and b.name='서울신문'
RETURN path
다음과 같이 써보면, 아래와 같은 연관성 그래프를 볼 수 있다!
짜잔! 키워드끼리 서로 공유된 것을 볼 수 있다.
이번엔 키워드간 관계도를 검색해보자. 키워드에서 보인 '국가'와 '세계'를 포함한 기사들을 보도록 하겠다.
MATCH path=(a:Keyword)<-[:Include]-(:Article)-[:Include]->(b:Keyword)
WHERE a.name='국가' and b.name='세계'
RETURN path
이번엔 이들간의 경로가 아닌 title을 반환해보면,
MATCH path=(a:Keyword)<-[:Include]-(c:Article)-[:Include]->(b:Keyword)
WHERE a.name='세계' and b.name='국가'
RETURN c.title
아주 잘 나오는 것을 볼 수 있다.
시각화가 가장 한 눈에 보기 좋기에 여러 번 시도해서 좋은 그래프를 만들면 좋을 것 같다!
'Deep Learning > Graph' 카테고리의 다른 글
[Neo4j] 사용 전 tutorial_실패 (0) | 2023.01.13 |
---|