본문 바로가기
공허의 유산/사상의 도구

DCInside 고갤 조회수 높은 글의 제목 분석

by 바른생활머시마 2023. 9. 20.
728x90
반응형

Code for Korea의 위로 프로젝트의 일환으로 DCInside의 고민 갤러리 글을 수집하고 이것을 분석하는 Task를 해보기로 하였습니다. 고민 갤러리의 글들을 읽어보면 매우 심각한 고민부터 매우 가벼운 고민까지 다양합니다. 가벼운 고민은 일단 관심 대상이 아니고, 절박한 상황에서 누군가의 따뜻한 말 한마디조차 간절한 사람들이 관심 대상이며, 그 사람들의 마음의 짐을, 댓글을 통해서라도 조금이라도 위로 할 수 있기를 바라는 마음으로 시작한 프로젝트 입니다.

 

DCInside도 여느 인터넷 게시판 서비스들과 비슷합니다. ....

그러다보니, 정작 도움을 구하는 사람과 도움을 주고자 하는 사람이 서로를 찾기가 어려운 상황이 되는 것 같습니다. 그래서, 도움을 주고자 하는 사람이 글들을 계속 읽어봐야 하는 수고가 필요한데, '수고'라는 표현도 어찌보면 그 어려움을 단순화 시킨 것일 수도 있습니다. 힘든 감정을 쏟아내는 글은 읽는 것도 마음이 힘들기 때문에 계속 고민글들을 읽어 나가는 것이 결코 쉬운 일은 아니었습니다. 그런 관점에서 보면, 사회의 여러 상담사분들의 일이 매우 힘든 일인 것 같습니다.

 

글의 내용 분석과는 별개로, 글 제목만 가지고도 뭔가 의미있는 분석을 할 수 있는 것이 없을까 생각하다가, 도움이 필요한 사람이 관심과 응원을 잘 받도록 할 방법을 찾아보고자 했고, 그 생각의 연장으로 댓글이 많은 글들은 일단 클릭수가 높을 것이므로, 글 조회수와 댓글수가 높을 것이므로 어떤 제목의 글이 조회수가 많은지 한번 알아보기로 했습니다.

 

먼저, 고민 갤리러 전체 글(~2023.8.31, 962681건) 중, 댓글이 있는 것만 일차로 추렸습니다.(780458건)

조회수가 높다는 것은 일단 제목에서 관심을 끈다는 것이고,

댓글 개수가 많다는 것은 공감되는 무엇인가가 있다는 것이라고 생각 됩니다.

그러나, 많은 댓글 수가 꼭 고민에 대한 진지한 댓글은 아니라는 점을 간과 해서는 안됩니다.

 

일단, 조회수가 높은 글, 즉 제목으로부터 관심을 끌 수 있는 글을 살펴 보겠습니다.

 사실 조회수는 제목 뿐만 아니라 조회수 자체 그리고 댓글의 개수도 영향을 줄 것입니다만, 일단은 최초의 시작은 제목부터 시작되는 것이니, 제목을 먼저 한번 분석 해 봅시다.

 

제목에 사용 된 단어별로 글 조회수를 누적하면, 조회수가 많은 단어들이 무엇인지 알 수 있을 것입니다.

 

어떤 글뭉치에서 단어의 빈도를 조사하는 것은 word frequency라는 표현으로 사용하며, 검색을 해보니 이제는 이것을 위한 python module도 있군요. 그런데, 이 빈도는 특정 단어가 사용 된 빈도이지 조회수를 나타내는 것은 아니죠. 다음에 한번 써보기로 하고.

https://pypi.org/project/wordfreq/

 

wordfreq

Look up the frequencies of words in many languages, based on many sources of data.

pypi.org

글 목록 한 줄을 읽은 후, 형태소로 분리하고, 각 단어에 글 조회수를 더해주도록 하겠습니다. 단어로 해야할지, 띄어쓰기로 해야할지 모르겠는데...일단 형태소로 한 후 명사, 띄어쓰기 등으로 확장 해 보도록 하죠.

 

 

형태로 빈도 상위 100개

아래와 같이 코드를 작성해 보았습니다.

