일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- MYSQL
- kpmg 인성검사
- 코딩테스트
- python
- 잡다 ai역량검사
- 후기
- nlp
- lda
- 프로그래머스
- 역검 결과표
- ai역검 합격
- 토픽모델링
- 컨설팅 면접
- 서비스
- 삼정kpmg 취업
- 삼정kpmg 서류
- pyLDAvis
- gensim
- 잡다 ai역검
- 형태소분석
- join
- 파이썬
- mecab
- 삼정kpmg pt면접
- 역검 전략게임
- 역검 전략게임 꿀팁
- 오류
- 역검 합격 꿀팁
- 삼정kpmg mc4
- SQL
- Today
- Total
쥬니어 분석가
[파이썬/NLP] 형태소 분석, 노래 가사 워드클라우드 feat.Mecab,Okt,kkma 본문
1. 형태소 분석기 비교
한국어 자연어 처리를 위해서는 KoNLPy라는 파이썬 패키지를 사용할 수 있습니다.
형태소 분석기로는 Okt(Open Korea Text), 메캅(Mecab), 코모란(Komoran), 한나눔(Hannanum), 꼬꼬마(Kkma)가 있습니다.
저는 이 중 Okt, Kkma, Mecab 형태소 분석기를 사용하려고 합니다.
각각의 메소드는 아래와 같은 기능을 갖고 있습니다.
1) morphs : 형태소 추출
2) pos : 품사 태깅(Part-of-speech tagging)
3) nouns : 명사 추출
이제 파이썬에서 형태소 분석기를 사용하여 토큰화를 해보도록 합시다.
아이고 하기싫어
from konlpy.tag import Okt
from konlpy.tag import Kkma
from eunjeon import Mecab
저는 Mecab을 konlpy에 있는 것이 아니라 새롭게 설치하여 사용했습니다.
제 파이썬 버전이 낮아서 그런지 konlpy에서 mecab이 불러와지지 않더라구요.
세 형태소 분석기를 사용해서 동일한 문장에 대해 형태소 추출, 품사 태깅, 명사 추출 모두 진행해 보겠습니다.
1. kkma
print('kkma 형태소 분석 :',kkma.morphs("공부하기 싫어요 티스토리 업로드는 더 싫어요"))
print('kkma 품사 태깅 :',kkma.pos("공부하기 싫어요 티스토리 업로드는 더 싫어요"))
print('kkma 명사 추출 :',kkma.nouns("공부하기 싫어요 티스토리 업로드는 더 싫어요"))
2. Okt
print('OKT 형태소 분석 :',okt.morphs("공부하기 싫어요 티스토리 업로드는 더 싫어요"))
print('OKT 품사 태깅 :',okt.pos("공부하기 싫어요 티스토리 업로드는 더 싫어요"))
print('OKT 명사 추출 :',okt.nouns("공부하기 싫어요 티스토리 업로드는 더 싫어요"))
3. mecab
print('mecab 형태소 분석 :',mecab.morphs("공부하기 싫어요 티스토리 업로드는 더 싫어요"))
print('mecab 품사 태깅 :',mecab.pos("공부하기 싫어요 티스토리 업로드는 더 싫어요"))
print('mecab 명사 추출 :',mecab.nouns("공부하기 싫어요 티스토리 업로드는 더 싫어요"))
각 분석기마다 다르게 추출하는 것을 알 수 있습니다.
본인이 생각하기에 자기와 더 잘 맞는 분석기를 사용하면 될 것 같습니다.
이제는 동일한 문장에 대해 명사 추출만 진행해 보겠습니다.
문장은 제가 좋아하는 문상훈의 책 내용 중 하나인..
내가 짝사랑을 하는 동안에 당신은 아무것도 하지 않아도 된다.
print('OKT 명사 추출 :',okt.nouns("내가 짝사랑을 하는 동안에 당신은 아무것도 하지 않아도 된다."))
print('kkma 명사 추출 :',kkma.nouns("내가 짝사랑을 하는 동안에 당신은 아무것도 하지 않아도 된다."))
print('mecab 명사 추출 :',mecab.nouns("내가 짝사랑을 하는 동안에 당신은 아무것도 하지 않아도 된다."))
동일한 문장인데 명사를 추출해 보니 조금씩 다르게 나오는 것을 알 수 있습니다.
마치 객관식 답안 후보 같은 모습이네요.
저는 이중에 Mecab을 활용해서 형태소분석을 하려고 합니다.
별다른 이유는 없고 그냥 조금 더 정확한 것 같았고, 인식을 잘 못하는 경우가 있더라도 사용자 사전에 추가하면 되니..
2. 노래 가사 워드클라우드
이제 Mecab을 활용해서 간단하게 텍스트 토큰화 후 워드클라우드를 그려보겠습니다.
어떤 거로 그려볼까 고민하다가 한국어만 있는 노래로 그려보고 싶다는 생각이 들었습니다.
그래서 구글 혹은 네이버에 노래 가사 검색 후 복사해서 하나의 txt 파일에 저장하여 불러왔습니다.
노래는 아이유의 밤편지, 윤상의 넌 쉽게 말했지만, 윤종신의 좋니로 가져왔습니다.
# 텍스트 파일 불러오기
file_path = r"C:\Users\바탕 화면\노래가사.txt" # 실제 파일 경로로 변경
with open(file_path, 'r', encoding='utf-8') as file:
text = file.read()
# 문장 토큰화
sentences = text.split('.') # 예시로 간단하게 마침표(.)를 기준으로 문장을 나눔
# 형태소 분석 및 토큰화
tokenized_sentences = []
for sentence in sentences:
tokens = mecab.morphs(sentence)
tokenized_sentences.append(tokens)
# 결과 확인
print(tokenized_sentences)
단어가 너무 많군요. 전체로 해서 의미 있는 결과가 나올까요?
- 문장 전체 워드클라우드
# 토큰화된 문장을 하나의 리스트로 펼치기
all_tokens = [token for sentence in tokenized_sentences for token in sentence]
# 리스트를 공백으로 연결하여 문자열로 변환
text_data = ' '.join(all_tokens)
#마스크 적용
im = Image.open(r"C:\Users\JJ\Downloads\동그라미.png") # 이미지 파일 읽어오기
mask = Image.new("RGB", im.size, (255,255,255))
mask.paste(im,im)
mask = np.array(mask)
font_path =r"C:\Users\JJ\AppData\Local\Microsoft\Windows\Fonts\PretendardVariable.ttf"
# WordCloud 생성
wordcloud = WordCloud(font_path=font_path, background_color='white', mask = mask,width=800, height=400).generate(text_data)
# 워드클라우드 시각화
plt.figure(figsize=(10, 5))
plt.imshow(wordcloud, interpolation='bilinear')
plt.axis('off')
plt.show()
우리, 사랑, 처럼, 에게, 그리워라는 단어가 많이 나오는 것 같습니다.
으니는 뭐지 생각해 봤는데 좋니에서 나오는 단어였어요.
- 명사만 추출 후 워드클라우드
nouns_sentences=[]
for sentence in sentences:
nouns = mecab.nouns(sentence)
nouns_sentences.append(nouns)
# 결과 확인
print(nouns_sentences)
# 토큰화된 문장을 하나의 리스트로 펼치기
all_nouns = [nouns for sentence in nouns_sentences for nouns in sentence]
# 리스트를 공백으로 연결하여 문자열로 변환
text_data = ' '.join(all_nouns)
#마스크 적용
im = Image.open(r"C:\Users\JJ\Downloads\동그라미.png") # 이미지 파일 읽어오기
mask = Image.new("RGB", im.size, (255,255,255))
mask.paste(im,im)
mask = np.array(mask)
font_path =r"C:\Users\JJ\AppData\Local\Microsoft\Windows\Fonts\PretendardVariable.ttf"
# WordCloud 생성
wordcloud = WordCloud(font_path=font_path, background_color='white', mask = mask,width=800, height=400).generate(text_data)
# 워드클라우드 시각화
plt.figure(figsize=(10, 5))
plt.imshow(wordcloud, interpolation='bilinear')
plt.axis('off')
plt.show()
역시 감성 발라드라 사랑이라는 단어가 가장 많이 나오는 것 같네요.
감성을 충전하게 되는 실습이었습니다.
Mecab에서 사용자 사전을 추가하고 싶다면 아래 글을 참고해주세요!
[NLP/Error] Mecab 사용자 사전 추가 , 디렉토리 경로 오류 해결
C:\mecab의 폴더는 아래와 같은 3개의 폴더로 이뤄져 있습니다. 물론 사람마다 폴더의 경로는 다르니 자신의 mecab 폴더 경로를 확인해 주시면 됩니다. mecab-ko-dic : mecab의 단어 사전 tools : 단어 사전
jiyoon1ing.tistory.com
'python' 카테고리의 다른 글
[파이썬/크롤링] 집닥 고객 후기 크롤링 with Selenium, BeautifulSoup (0) | 2024.02.14 |
---|---|
[NLP/mecab] 품사 태그 (0) | 2024.02.14 |
[NLP/Error] Mecab 사용자 사전 추가 , 디렉토리 경로 오류 해결 (1) | 2024.01.25 |
[Error] 파이썬 pyLDAvis.gensim 오류 (1) | 2023.11.29 |
[Error] 파이썬 워드클라우드 오류 (0) | 2023.09.12 |