견리더의 알(R)파(Python)고
고용 관련 뉴스기사 분류 및 토픽 모델링 - 2 (사전에 단어 추가, ckonlpy) 본문
형태소 분석과 배제어 추가하기
일반적으로 형태소 분석은 konlpy를 이용하여 Okt, 꼬꼬마 등을 사용한다.
하지만 분석중에 큰일이 터져 버렸다.
자자...
이 결과를 보자.
올해 뉴스기사를 분석하려는데, 나름 핵심어라고 생각한 '비대면'이라는 글자를 '비대' 와 '면'으로 나누어 형태소 분석을 해버린 것이다아아아아아
사실 '비대면'이라는 글자가 올해 갑자기 많이 쓰인 단어이기에 이해가 갔지만, 분명 수정을 해야할 것이다.
하지만 konly에서 단어를 사전에 추가하는 방법을 모른다. ㅎㅎㅎ
아마 없을지도 모른다.
그래서 난 ckonlpy를 사용했다. 형태소 분석을 할때 내가 원하는 단어를 새로 집어 넣기 좋은 패키지였다.
이 패키지를 만든 사람이 깃허브에 올려놓은 것을 바탕으로 사전을 구축했다.
github.com/lovit/customized_konlpy
lovit/customized_konlpy
Customized KoNLPy - Korean Natural Language Processing Toolkit KoNLPy wrapping code - lovit/customized_konlpy
github.com
감사합니다.... ㅎㅎㅎ
자자 파이썬 초보자도 쉽게 사전에 추가하고 통합어를 만드는데 어려움이 없으니 읽어보시기 바랍니다.
이제 나의 코드를 살펴보자
from ckonlpy.tag import Twitter
twi = Twitter()
#단어 추가 하기
twi.add_dictionary('비대면','Noun')
twi.add_dictionary('확진자','Noun')
twi.add_dictionary('거리두기','Noun')
Twitter라는 형태소 분석기 기반인데, Okt의 구버젼이라고 생각하면 된다.
구 버젼이라 걱정되는 사람도 있을 것이나 실행하면 자동으로 Okt버젼으로 바뀐다고 뜬다. 노 걱정
간단하다. 요렇게 추가하면 끝이다. 너무 행복하다.
참고로 통합어도 지정 할 수 있다.
#통합어 만들기
replace = {'유연근로제':'유연근무제','유연근무':'유연근무제','유연근로':'유연근무제',
'특고':'특수고용직','특수형태근로자':'특수고용직',
'특수형태근로종사자':'특수고용직'}
postprocessor = Postprocessor(base_tagger=twi, replace=replace, passtags={'Noun'})
#단어 등록 확인하기
postprocessor.pos('확진자와 비대면으로 거리두기를 사랑제일교회에서부터 전광훈이 유연근로제를')
이런식으로 쓰면 된다. 간단하다.
쨋든 난 명사만 뽑아 내어 쓸 예정이기 때문에 twi.pos 가 아닌 twi.nouns 사용한다.
하지만 Postprocessor는 .nouns가 안되는 것 같아서 나 나름대로 처리하여 명사만 가져왔다.
이 한줄을 표현하려고 많이 머리를 집어 뜯었다.
#형태소 분석 하기
words = [[j[i][0] for i in range(len(j))] for j in [postprocessor.pos(i) for i in tqdm(list(data['text']))]]
대괄호와 중괄호의 향연이다. 물론 알 필요는 없다. 일반적으로 사전에 추가하여 쓰고 싶으면
twi.pos 를 사용하면 간단하다.
- 배제어 제거하기
배제어는 간단하다 remove를 사용해주면 된다.
#배제어 등록하기
Prohibit_words = ['기자','연합뉴스','뉴시스','시사저널','신문','뉴스','사진','헤럴드경제','노컷뉴스','파이낸셜뉴스','특파원',
'라며','대해','지난','위해','오전','오후','무단','배포','이데일리','머니투데이','앵커','지금','때문','이번',
'통해','정도','경우','관련','이미지','출처','일보','바로가기','까지','여개','도록','이나','재배포','처럼','면서',
'거나','이제','지난달','어요']
#배제어 제거, 한 글자 제거하기
j = 0
for i in tqdm(words):
for k in Prohibit_words:
while k in i:
i.remove(k)
words[j] = i
j += 1 #불용어 제외
for k in range(len(words)):
words[k] = [i for i in words[k] if len(i) > 1] # 한글자 제외
data['words'] = words
리스트 형식으로 배제어를 만들고
for문과 while를 써가며 배제어를 제거하는과정이다. 천천히 읽어보면 이해가 갈 것이다.
또한 한글자 명사는 대부분 의미가 없고, 나중에 분석에서 불리하기 때문에 지워준다.
data['length_word'] = [len(i) for i in tqdm(data['words'])]
data50 = data[data['length_word'] >= 50] #단어 갯수 50개 이하 제거
형태소 분석 결과 단어가 50개 이하인 기사는 삭제해버렸다. 이는 포토뉴스가 기사에 의미가 없는 속보뉴스일 가능성이 크기 때문이다.
이로써 형태소 분석과 배제어 등록이 끝났다. 이걸로 토픽모델링도 할 수 있고, word2vec도 가능하다.
다음엔 word2vec을 이용한 고용관련 기사를 구별해보자.
그럼 이만 총총.......
'프로젝트' 카테고리의 다른 글
고용 관련 뉴스기사 분류 및 토픽 모델링 - 5 (토픽 모델링하기 gensim, lda) (0) | 2020.12.07 |
---|---|
고용 관련 뉴스기사 분류 및 토픽 모델링 - 4 (word2vec활용하기) (0) | 2020.11.30 |
고용 관련 뉴스기사 분류 및 토픽 모델링 - 3 (word2vec) (0) | 2020.11.23 |
고용 관련 뉴스기사 분류 및 토픽 모델링 - 1 (0) | 2020.11.09 |
프로젝트의 쓸 패키지들 (0) | 2020.11.05 |