# Konlpy 설치
# https://konlpy.org/ko/latest/install/#id2

from konlpy.tag import Kkma
import pickle
from operator import itemgetter


kkma = Kkma()

dc_dict={}

#list_file = open('./AttractiveTitle/DCInside_gogall_list_with_reply.text')
list_file = open('./AttractiveTitle/1.text', encoding='utf-8')

for line in list_file.readlines():
    line = line.strip()

    # 1842020|정신차리자 개이야 |4|고갤러(118.235)|2023-08-31 20:34:14|32|0
    terms = line.split('|')

    try:
        title = terms[1]
        comment = int(terms[2])
        views = int(terms[5])
    except:
        continue

    # 제목의 형태소 분리
    morphs = kkma.morphs(title)

    for morph in morphs:
        if morph in dc_dict:
            dc_dict[morph] += views
        else:
            dc_dict[morph] = views
list_file.close()

dc_dict = sorted(dc_dict.items(), key=itemgetter(1), reverse=True)

with open('saved_dictionary.pkl', 'wb') as f:
    pickle.dump(dc_dict, f)

dc_dict = dc_dict[:100]
print(dc_dict)

결과는...

형태소로는 의미있는 결론을 내기 어렵겠네요.

음. 실질형태로만 대상으로 한번 해봐야겠네요.

kkma의 품사 색인을 보면, 품사의 첫번째 글자가, NVM중 하나면 되겠다.

요렇게 뽑아봐도 불필요한 것들이 많이 보인다. 그냥 명사만 뽑아보는게 좋을 것 같다.

샘플 데이터 소량을 가지고, 명사만 뽑아보면, 결국 사람들의 관심을 많이 받는 문제는 사람들 사이의 문제이다.

주요 분류별로 살펴보면, 삶/현실/관계에 대한 고민을 가지고 도움을 요청하는 글들이 조회수가 높은 것 같다. 그냥 막 감정을 배설하거나 그다지 중요하지 않은 글은 사람들의 관심을 가지지 못하는 것 같다. 그나마 다행일수도...

도움의 요청 - 고민/나/내가/저조언/고민상담/질문

사람 사이의 이슈 - 사람/친구/나/여자/남자/엄마/뒷담/이간질/학교/형/동생/사친/어머니/여자애

삶에 대한 이슈 - 인생/진로/

현실 - 돈/집/알바/실적일/회사

 

이제 전체 데이터로 한번 돌려보자.

코드는 아래와 같이 수정하고~

# Konlpy 설치
# https://konlpy.org/ko/latest/install/#id2

from konlpy.tag import Kkma
import pickle
from operator import itemgetter


kkma = Kkma()

dc_dict={}

list_file = open('./AttractiveTitle/DCInside_gogall_list_with_reply.text', encoding='utf-8')
#list_file = open('./AttractiveTitle/1.text', encoding='utf-8')

cnt = 0
lines = list_file.readlines()
line_cnt = len(lines)
for line in lines:
    line = line.strip()

    cnt += 1
    if cnt % 100 == 0:
        print(f"Progress - {cnt} / {line_cnt}")

    # 1842020|정신차리자 개이야 |4|고갤러(118.235)|2023-08-31 20:34:14|32|0
    terms = line.split('|')

    try:
        title = terms[1]
        comment = int(terms[2])
        views = int(terms[5])
    except:
        continue

    # 제목의 형태소 분리
    #morphs = kkma.morphs(title)
    #morphs = kkma.pos(title)
    nouns = kkma.nouns(title)

    for morph in nouns:
        if morph in dc_dict:
            dc_dict[morph] += views
        else:
            dc_dict[morph] = views
list_file.close()

dc_dict = sorted(dc_dict.items(), key=itemgetter(1), reverse=True)

with open('saved_nouns_dictionary.pkl', 'wb') as f:
    pickle.dump(dc_dict, f)

dc_dict = dc_dict[:100]
print(dc_dict)

 

돌리다보니, 같은 글자가 여러개 붙은 제목이 있을 때 kkma는 응답 없는 상태가 되어 버리는 경우가 자주 발생하네요.

