[Python] Web Crawling - 형태소 분석, WordCloud
파이썬을 활용한 웹 크롤링 #4
휴잭맨 영화 리뷰 분석 및 워드클라우드
- 형태소 분석(koNLPy)
1. 크롤링한 댓글파일을 불러와서 리트스 변수에 저장- konlpy 모듈 호출 및 Okt 객체 생성
- 반복문을 사용하여 문장별 형태소구분 및 품사매칭(koLNPy함수)
- [응용실습] 필요한 품사만 추출
- [응용실습] 선별된 품사별 빈도수 계산하고 상위 빈도 10위 까지 출력
# konlpy 설치 pip install konlpy import os from konlpy.tag import Okt from collections import Counter # Okt 형태소 분석 객체 생성 ok_twitter = Okt() # 저장된 파일의 위치 탐색 후, file변수에 저장 file = open('./drive/MyDrive/machine_learning_data/Naver_opinion.txt','r',encoding='utf-8') total_lines = file.readlines() # txt파일을 줄 단위로 읽음 file.close() print(total_lines) >['휴잭맨의. 매력이 한껏 돋보인 영화입니다.다른 출연자들도 너무 멋지구요.사람은 누구나 소중하며, 현재를 멋지... # 크롤링 댓글파일 가져와서 reply_text 리스트에 저장 reply_text = [] for line in total_lines: reply_text.append(line[:-1]) # 형태소 분류하고 확인 하기 sentences_tag = [] for sentence in reply_text: morph = ok_twitter.pos(sentence) sentences_tag.append(morph) print(morph) # 분석된 1건 결과 확인 print('-' * 30) >[('스토리', 'Noun'), ('는', 'Josa'), ('좀', 'Noun'), ('뻔하지만', 'Adjective'), ('화려하고', 'Adjective'), ('노래', 'Noun'), ('도', 'Josa'), ('너무', 'Adverb'), ('좋아', 'Adjective'), ('시간', 'Noun'), ('가는줄', 'Verb'), ('몰랐다', 'Verb')] >------------------------------ # 명사만 출력해 보기 for my_sentence in sentences_tag: for word, tag in my_sentence: if tag in ['Noun']: print(word) >남자배우 스토리 감동 작품 만 품위 즐거움 무조건 # 필요한 품사만 추출해보기(명사를 bucket list에 담기) bucket_list = [] for my_sentence in sentences_tag: for word, tag in my_sentence: if tag in ['Noun']: bucket_list.append(word) print(bucket_list) >['휴잭맨', '매력', '영화', '다른', '출연자', '사람', '누구', '현재', '메세지', '정말', '인생', '최고', '영화'... # 단어 빈도수 구하기 # 각 원소의 출현 횟수를 계산하는 Counter 모듈을 활용한다. from collections import Counter counts = Counter(bucket_list) print(counts) >Counter({'영화': 1106, '노래': 349, '최고': 320, '음악': 216, '정말': 192... # 명사 빈도 순서대로 상위 30개 출력 print(counts.most_common(30)) >[('영화', 1106), ('노래', 349), ('최고', 320), ('음악', 216), ('정말', 192),... # 명사와 형용사를 모두 추출하고 상위 50개를 출력 bucket_list_2 = [] for my_sentence in sentences_tag: for word, tag in my_sentence: if tag in ['Noun','Adjective']: bucket_list_2.append(word) counts = Counter(bucket_list) print(counts.most_common(50)) >Counter({'영화': 1106, '노래': 349, '최고': 320, '음악': 216, '정말': 192, '감동': 191, '인생': 183,...
-
WordCloud
1.워드클라우드(word cloud)는 자주 나타나는 단어들의 크기를 상대적인 크기로 시각화 하여 보여줌으로써 많이 사용되는 단어의 영향력을 한 눈에 알 수 있도록 제공
2.필요한 라이브러리
- konlpy.tag(형태소 분석을 통해 명사 추출)
- pytagclud 패키지(워드클라우드 그림 그리기) 또는 wordcloud 1.8.1 패키지
- pytagclud : 교육용으로 좋음, 하지만 복잡함
- wordcloud : 함수로 쉽게 구현 가능(옵션 조절을 통해)
- wordcloud에 배경이미지를 넣으려면 마스킹 이미지를 만들어야 한다는 피곤함 있음(파워포인트를 사용하면 그나마 쉽게 만들 수 있음)
- ⛑ 주의!! : 인터넷에 있는 무료 폰트라고 해서, 절대로 막 사용하지 않기!, 개인적으로 집에서 볼 것이라면 사용해도 되지만, 다른 곳에 활용한다면 절대 쓰지 말기
-
WordCloud 패키지 활용
- 단어 구름을 형태를 가지는 그림으로 만들기
1.이미지를 마스크로 사용하여 수행
2.흰색이 아닌 위치에 단어를 생성함 - 과정
1.마스크용 이미지 준비(포토샵, 구글이미지 검색, 파워포인트) (돌고래 jpg)
2.크롤링된 문장이 저장된 txt파일 (휴잭맨 영화 리뷰)
3.사용할 폰트파일 준비 (NanumBarunGothic)
4.패키지 설치:형태소 분석(Okt),wordcloud(PIL,numpy)
5.wordcloud로 생성 후 결과 이미지 생성
- 단어 구름을 형태를 가지는 그림으로 만들기
# pip install wordcloud # 크롤링한 댓글 파일 가져와서 리스트 변수에 저장 from konlpy.tag import Okt from wordcloud import WordCloud from PIL import Image import numpy as np with open('./drive/MyDrive/machine_learning_data/Naver_opinion.txt','r') as f: reply = f.readlines() # 크롤링한 댓글파일 가져와서 리스트 변수에 저장 # 반드시 문자 사이 공백을 넣어야지 wordcloud에서 분석 가능!! ok_twitter = Okt() text = '' for sentence in reply: for noun in ok_twitter.nouns(sentence): text += noun+' ' print(text) > 휴잭맨 매력 영화 다른 출연자 사람 누구 현재 메세지 정말 인생 최고 영화 남 기립박수 뻔 강추 노래 진짜 쩐다... # 크롤링한 댓글파일 가져와서 리스트 변수에 저장 # 배경이 흰색인 마스크 이미지 mask_image = np.array(Image.open('./drive/MyDrive/machine_learning_data/dolphine.jpg')) wc = WordCloud( font_path='./drive/MyDrive/machine_learning_data/NanumBarunGothic.ttf', # 사용할 폰트 background_color='white', # 배경색 max_words=100, # 최대 빈도수를 기준으로 출력할 단어 수 mask=mask_image, # 마스크 이미지 max_font_size=70, # 최대 폰트 크기 colormap='hsv' # 컬러 스타일 ex)'Accent', 'Accent_r', 'Blues', 'Blues_r' 등등 ).generate(text) wc.to_file('./drive/MyDrive/machine_learning_data/wc_result.png')
# 다른 스타일 적용해보기(Accent_r) from konlpy.tag import Okt from wordcloud import WordCloud from PIL import Image import numpy as np with open('./drive/MyDrive/machine_learning_data/Naver_opinion.txt','r') as f: reply = f.readlines() ok_twitter = Okt() text = '' # 필요없는 단어는 아래와 같이 제외 시킬 수 있다. for sentence in reply: for noun in ok_twitter.nouns(sentence): if noun not in ['그','아주','나','거','임','위','이','수','때','것','남','더']: text += noun+' ' mask_image = np.array(Image.open('./drive/MyDrive/machine_learning_data/dolphine.jpg')) wc = WordCloud( font_path='./drive/MyDrive/machine_learning_data/NanumBarunGothic.ttf', # 사용할 폰트 background_color='white', # 배경색 max_words=100, # 최대 빈도수를 기준으로 출력할 단어 수 mask=mask_image, # 마스크 이미지 max_font_size=70, # 최대 폰트 크기 colormap='Accent_r' # 컬러 스타일 ex)'Accent', 'Accent_r', 'Blues', 'Blues_r' 등등 ).generate(text)
Author And Source
이 문제에 관하여([Python] Web Crawling - 형태소 분석, WordCloud), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@changhtun1/파이썬을-활용한-웹-크롤링-4-형태소-분석-WordCloud저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)