Ubuntu16.04에 Neo4j를 설치하고 Outlook 메일을 기반으로 간단한 소셜 네트워크 분석을 시도합니다.

10231 단어 ubuntu16.04neo4j

목적



Neo4j를 배우기 위해 Neo4j를 설치하고 Outlook 메일을 기반으로 간단한 소셜 네트워크 분석을 시도했습니다.

작업 내용



우분투 환경



우분투의 환경은 다음과 같습니다.
$ cat /etc/lsb-release
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=16.04
DISTRIB_CODENAME=xenial
DISTRIB_DESCRIPTION="Ubuntu 16.04 LTS"
$

Neo4j 설치



Installing Neo4j on Ubuntu 을 참고하여 Neo4j를 Ubuntu에 설치했습니다.
$ cd ~
$ wget -O - http://debian.neo4j.org/neotechnology.gpg.key >> key.pgp
$ sudo apt-key add key.pgp
$ echo 'deb http://debian.neo4j.org/repo stable/' | sudo tee -a /etc/apt/sources.list.d/neo4j.list > /dev/null
$ sudo apt-get update && sudo apt-get install neo4j
$ 

원격 액세스 권한 설정



여기 의 사이트에 프로덕션 환경에서 리모트 액세스를 허가하는 것은 좋지 않다고 기재가 있습니다만, 이번은 학습용이므로 리모트 액세스는 좋다고 합니다.

다음 파일을 다시 씁니다. 다시 쓰기 전에 내용을 확인하십시오.
$ cat /etc/neo4j/neo4j.conf |grep dbms.connector
#dbms.connectors.default_listen_address=0.0.0.0
#dbms.connectors.default_advertised_address=localhost
dbms.connector.bolt.enabled=true
#dbms.connector.bolt.tls_level=OPTIONAL
#dbms.connector.bolt.listen_address=:7687
dbms.connector.http.enabled=true
#dbms.connector.http.listen_address=:7474
dbms.connector.https.enabled=true
#dbms.connector.https.listen_address=:7473

vi에서 편집합니다.
$ sudo vi /etc/neo4j/neo4j.conf
[sudo] admin01 のパスワード:

다음과 같이 다시 작성했습니다.
$ cat /etc/neo4j/neo4j.conf |grep dbms.connector
dbms.connectors.default_listen_address=0.0.0.0
#dbms.connectors.default_advertised_address=localhost
dbms.connector.bolt.enabled=true
#dbms.connector.bolt.tls_level=OPTIONAL
#dbms.connector.bolt.listen_address=:7687
dbms.connector.http.enabled=true
dbms.connector.http.listen_address=0.0.0.0:7474
dbms.connector.https.enabled=true
dbms.connector.https.listen_address=0.0.0.0:7473
$


Neo4j 서비스 시작



Neo4j 서비스를 시작합니다.
$ sudo service neo4j start

Neo4j GUI 액세스



7474 포트를 사용하여 GUI에 액세스할 수 있었습니다.


테스트 데이터 준비(이메일 전송 정보 및 대상 정보)



Outlook Export Tool 을 이용해 다음과 같은 형태로 메일을 텍스트 출력할 수 있었습니다.
어떤 소속 메일링 리스트에서 수신한 메일을 텍스트화했습니다.
이 작업이 완료되면 Neo4j로 전송합니다.





데이터 정규화



여기에서는 Neo4j에 Load하기 위한 다음의 2개의 파일을 작성합니다.
· mail_user : 사용자의 독특한 정보 목록
· mail_data : 누가 누구에게 메일을 보냈는지 알 수있는 정보 목록

또한 Outlook에서 텍스트 출력한 메일 텍스트는 Ubuntu의 홈 디렉토리 아래의 mail이라는 디렉토리를 작성하여 전송했습니다.

UTF-8로 변환



텍스트화한 파일의 문자 코드가 unknown-8bit가 되어 문자화되어 있었습니다.
$ file -i mail/1.txt
mail/1.txt: text/plain; charset=unknown-8bit
$

