[Python mini projects] 텍스트 속 통계 산출 pt2 - 벤포드 법칙/두 텍스트 비교하기






Category: Python programming / Data science



지난번에 진행하던 프로젝트를 이어 진행하기 전, 몇 가지 추가적인 코드를 이용해 재미난 정보를 얻을 수 있는 작업을 수행해보고자 한다. 지난 번의 텍스트 분석에 대한 포스트는 다음을 참고하면 되겠다 : https://thoughtschangeworld.blogspot.kr/2018/01/python-mini-projects-python-1.html



***

1. 텍스트를 비교하는 코드 만들기



 문서의 txt파일 소스를 input으로 넣으면등장하는 단어들을 비교해 얼마나 많은 단어들이 중복되는지를 보여주는 코드를 만들어보자 코드를 만들게  근본적인 아이디어는 유사한 주제내용에 대해 말하고 있는 글은 자연스럽게 주로 많이 사용하는 단어들이 중복될 것이라는 점이다. 어찌보면 너무 당연한 이야기이지만 실제로 얼마나 많은 키워드들이 중복되는지가 글의 주제와 내용을 어느정도 묶어내는 기준이  수도 있을거라 생각한다

 텍스트 파일을 input으로 가지는 compare_two 함수를 만든다참고로단어를 필터링하는 알고리즘은 지난번에 사용한 것과 동일하지만 이번에는  정확히 단어를 필터링할  있도록 코드를 수정해보았다. Text analysis에서는 연구자가 원하는 정도에 따라 '일반적인'단어들 (stopwords라고 한다 걸러내야 하고이러한 연구를 손쉽게   있도록 만들어진 stopword 세트가 많이 있다나는  중에서 최소한의 단어만을 포함한 minimal stop words, 상당히 많은 수를 포함한 Terrior stopwords, 그리고 구글링을 통해 중간 정도의 단어를 포함한  하나의 stopwords세트를 구해키워드 인자를 통해 stopword set 선택할  있도록 코드를  보았다

코드는 다음과 같다 (역시 코딩에 관심이 크게 없다면 건너뛰고 바로 결과를 보려주는 부분으로 넘어가도 상관없다)






코드를 자세히 보면 길기는 하지만 크게 복잡할것은 없다. 지난번에 만들었던 count_filtered함수과 구조는 거의 같지만, 두개의 input 대해 필터링을 따로 두번 진행하고, 가장 많이 등장하는 필터링된 단어들이 겹치는지를 세는 작업을 수행한다. (Threshold top 개의 단어까지 산출할 것인지를 결정해주는 키워드 인자이다) 추가적으로 겹치는 단어들 (hub 되는 단어들) 무엇인지, 그리고 가장 많이 등장하는 단어들 중에 프로나 겹치는지를 보여준다. 가지 유의할 점은 모든 텍스트의 길이 (혹은 포함된 단어 ) 다르기 때문에 중복되는 비율 (percentage) 산출할 때는 짧은 텍스트를 기준으로 비율을 산정한다

함수의 키워드 인자에는 whole -  필터링을 거친 비교할 것인지, 전체로 비교할 것인지, threshold - 개의 상위 단어 (빈도가 높은 순으로 정렬했을 때를 말함) 놓고 비교할것인지, stopword - stopwords 세트를 어떤 것으로 선택할 것인지 (Terrior stopwords 디폴트 값으로) 설정했다


테스트를 해보자. 지난번에 테스트에 사용했던 성경과 쿠란을 가져와보겠다. 먼저, 구약성서와 신약성서를 비교해보자. 먼저 필터링을 하지 않은 전체 텍스트를 비교한 결과를 보자


구약과 신약 성서에 등장하는 단어는 7369개로, 적은 단어(8299) 등장하는 신약성서를 기준으로 89프로의 단어가 중복됨을 있다

그렇다면 이번에는 필터링을 거친 , 각각 상위 30, 50개의 단어에 대해 중복되는 단어의 비율을 살펴보자
구약성서와 신약성서는 stopword 걸러내고 가장 많이 등장하는 단어들을 뽑았을 60프로의 최빈 단어들이 중복됨을 있었다. Stopword 걸러낸 결과라고 생각하면 상당히 높은 갚이라고 생각된다. (구약과 신약 성서 모두 내용은 다르지만 기본적으로 성경이라는 안에 있기에 이렇게 수치가 나올 있지 않았을까)
그렇다면 성경과 쿠란을 비교해보자. 먼저, 구약성서와 쿠란을 필터링하지 않고 비교한 결과이다

중복되는 단어의 비율이 30프로대로 급격히 감소했다. 이번엔 필터링을 통해 각각 30, 50개에 대한 단어의 중복 비율을 살펴보자





30개의 단어에 대해 비교한 모습이다. 30 17개의 단어가 중복되어 56프로가 중복됨을 있다. Hub 되는 핵심 단어들은 위에 표시된대로이다


역시 50개의 단어에 대해 비교한 모습으로, 50 30개의 단어가 중복되어 60프로의 단어가 중복됨을 있다. Hub 되는 단어들은 역시 위와 같다







이번에도 역시 30프로대의 중복률을 보여준다. 허브는 위와 같으며, 신약 - 구약 성서 사이의 허브가 되었던 단어들 god, lord등은 있지만 jesus, father등은 없다. 이번엔 같은 방식으로 신약성서와 쿠란을 비교해보자. 순서대로 필터링하지 않음 / 필터링 30 / 필터일 50 이다






이번에는 전체적으로 비교하자 무려 50프로대가 나왔으나 필터링을 거치고 나니 30프로, 40프로대로 줄어든 것을 있다. 궁금해서 100개까지 10 단위로 갯수를 늘려보니 

---
 ---
 ---
 ---

위와 같이 점점 40프로대로 자리잡는 모습을 있었다. 필터링을 하지 않고 전체를 비교하거나, 너무 많은 단어들 (1000이상) 비교할 경우엔, 텍스트의 단어 수가 많이 차이나기도 하고, stopword 걸러지지는 않았지만 충분히 빈번히 등장하는 특색 없는 단어들  (예컨데 'keep' ) - 이러한 단어들은 count되지만 중복 등장하는 수가 매우 적다 - 때문에 유의미한 상관관계를 나타내주지 못하는 것으로 보인다. 따라서 Threshold 적절히 정하는 역시 매우 중요할 것이다

Stopword 필터링도 완벽하다 없고, 많은 부분이 아직 어설프지만 중복되는 단어들을 통해 확실히 어느 정도 유의미한 상관관계를 나타내는데는 성공한 것으로 보인다. 또한, 데이터의 시대에서 깔끔하게 정돈된 데이터보다 중요한 것은 데이터의 이기에 ( 데이터가 만드는 세상 - 빅토르 마이어 쇤버거 / 케네스 쿠키어 참고), 훨씬 길고 많은 단어를 포함한 텍스트 데이터만 있다면 훌륭한 단어들의 네트워크를 만들 있을것이라 생각된다


2. 논문을 분석해보자 - 벤포드 법칙 테스트해보기

이번에는 연세대학교 학술정보원에서 구할 있는 논문 자료를 랜덤으로 8 뽑아와 보았다. 8개의 논문자료를 지금까지 만든 함수들을 이용해 자주 등장하는 단어/숫자들을 뽑아내보고, 최종적으로는 자주 등장하는 단어가 중복되는 논문의 경우 허브 단어를 통해 주제를 유추하고 묶어낼 있는지, 일종의 논문간의 네트워크를 만드는 작업을 하는것을 목표로 하고 있다

전에 논문자료들을 통해 벤포드 법칙을 한번 테스트해보고 싶어졌다. 지난번에 만든 count_number함수는 '숫자' 세었다면 이번에는 모든 숫자들을 자릿수 단위로 쪼개서, 1부터 9까지의 숫자들 어느 숫자가 가장 많이 등장하는지를 보는것이다. 과연 정말로 1 가장 많이 나오고, 9 가까워질 수록 숫자의 등장 빈도가 줄어들까? 논문에는 통계자료, 수치 세상을 담은 다양한 숫자가 등장하기 때문에 벤포드 법칙을 테스트해보기에 좋은 자료라고 생각했다. (물론 데이터분석을 하기에 8개의 논문은 너무 적다. 추후에 수많은 논문을 구해 CPU 램이 튼튼한 컴퓨터에서 작업을 다시 해보고싶다)


다음은 벤포드 법칙을 테스트하기 위한 코드이다. 등장하는 모든 숫자들을 자릿수로 쪼개어 세어준다. 결과를 꺾은선그래프로 나타내며 숫자의 등장 빈도에 따라 각각 꺾은선의 꼭지점은 크기가 다른 원으로 나타내어준다



, 이제 모든 함수가 준비되었다. 그럼 8개의 논문을 count_filtered(), count_number(), bedford() 함수를 통해 각각 분석해보자. (stopword 필터링하지 않은 결과물은 생략하겠다)

- 논문 1: 노인 당뇨병에 관한 연구




- 논문 2: 대학생 성별에 따른 진로 역량





- 논문 3: 청소년기의 자살충동 요인








- 논문 4: 유전자 재조합 식품의 유용성과 유해성













- 논문 5: 간호학생의 치료적 의사소통을 위한 환자 커뮤니케이션








- 논문 6: 라돈과 폐암에 관한 연구 (영문)








- 논문 7: 조직 커뮤니케이션과 내부 브랜딩에 관한 연구








- 논문 8: 육아 리얼리티 프로그램과 여성 수용 경험 연구








물론 자체가 너무 작고, 논문 하나하나도 길지 않았지만 각각의 결과는 논문의 핵심 단어들을 보여주는 한다. 8개의 논문의 경우 주제가 많이 상이했지만, 유사한 주제를 가진 경우 유의미하게 네트워크를 만들어낼 있을 같다. 예를 들어, Top 3 단어들에 대해 Strong network 정의해 '유전자', '재조합'이라던지, '노인', '당뇨병' 등의 단어들을 hub 네트워크가 생긴다면 논문은 주제에 연관성이 있다. 외에도 Top 30정도까지 얼마나 되는 핵심 단어들이 중복되는가를 기준으로 네트워크를 만들어낸다면 논문을 주제별로 묶어낼 있을지도 모른다.

흥미로운점은, 벤포드 법칙이 생각보다 맞아떨어졌다. 대체로 1에서 9 수록 숫자들이 나타나는 빈도가 줄어들며, 자릿수를 쪼개지 않더라도 숫자가 커질수록 나타나는 빈도가 줄어들었다. 흥미로운 점은, 상대적으로 9 출현빈도가 높다는 점인데, 이는 논문의 특성상 1900년대의 년도가 등장하는 빈도가 많이 때문인것으로 추측된다. (ex, 1990대의 모든 해는 언급시 최소 9 등장한다. 1999년이 한번 등장하면 9 벌써 등장한다.)

---

다음번엔 마지막으로, 많은 논문 자료를 구해 논문들끼리 비료하여, 네트워크를 만들어보는 작업을 함으로써 프로젝트를 마무리해보고자 한다

활용 자료:

- 노인 당뇨병 인구에서 당뇨병 관리 교육이 당뇨 치료 이행에 미치는 영향: 박한나, 서울 연세대학교 보건대학원, 2017

- 대학생의 성별에 따른 진로 역량 개발에 대한 영향 요인 탐색 연구: 박혜경, 서울 연세대학교 대학원, 2013

- 청소년기에 경험하는 자살충동 요인: 이혜진, 서울 : 연세대학교 대학원, 2017

- 유전자 재조합 식품(GMO) 유용성 유해성에 대한 비교분석: (A) comparative analysis on the use and the harmfulness of genetically modified organisms: 김태형, 서울 연세대학교 산업대학원, 2001

- 간호학생의 치료적 의사소통을 위한 표준화 환자 학습 시나리오 개발 평가: 이희정, 서울 연세대학교 대학원, 2015

- Study on Establishment of Radon Potential Evaluation Program with correlation between lung cancer and Radon exposure environment among mass outbreak sites of cancer: MIn-Jun Kim, The Graduate School Yonsei University Department of Environmental Engineering, 2017

- 육아 리얼리티 프로그램의 여성 수용 경험 연구 : <슈퍼맨이 돌아왔다> 20-30 수용자 심층 인터뷰를 중심으로: 위성주, 연세대학교 커뮤니케이션대학원 2018

- 조직 커뮤니케이션 장애 요인이 내부브랜딩을 위한 직원의 브랜드 동일시와 브랜드 영역 확장 행동에 미치는 영향국내 100 브랜드 보유 기업을 중심으로: 최승범, 연세대학교 커뮤니케이션 대학원, 2018

댓글

이 블로그의 인기 게시물

[Python mini projects] Python을 활용한 텍스트 속 유의미한 통계 산출하기 -1

(2부) 플랫폼 비즈니스,그리고 카카오의 수익모델에 대한 idea

Kaggle competition 간단후기