2016년 12월 8일 목요일

텍스트 의미망 분석

빅데이터 유행 덕에 텍스트 의미망에 대한 분석 결과를 꽤 자주 접하게 된다. 어떻게 하는 건가 궁금했는데, Gephi라는 데이터 시각화 도구를 이용하면 비교적 쉽게(?) 접근할 수 있는 것 같아 소개해볼까 한다.


대통령의 품사편에서 최소 단어 단위로 분류했던 데이터 분석이 쉬워지는 정규표현식 원고를 사용할 것이다. 일단 모든 단어의 의미망을 분석할 필요는 없으니 그중 의미있는 단어만을 골라보자.


어떻게? 별 수 없다. 그냥 노가다가 진리. 7,000여 개의 단어들 중 50개의 키워드를 골라냈다. (전체 과정 중 제일 빡센 작업) 이제 원본 데이터에서 해당 키워드만을 추출하면 된다.

데이터 노가다(전처리) 시작

키워드를 고르기 전에 원본 데이터를 단락 단위로 구분하기 위해 구분 기호 '-----'를 추가했다. (단락 구분이 안 되면 키워드의 단락 간 연결 관계를 분석하지 못함) VIM 명령어 '%s/$/\r-----'는 각 줄 끝에서 엔터값(줄바꿈)을 입력한 후 '-----'를 추가해준다. 


이제 키워드만 추출하면 되는데, 원활한 작업을 위해서 원본 텍스트를 단어 단위로 구분할 필요가 있다. 명령어 '%s/ /\r/g'는 '공백'을 찾아서 엔터값으로 바꿔준다.


키워드 검색


명령어 'v//d'는 직전 검색 결과를 포함하지 않는 줄만을 골라서 삭제해준다. 즉 키워드를 포함하지 않은 줄은 모두 삭제된다.


정확한 분석을 위해서는 순수 키워드를 제외한 '을, 를, 은' 등의 조사도 제거해야 한다. 먼저 명령어 '%s//ㅋ&ㅋ/'을 이용해서 순수 키워드의 좌우에 구분 기호 'ㅋ'을 추가했다.


이제 각 줄의 시작 위치에서 'ㅋ'으로 끝나는 문자열과, 'ㅋ'으로 시작하는 모든 문자열을 순서대로 검색 후, 삭제하면 된다. 검색이 되면 삭제는 껌.



이제 단락 단위로 키워드를 정렬하면 끝

먼저 명령어 '%s/\n/ /'를 이용해서 줄바꿈 문자를 '공백'으로 바꿈으로써 전체 데이터를 한 줄로 만들었다.


단락 단위로 구분하는 방법은? 앞서 미리 추가했던 '-----'를 단락 구분 기호로 사용하면 된다. 명령어 '%s/ ----- /\r/g'는 ' ----- '를 엔터값으로 바꿔주며, 결과적으로 단락 단위의 키워드 정렬이 완료된다.


이후 필요 없어진 '-----'는 삭제.


해당 결과를 엑셀에서 '공백'을 기준으로 분류한 결과는 다음과 같다. CSV 파일로 저장.


데이터 시각화

다음은 해당 CSV 파일을 Gephi에서 불러온 결과. 뭔가 조잡해보이는데, 예쁜 그림을 그리기 위해서는 몇 가지 조작이 필요하다.


첫 단계로 'Statistics' 메뉴에서 'Modularity'와 'PageRank'를 한 번씩 실행해주자. 두 기능은 순서대로 노드 간의 연결 관계를 파악하고, 연결 비중을 계산해서, 군집(노드 그룹) 및 노드 크기를 결정한다.


'Modularity' 설정을 통한 노드별 군집화 반영


'PageRank' 설정을 통한 노드별 크기 비율 반영


레이아웃 설정


노드별 이름 표시


각 노드를 드래그해서 좀 더 보기좋게 배치해봤다. 연결된 개체가 많으면 원의 크기를, 연결 빈도가 높으면 연결선의 크기를 키워서 보여주는 듯. 가장 많은 개체와 연결된 노드는 '그림', 발생 빈도가 가장 높은 연결은 '정규표현식 -> 검사' 연결인 듯하다.


Gephi는 최초 개체가 속해진 그룹에서 시작, 가까운 그룹을 합쳐 나가는 과정을 반복하여 최적의 군집을 찾는 결합형 계층 군집화(Aggolomerative Hierachical Clustering) 방법을 사용한다고 한다.

뭔 소린지 모르겠지만 녹색 그룹은 책의 전반부, 파란색은 중반부, 주황색은 후반부, 보라색은 전체에 걸쳐 등장 빈도가 많은 단어들임을 감안하면 꽤 정확한 방법인 듯.

몇 번 사용해본 소감은 네트워크 연결망을 표현하는데 상당히 유용한 듯하다. 특히 특정 노드에 마우스를 가져가면 해당 노드의 연결 관계만을 강조해주는 기능이 마음에 든다. 다음은 VIM 정규표현식의 백트래킹을 설명하는 과정에서 집중적으로 발생한 '원자' 노드 기준의 연결망.


단어들의 연결 관계를 비교적 정확하게 표현해주는 듯하며, 무엇보다 전체 데이터의 큰 그림을 그리고 싶을때 매우 유용해 보인다.


관련 글

댓글 없음:

댓글 쓰기

크리에이티브 커먼즈 라이선스