본문 바로가기
프로그래밍/Python

Python(파이썬) 명사 분리 추출 후, 단어 사용 빈도 계산기(Web Cralwer)

by LiveData 2018. 12. 1.
반응형

0. 전 포스트



Python(파이썬) 특정 단어포함하는 신문기사 웹 크롤러 만들기(Web Cralwer) -1


Python(파이썬) 특정 단어포함하는 신문기사 웹 크롤러 만들기(Web Cralwer) -2


Python(파이썬)크롤링 한 파일에 불필요한 문자 제거(Web Cralwer) -3





전 포스트에 특정 단어로 동아일보의 신문 기사를 원하는 page만큼 크롤링 해보았습니다.


아마 따라해보신 분들은 out.txt 에 아래와 같은 내용이 생성 되었을 것입니다.


 


이번에는 이 추출한 기사에서 명사만 추출하고 갯수를 세는 프로그램을 만들어보도록 하겠습니다.







실행 환경  :  파이썬 3.6버전 


out.txt








1. 시작




천천히 코드 부터 살펴보도록 하죠.



1
2
from konlpy.tag import Twitter
from collections import Counter
cs




명사를 분리/추출하기 위해 한국어 형태소 분석기인 'konlply'를 import 하였습니다.


import 의 Twitter는 konlpy 분석기 종류중 하나입니다.


konlpy를 사용하기 위해서는 설치를 하여야 합니다. (http://blog.naver.com/rjs5730/220979230787 설치법)


collections의  Counter객체는 counting hashable container 객체로서,


빈도 수 계산을 위한 사전형태의 데이터 타입입니다.


'konlpy'를 통해 품사 태깅을 한 후, 명사만 따로 모아 빈도 수를 계산하기 위해 임포트 했습니다.






명사 분리/추출 후, 빈도 계산하는 함수 get_tags


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
def get_tags(text, ntags=50):
    spliter = Twitter()
    # konlpy의 Twitter객체
    nouns = spliter.nouns(text)
    # nouns 함수를 통해서 text에서 명사만 분리/추출
    count = Counter(nouns)
    # Counter객체를 생성하고 참조변수 nouns할당
    return_list = []  # 명사 빈도수 저장할 변수
    for n, c in count.most_common(ntags):
        temp = {'tag': n, 'count': c}
        return_list.append(temp)
    # most_common 메소드는 정수를 입력받아 객체 안의 명사중 빈도수
    # 큰 명사부터 순서대로 입력받은 정수 갯수만큼 저장되어있는 객체 반환
    # 명사와 사용된 갯수를 return_list에 저장합니다.
    return return_list 
cs


















코드 설명은 주석을 참고하시기 바랍니다.






main 함수 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
def main():
    text_file_name = "out.txt"
    # 분석할 파일
    noun_count = 20
    # 최대 많은 빈도수 부터 20개 명사 추출
    output_file_name = "count.txt"
    # count.txt 에 저장
    open_text_file = open(text_file_name, 'r',-1,"utf-8")
    # 분석할 파일을 open 
    text = open_text_file.read() #파일을 읽습니다.
    tags = get_tags(text, noun_count) # get_tags 함수 실행
    open_text_file.close()   #파일 close
    open_output_file = open(output_file_name, 'w',-1,"utf-8")
    # 결과로 쓰일 count.txt 열기
    for tag in tags:
        noun = tag['tag']
        count = tag['count']
        open_output_file.write('{} {}\n'.format(noun, count))
    # 결과 저장
    open_output_file.close() 
 
if __name__ == '__main__':
    main()
cs


























명사의 빈도 수가 큰것일 수록 앞에 옵니다.


명사1 , 갯수1

명사2 , 갯수2

명사3 , 갯수3

...


이런식의 key value 값으로 저장되게 됩니다.



open 함수에서 오류가 날 경우 클릭해주세요!




결과



 


위의 결과를 보면 후보, 안철수, 대통령 이처럼 명사이지만 


것,일,고,이 같은 명사가 아닌단어도 추출되는 것을 볼 수 있습니다.


이런 데이터를 보면 문재인 보다 안철수가 더 기사거리가 많다는 것을 확인할 수 있습니다. (그냥 제 생각 뇌피셜)






전체 코드


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
from konlpy.tag import Twitter
from collections import Counter
 
 
def get_tags(text, ntags=50):
    spliter = Twitter()
    # konlpy의 Twitter객체
    nouns = spliter.nouns(text)
    # nouns 함수를 통해서 text에서 명사만 분리/추출
    count = Counter(nouns)
    # Counter객체를 생성하고 참조변수 nouns할당
    return_list = []  # 명사 빈도수 저장할 변수
    for n, c in count.most_common(ntags):
        temp = {'tag': n, 'count': c}
        return_list.append(temp)
    # most_common 메소드는 정수를 입력받아 객체 안의 명사중 빈도수
    # 큰 명사부터 순서대로 입력받은 정수 갯수만큼 저장되어있는 객체 반환
    # 명사와 사용된 갯수를 return_list에 저장합니다.
    return return_list
 
 
def main():
    text_file_name = "out.txt"
    # 분석할 파일
    noun_count = 20
    # 최대 많은 빈도수 부터 20개 명사 추출
    output_file_name = "count.txt"
    # count.txt 에 저장
    open_text_file = open(text_file_name, 'r',-1,"utf-8")
    # 분석할 파일을 open 
    text = open_text_file.read() #파일을 읽습니다.
    tags = get_tags(text, noun_count) # get_tags 함수 실행
    open_text_file.close()   #파일 close
    open_output_file = open(output_file_name, 'w',-1,"utf-8")
    # 결과로 쓰일 count.txt 열기
    for tag in tags:
        noun = tag['tag']
        count = tag['count']
        open_output_file.write('{} {}\n'.format(noun, count))
    # 결과 저장
    open_output_file.close() 
 
if __name__ == '__main__':
    main()
cs


















































다음에는 이런 분석한 명사를 시각화 하는 프로그램을 만들어 보겠습니다.


많이 나온 단어일수록 글자크기가 커지는 knolpy 의 기능중 하나입니다.

 






 


반응형