한글 영어 혼합 분석기 만들기

호랑·2024년 1월 4일
0

코딩에서 손 뗀 지 어언 500년.. 간만에 내 특기(?)인 텍스트 긁어서 워드클라우드 만들기를 한 번 더 할 기회가 생겼다. 간단한 크롤링+워드클라우드 원툴인 나는 자신만만하게 검색해서 코드들을 봤으나 어쩐지 너무 어려웠다.

결국 배운 게 도둑질이라고 내 벨로그에 다시 와서 그 코드를 참고해서 크롤링 코드를 짰더니 무사히 코드를 완성했다. Thanks to 과거의 나. 그런 의미에서 이번에도 또 기록을 해본다.

아 졸라 길게 썼는데 날아감.

def get_news_list(keyword, page):
    url = f"https://www.google.com/search?q={keyword}&sca_esv=594127581&tbm=nws&sxsrf=AM9HkKk2GHGxRdc8VzZxAXkwJzAKe94ooQ:1703730654080&ei=3t2MZeC_BJrY1e8PyLK08Ak&start={page}&sa=N&ved=2ahUKEwjgpreji7GDAxUabPUHHUgZDZ4Q8tMDegQIBBAG&biw=1861&bih=891&dpr=1"
    response = requests.get(url, headers=headers)
    html = bs(response.text, "lxml")
    title_list = html.select("#rso > div > div > div > div > div > a > div > div.iRPxbe > div.n0jPhd.ynAwRc.MBeuO.nDgy9d")
    content_list = html.select("#rso > div > div > div > div > div > a > div > div.iRPxbe > div.GI74Re.nDgy9d")
    
    title_list_txt = []

    for i in range(len(title_list)) :
        title_list_txt.append(title_list[i].text)
        
    content_list_txt = []

    for i in range(len(content_list)) :
        content_list_txt.append(content_list[i].text)
    
    df_title_list_txt = pd.DataFrame(title_list_txt)
    df_content_list_txt = pd.DataFrame(content_list_txt)
    title_content = pd.concat([df_title_list_txt, df_content_list_txt],axis=1) 
    
    return title_content

뉴스 긁는 코드. (검색키워드, 페이지 번호)

news_list_df = pd.DataFrame()


for i in range(0, 60, 10):
    title_content = get_news_list('밀당피티', i)
    news_list_df = pd.concat([news_list_df,title_content])

페이지 매핑해서 긁고, 그 결과 합쳐주는 코드. 이 경우엔 헤드라인하고 요약을 합쳐주는 거임.

news_list_df = news_list_df.reset_index(drop=True)
news_list_df.columns = ["제목","미리보기"]

칼럼명 바꿔주기.

참고 : 웹소설 스크래핑

뭉쳐져있는 코퍼스에서 각각 한글과 영어를 따로 분리해서 각각 카운팅해서 분석 후 워드클라우드 그려주는 코드

def make_good_style_wordcloud(keyword):

    tmp = keyword.apply(lambda x: str(x["제목"]) + str(x["미리보기"]), axis=1)
    corpus = " ".join(tmp.tolist())

    #영어 한국어 추출
    english_text = ' '.join(re.findall(r'[a-zA-Z]+', corpus))
    korean_text = ' '.join(re.findall(r'[ㄱ-ㅎㅏ-ㅣ가-힣]+', corpus))

    #한국어 처리
    okt = Okt()
    def tokenize_kor(korean_text):
        return [n for n in okt.nouns(korean_text) if len(n) > 1] # 단어의 길이가 1개인 것은 제외


    #영어 처리
    
    def tokenize_eng(english_text):
        is_noun = lambda pos: pos[:2]=="NN"
        tokenized = nltk.word_tokenize(english_text)
        return [word for (word,pos) in nltk.pos_tag(tokenized) if is_noun(pos)] 
    
    all_nouns = tokenize_kor(korean_text) + tokenize_eng(english_text)

    c = Counter(all_nouns)
    custom_stopwords = ["불용어 리스트 입력"]
    return stylecloud.gen_stylecloud(font_path='System/Library/Fonts/JejuGothic.ttf',text=c,icon_name="fas fa-circle", custom_stopwords = custom_stopwords, output_name=f"wordcloud.png")

keyword 자리엔 데이터프레임을 넣으면 된다. 이미 코퍼스를 가지고 있다면

tmp = keyword.apply(lambda x: str(x["제목"]) + str(x["미리보기"]), axis=1)
corpus = " ".join(tmp.tolist())

데이터프레임을 코퍼스로 바꿔주는 부분인 이 부분을 지우고 (keyword)대신 (corpus)로 바꾸고 그 자리에 코퍼스 변수를 넣어주면 됨!

profile
데이터리터러시 기획자 / 데이터 분석가가 꿈!

0개의 댓글