여러가지 예외 처리를 하다가 안되서 Komoran을 적용 해 봤더니, 응답 없는 상태도 없고, 처리 속도는 훨씬 빠르네요.

그래서 코드를 아래와 같이 수정했습니다.

# Konlpy 설치
# https://konlpy.org/ko/latest/install/#id2

from konlpy.tag import Kkma, Komoran
import pickle
from operator import itemgetter


#kkma = Kkma()
komoran = Komoran()

dc_dict={}

list_file = open('./AttractiveTitle/DCInside_gogall_list_with_reply.text', encoding='utf-8')
#list_file = open('./AttractiveTitle/1.text', encoding='utf-8')

cnt = 0
lines = list_file.readlines()
line_cnt = len(lines)

for line in lines:
    line = line.strip()

    cnt += 1
    #if cnt % 100 == 0:

    # 1842020|정신차리자 개이야 |4|고갤러(118.235)|2023-08-31 20:34:14|32|0
    terms = line.split('|')

    try:
        title = terms[1]
        comment = int(terms[2])
        views = int(terms[5])
        # 같은 글자만 연속으로 있는 문장에서 hang 걸림
        # 첫번째-마지막 글자가 같고 띄어쓰기 없으면 skip하는걸로.
        if title[0]==title[-1] and title.find(' ')<0:
            continue

        print(f"Progress - {cnt} / {line_cnt} : {title}")

        # 제목의 형태소 분리
        #morphs = kkma.morphs(title)
        #morphs = kkma.pos(title)
        #nouns = kkma.nouns(title)
        nouns = komoran.nouns(title)

        for morph in nouns:
            if morph in dc_dict:
                dc_dict[morph] += comment#views
            else:
                dc_dict[morph] = comment#views

    except:
        print('Unkown exception.')
        continue


list_file.close()

dc_dict = sorted(dc_dict.items(), key=itemgetter(1), reverse=True)

with open('./AttractiveTitle/result/nouns_by_comments.pkl', 'wb') as f:
    pickle.dump(dc_dict, f)

dc_dict = dc_dict[:100]
print(dc_dict)

 

조회수와 댓글수에 대해서 가중치를 부여해서 가장 영향력 있을 것 같은 명사를 정리하고, 그 중 상위 100개만 따로 추려서 저장했습니다.

화면에 출력한 것을 그냥 그대로 긁어서 텍스트 파일로 저장했더니 리스트 형식으로 명사와 가중치 숫자를 가진 튜플이 리스트의 멤버로 되어 있습니다.

 

댓글수 많은 명사 Top 100

[('고민', 286587), ('여자', 129409), ('거', 126963), ('사람', 88287), ('때', 70691), ('오늘', 60729), ('친구', 57512), ('것', 55931), ('개', 55121), ('애', 53777), ('말', 51976), ('남자', 51689), ('고개', 49220), ('안', 45869), ('존', 43708), ('글', 38586), ('일', 36649), ('형', 36546), ('생각', 35106), ('살', 33795), ('수', 33768), ('인증', 32759), ('중', 32003), ('디', 31942), ('님', 30137), ('씨', 29677), ('이', 29648), ('내', 26057), ('건', 25642), ('번', 25551), ('요즘', 25399), ('남', 25261), ('게', 24804), ('키', 24179), ('아', 24094), ('시', 23853), ('시발', 23681), ('집', 23592), ('데', 23351), ('년', 22428), ('러', 22337), ('공부', 21425), ('!!!', 20974), ('내일', 20908), ('때문', 20552), ('여치', 20394), ('이랑', 19977), ('노래', 19960), ('얼굴', 19436), ('알바', 19344), ('사진', 19231), ('새끼', 18840), ('여자친구', 18632), ('시간', 18617), ('인생', 18387), ('날', 18235), ('돈', 18071), ('대학', 17699), ('어', 17022), ('머리', 16873), ('누나', 16823), ('군대', 16799), ('학교', 16649), ('술', 16303), ('방', 16071), ('니들', 15561), ('!!', 15441), ('추천', 15288), ('분', 15284), ('놈', 14914), ('하', 14660), ('한', 14572), ('전', 14391), ('연애', 14201), ('밥', 14168), ('상담', 13988), ('질문', 13666), ('민개', 13439), ('고백', 13339), ('후', 13324), ('다', 13301), ('사랑', 13174), ('눈', 12795), ('영화', 12774), ('문제', 12661), ('엄마', 12606), ('지', 12391), ('병신', 12372), ('적', 12355), ('사실', 12314), ('얘기', 12221), ('야', 12193), ('대', 12109), ('미', 12102), ('이유', 12019), ('옷', 11988), ('점', 11858), ('닉', 11792), ('진짜', 11633), ('꺼', 11452)]

