기사를 통한 감성분석 분류해보기.

2023. 8. 5. 19:46프로젝트/주식분석_기사제목

반응형

 

https://www.bigkinds.or.kr/

 

빅카인즈(BIG KINDS)

뉴스빅데이터 분석시스템, 뉴스 속 키워드 관계망, 주요 이슈, 정보원, 이슈 트렌드 분석 정보 제공

www.bigkinds.or.kr

 

여기 사이트에서 뉴스분석 엑셀 다운로드를 했다. 일단 테스트를 해봐야 해서, LG 화학을 검색해 가져왔다.

df = pd.read_excel('./LG화학.xlsx')

xlsx 파일이어서 이렇게 pd.read_excel로 가져왔다. 왜 여태 csv를 했지? csv만의 장점이 뭐지? 약간 무지성으로 따라한 느낌이다.

 

이런 식으로 데이터를 가져옴.

 

import re
def test_text_preprocessing(text, mecab):
    
    stopwords = ['그리고', '그런데', '그러나', '그래서', '그러므로', '하지만', '아니라', '들', '때문에', '아직', '통해', '이런', '여러', '이미', '몇', '등등','은','과','한','게','에','의','는','위']
    
    txt = re.sub('[^가-힣a-z]', ' ', text)
    token = mecab.morphs(txt)
    token = [t for t in token if t not in stopwords]
        
    return token

ex_text = "단독입찰보다 복수입찰의 경우"
example_pre= test_text_preprocessing(ex_text, mecab)

print(example_pre)

그리고 이런 식으로 테스트를 진행했다. 이 stopword 나오는 양이... 형태소는 진짜 어마하다. 한글은 아직 100% 완벽하게 분류가 안되는 것 같다. 여러 블로그를 보니까 그래도 띄어쓰기로 하는 것보다 형태소 기준 분류가 더 정확도가 높다고 해서 일단 이렇게 하는 것이다.

 

positive_lexicon = ['러브', '콜', '만점', '만점', '상승', '회복', '적극', '정착', '세계최초','강세','보상','잘 만들다','정확하다','칭찬','응원','좋은','소중한','가능하다','강화하다','신뢰','민생안정','대응전략','극복방안','복원력','방도','안정화','규제','동참','안정','표심잡기','끝내기','MOU', '제휴', '주목', '호응', '돌파', '이목', '수상', '입점', '인기', '열풍', '진화', '대박', '순항', '유치', '1위', '출시', '선보여', '오픈', '팝업', '돌풍', '팝업스토어', '인싸', '줄서서', '인기', '대세', '트렌드', '불티', '진출', '부상', '체결', '증가', '봉사', '기부', '신메뉴', '신제품', '신상', '최고', '새로운', '편한', '미소', '맛집', '착한가게', '순항', '착한', '제작지원','성과' ,'키운다', '역발상', '기회', '잡']
negative_lexicon = ['쪼들리', '매각', '강등', '망신','괴담','노골적','가짜','날치기','터무니없다','실적악화','진퇴양난','경제침체','대재난','비상사태','내수시장','실직','황폐화','제살 깎아먹기','제식구 감싸기','말바꾸기','말맞추기','부풀리기','퍼나르기','버티기','수박겉핥기','겨자먹기','먼지털기','퍼주기','갑질', '논란', '폭리', '허위', '과징금', '눈물', '피해', '포화', '우롱', '위반', '리스크', '사퇴', '급락', '하락', '폐업', '불만', '산재', '닫아', '손배소', '구설수', '폐점', '적발', '침해', '빨간불', '취약', '불명예', '분신', '구형', '기소', '반토막', '호소', '불매', '냉담', '문제', '직격탄', '한숨', '불똥', '항의', '묵묵부담', '싸늘', '일탈', '파문', '게이트', '횡령', '사과문', '여파', '울상', '초토화', '급감', '우려', '중단', '퇴출', '해지', '일베', '이물질', '벌레', '엉망', '적발', '위생불량', '위생엉망', '소송', '하락', '매출하락', '반토막', '혐의', '불매', '부채', '적발', '폭리', '과징금', '오너리스크', '매각', '포기', '불만','깨졌' ,'손실' ,'부진']

def analyze_sentiment(morphemes, positive_lexicon, negative_lexicon):
    positive_count = sum(word in positive_lexicon for word in morphemes)
    negative_count = sum(word in negative_lexicon for word in morphemes)
    
    
    if positive_count > negative_count:
        return '1'
    elif positive_count < negative_count:
        return '0'
    else:
        return '-'

df['감성분류'] = [analyze_sentiment(test_text_preprocessing(title, mecab), positive_lexicon, negative_lexicon) for title in df['제목']]

df.head()

 

그다음은 긍정어와 부정어를 판별해서 긍정어면 1 부정어면 0 분류가 안되면 -로 분류하는 것을 만들어서 '감성분류' 라는 컬럼으로 분류했다.

 

하.... 이거 맞아..? 분류가 되지 않는게 무려 2200개... 더 공부좀 해야겠다.

728x90