텍스트 파일을 대량으로 iconv 의 사이트를 참고해, mail 디렉토리 이하를 iconv로 UTF-8로 변환했습니다.
$ find mail -type f | xargs file | grep  ":*.txt" | cut -d: -f1 | xargs -t -I{} iconv -f SHIFT_JIS -t UTF-8 {} -o {}

받는 사람, 보낸 사람 데이터 추출(mail_data 파일 만들기)



메일 데이터 중에서 수신자와 보낸 사람의 데이터 만 awk, sed, grep 등을 이용하여 추출합니다.
※이쪽은 mail 디렉토리 안에서 실행하고 있습니다.
~/mail$ sudo head -n 4 * |grep -e 差出人 -e 宛先 | awk 'NR%2{sl=$0;next}{print sl":"$0}' |sed -e s/^M//g |awk -F: '{print $2,":",$4}' |sed -e s/","//g -e s/"\t"//g -e s/":"/","/g -e s/"'"//g -e s/" "//g -e 1s/^/source,destination\\n/g |sed -r 's/(<.*>)//g' > mail_data
~/mail$

아래와 같은 송신원과 수신측을 누군가 알 수 있는 데이터가 되었습니다.
1행째에 source,destination라고 하는 것으로 Header를 붙이고 있어 2행째 이후가 송신원과 수신원의 실제의 유저명입니다.
~/mail$ head mail_data
source,destination
AAAAAA,BBBBBB
CCCCCC,AAAAAA
 ・
 ・
 ・
~/mail$

고유한 사용자 목록 추출(mail_users 파일 만들기)



이번에는 awk, sed, grep 명령을 사용하여 독특한 메일 사용자 목록을 추출합니다.
~/mail$ awk -F, '{print $1}{print $2}' mail_data |awk -F ";" '{print $1}'|awk -F "<" '{print $1}'|awk '!a[$0]++' | sort |grep -v source |grep -v destination |sed 1s/^/user\\n/g > mail_users 
~/mail$

mail_users의 데이터는 다음과 같은 내용으로 되어 있습니다.
1행째는 user라고 하는 Header를 붙이고 있어 2행째 마이그레이션이 독특한 유저명입니다.
~/mail$ head mail_users
user
AAAAA
BBBBB
 ・
 ・
 ・
~/mail$

mail_users 및 mail_data 파일을 /var/lib/neo4j/import 아래에 복사



작성한 파일을/var/lib/neo4j/import/하위에 복사합니다.
로컬 파일을 Neo4j로 로드할 때는 이 디렉토리 아래의 것이 대상이 되는 것 같습니다.
~/mail$ sudo cp mail_users /var/lib/neo4j/import/mail_users
~/mail$ sudo cp mail_data /var/lib/neo4j/import/mail_data
~/mail$

고유한 사용자 정보를 Neo4j의 노드로 로드



여기에서는 Neo4j의 조작이 됩니다.
GUI에서 실행할 수 있는 Cypher에서 조작합니다.
고유한 사용자 정보가 포함된 파일을 Neo4j로 가져옵니다.
LOAD CSV WITH HEADERS FROM "file:///mail_users" AS csvLine
CREATE (n:Mailuser{username:csvLine.user})

누가 누구에게 이메일을 보냈기 때문에 Relationship을 Neo4j에서 만들었습니다.



이쪽도 Neo4j의 GUI 조작으로 Cypher에서 조작합니다.
누가 누구에게 메일을 보냈는지라는 Relationship이라는 정보를 mail_data 파일을 사용하여 만듭니다.
LOAD CSV WITH HEADERS FROM "file:///mail_data" AS csvLine
MATCH (source:Mailuser{username: csvLine.source})
MATCH (destination:Mailuser{username: csvLine.destination})
MERGE (source)-[r:send]->(destination)

소셜 그래프 완성



Neo4j의 GUI에서 볼 때 그래프를 볼 수 있습니다.
단, 개인명 등이 기재되어 있으므로 첨부한 이미지는 Neo4j의 GUI가 아니라 명칭에 흐림을 넣은 이미지의 캡처입니다.



요약



Neo4j에 대해 조금 이해할 수있었습니다.
앞으로는 더 본격적으로 만져 가면 좋겠습니다.

좋은 웹페이지 즐겨찾기