조회수 많은 명사 Top 100

[('고민', 5308373), ('여자', 3136971), ('거', 2527595), ('사람', 1675455), ('때', 1432795), ('남자', 1293878), ('친구', 1271003), ('것', 1123639), ('애', 1091385), ('오늘', 1052149), ('개', 1025750), ('말', 933268), ('존', 907082), ('안', 872244), ('고개', 805187), ('살', 760849), ('일', 688831), ('수', 666333), ('생각', 656135), ('글', 634214), ('중', 613745), ('남', 611068), ('형', 569262), ('여치', 555397), ('이', 523052), ('디', 521466), ('인증', 517964), ('여자친구', 511787), ('키', 509687), ('건', 501250), ('년', 500050), ('씨', 496576), ('집', 476705), ('내', 472393), ('번', 465907), ('요즘', 462839), ('시발', 458143), ('게', 452779), ('이랑', 444949), ('때문', 440370), ('님', 433316), ('아', 433199), ('데', 425910), ('시', 415519), ('얼굴', 408510), ('인생', 399888), ('알바', 392688), ('러', 391996), ('사진', 381081), ('대학', 378823), ('새끼', 373658), ('공부', 353553), ('법', 353126), ('어', 344079), ('돈', 338346), ('시간', 327899), ('내일', 321451), ('술', 320789), ('누나', 320766), ('연애', 319934), ('날', 318913), ('!!!', 316871), ('군대', 316116), ('고백', 305316), ('방', 300343), ('한', 300028), ('학교', 299305), ('머리', 297737), ('노래', 287864), ('방법', 285886), ('분', 285009), ('추천', 284540), ('엄마', 281105), ('전', 277202), ('대', 276846), ('문제', 273260), ('하', 271621), ('후', 270390), ('이유', 267218), ('놈', 266560), ('사랑', 254757), ('!!', 252994), ('상담', 251122), ('지', 247551), ('친', 245026), ('남자들', 244949), ('니들', 241441), ('야', 237355), ('다', 235717), ('밥', 231034), ('병신', 227037), ('해', 223704), ('눈', 223374), ('나이', 221332), ('질문', 218246), ('혼자', 217896), ('얘기', 217612), ('진짜', 215959), ('옷', 215639), ('문자', 214893)]

이렇게 하나 저렇게 하나 1,2위가 동일하네요. 

사실, '고민'이라는 것이 꼭 슬프고 힘들고 괴롭고 그런 것만은 아니죠. 그런 감정 뒤에 오는 긍정적인 감정과 일들도 있어서 어떤 고민은 그 고민 자체가 아름답게 보이기도 하죠. '위로' 프로젝트의 대상은, 이런 것은 아니었으니... 일단 이 결과로, 아름다운 고민을 가진 사람들도 많다는 것으로 정리하고, 정말 위로가 필요한 사람들의 글을 찾아내는 것은 다른 방법을 찾아봐야겠네요.

 

본 글에서 분석에 사용한 데이터는, DCInside의 고민갤러리(https://gall.dcinside.com/board/lists/?id=agony) 글을 사용하였으며, Code for Korea의 '위로' 프로젝트의 공익성에 대해 말씀을 드리고 사용 허락을 받았습니다.  

 '위로' 프로젝트 활동으로, 위로 게시판의 목록과 최신글 10만건을 수집하는 프로젝트도 진행하였습니다. 함께 분석을 해 보시고 싶으신 분은 아래 링크에서 자료를 받아 활용하시면 되고, 바로 위 볼드체와 같은 문구를 함께 표시 해 주시면 됩니다.

728x90
반응형

댓글