최대한 친절 하 게 쓴 R 로 낱말 구름 , 의미 연결망 그리 기 ( feat . tidyverse , KoNLP ) : kini ' n creations 
 access _ time 2018 . 09 . 24 22 : 42 
 위 에 있 는 사진 은 도널드 트럼프 미국 대통령 이 지난해 11 월 8 일 국회 를 찾 아 연설 한 내용 을 낱말 구름 ( 워드 클라우드 ) 형태 로 정리 한 겁니다 . 당연히 R 를 활용 해 텍스트 데이터 를 정리 했 습니다 . ( 최종 결과물 을 만들 때 는 어 도피 포토샵 도움 도 받 았 습니다 . ) R 는 이렇게 숫자 뿐 아니 라 텍스트 데이터 를 분석 하 고 정리 하 는 데 도 일가견 이 있 습니다 . 이런 작업 을 흔히 텍스트 마이닝 ( text mining ) 이 라고 부릅니다 . 
 이 포스트 를 읽 고 계신 분 대다수 는 인터넷 포털 사이트 등 에 R 관련 검색어 를 넣 어 찾아오 셨 을 테 니 이미 R 가 무엇 인지 알 고 계실 겁니다 . 그래도 혹시 모르 시 는 분 들 께 R 홈페이지 에 올라온 자기소개 를 따라 말씀 드리 면 " R 는 통계 계산 과 그래픽 에 활용 하 는 무료 소프트웨어 환경 ( R is a free software environment for statistical computing and graphics ) " 입니다 . 
 무료 라는 건 누구 나 이 페이지 에서 원 하 시 는 R 버전 을 설치 해 사용 할 수 있 다는 뜻 입니다 . 2018 년 9 월 현재 최신 버전 은 3 . 5 . 1 이 며 마이크 로 소프트 ( MS ) 윈도 에 이 버전 를 설치 하 고 싶 으신 분 은 이 링크 를 눌러 설치 파일 을 내려 받 으실 수 있 습니다 . 이 포스트 제목 에 는 분명 ' 최대한 친절 하 게 ' 라는 표현 이 들어가 있 지만 프로그램 설치 법 까지 모르 실 거 라고 는 생각 하 지 않 으니 이 부분 은 넘어가 겠 습니다 . 
 설치 를 끝마치 신 다음 R 를 실행 하 시 면 아래 화면 이 나타납니다 . 창 제목 에 나온 것 처럼 이 화면 은 ' R 콘솔 ( Console ) ' 이라고 부릅니다 . 
 R 콜 손 에서 '>' 표시 뒤 에 명령어 를 입력 하 면 프로그래밍 ( 코딩 ) 을 시작 할 수 있 습니다 . 코딩 은 ' 이러저러한 게 하 고 싶 다 ' 고 컴퓨터 에게 알려 주 는 행위 입니다 . 이 창 에 " print ( ' Hello , World ! ')" 라고 쓴 건 Hello , World ! 를 ( 화면 에 ) 출력 하 고 싶 다고 뜻 입니다 . 이 " Hello , World ! " 프로그램 은 코딩 을 처음 배울 때 제일 많이 쓰 는 예제 입니다 . 그러니까 여러분 은 방금 첫 번 째 R 명령어 ( 함수 ) 를 배우 신 겁니다 . 
 두 번 째 로 배울 명령어 는 install . packages ( ) 입니다 . 이 함수 는 의미 그대로 R 에 패키지 를 설치 하 라는 뜻 입니다 . 패키지 는 R 에 기본 으로 들 어 있 지 않 은 각종 기능 을 추가 할 수 있 는 묶음 이 라고 이해 하 시 면 쉽 습니다 . 
 그렇 다면 이번 에 우리 가 설치 해야 하 는 패키지 이름 은 뭘까요 ? 맞 습니다 . ' tidyverse ' 입니다 . tidyverse 는 R 에 기본 적 으로 들 어 있 는 각종 함수 를 깔끔 한 ( tidy ) 구문 ( verse ) 으로 바꿔 주 는 도구 입니다 . tidyverse 는 패키지 하나 가 아니 라 △ dplyr △ forcats △ ggplot 2 △ purrr △ readr △ stringr △ tibble △ tidyr 등 8 개 패키지 를 한 곳 에 묶 은 형태 입니다 . 이런 이유 로 ' tidyverse 생태 계 ' 라는 표현 도 씁니다 . 
 이 ' 최대한 진철 하 게 쓴 R ' 시리즈 는 기본 적 으로 tidyverse 생태계 를 소개 하 는 게 목적 입니다 . 이번 포스트 에서 도 꼭 이해 가 필요 한 부분 은 최대한 친절 하 게 설명 하 겠 지만 부족 하 다고 느끼 실 수 있 을 겁니다 . 이 블로그 에 dplyr , ggplot 2 , tidyr 에 대한 소개 글 은 이미 있 으니 각 패키지 가 궁금 하 신 분 은 읽 어 보 셔도 좋 습니다 . 
 이제 정말 tidyverse 패키지 를 설치 하 겠 습니다 . 그냥 이렇게 치 시 면 됩니다 . 
 이렇게 입력 하 고 나 면 R 가 어떤 ( 미러 ) 사이트 에서 패키지 를 내려 받 을 것 인지 물 어 올 겁니다 . 지금 은 어떤 사이트 에서 내려 받 아도 관계 가 없 습니다 . 그냥 엔터 만 치 시 면 자동 으로 설치 를 진행할 겁니다 . 
 R 에서 는 패키지 를 설치 했 다고 곧바로 사용 할 수 있 게 되 는 건 아닙니다 . 패키지 를 메모리 에 불러오 는 절차 를 한 번 더 거쳐야 합니다 . 이때 는 ' library ( ) ' 라는 함수 를 씁니다 . 
 ## -- Attaching packages - - - - - - ------------------------- tidyverse 1 . 2 . 1 -- 
 ## √ ggplot 2 3 . 0 . 0 √ purrr 0 . 2 . 5 
 ## √ tibble 1 . 4 . 2 √ dplyr 0 . 7 . 5 
 ## √ tidyr 0 . 8 . 1 √ stringr 1 . 3 . 1 
 ## √ readr 1 . 1 . 1 √ forcats 0 . 3 . 0 
 ## -- Conflicts - - - - - - - - - ------------------------- tidyverse _ conflicts ( ) -- 
 위 에서 말씀 드렸 던 패키지 여덟 가지 를 한 번 에 불러 왔 다는 걸 알 수 있 습니다 . 아래 는 dplyr 에서 사용 하 는 명령어 ( tidyverse 에서 는 함수 대신 ' 동사 ' 라는 표현 도 씁니다 ) 가 같 아서 이 를 덮어썼 다는 뜻 입니다 . 
 축 하 드립니다 . 이제 여러분 은 그 유명 한 tidyverse 세계 에 입성 하 시 는 데 성공 하 셨 습니다 . 이제 부터 이 포스트 를 따라 한 번 깔끔 하 게 텍스트 데이터 를 처리 해 보 겠 습니다 . 
 문재인 대통령 평양 연설 불러오 기 
 이번 에 우리 가 분석 할 데이터 는 문재인 대통령 이 19 일 평양 5 · 1 경기장 에서 연설 한 내용 입니다 . 이 연설 내용 은 아래 텍스트 파일 에 들 어 있 습니다 . 
 윈도 를 쓰 고 계시 다면 별도 로 프로그램 을 설치 하 시 지 않 아도 ' 메모장 ' 에서 간단히 텍스트 파일 을 열 어 볼 수 있 습니다 . R 에서 도 코드 한 줄 이 면 텍스트 파일 확인 이 가능 합니다 . 우리 는 ' moon . txt ' 파일 을 불러오 려는 거 니까 이렇게 쓰 시 면 됩니다 . ( 대소문자 에 주의 하 세요 ! ) 
 readLines ( ' moon . txt ') 
 우리 는 tidyverse 생태계 를 배우 고 있 으니까 같 은 기능 을 하 는 동사 를 스 겠 습니다 . readr 패키지 에 들 어 있 는 read _ lines ( ) 가 같 은 구실 을 합니다 . 
 read _ lines ( ' moon . txt ') 
 ## [ 1 ] " 북녘 동포 여러분 , 남녘 의 국민 여러분 , 해외 동포 여러분 , 전쟁 없 는 한반도 가 시작 되 었 습니다 . 남 과 북 은 오늘 한반도 전 지역 에서 전쟁 을 일으킬 수 있 는 모든 위험 을 없애 기 로 합의 했 습니다 . " 
 ## [ 3 ] " 남북 군사 공동 위원회 를 가동 해 군사 분야 합의 사항 의 이행 을 위한 상시 적 협의 를 진행 하 기 로 했 습니다 . 1953 년 정전 협정 으로 포성 은 멈췄 지만 지난 65 년 전쟁 은 우리 의 삶 에서 계속 되 었 습니다 . 죽 어야 할 이유 가 없 는 젊 은 목숨 들 이 사라졌 고 , 이웃 들 사이 에 보이 지 않 는 벽 이 생겼 습니다 . 한반도 를 항구 적 평화 지대 로 만들 어 감 으로써 우리 는 이제 우리 의 삶 을 정상 으로 돌려놓 을 수 있 게 되 었 습니다 . " 
 ## [ 5 ] " 그동안 전쟁 의 위협 과 이념 의 대결 이 만들 어 온 특권 과 부패 , 반 인권 으로부터 벗어나 우리 사회 를 온전히 국민 의 나라 로 복원 할 수 있 게 되 었 습니다 . " 
 ## [ 6 ] " 나 는 오늘 이 말씀 을 드릴 수 있 어 참으로 가슴 벅찹니다 . " 
 ## [ 8 ] " 남 과 북 은 처음 으로 비핵화 방안 도 합의 했 습니다 . 매우 의미 있 는 성과 입니다 . " 
 ## [ 9 ] " 북측 은 동창리 엔진 시험장 과 미사일 발사대 를 유관국 의 전문가 들 의 참여 하 에 영구 적 으로 폐쇄 하 기 로 했 습니다 . 또한 미국 의 상응 조치 에 따라 영변 핵 시설 의 영구 폐기 와 같 은 추가 적 조치 도 취해 나가 기 로 했 습니다 . " 
 ## [ 11 ] " 우리 겨레 모두 에게 아주 기쁘 고 고마운 일 입니다 . 한반도 의 완전 한 비핵화 가 멀 지 않 았 습니다 . 남 과 북 은 앞 으로 도 미국 등 국제 사회 와 비핵화 의 최종 달성 을 위해 긴밀 하 게 협의 하 고 협력 해 나가 기 로 했 습니다 . " 
 ## [ 12 ] " 우리 의 역할 도 막중 해졌 습니다 . 국민 들 의 신뢰 와 지지 가 어느 때 보다 절실 합니다 . " 
 ## [ 14 ] " 북녘 의 동포 여러분 , 남녘 의 국민 여러분 , 지난 판문점 선언 이후 한반도 와 그 주변 에 는 역사 적 사변 이 라고 해도 좋 을 거대 한 변화 가 일어나 고 있 습니다 . 사상 최초 로 북미 정상 이 마주 앉 아 회담 을 하 고 합의 사항 을 내놓 았 습니다 . " 
 ## [ 16 ] " 북측 은 추가 핵실험 과 미사일 실험 을 일체 하 지 않 겠 다고 약속 했으며 이 를 지켰 습니다 . 한 미 양국 도 대 규모 연합 훈련 을 중단 했 습니다 . " 
 ## [ 17 ] " 개성 에 는 남북 공동 연락 사무소 가 설치 되 었 습니다 . 상시 적 으로 우리 의 문제 를 논의 할 수 있 는 새로운 남북 시대 가 열렸 습니다 . " 
 ## [ 19 ] " 너무나 꿈 같 은 일 이 지만 우리 눈앞 에서 분명히 이행 되 고 있 는 일 들 입니다 . " 
 ## [ 21 ] " 평화 와 번영 을 바라 는 우리 겨레 의 마음 은 단 한 순간 도 멈춘 적 이 없 습니다 . 빠르 게 보이 지만 결코 빠른 것 이 아닙니다 . 이러 한 일 들 은 오랫동안 바라 고 , 오래도록 준비 해 온 끝 에 오늘 우리 앞 에 펼쳐지 고 있 는 것 입니다 . 하나 로 모인 8 천만 겨레 의 마음 이 평화 의 길 을 열 어 냈 습니다 . 우리 는 우리 가 만들 어 낸 이 길 을 완전 한 비핵화 를 완성 해 가 며 내 실 있 게 실천 해 가 야 할 것 입니다 . " 
 ## [ 23 ] " 김정은 위원장 과 나 는 오늘 평양 에서 북 과 남 의 교류 와 협력 을 더욱 증대 시키 기 로 하 였 고 , 민족 경제 를 균형 적 으로 발전 시키 기 위한 실질 적 대책 을 만들 어 나가 기 로 했 습니다 . " 
 ## [ 24 ] " 남 과 북 은 올해 안 에 동 · 서해선 철도 와 도로 연결 을 위한 착공식 을 가질 것 입니다 . 환경 이 조성 되 는 대로 개성 공단 과 금강산 관광 사업 의 정상 화 도 이루어질 것 입니다 . " 
 ## [ 26 ] " 한반도 환경 협력 과 전염성 질병 의 유입 과 확산 을 막 기 위한 보건 의료 분야 의 협력 은 즉시 추진 될 수 있 을 것 입니다 . 금강산 이산가족 상설 면회소 복구 와 서신 왕래 , 화상 상봉 은 우선 적 으로 실현 해 나갈 것 입니다 . " 
 ## [ 28 ] " 2032 년 하계 올림픽 의 남북 공동 개최 유치 에 도 함께 협력 하 기 로 했 습니다 . " 
 ## [ 29 ] " 3 . 1 운동 100 주년 공동 행사 를 위한 구체 적 준비 도 시작 하 기 로 했 습니다 . " 
 ## [ 30 ] " 10 월 이 되 면 평양 예술단 이 서울 에 옵니다 . ' 가을 이 왔 다 ' 공연 으로 남 과 북 사이 가 더욱 가까워질 것 입니다 . " 
 ## [ 32 ] " 나 는 김정은 위원장 에게 서울 방문 을 요청 했 고 , 김 위원장 은 가까운 시일 안 에 서울 을 방문 하 기 로 했 습니다 . 여기 에서 ' 가까운 시일 안 에 ' 라는 말 은 특별 한 사정 이 없 으면 ' 올해 안 에 ' 라는 의미 를 담 고 있 습니다 . 김 위원장 의 서울 방문 은 최초 의 북측 최고 지도자 의 방문 이 될 것 이 며 남북 관계 의 획기 적 전기 가 마련 될 것 입니다 . " 
 ## [ 34 ] " 북녘 동포 여러분 , 남녘 의 국민 여러분 , 해외 동포 여러분 , 김정은 위원장 은 오늘 한반도 비핵화 의 길 을 명확히 보여 주 었 고 핵무기 도 , 핵 위협 도 , 전쟁 도 없 는 한반도 의 뜻 을 같이 했 습니다 . 온 겨레 와 세계 의 여망 에 부응 했 습니다 . " 
 ## [ 35 ] " 김정은 위원장 의 결단 과 실행 에 깊 은 경의 를 표 합니다 . " 
 ## [ 37 ] " 남북 관계 는 흔들림 없이 이어져 갈 것 입니다 . 이제 평양 회담 의 성과 를 바탕 으로 북미 간 대화 가 빠르 게 재개 되 기 를 기대 합니다 . " 
 ## [ 38 ] " 북미 양국 은 끊임없이 친서 를 교환 하 며 서로 간 의 신뢰 를 거듭 확인 해 왔 습니다 . 양국 간 정상 회담 이 조속히 이루어지 고 , 양국 이 서로 합의 할 수 있 는 지점 을 찾 을 수 있 도록 우리 의 노력 도 다 해 나갈 것 을 약속 합니다 . " 
 ## [ 40 ] " 지난 봄 , 한반도 에 는 평화 와 번영 의 씨앗 이 뿌려졌 습니다 . 오늘 가을 의 평양 에서 평화 와 번영 의 열매 가 열리 고 있 습니다 . " 
 ## [ 41 ] " 감사 합니다 . " 
 한 번 에 이렇게 파일 을 불러오 는 데 성공 한 분 도 계실 거 고 ' Error : ' moon . txt ' does not exist in current working directory ' 라는 에러 메시지 를 접한 분 도 계실 겁니다 . 에러 메시지 가 설명 하 고 있 는 것 처럼 R 는 기본 적 으로 작업 디렉 토리 ( 폴더 ) 에서 파일 을 불러옵니다 . 만약 한 번 도 작업 폴더 를 바꾸 신 적 이 없 다면 ' 문서 ' 가 작업 폴더 입니다 . 그러 니 이 텍스트 파일 을 문서 에 내려 받 으셨 어야 합니다 . 
 물론 꼭 이 방법 만 있 는 건 아닙니다 . 아예 편하 신 곳 을 작업 폴더 로 지정 하 시 는 방법 도 있 습니다 . 가장 손쉬운 방법 은 R 메뉴 에서 File - Change dir . .. 를 선택 하 시 는 겁니다 . 이 메뉴 를 선택 하 시 면 폴더 선택 창 이 뜹니다 . 이 다음 부터 는 설명 드리 지 않 아도 어떻게 하 는지 아 시 겠 죠 ? 
 코드 를 가지 고 작업 폴더 를 바꾸 고 싶 으신 분 은 ' setwd ( ) ' 함수 를 쓰 셔도 됩니다 . 괄호 안 에 원하 는 폴더 이름 을 적 어 넣 으시 면 작업 폴더 가 그리로 바뀌 게 됩니다 . 
 이번 에 만 다른 폴더 에서 파일 을 불러오 고 싶 으실 때 는 ' file . choose ( ) ' 함수 를 쓰 시 는 방법 도 있 습니다 . 그러니까 ' read _ lines ( file . choose ( ) ) ' 라고 입력 하 시 면 파일 을 선택 할 수 있 는 창 이 뜹니다 . 그러면 그때 moon . txt 를 선택 하 시 면 됩니다 . 
 우리 는 m 이 라는 변수 에 이 내용 을 넣 어 두 도록 하 겠 습니다 . 이렇게 쓰 면 됩니다 . 
 m <- read _ lines ( ' moon . txt ') 
 원래 아무 반응 도 나타나 지 않 는 거 니까 아무 반응 도 없 다고 걱정 하 지 않 으셔도 됩니다 . 
 그러면 파일 이 잘 들어왔 는지 는 어떻게 확인 할 수 있 을까요 ? 첫 번 째 방법 은 '>' 다음 에 변수 이름 을 입력 하 는 겁니다 . 지금 m 이 라고 치 시 면 위 에서 우리 가 본 것 하고 똑같 은 결과 가 나타날 겁니다 . 
 두 번 째 는 ' head ( ) ' 나 ' tail ( ) ' 함수 를 쓰 는 방식 입니다 . head 는 어떤 자료 가 있 을 때 처음 여섯 줄 , tail 은 거꾸로 맨 뒤 에서 여섯 줄 을 보여 주 는 기능 을 합니다 . 기본 은 여섯 줄 씩 이 지만 ' head ( 변수 이름 , 숫자 ) ' 형태 로 원 하 는 만큼 만 확인 할 수 도 있 습니다 . 첫 번 째 한 줄 만 볼까요 ? 
 head ( m , 1 ) 
 ## [ 1 ] " 북녘 동포 여러분 , 남녘 의 국민 여러분 , 해외 동포 여러분 , 전쟁 없 는 한반도 가 시작 되 었 습니다 . 남 과 북 은 오늘 한반도 전 지역 에서 전쟁 을 일으킬 수 있 는 모든 위험 을 없애 기 로 합의 했 습니다 . " 
 역시 잘 들어왔 습니다 . 이제 텍스트 까지 불러 들였으니 진짜 분석 을 시작 해 보 겠 습니다 . 좀 지루 할 수 도 있 으니 기 지재 도 한 번 씩 펴 시 면서 같이 가 보 시 죠 -_-)/ 
 한국어 와 영어 차이 혹은 tidytext 여 안녕 ~ 
 R 세계 에 는 tidyverse 패키지 에 들 어 있 는 여덟 가지 말 고도 ' 깔끔 한 접근 ( tidy approach ) ' 을 추구 하 는 여러 패키지 가 존재 합니다 . 넓 은 의미 에서 이 들 역시 tidyverse 생태 게에 속해 있 다고 할 수 있 습니다 . 텍스트 분석 에서 는 tidytext 패키지 가 바로 여기 에 해당 합니다 . 
 그렇 다면 데이터 에 깔끔 하 게 접근 한다는 건 무슨 의미 일까요 ? 첫 번 째 단계 는 이미 ' 최대한 친절 하 게 쓴 R 로 데이터 깔끔 하 게 만들 기 ( feat . tidyr ) ' 포스트 에 쓴 것 처럼 다음 과 같 은 형태 로 데이터 를 정리 하 는 겁니다 . 
 아직 이게 어떤 건지 감지 알 오 지 않 으시 죠 ? tidytext 패키지 에서 텍스트 를 어떻게 정리 하 는지 보 시 면 도움 이 될지 모릅니다 . 
 아래 처럼 영어 로 쓴 네 문장 이 있 다고 하 겠 습니다 . 지금 우리 가 m 에 가지 고 있 는 데이터 와 큰 차이 가 없 어 보이 기 도 하 는 게 사실 입니다 . 
 ## [ 1 ] " Because I could not stop for Death -" " He kindly stopped for me -" 
 tidytext 에 들 어 있 는 ' unnest _ tokens ( ) ' 함수 를 이용 하 면 이 데이터 를 이렇게 바꿀 수 있 습니다 . 
 감 이 좀 잡히 시 나요 ? 일단 문장 을 띄어쓰 기 단위 로 끊 어서 행 을 새로 만들 었 습니다 . 그리고 line 이 라는 열 에 원래 이 낱말 이 몇 번 째 문장 에 들 어 있 었 는지 도 담 고 있 습니다 . 
 아 , 여기 등장 하 는 tibble 은 tidyverse 생태 계 에서 쓰 는 데이터 프레임 ( Data Frame ) 이 라고 생각 하 시 면 됩니다 . 그러면 데이터 프레임 이 뭔지 또 아 셔야 겠 죠 ? 가장 쉽 게 설명 드리 면 MS 엑셀 에서 자료 를 다룰 때 처럼 행과 열 이 있 는 테이블 형태 로 자료 를 담 고 있 는 형식 이 데이터 프레임 입니다 . tibble 또는 tbl _ df 는 이 데이터 프레임 이 tidyverse 생태 계 에 더 잘 달라붙 을 수 있 도록 튜닝 한 형태 라고 이해 하 셔도 무방 합니다 . 앞 으로 자주 쓰 게 될 테 니 개념 정도 는 알 고 가셔야 좋 습니다 . 
 물론 m 에 들 어 있 는 한국어 문장 도 tibble 로 만들 수 있 고 , 띄어쓰기 를 기준 으로 행갈이 를 할 수 도 있 습니다 . 이렇게 말 입니다 . 
 ## # A tibble : 555 x 2 
 ## 1 1 북녘 
 ## 2 1 동포 
 ## 3 1 여러분 
 ## 4 1 남녘 의 
 ## 5 1 국민 
 ## 6 1 여러분 
 ## 7 1 해외 
 ## 8 1 동포 
 ## 9 1 여러분 
 ## 10 1 전쟁 
 ## # . .. with 545 more rows 
 그런데 한국어 는 이렇게 하 면 안 됩니다 . 여기 서 는 ' 남녘 의 ' 가 대표 사례 입니다 . 이 표현 은 ' 남녘 ' 이 라는 명사 에 관형격 조사 ' 의 ' 가 붙 어 있 는 형태 입니다 . 데이터 를 분석 할 때 는 이 를 두 가지 로 나눠야 합니다 . 
 이런 사례 만 있 는 게 아닙니다 . ' 감사 합니다 ' 라는 말 은 어떨까 요 ? 이 말 은 ' 감사 + 하 + ㅂ니다 ' 형태 로 분석 할 수 있 습니다 . 역시 텍스트 를 분석 할 때 는 이렇게 분해 한 형태 로 접근 하 는 게 여러 모로 도움 이 됩니다 . 
 이렇게 한국어 는 형태론 적 으로 교착어 ( 膠着 語 ) 로 분류 할 수 있 는 특징 을 나타내 기 때문 에 사실 상 고립어 로 변한 현대 영어 를 분석 하 려고 만든 tidytext 만 쓰 는 데 는 한계 가 있 을 수 밖에 없 습니다 . 그래서 새로운 길 을 찾 아야 합니다 . 
 안녕 , KoNLP ! 그리고 파이프 ( %>%) 
 물론 여러분 이 지금 당장 새로운 길 을 만드실 필요 는 없 습니다 . 전 희원 님 이 라는 아주 멋진 분 께서 한국어 데이터 를 처리 할 수 있 는 KoNLP ( Korean Natural Language Processing ) 패키지 를 만드셨 기 때문 입니다 . 박수 ! 
 패키지 가 새로 등장 했 으니까 우리 가 처음 해야 할 일 은 패키지 를 설치 하 고 불러오 는 겁니다 . 기억 하 고 계시 죠 ? 
 install . packages ( ' KoNLP ') 
 library ( ' KoNLP ') 
 ## Checking user defined dictionary ! 
 여기 서 에러 를 접한 분 이 분명 계실 겁니다 . 그리고 이렇게 에러 가 나온 이유 는 거의 대부분 자바 ( Java ) 때문 일 겁니다 . 당황 하 지 마시 고 일단 이 링크 를 찾아가 셔서 자기 운영 체제 ( OS ) 에 맞 는 오프라인 버전 을 내려 받 아 설치 합니다 . 설치 가 끝나 면 R 로 돌아가 서 install . packages ( ' rJava '), library ( ' rJava ') 를 하 신 다음 에 KoNLP 를 불러오 시 면 정상 작동 할 겁니다 . 
 KoNLP 는 사전 을 통해 단어 를 분류 하 게 되 는데 가장 최근 에 이 패키지 에 들어간 건 ' 형태소 사전 ( NIADic ) ' 입니다 . 아래 명령어 로 이 사전 을 불러올 수 있 습니다 . 
 ## Backup was just finished ! 
 ## 983012 words dictionary was built . 
 우리 가 KoNLP 패키지 를 불러온 건 한국어 표현 을 분해 해서 이해 하 려는 목적 이 었 습니다 . 이렇게 어떤 어절 을 분석 하 는 걸 흔히 ' 형태소 분석 ' 이라고 합니다 . 이 분석 첫 단계 는 동사 , 명사 , 형용사 ' 품사 ' 를 붙여 주 는 겁니다 . 
 KoNLP 에 는 KIAST 품사 태그 셋 에 따라 텍스트 에 품사 를 붙일 수 있 는 함수 두 가지 가 들 어 있 습니다 . 하나 는 SimplePos 09 ( ) 고 두 번 째 는 SimplePos 22 ( ) 입니다 . 차이 는 ? 09 는 품사 를 9 개 로 구분 하 고 , 22 는 22 개 로 구분 한다는 점 입니다 . 이번 포스트 에서 는 일단 간단 하 게 09 를 쓰 도록 하 겠 습니다 . 
 ' 최대한 친절 하 게 쓴 R ' 라는 표현 을 SimplePos 09 ( ) 에 넣 는 걸로 시작 해 볼까요 ? 
 SimplePos 09 ( ' 최대한 친절 하 게 쓴 R ') 
 ## $ 최대한 
 ## [ 1 ] " 최대한 / M " 
 ## $ 친절 하 게 
 ## [ 1 ] " 친절 / N + 하 / X + 게 / E " 
 ## $ 쓴 
 ## [ 1 ] " 쓰 / P + ㄴ / E " 
 ## [ 1 ] " R / F " 
 뭔가 재미있 는 결과 가 나타나 지 않 았 습니까 ? 당연히 SimplePos 09 ( ) 를 한 문장 에 만 적용 할 수 있 는 건 아닙니다 . m 에 통째 로 써 볼까요 ? 그래서 그 결과 를 mp 라는 새 변수 에 넣 도록 하 겠 습니다 . 
 mp <- SimplePos 09 ( m ) 
 이번 에 도 아무 반응 이 없 습니다 . mp 라는 변수 를 만들 라고 했 을 뿐 무엇 을 출력 하 라고 명령 한 건 아니 니까요 . 이렇게 한번 확인 해 보 겠 습니다 . 
 mp %>% tail ( 1 ) 
 ## [ [ 1 ] ] $ 감사 합니다 
 ## [ 1 ] " 감사 / N + 하 / X + ㅂ니다 / E " 
 ## [ [ 1 ] ] $. 
 ## [ 1 ] "./ S " 
 결과 가 잘 나온 건 나온 건데 코드 가 뭔가 신기 하 지 않 나요 ? 저기 서 '%>%' 는 tidyverse 에서 쓰 는 파이프 기호 입니다 . 
 금속 이나 플라스틱 으로 만든 파이프 는 액체 나 기체 같 은 유체 를 다른 곳 으로 보내 는 구실 을 합니다 . 마찬가지 로 코딩 에서 파이프 도 변수 내용 을 이 함수 에서 저 함수 로 옮깁니다 . 위 에 제 가 쓴 코드 는 ' tail ( mp , 1 ) ' 이라고 써도 똑같 은 결과 를 내놓 습니다 . 
 이렇게 함수 를 겹치 고 겹쳐 쓰 다 보 면 괄호 하나 만 잘못 써도 처음 부터 코드 를 다시 작성 해야 하 는 일 이 생깁니다 . 또 tail ( mp , 1 ) 이 라고 쓰 는 것 보다 mp %>% tail ( 1 ) 쪽 이 코드 내용 을 직관 적 으로 이해 하 는 데 더 도움 이 되 지 않 나요 ? 
 이런 이유 로 다른 분 들 이 쓰 신 R 코드 를 보 다 보 면 %>% 를 어렵 지 않 게 발견 하 실 수 있 습니다 . 물론 이 포스트 에서 도 앞 으로 여러 차례 등장 할 겁니다 . 
 tibble 도 안녕 ! 
 위 에서 tidytext 는 자료 를 tibble 이 라는 형식 으로 다룬다고 말씀 드렸 습니다 . 그러 면 mp 는 어떤 형식 일까요 ? 이 를 알아볼 때 는 ' class ( ) ' 함수 도움 을 받 으면 됩니다 . 당연히 파이프 를 써야 겠 죠 ? 
 mp %>% class ( ) 
 리스트 ( list ) 형식 이 라고 나옵니다 . 리스트 는 문자 그대로 목록 을 담 고 있 다는 뜻 입니다 . mp 에 는 형태소 분석 을 마친 목록 이 들 어 있 습니다 . 
 이제 우리 가 할 일 은 이 리스트 를 tibble 로 바꾸 는 것 . tidyverse 동사 만 으로 리스트 를 tibble 로 바꾸 는 방법 이 없 는 건 당연히 아닙니다 . 그런데 그 보다 더 간단 하 고 쉬운 길 이 있 다면 그 쪽 을 택하 는 게 더 친절 할 겁니다 . 
 우리 는 reshape 2 패키지 에 들 어 있 는 melt ( ) 함수 를 쓸 겁니다 . 새로 패키지 가 등장 했으니 설치 하 고 불러들이 는 과정 부터 거쳐야 합니다 . 
 여기 서 tidyr 가 등장 하 는 걸 눈여겨 볼 만 합니다 . tidyverse 생태 계 에서 reshape 2 와 제일 비슷 한 기능 을 하 는 게 바로 tidyr 입니다 . melt ( ) 는 tidyr 에서 gather ( ) 처럼 데이터 를 롱 포맷 ( long format ) 으로 바꿔 주 는 구실 을 합니다 . 
 두 함수 에 차이 가 있 다면 melt ( ) 는 별 다른 옵션 을 주 지 않 아도 mp 처럼 리스트 안 에 리스트 가 들 어 있 는 자료 도 데이터 프레임 으로 바꿔 준다는 점 입니다 . 이렇게 말 입니다 . 
 mp %>% melt %>% head 
 ## value L 2 L 1 
 ## 1 북녘 / N 북녘 1 
 ## 2 동포 / N 동포 1 
 ## 3 여러분 / N +,/ S 여러분 , 1 
 ## 4 남녘 / N + 의 / J 남녘 의 1 
 ## 5 국민 / N 국민 1 
 ## 6 여러분 / N +,/ S 여러분 , 1 
 사실 우리 가 원 하 는 건 데이터 프레임 이 아니 라 tibble 입니다 . 데이터 프레임 을 tibble 로 바꿀 때 는 as _ tibble ( ) 함수 를 한번 쓰 시 면 됩니다 . 이렇게 자료 를 tibble 형태 로 바꾼 다음 에 이 를 m _ df 라는 변수 에 넣 겠 습니다 . 그리고 내용 까지 확인 해 보 겠 습니다 . 
 m _ df <- mp %>% melt %>% as _ tibble 
 ## # A tibble : 610 x 3 
 ## value L 2 L 1 
 ## < fct > < chr > < int > 
 ## 1 북녘 / N 북녘 1 
 ## 2 동포 / N 동포 1 
 ## 3 여러분 / N +,/ S 여러분 , 1 
 ## 4 남녘 / N + 의 / J 남녘 의 1 
 ## 5 국민 / N 국민 1 
 ## 6 여러분 / N +,/ S 여러분 , 1 
 ## 7 해외 / N 해외 1 
 ## 8 동포 / N 동포 1 
 ## 9 여러분 / N +,/ S 여러분 , 1 
 ## 10 전쟁 / N 전쟁 1 
 ## # . .. with 600 more rows 
 tidytext 가 자료 를 처리 했 던 것 과 점점 비슷 한 모양 으로 바뀌 고 있 습니다 . 이걸 더 비슷 하 게 만들 려면 L 1 을 제일 앞 에 넣 고 value 를 그 다음 에 넣 으면 될 겁니다 . 이럴 때 는 어떻게 하 면 될까요 ? 
 데이터 프레임 에서 특정 한 위치 에 있 는 자료 만 뽑 아 보 고 싶 을 때 는 ' 데이터 프레임 [ 행 , 열 ] ' 순서 로 쓰 시 면 됩니다 . 그렇 다면 ' m _ df [ , 1 ] ' 라고 쓰 면 어떻게 될까요 ? 첫 번 째 열인 value 만 보여 줄 겁니다 . 
 m _ df [ , 1 ] 
 ## # A tibble : 610 x 1 
 ## 1 북녘 / N 
 ## 2 동포 / N 
 ## 3 여러분 / N +,/ S 
 ## 4 남녘 / N + 의 / J 
 ## 5 국민 / N 
 ## 6 여러분 / N +,/ S 
 ## 7 해외 / N 
 ## 8 동포 / N 
 ## 9 여러분 / N +,/ S 
 ## 10 전쟁 / N 
 우리 는 세 번 째 , 첫 번 째 가 필요 한 겁니다 . 이럴 때 는 ' m _ df [ , c ( 3 , 1 ) ] ' 이 모법 답안 입니다 . ' c ( ) ' 라는 함수 가 새로 등장 했 습니다 . 여기 서 c 는 ' 사슬 같이 잇 다 ( concatenate ) ' 라는 뜻 으로 R 에서 는 자료 여러 개 를 한꺼번에 표시 하 고 싶 을 때 씁니다 . 여기 서 는 세 번 째 와 첫 번 째 를 같이 묶 어 달 라는 뜻 으로 이렇게 쓴 겁니다 . 아래 에서 는 이 결과 를 다시 m _ df 에 넣 었 습니다 . 
 m _ df <- m _ df [ , c ( 3 , 1 ) ] 
 ## # A tibble : 610 x 2 
 ## L 1 value 
 ## < int > < fct > 
 ## 1 1 북녘 / N 
 ## 2 1 동포 / N 
 ## 3 1 여러분 / N +,/ S 
 ## 4 1 남녘 / N + 의 / J 
 ## 5 1 국민 / N 
 ## 6 1 여러분 / N +,/ S 
 ## 7 1 해외 / N 
 ## 8 1 동포 / N 
 ## 9 1 여러분 / N +,/ S 
 ## 10 1 전쟁 / N 
 이제 tidytext 부럽 지 않 은 모양 이 됐 습니다 . 돌다리 도 두드려 보 고 건너 듯 천천히 오 느라 엄청 오래 걸린 느낌 적 인 느낌 이 들 지만 지금 까지 쓴 코드 안 에 진짜 텍스트 분석 에 필요 한 내용 이 들 어 있 는 건 아래 가 전부 입니다 . 
 m _ df <- read _ lines ( ' moon . txt ') %>% 
 SimplePos 09 %>% 
 select ( 3 , 1 ) 
 그러 니 앞 으로 도 계속 천천히 가 겠 지만 너무 겁 을 먹 거나 어려워 하 실 필요 없 습니다 . 이 코드 맨 끝 에 등장 하 는 select ( ) 함수 는 ' 열 을 선택 하 는 ' dplyr 패키지 동사 입니다 . 지금 은 일단 이 내용 이 면 충분 하 리라고 보 지만 dplyr 패키지 에 대해 더 자세히 알 고 싶 으신 분 이 분명 계실 터 . 지금 궁 긍증이 드셨 다면 ' 최대한 친절 하 게 쓴 R 로 데이터 뽑아내 기 ( feat . dplyr ) ' 포스트 가 도움 이 될 수 있 습니다 . 
 정규식 도 왔 네 ? 
 아직 도 깔끔 하 게 끝 이 난 건 아닙니다 . 각 낱말 이 여전히 품사 태그 를 달 고 있 기 때문 입니다 . 이 태그 를 떼 어 버리 려면 ' 정규식 ' 이 라는 걸 조금 공부 하 셔야 합니다 . 
 정규식 이 라면 많 은 분 이 올해 프로 야구 LG 에서 방출 당한 포수 정규식 ( 28 ) 을 떠올리 시 겠 지만 ( 응 ? ) 여기 서 정규식 은 ' 정규 표현식 ( Regular Expression ) ' 을 줄인 말 입니다 . 위키피디아 는 정규 표현식 을 " 특정 한 규칙 을 가진 문자열 의 집합 을 표현 하 는 데 사용 하 는 형식 언어 " 라고 풀이 하 고 있 습니다 . 
 풀이 를 보 셔도 잘 모르 시 겠 죠 ? 여러분 만 그런 게 아닙니다 . 그래서 아예 R 에서 사용 하 는 정규식 을 설명 하 는 커닝 페이퍼 가 따로 있 을 정도 입니다 . ( 아래 있 는 그림 파일 을 내려 받 으시 면 크기 를 키우 실 수 있 습니다 . 아니면 앞 에 있 는 링크 에서 PDF 파일 을 내려 받 는 방법 도 있 습니다 . ) 
 이 커닝 페이퍼 는 기본 적 으로 왼쪽 에 있 는 표현 이 오른쪽 에서 색칠 한 부분 을 뜻 한다는 내용 입니다 . 한번 연습 해 보 시 죠 . 이 페이퍼 맨 처음 에 알파벳 한 글자 만 쓰 면 ( 당연히 ) 그 글자 를 뜻 한다는 내용 이 있 으니 한 번 해 보 겠 습니다 . 
 확인 에 쓸 함수 는 str _ match ( ) 입니다 . 문자열 은 영어 로 ' string ' 이라고 부릅니다 . tidyverse 패키지 에 들 어 있 는 stringr 패키지 가 바로 문자열 을 다루 는 용도 입니다 . match 는 일치 한다는 뜻 이 겠 죠 ? str _ match ( ) 를 쓰 면 str _ match ( 문자열 , 조건 ) 형태 로 어떤 조건 에 일치 하 는 문자열 만 뽑아내 라고 명령 할 수 있 습니다 . 
 따라서 ' 최대한 친절 하 게 쓴 R ' 이 라는 표현 에서 R 라는 한 글자 만 뽑아내 고 싶 을 때 는 아래 처럼 쓰 면 됩니다 . 
 str _ match ( ' 최대한 친절 하 게 쓴 R ', ' R ') 
 ## [ 1 , ] " R " 
 예상 한 것 처럼 잘 나왔 습니다 . 난도 를 높여 보 겠 습니다 . 여기 서 알파벳 만 뽑아내 고 싶 을 때 는 어떻게 하 면 될까요 ? 위 에 [ : alpha : ] 라고 답 이 나와 있 습니다 . 이렇게 써도 되 고 그냥 [ A - Z ] 라고 써도 같 은 결과 가 나옵니다 . 이번 에 는 알파벳 이 R 밖에 없 기 때문 에 R 를 출력 할 겁니다 . 
 str _ match ( ' 최대한 친절 하 게 쓴 R ', '[ A - Z ] ') 
 한글 을 출력 하 고 싶 을 때 는 어떻게 해야 할까요 ? 가나다 순서 로 정리 하 면 한글 첫 글자 는 ' 가 ' 이 고 마지막 글자 는 ' 힣 ' 입니다 . 
 str _ match ( ' 최대한 친절 하 게 쓴 R ', '[ 가 - 힣 ] ') 
 ## [ 1 , ] " 최 " 
 ' 최 ' 라고 한 글자 만 나온 건 str _ match ( ) 가 기본 적 으로 맨 앞 에 있 는 결과 를 출력 하 기 때문 입니다 . 만약 모든 결과 를 출력 하 고 싶 으실 때 는 str _ match _ all ( ) 함수 를 쓰 시 면 됩니다 . 
 str _ match _ all ( ' 최대한 친절 하 게 쓴 R ', '[ 가 - 힣 ] ') 
 ## [ 2 , ] " 대 " 
 ## [ 3 , ] " 한 " 
 ## [ 4 , ] " 친 " 
 ## [ 5 , ] " 절 " 
 ## [ 6 , ] " 하 " 
 ## [ 7 , ] " 게 " 
 ## [ 8 , ] " 쓴 " 
 그런데 이건 우리 가 원 하 던 결과 하고 는 조금 다릅니다 . 우리 가 원 하 는 건 ' 최대한 ' 처럼 어절 단위 로 끊 는 거 니까요 . 이럴 때 는 '+' 기호 도움 을 받 으면 됩니다 . 
 str _ match _ all ( ' 최대한 친절 하 게 쓴 R ', '[ 가 - 힣 ] +') 
 ## [ 1 , ] " 최대한 " 
 ## [ 2 , ] " 친절 하 게 " 
 ## [ 3 , ] " 쓴 " 
 우리 는 이미 어절 단위 로 행 을 나눈 상태 이 기 때문 에 모든 데이터 가 필요 하 지 는 않 습니다 . 그냥 str _ match ( ) 를 써서 ' 최대한 ' 만 뽑아내 도 충분 합니다 . 
 난도 를 더 높여 보 겠 습니다 . 우리 가 한글 텍스트 를 분석 할 때 ' 몸통 ' 에 해당 하 는 품사 는 뭘까요 ? 바로 체언 ( 명사 , 대명사 , 수사 ) 입니다 . 괜히 이 품사 에 몸 체 ( 體 ) 를 붙인 게 아닐 테 니까요 . 우리 가 쓰 고 있 는 KAIST 품사 태그 는 체언 에 '/ N ' 이 라는 꼬리표 를 붙이 고 있 습니다 . 이렇게 / N 이 붙 은 행 만 골라내 는 건 정규 식 으로 이렇게 쓸 수 있 습니다 . 
 str _ match ( ' 북녘 / N ', '([ 가 - 힣 ] +)/ N ') 
 ## [ 1 , ] " 북녘 / N " " 북녘 " 
 이 중 에서 우리 는 / N 이 붙 지 않 은 두 번 째 자료 가 필요 하 니까 이렇게 쓰 면 꼬리표 를 떼 어 낸 형태 로 데이터 를 정리 할 수 있 습니다 . 
 str _ match ( ' 북녘 / N ', '([ 가 - 힣 ] +)/ N ')[, 2 ] 
 ## [ 1 ] " 북녘 " 
 거의 다 왔 습니다 . 우리 가 분석 할 데이터 를 담 고 있 는 m _ df 에 이 를 똑같이 적용 하 면 그만 입니다 . 이 작업 을 진행 하 시 기 전 에 mutate ( ) 라는 함수 를 하나 더 배우 셔야 편합니다 . dplyr 에 들 어 있 는 mutate ( ) 는 계산 결과 를 담 은 열 을 추가 하 라는 뜻 입니다 . 
 이게 무슨 뜻 인지 는 다음 코드 실행 결과 를 보 시 면 이해 가 가시리 라 믿 습니다 . 그래도 부족 하 시 다면 ' 최대한 친절 하 게 쓴 R 로 데이터 뽑아내 기 ( feat . dplyr ) ' 포스트 가 도움 이 될 수 있 습니다 . 
 일단 파이프 와 mutate ( ) 를 활용 해 아래 처럼 코드 를 쓰 도록 하 겠 습니다 . 
 m _ df %>% 
 이 코드 는 m _ df 에서 자료 를 가져와서 이 가운데 value 열 에 들 어 있 는 자료 에 str _ match ( ) 함수 를 적용 해 그 결과 를 noun ( 영어 로 명사 ) 이 라는 열 로 만들 어 내 라는 뜻 입니다 . 그래서 이 코드 를 실행 하 시 면 이런 결과 가 나옵니다 . 
 ## L 1 value noun 
 ## < int > < fct > < chr > 
 ## 1 1 북녘 / N 북녘 
 ## 2 1 동포 / N 동포 
 ## 3 1 여러분 / N +,/ S 여러분 
 ## 4 1 남녘 / N + 의 / J 남녘 
 ## 5 1 국민 / N 국민 
 ## 6 1 여러분 / N +,/ S 여러분 
 ## 7 1 해외 / N 해외 
 ## 8 1 동포 / N 동포 
 ## 9 1 여러분 / N +,/ S 여러분 
 ## 10 1 전쟁 / N 전쟁 
 원래 m _ df 에 는 L 1 과 value 열 만 있 었 는데 noun 이 생겼 다는 사실 을 알 수 있 습니다 . 이 부분 에 는 체언 이 너무 많 아서 눈 에 잘 띄 지 않 지만 4 행 을 보 시 면 원래 는 ' 남녘 의 ' 였 는데 이 중 에서 관형격 조사 ' 의 ' 를 걸러 내 ' 남녘 ' 만 남 았 다는 사실 을 알 수 있 습니다 . 
 여기 서 주의 해야 할 건 어떤 행 에 는 아예 체언 이 없 는 일 도 있 기 때문 에 모든 행 이 예쁘 게 데이터 를 담 고 있 는 건 아니 라는 점 입니다 . 꼬리 부분 만 확인 해도 이 를 알 수 있 습니다 . 
 ## L 1 value noun 
 ## < int > < fct > < chr > 
 ## 1 40 열매 / N + 가 / J 열매 
 ## 2 40 열리 / P + 고 / E < NA > 
 ## 3 40 있 / P + 습니다 / E < NA > 
 ## 4 40 . / S < NA > 
 ## 5 41 감사 / N + 하 / X + ㅂ니다 / E 감사 
 ## 6 41 . / S < NA > 
 < NA > 는 ' Not Applicable ' 또는 ' Not Available ' 이 라는 의미 로 계산 결과 가 없 다는 뜻 입니다 . 이런 행은 아예 빼 는 게 낫 겠 죠 ? 그럴 때 는 na . omit ( ) 함수 를 쓰 시 면 됩니다 . 영어 낱말 ' omit ' 는 생략 하 다 , 제거 하 다는 뜻 입니다 . 
 na . omit %>% tail 
 ## 1 40 가을 / N + 의 / J 가을 
 ## 2 40 평양 / N + 에서 / J 평양 
 ## 3 40 평화 / N + 와 / J 평화 
 ## 4 40 번 영 / N + 의 / J 번영 
 ## 5 40 열매 / N + 가 / J 열매 
 ## 6 41 감사 / N + 하 / X + ㅂ니다 / E 감사 
 < NA > 가 들 어 있 던 행 이 사라진 걸 알 수 있 습니다 . 그리고 이제 진짜 데이터 손질 을 마쳤 습니다 . 정말 고생 하 셨 습니다 . 잠깐 물 이 라도 한 잔 하 시 면서 머리 좀 식히 세요 . 
 문 대통령 은 어떤 낱말 을 많이 썼 을까 ? 
 우리 가 활용 하 고 있 는 평양 연설 자료 처럼 대통령 등 주요 인물 연선 물 이 끝나 면 언론 에서 ' 어떤 낱말 을 몇 번 섰 다 ' 고 표현 하 는 걸 어렵 지 않 게 볼 수 있 습니다 . 이런 건 어떻 게 구 할까요 ? 
 제일 쉬운 건 물론 직접 세 는 겁니다 . 그런데 이렇게 시간 을 낭비 하 는 방식 을 별로 추천 하 고 싶 지 는 않 습니다 . dplyr 에 는 숫자 를 세 어서 알려 주 는 count ( ) 함수 가 있 으니까요 . 위 에서 썼 던 코드 를 na . omit ( ) 부분 까지 그대로 쓰 고 count ( ) 부분 만 추가 하 면 이런 결과 를 얻 을 수 있 습니다 . 
 ## # A tibble : 238 x 2 
 ## noun n 
 ## 1 우리 13 
 ## 2 것 12 
 ## 3 한반도 9 
 ## 4 수 8 
 ## 5 여러분 8 
 ## 6 남 6 
 ## 7 오늘 6 
 ## 8 위원장 6 
 ## 9 동포 5 
 ## 10 비핵화 5 
 사소 한 문제 가 있 다면 ' 것 ' 이나 ' 수 ' 같 은 의존 명사 는 큰 의미 가 없 는 데 도 자주 등장 한다는 점 입니다 . 그래서 텍스트 데이터 를 처리 할 때 는 보통 두 글자 이상 만 정리 하 는 방식 으로 이 문제 를 해결 합니다 . 그러 려면 글자 수 를 따로 세 어 줘야 합니다 . 
 stringr 에서 는 str _ length ( ) 가 바로 이 구실 을 합니다 . ' 최대한 친절 하 게 쓴 R ' 가 몇 글자 인지 궁금 하 다면 이렇게 치 시 면 됩니다 . 
 str _ length ( ' 최대한 친절 하 게 쓴 R ') 
 12 글자 라는 결과 를 납득 하 기 힘든 분 도 계실 텐데 빈 칸 ( 공백 ) 까지 세 어 보 시 면 12 글자 맞 습니다 . 
 이번 에 도 m _ df 에 있 는 각 행 에 글자 숫자 를 계산 하 는 과정 이 필요 하 겠 죠 ? 이렇게 쓰 시 면 됩니다 . 
 ## # A tibble : 386 x 4 
 ## L 1 value noun length 
 ## < int > < fct > < chr > < int > 
 ## 1 1 북녘 / N 북녘 2 
 ## 2 1 동포 / N 동포 2 
 ## 3 1 여러분 / N +,/ S 여러분 3 
 ## 4 1 남녘 / N + 의 / J 남녘 2 
 ## 5 1 국민 / N 국민 2 
 ## 6 1 여러분 / N +,/ S 여러분 3 
 ## 7 1 해외 / N 해외 2 
 ## 8 1 동포 / N 동포 2 
 ## 9 1 여러분 / N +,/ S 여러분 3 
 ## 10 1 전쟁 / N 전쟁 2 
 이제 는 length 가 2 이상 인 것 만 걸러 내 면 됩니다 . 거르 는 건 영어 로 filtering ( 필터링 ) . dplyr 에서 행 을 골라낼 때 쓰 는 함수 가 filter ( ) 인 이유 입니다 . filter ( ) 는 filter ( 열 , 조건 ) 형태 로 써서 원 하 는 행 만 골라 내 도록 합니다 . 이번 에 도 아래 예시 를 보 시 면 이게 무슨 뜻 인지 이해 하 시 리라 믿 지만 그래도 어딘가 이상 하 다면 ' 최대한 친절 하 게 쓴 R 로 데이터 뽑아내 기 ( feat . dplyr ) ' 포스트 를 읽 어 보 시 는 게 좋 습니다 . 
 앞 에서 는 어떤 결과 가 나오 는지 보여 드리 려고 mutate ( ) 를 썼 지만 사실 저 열 이 꼭 필요 한 건 아닙니다 . 그냥 filter 에서 조건 안 에 저 내용 을 넣 어도 충분 합니다 . 그래서 코드 를 이런 식 으로 쓰 도록 하 겠 습니다 . 아예 많이 나온 낱말 을 뽑아내 는 것 까지 한 번 에 . 
 ## # A tibble : 206 x 2 
 ## 2 한반도 9 
 ## 3 여러분 8 
 ## 4 오늘 6 
 ## 5 위원장 6 
 ## 6 동포 5 
 ## 7 비핵화 5 
 ## 8 전쟁 5 
 ## 9 겨레 4 
 ## 10 국민 4 
 ' 남북 정상 회담 에 참가 한 대통령 이 라면 이런 낱말 을 많이 쓰 지 않 을까 ' 하고 예상 할 수 있 는 그런 낱말 이 실제로 많이 나왔 습니다 . 우리 분석 이 틀리 지 않 았 다는 뜻 일 겁니다 . 이걸로 정말 낱말 구름 을 그릴 수 있 는 준비 가 끝 났 습니다 . 
 낱말 구름 을 그려 보 자 
 R 는 사용 자 가 낱말 구름 을 그릴 수 있 도록 wordcloud 패키지 를 마련 하 고 있 습니다 . 그리고 이 패키지 를 업데이트 한 wordclud 2 패키지 도 있 습니다 . 기왕이면 새 버전 을 쓰 는 게 낫 겠 죠 ? 패키지 가 나왔으니 설치 및 로드 진행 하 고 계시 죠 ? 
 낱말 구름 을 그리 는 함수 이름 도 wordcloud 2 ( ) 입니다 . 이 함수 는 wordcloud 2 ( 데이터 , 빈도 ) 가 기본 형식 입니다 . 우리 는 이미 어떤 낱말 이 몇 번 나왔 는지 ( 빈도 ) 알려 주 는 데이터 를 가지 고 있 으니까 그냥 곧바로 적용 하 면 됩니다 . 
 이 코드 를 실행 하 면 기본 인터넷 브라우저 가 열리 면서 아래 그림 같 은 낱말 구름 을 표시 합니다 . 
 코드 에서 이해 가 가 지 않 는 부분 없 으시 죠 ? 이렇게 코드 를 쓰 면 아래 같 은 결과 가 나옵니다 . 
 이런 식 으로 속성 에 변화 를 주 면 다양 한 형태 로 낱말 구름 을 그릴 수 있 습니다 . 이번 포스트 는 낱말 구름 을 그리 는 방법 을 소개 해 드리 는 게 목적 이 고 , 저 는 제 미 적 기준 을 믿 지 못하 기 때문 에 새로 낱말 구름 을 추가 하 지 는 않 겠 습니다 . 그래도 2 % 부족 하 다는 생각 에 좀 더 다양 한 예시 를 보 고 싶 으신 분 은 이 페이지 를 찾 아 보 시 면 도움 이 되 리라고 생각 합니다 . 
 의미 연결망 도 그려 보 자 
 이제 마지막 으로 의미 연결망 을 그릴 차례 입니다 . 의미 연결망 이 라는 표현 자체 는 낯선 분 도 언론 에서 아래 같 은 그림 을 보 신 적 은 있 으실 겁니다 . 
 이 그림 은 제 가 주간 동 에 의뢰 로 지난해 ( 2017 년 ) 청와대 국민 청원 및 제안 게시판 을 분석 해 정리 한 의미 연결망 입니다 . ( 저 는 스케치 형태 로 제공 했 고 실제 그래픽 작업 은 주간동아 그래픽 팀 에서 맡 았 습니다 . ) 
 이런 그림 을 그려 보 면 어떤 텍스트 에서 어떤 내용 을 강조 하 고 있 는지 파악 할 수 있 습니다 . 예 를 들 어 이 그래프 에서 ' 이명박 ' 이 라는 낱말 은 ' 대통령 ' 과 가까이 에 있 지만 ' 문재인 ' 은 ' 대통령 님 ' 과 더 가까이 에 있 다는 걸 파악 하 는 게 가능 합니다 . 
 의미 연결망 은 문자열 에 사회관 계망 분석 ( SNA ) 기법 을 적용 해 그립니다 . 그래서 SNA 기본 지식 이 부족 하 면 내용 이해 에 어려움 이 따르 는 게 당연 한 일 입니다 . 그래서 포기 하 시 라는 게 아니 라 이해 가 잘 가 지 않 으시 면 가 지 않 으시 는 대로 흘려 보내 셔도 된다는 뜻 입니다 . 대신 제 가 약간 불친절 해도 이해 해 주 시 기 바랍니다 . 
 혹시 이번 기회 에 SNA 에 대해 공부 하 고 싶 으신 분 은 ' 최대한 친절 하 게 쓴 R 로 사회 연결망 분석 하 기 ( feat . tidygraph , ggraph ) ' 포스트 가 도움 이 될 수 도 있 습니다 . ( 정말 길 고 긴 포스트 니까 , 심지어 지금 까지 이 포스트 에 쓴 것 보다 더 기 니까 페이지 를 옮겨 가 기 전 에 주의 하 세요 ! ) 
 의미 연결망 을 그리 려면 일단 자료 를 좀 쳐낼 필요 가 있 습니다 . 지금 우리 데이터 에 는 두 글자 이상 만 뽑 아도 200 개 가 넘 는 낱말 이 들 어 있 습니다 . 200 개 가 넘 는 점 을 서로 잇 는 선 을 그리 면 뭐 가 뭔지 알아보 기 쉽 지 않 습니다 . 
 그래서 제일 많이 등장 한 낱말 15 개 만 고른 다음 작업 을 진행 하 도록 하 겠 습니다 . 꼭 15 개 를 고르 셔야 하 는 건 아닙니다 . 이 숫자 는 순전히 제 가 제 마음대로 고른 숫자 입니다 . 필요 와 희망 에 따라서 보 기 좋 은 ( ? ) 숫자 를 고르 시 면 됩니다 . 
 이 15 개 는 이렇게 고르 는 방법 은 이렇 습니다 . 먼저 낱말 빈도 를 알려 주 는 tibble 을 하나 만듭니다 . 그러면 이 tibble 에서 맨 처음 15 개 가 바로 가장 많이 나온 낱말 15 개 가 됩니다 . 그 다음 원본 데이터 하 고 비교 하 는 과정 을 거칩니다 . 어떤 데이터 가 이 15 개 안 에 들 어 있 는지 확인 하 는 것 . 
 이 를 코드 로 쓰 면 이렇 습니다 . 먼저 m _ count 라는 변수 에 가장 많이 나온 낱말 15 개 를 담 아 보 도록 하 겠 습니다 . 
 m _ count <- m _ df %>% 
 ## 11 김정은 4 
 ## 12 서울 4 
 ## 13 양국 4 
 ## 14 평화 4 
 ## 15 합의 4 
 코드 에서 이해 가 잘 가 지 않 는다는 부분 없 으시 죠 ? 앞 에서 이미 했 던 작업 결과 에 맨 앞 에 있 는 15 줄 을 뽑 아 달 라는 뜻 에서 head ( 15 ) 만 추가 한 거 니까요 . 
 두 번 째 작업 은 더 쉽 습니다 . 계속 지켜 봤 던 녀석 을 m _ df 2 라는 변수 에 넣 는 것 뿐 이 니까요 . 단 , 이제 정말 품사 꼬리표 는 필요 가 없 으니까 아예 그 녀석 까지 제외 하 도록 하 겠 습니다 . 
 m _ df 2 <- m _ df %>% 
 m _ df 2 
 ## noun L 1 
 ## 1 북녘 1 
 ## 2 동포 1 
 ## 3 여러분 1 
 ## 4 남녘 1 
 ## 5 국민 1 
 ## 6 여러분 1 
 ## 7 해외 1 
 ## 8 동포 1 
 ## 9 여러분 1 
 ## 10 전쟁 1 
 ## # . .. with 306 more row 
 이제 이 가운데 noun 에 있 는 낱말 이 m _ count 에서 같 은 열 에 있 을 때 만 골라내 는 작업 을 진행 하 면 됩니다 . 이번 에 도 행 을 뽑 아 내 니까 filter ( ) 를 써야 겠 죠 ? R 에 는 어떤 값 이 어떤 변수 에 들 어 있 는지 여부 를 알려 주 는 '% in %' 이 라는 연산자 가 있 습니다 . 그래서 이런 식 으로 쓰 면 그만 입니다 . 
 m _ df 3 <- m _ df 2 %>% 
 filter ( noun % in % m _ count $ noun ) 
 m _ df 3 
 ## 1 동포 1 
 ## 2 여러분 1 
 ## 3 국민 1 
 ## 4 여러분 1 
 ## 5 동포 1 
 ## 7 전쟁 1 
 ## 8 한반도 1 
 ## 9 오늘 1 
 ## 10 한반도 1 
 아 , 여태 '$' 기호 를 말씀 드린 적 이 없 었 네요 . $ 는 데이터 프레임 에서 특정 한 열 을 뽑아낼 때 쓰 는 기호 입니다 . ' 데이터 프레임 $ 열 이름 ' 형태 로 쓰 시 면 됩니다 . m _ count 변수 에 는 noun 뿐 만 아니 라 ' n ' 열 도 있 기 때문 에 알려준 겁니다 . 
 이제 데이터 정리 를 마쳤으니 진짜 SNA 를 진행할 차례 입니다 . R 에서 SNA 에 제일 많이 쓰 는 패키지 는 igraph 입니다 . 패키지 가 등장 했으니 할 일 은 ? 
 igraph 는 이름 그대로 ( 네트워크 ) 그래프 를 다루 는 패키지 입니다 . 그래서 m _ df 3 에 담 아 둔 자료 를 그래프 형태 로 바꿔 줘야 합니다 . 이때 사용 하 는 함수 이름 은 graph _ from _ data _ frame ( ) 입니다 . 무슨 의미 인지 한 번 에 아 시 겠 죠 ? mg 라는 변수 에 그래프 를 넣 고 어떻게 생겼 는지 확인 해 보 겠 습니다 . 
 mg <- graph _ from _ data _ frame ( m _ df 3 ) 
 ## IGRAPH 6336 ea 9 DN -- 35 85 -- 
 ## + edges from 6336 ea 9 ( vertex names ) : 
 ## [ 1 ] 동포 -> 1 여러분 -> 1 국민 -> 1 여러분 -> 1 동포 -> 1 여러분 -> 1 
 ## [ 7 ] 전쟁 -> 1 한반도 -> 1 오늘 -> 1 한반도 -> 1 전쟁 -> 1 합의 -> 1 
 ## [ 13 ] 합의 -> 3 전쟁 -> 3 우리 -> 3 한반도 -> 3 우리 -> 3 우리 -> 3 
 ## [ 19 ] 전쟁 -> 5 우리 -> 5 국민 -> 5 오늘 -> 6 비핵화 -> 8 합의 -> 8 
 ## [ 25 ] 우리 -> 11 겨레 -> 11 한반도 -> 11 비핵화 -> 11 비핵화 -> 11 우리 -> 12 
 ## [ 31 ] 동포 -> 14 여러분 -> 14 국민 -> 14 여러분 -> 14 한반도 -> 14 합의 -> 14 
 ## [ 37 ] 양국 -> 16 우리 -> 17 우리 -> 19 평화 -> 21 우리 -> 21 겨레 -> 21 
 ## [ 43 ] 오늘 -> 21 우리 -> 21 겨레 -> 21 평화 -> 21 우리 -> 21 우리 -> 21 
 각 낱말 이 특정 한 번호 를 향하 고 있 습니다 . 이 번호 는 문 대통령 연설 가운데 몇 번 째 문장 이 었 는지 를 나타냅니다 . 텍스트 를 이렇게 분석 하 는 건 같 은 문장 에 들 어 있 는 낱말 끼리 관계 가 더욱 깊 다고 간주 하 기 때문 입니다 . 
 문제 는 여기 서 낱말 과 문장 번호 는 서로 성질 이 다른 변수 라는 점 입니다 . 이런 식 으로 정리 한 그래프 를 ' 이분 ( Bipartite ) 그래프 ' 라고 부릅니다 . 이분 그래프 는 다음 과 같 은 과정 을 거쳐서 분해 할 수 있 습니다 . 자세 한 내용 은 ' 최대한 친절 하 게 쓴 R 로 사회 연결망 분석 하 기 ( feat . tidygraph , ggraph ) ' 를 참고 해야 한다는 것 알 고 계시 죠 ? 
 V ( mg ) $ type <- bipartite _ mapping ( mg ) $ type 
 mm <- as _ incidence _ matrix ( mg ) %*% t ( as _ incidence _ matrix ( mg ) ) 
 mg <- graph _ from _ adjacency _ matrix ( mm ) 
 자료 정리 가 끝 났 으니까 일단 R 에 기본 적 으로 들 어 있 는 시각화 함수 plot ( ) 를 써서 의미 연결망 을 그려 보 면 이렇게 생겼 다는 걸 알 수 있 습니다 . 
 성공 입니다 . 여러분 은 ( 아마도 대부분 ) 인생 처음 으로 낱말 의미 연결망 그래프 를 그리 셨 습니다 . 이제 여러분 은 텍스트 자료 만 있 으면 낱말 구름 과 의미 연결망 을 모두 그릴 줄 아 는 능력자 이 십니다 . 
 깔끔 하 게 의미 연결망 을 그려 보 자 
 tidyverse 스타일 로 텍스트 데이터 를 분석 하 게 해 주 는 tidytext 패키지 가 있 는데 SNA 라고 달라야 하 나요 ? 눈치 가 빠르 신 분 은 이미 위 에서 두 번 언급 한 포스트 제목 에 tidygraph 와 ggraph 라는 녀석 이 들 어 있 었 다고 짐작 하 고 계실 겁니다 . tidygraph 는 igraph 처럼 네트워크 그래프 를 분석 할 수 있 도록 돕 는 도구 고 , ggraph 는 그래프 를 시각 화 하 는 패키지 입니다 . 
 패키지 가 나왔으니 제일 먼저 해야 할 일 은 ? 네 , 이제 따로 말씀 드리 지 않 아도 아실 겁니다 . 
 tidygraph 는 tbl _ graph 라는 형태 로 그래프 데이터 를 처리 합니다 . 데이터 프레임 이나 행렬 또는 igraph 데이터 모두 as _ tbl _ graph ( ) 라는 함수 안 에 넣 으면 이 형태 로 바꿀 수 있 습니다 . 우리 는 igraph 에서 처리 한 mg 변수 가 있 기 때문 에 걱정 할 필요 가 없 습니다 . 
 ggraph 는 ggplot 2 스타일 로 사회관 계망 을 그릴 수 있 도록 만듭니다 . ggplot 2 는 tidyverse 생태 계 뿐 아니 라 아마 R 생태 계 전체 를 통틀 어서 도 가장 유명 한 시각화 패키지 라고 할 수 있 습니다 . ggplot 는 기본 적 으로 데이터 에 기하학 적 ( geometric ) 요소 를 더 하 는 방식 으로 그래프 를 완성 합니다 . ggraph 같 은 문법 스타일 을 따라 한다고 생각 하 시 면 쉽 습니다 . 이번 에 도 ggplot 2 에 대해 조금 더 알 고 싶 으신 분 은 ' 최대한 친절 하 게 쓴 R 로 그래프 그리 기 ( feat . ggplot 2 ) ' 에서 도움 을 받 으실 수 있 습니다 . 
 정리 하 면 제일 먼저 해야 할 일 은 mg 를 as _ tbl _ graph ( ) 에 넣 는 것 이 고 이어서 ggraph 가 나오 면 tidyverse 스타일 로 위 에서 본 그래프 를 다시 그릴 수 있 게 되 는 겁니다 . 그렇 죠 ? 이 를 R 코드 로 표현 하 면 이렇게 쓸 수 있 습니다 . 
 mg %>% as _ tbl _ graph ( ) %>% 
 이 그래프 를 보 고 처음 한 생각 은 ' 15 개 도 너무 많 았 다 ' 였 습니다 . 그래프 에 별다른 미 적 효과 를 주 지 않 아서 좀 허전 해 보이 기 도 하 지만 이 정도 면 어떤 낱말 이 다른 낱말 과 어떤 관계 를 맺 고 있 는지 파악 하 는 데 는 큰 어려움 이 없 을 겁니다 . 
 ggraph 코드 를 조금 더 말씀 드리 면 geom _ edge _ link 는 이 그래프 에서 점 과 점 을 어떻게 이어야 할지 정의 하 고 있 습니다 . 기하학 적 으로 ( geom ) 점 과 점 을 이어서 모서리 를 만드 는데 ( edge ) 그 형태 를 선 ( link ) 으로 하 라는 게 이 함수 뜻 입니다 . 이 함수 안 에 들 어 있 는 각종 속성 은 선 과 선 을 그을 때 점 ( node ) 이름 이 들어갈 정도 로 여백 을 주 라는 뜻 입니다 . 
 geom _ node _ text 는 텍스트 로 점 ( node ) 을 잡 으라는 뜻 입니다 . ase 는 에스테 틱 할 때 ' 미적 ( aesthetic ) ' 을 줄인 말 로 ggplot 2 계열 에서 는 데이터 가 달라지 면 다른 값 을 반영 하 라는 뜻 입니다 . 여기 서 는 노드 마다 텍스트 이름 이 달라지 기 때문 에 이런 코드 를 썼 습니다 . 
 그런데 낱말 과 낱말 사이 관계 를 규정 하 는 방식 이 이렇게 같 은 낱말 이 등장 한 문장 사이 를 연결 하 는 것 밖에 없 을까요 ? 물론 아닙니다 . 그냥 낱말 다음 에 어떤 낱말 이 나오 는지 를 곧바로 살펴봐도 됩니다 . 마지막 으로 이런 작업 은 어떻게 하 는지 살펴보 겠 습니다 . 
 바이 그램 , 안녕 ! 
 ( 제 학부 전공 인 ) 언어학 에서 는 어떤 낱말 과 낱말 이 연속 해 등장 할 때 n 그램 이 라는 표현 을 씁니다 . 두 낱말 이 연속 해서 등장 하 는 건 바이 그램 ( bigram ) 입니다 . 이번 도전 과제 가 바로 바이 그램 연결망 그리 기 입니다 . 
 바이 그램 연결망 을 그리 려면 일단 바이 그램 부터 찾 아 봐야 할 겁니다 . 한번 다음 처럼 코드 를 입력 해 보 겠 습니다 . 
 m _ df 2 %>% 
 select ( noun ) %>% 
 이 코드 는 무슨 뜻 일까요 ? m _ df 2 에서 명사 가 들 어 있 는 noun 열 을 선택 한 다음 lead ( ) 라는 함수 를 적용 해 lead 라는 열 을 새로 만들 어 붙이 라는 뜻 입니다 . 그러면 이런 결과 가 나타납니다 . 
 ## noun lead 
 ## 1 북녘 동포 
 ## 2 동포 여러분 
 ## 3 여러분 남녘 
 ## 4 남녘 국민 
 ## 5 국민 여러분 
 ## 6 여러분 해외 
 ## 7 해외 동포 
 ## 8 동포 여러분 
 ## 9 여러분 전쟁 
 ## 10 전쟁 한반도 
 동포 는 원래 noun 에서 두 번 째 행 에 있 던 값 인데 lead 에서 는 맨 첫 행 으로 자리 를 바꿨 습니다 . 나머지 도 한 칸 씩 위 로 자리 를 옮겼 다는 걸 알 수 있 습니다 . dplyr 패키지 에 있 는 lead ( ) 함수 는 이렇게 바로 아래 행 에서 자료 를 가져오 라는 뜻 입니다 . 참고 로 lag ( ) 함수 는 반대 로 위 에서 아래 로 자료 를 가져 옵니다 . 
 이렇게 자료 를 정리 하 면 ' 북녘 동포 ', ' 동포 여러분 ' 처럼 바이 그램 이 눈 에 들어옵니다 . 이 두 낱말 사이 에 선 을 그으면 바이 그램 의미 연결망 이 나올 겁니다 . 문제 는 이러 면 너무 많 다는 것 . 일단 바이 그램 이 316 개 있 다고 나오 는데 이 중 에 는 똑같 은 표현 도 있 을 거 고 - ' 동포 여러분 ' 을 한 번 만 쓰 지 는 않 았 을 테 니까요 - 우리 는 체언 과 체언 만 연결 했 기 때문 에 중간 에 있 는 낱말 을 건너 뛰 어서 같 은 낱말 만 남 아 있 는 케이스 도 있 을 겁니다 . 
 그런 이유 로 정제 과정 을 거쳐야 합니다 . 이번 에 도 많이 나온 연결 고리 만 정리 하 는 걸로 해 보 겠 습니다 . 그러 려면 일단 어떤 바이 그램 이 많이 나왔 는지 알 아야 겠 죠 ? 많이 나온 낱말 을 정리 할 때 랑 같 은 방법 을 쓰 면 됩니다 . 단 , 지금 은 낱말 두 개 가 따로 따로 있 기 때문 에 이 를 합칠 필요 가 있 습니다 . 이때 쓰 는 함수 는 unite ( ) 입니다 . 
 ## # A tibble : 316 x 1 
 ## 1 북녘 동포 
 ## 2 동포 여러분 
 ## 4 남녘 국민 
 ## 5 국민 여러분 
 ## 7 해외 동포 
 ## 8 동포 여러분 
 ## 10 전쟁 한반도 
 ## # A tibble : 286 x 2 
 ## bigram n 
 ## < chr > < int > 
 ## 1 동포 여러분 5 
 ## 2 김정은 위원장 4 
 ## 3 국민 여러분 3 
 ## 4 남녘 국민 3 
 ## 5 북녘 동포 3 
 ## 6 여러분 남녘 3 
 ## 7 위원장 서울 3 
 ## 8 평화 번영 3 
 ## 9 겨레 마음 2 
 ## 10 서울 방문 2 
 조금 더 확인 해 보 면 19 번 까지 두 번 등장 한 바 이 그램 이 차지 하 고 있 습니다 . 그러면 맨 위 에서 19 개 만 뽑 으면 되 겠 죠 ? 그리고 다시 bigram 을 낱말 두 개 로 분리 하 겠 습니다 . 이 때 는 separate ( ) 함수 를 쓰 시 면 됩니다 . 이 결과 를 bigram _ df 에 넣 고 확인 해 보 겠 습니다 . 
 bigram _ df <- m _ df 2 %>% 
 head ( 19 ) %>% 
 ## word 1 word 2 n 
 ## < chr > < chr > < int > 
 ## 1 동포 여러분 5 
 ## 3 국민 여러분 3 
 ## 4 남녘 국민 3 
 ## 5 북녘 동포 3 
 ## 8 평화 번영 3 
 ## 9 겨레 마음 2 
 ## 10 서울 방문 2 
 ## 11 여러분 해외 2 
 ## 12 오늘 한반도 2 
 ## 13 완전 한 비핵화 2 
 ## 14 우리 겨레 2 
 ## 15 우리 우리 2 
 ## 16 위원장 오늘 2 
 ## 17 전쟁 한반도 2 
 ## 18 합의 사항 2 
 ## 19 해외 동포 2 
 15 행 에 ' 우리 우리 ' 가 있 습니다 . 이 행 을 빼주 는 게 모양새 가 더 나 을 겁니다 . 이건 이렇게 간단 하 게 뺄 수 있 습니다 . 
 bigram _ df <- bigram _ df [ - 15 , ] 
 이제 그래프 를 그릴 준비 를 모두 마쳤 습니다 . 이번 에 도 위 에서 쓴 ggraph 코드 를 그냥 뒤 에다가 붙이 기 만 하 면 됩니다 . 
 bigram _ df %>% 
 깔끔 하 게 나왔 습니다 . 굳이 옥 에 티 를 찾 자면 ' 완전 한 ' 은 체언 이 아닌데 ' 완전 한 비핵화 ' 에 살 아 남 아 있 습니다 . 한국어 특성 상 실제 데이터 를 처리 하 다 보 면 이렇게 100 % 완벽 하 지 는 않 은 결과 가 나올 때 가 많 습니다 . 그럴 때 는 소위 ' 노가다 ' 를 하 는 게 가장 빠른 해결책 입니다 . 이를 테 면 이번 에 는 ' 완전 한 ' 을 그냥 ' 완전 ' 으로 바꾸 면 그만 입니다 . 
 더 깔끔 한 텍스트 분석 을 기대 하 면서 
 물론 텍스트 마이닝 기법 에 낱말 구름 과 의미 연결망 분석 만 있 는 건 아닙니다 . 이 글 은 텍스트 를 분석 해 보 고 싶 으신 초보 자 분 께 도움 을 드리 려는 목적 이 라 제일 유명 한 두 기법 을 소개 했 을 뿐 입니다 . 이 문장 을 읽 고 계시 다면 ' R 에서 텍스트 를 이렇게 다루 는구나 ' 하고 감 은 잡 으셨으리라 믿 습니다 . 
 긴 글 읽 어 주 시 느라 고생 하 셨 고 , 이 포스트 를 읽 으시 다가 잘못 됐 거나 이해 가 잘 가 지 않 는 부분 이 있 으시 다면 언제 든지 알려 주 세요 . 함께 공부 하 면서 바로잡 도록 하 겠 습니다 . 다시 한 번 긴 글 읽 어 주 셔서 감사 합니다 . 텍스트 마이닝 공부 를 시작 하 시 는 분 들 께 이 포스트 가 도움 이 되 었 기 를 바랍니다 . 
 Tags 　 DPLYR , ggraph , igraph , KoNLP , r , reshape 2 , SNA , tidygraph , tidytext , tidyverse , wordcloud 2 , 낱말 구름 , 사회 연결망 , 워드 클라우드 , 의미 연결망 , 텍스트 , 텍스트 마이닝 
 댓글 수정 / 삭제 이종완 
 2018 . 11 . 04 22 : 37 신고 
 이제 갓 R 에 입문 한 주제 에 남 을 가르치 고 있 는 초보 강사 입니다 . 
 컴 공 출신 이 라 컴퓨터 에 대해 조금 안다고 자부 하 고 있 었 는데 
 Kini 님 의 글 을 보 고 새롭 게 마음 을 가다듬 었 습니다 
 앞 으로 좋 은 글 부탁 드립니다 
 말씀 감사 합니다 ( __) 
 2018 . 11 . 10 23 : 00 신고 
 Kini 님 
 비 전공 자 로 공간 정보 IT 회사 에 다니 는 사람 으로 
 관련 포스팅 을 읽 으면서 많 은 이해 와 흥미 를 느끼 고 있 습니다 . 
 블로그 를 운영 하 고 다양 한 지식 을 공유 하 는 일 자체 가 정말 
 대단 하 다는 생각 이 들 고 , 또 제 롤 모델 의 모습 인데 
 시작 한다는 게 쉽 지 않 네요 
 그래도 제 스스로 에게 흥미 와 목표 를 주 셔서 감사 합니다 . 
 이 말 을 꼭 드리 고 싶 었 어요 ! 
 앞 으로 도 많 은 포스팅 부탁 드려요 ! 
 블로그 시작 하 시 면 저 한테 도 알려 주 셔요 ! 
 댓글 수정 / 삭제 CHO 
 2018 . 12 . 14 00 : 37 신고 
 관련 분야 에 관심 이 있 는 비 전공 자 입니다 . 너무 상세히 설명 하 여 주 셔서 감사 할 따름 입니다 . ㅜ 
 2018 . 12 . 14 11 : 16 신고 
 댓글 수정 / 삭제 왕 초보 
 2019 . 01 . 03 10 : 46 신고 
 에서 요 ~~~~ 
 아래 와 같 은 에러 메시지 가 나오 는데 . ..... 왜 그럴까요 ? 
 could not find function " unite " 
 R 스튜디오 ( Version 1 . 1 . 463 ) 를 쓰 고 있 습니다 . 
 2019 . 01 . 06 22 : 25 신고 
 tidyr 를 불러오 시 지 않 은 게 아닌가요 ? 
 댓글 수정 / 삭제 Yu 
 2019 . 01 . 14 17 : 37 신고 
 R 과 관련 해서 늘 도움 을 받 고 있 습니다 . 
 다름 이 아니 오라 작성 해 주 신 코드 중 
 위 의 코드 와 관련 해서 에러 가 발생 합니다 . 
 ( 사용 데이터 는 다른 데이터 를 사용 하 였 습니다 . ) 
 Error : All inputs to rbind . fill must be data . frames 
 위 와 같 은 에러 가 발생 하 는데 , 혹시 해결 할 수 있 는 코드 가 있 을까요 . .? 
 2019 . 01 . 17 01 : 40 신고 
 자료 형태 가 다른 모양 인데요 ? 
 댓글 수정 / 삭제 Uris 
 2019 . 02 . 17 03 : 47 신고 
 설명 감사 드립니다 . 조언 을 얻 을 수 있 을지 요 ? 
 상 품평 모음 으로 해 보 고 있 는데 
 mp <- SimplePos 09 ( m ) 단계 에서 
 아래 와 같 은 메시지 가 나오 면서 그 다음 단계 로 진행 할 수 가 없 습니다 . 
 ( moon . txt 로 는 되 다가 도 아래 같 은 메시지 가 날 때 도 있 습니다 . ) 
 해결 을 위한 조언 이나 제 가 참고 할 만 한 곳 이 있 을 지요 ? 
 at kr . ac . kaist . swrc . jhannanum . plugin . SupplementPlugin . PlainTextProcessor . SentenceSegmentor 2 . SentenceSegmentor 2 . doProcess ( SentenceSegmentor 2 . scala : 68 ) 
 2019 . 02 . 18 00 : 51 신고 
 일단 여기 서 사용 하 고 계신 운영 체제 에 맞 는 걸 설치 해 보 시 겠 어요 ? 
 2019 . 02 . 18 11 : 49 신고 
 문 의 전 에 제 가 해 봤 던 것 들 은 
 - 자바 및 rJAVA 패키지 를 모두 삭제 후 , 말씀 하 신 사이트 에서 Windows Offline ( 64 - bit ) 를 설치 하 고 rJAVA 도 재 설치 해서 다시 해 봤 습니다 . 
 - 그래도 안 되 길래 , 누군가 32 - bit 도 다운 받 으라고 해서 그것 도 해 봤 는데 역시 해당 메시지 가 나오 고 역시 진행 이 안 되 어서 문 의 드렸 습니다 . 
 해당 메시지 는 JAVA 문제 로 보 시 는 거 죠 ? 
 다른 문의 입니다 . 위 결과 ( https : / / t 1 . daumcdn . net / cfile / tistory / 9958 E 3415 BB 574 AB 30 ) 에서 각각 의 위치 는 무엇 을 의미 하 는지요 ? 
 가령 , 위원장 중심 네트워크 와 여러분 중심 네트워크 의 위치 ( 좌표 ) 는 단순 한 위치 인지 아니 면 각각 좌표 가 의미 하 는 바 가 따로 있 는지요 ?