ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 자연어 처리 예제
    Python 2020. 7. 22. 17:56

    여자친구 선물 고르기

    • 네이버에서 여자친구 선물 검색

    • 검색 결과를 가지고 텍스트 마이닝 작업

    import pandas as pd
    import numpy as np
    
    import platform
    import matplotlib.pyplot as plt
    
    %matplotlib inline
    
    path = "c:/Windows/Fonts/malgun.ttf"
    from matplotlib import font_manager, rc
    if platform.system() == 'Darwin':
        rc('font', family='AppleGothic')
    elif platform.system() == 'Windows':
        font_name = font_manager.FontProperties(fname=path).get_name()
        rc('font', family=font_name)
    else:
        print('Unknown system... sorry~~~~')    
    
    #그래프에서 마이너스 기호가 깨짐 방지
    #plt.rcParams['axes.unicode_minus'] = False
    
    from bs4 import BeautifulSoup 
    from urllib.request import urlopen
    import urllib
    import time
    tmp1 = 'https://search.naver.com/search.naver?where=kin'
    html = tmp1+ '&sm=tab_jum&ie=utf8&query={key_word}&start={num}'
    
    response = urlopen(html.format(num=1, key_word=urllib.parse.quote('여친 선물')))
    
    soup = BeautifulSoup(response, 'html.parser')
    tmp = soup.find_all('dl')
    tmp_list = []
    for line in tmp:
        tmp_list.append(line.text)
    tmp_list
    [' 기본검색   입력한 단어가 하나이상 포함된 문서 검색  ',
     ' 상세검색  정확히 일치하는 단어/문장(" ") 반드시 포함하는 단어(+) 제외하는 단어(-)  기본검색의 결과 범위를 줄이고자 할 때 사용합니다.여러개의 단어를 입력하실 때는쉼표(,)로 구분해서 입력하세요.   ',
     '  질문  여친 선물로 에어맥스 97 데저트샌드   2020.03.12.   여친 선물로 에어맥스 97 데저트샌드 사주고싶어서 그런데 여기가 가장 믿을만한거 같은데 사이트 정품취급하는곳인가요? https://m.smartstore.naver.com/nonshop...   답변 제품을 받아봐야 정답이 나오겠는데 의심이 되네요 패스하시는게 정신건강에 좋겠고 다른 정품사이트는 메일로 보내드릴테니 참고하시길 바랍니다.    닉네임코비진스   ',
     '  질문  여친선물로 뭘 줘야 할까요?   2020.05.21.   여친선물로 뭘 줘야 할까요?   답변 안녕하세요 저는 종로3가에서 귀금속을 하고 있는 예문입니다 어떤 특별한 날인가요 그러면 특별하게 선물을 주시는 게 좋을 거 같아서요 기념이 돌 수 있는 목걸이,반지...    닉네임Shine09749 블로그   ',
     '  질문  천여여친 선물 추   2020.06.21.   천여여친 선물 추   답변 쥬얼리여 ^^ 라디오르 : 네이버쇼핑 스마트스토어 splendid light in your daily life m.smartstore.naver.com    닉네임으앙   ',
     '  질문  아빠가 어제 카드 주셔서 여친 선물   2020.02.04.   아빠가 어제 카드 주셔서 여친 선물 사는데에 20만원 썼거든요?? 근데 여친이 또 사달라는게 있는데 그게 30만원이에요... 근데 또 돈쓰면 아빠가 뭐라 할것같고 안사주면...   답변 제가 보기에는 여친이 너무 무리하게 요구하는것 같은데 무리해서도라도 사주고 싶은 건가요? 남친을 곤란하게 만드는 여친이라면 고민해 보셔야할듯 해요~사랑은 둘이...    닉네임후니맘   ',
     '  질문  여우님!! 정품문의 답변즘여 여친선물인데....   2020.01.29.   셀렉온에서 구매했으며 EATTREND에서 물품 배송되었어요. 메종 마르지엘라 5AC 미니백 부탁드립니다. 여친선물이에요... 꼼꼼히... 부탁... 드립니다... 감사합니다.   답변 구매처링크와 제품모델명택, 자물쇠 각인도 올려주세요 꼼꼼히 확인하기엔 부족한 사진이 너무 많네요;    닉네임은빛여우   ',
     '  질문  베트남에서 여친 선물   2019.08.14.   이번주 주말에 베트남 다낭에 여행가는데 대학생 여친한테 선물 줄꺼 추천해주세요!! 부담되지 않게 5만원 이하로 부탁해요!!   답변 라탄 가방 라탄 장식품 커피 노니 환 노니비누 베트남 과자 ^^ 한시장에서 파는 라탄 가방 싸용~ 2~3개 사도 될껍니다    닉네임유니   ',
     '  질문  여친 선물 추천해주세여 오프라인에서   2020.01.23.   여친 선물 추천해주세여 오프라인에서 살수잇는거요   답변 https://blog.naver.com/tkdghks7/221782360113 Apple 에어팟 2세대 유선 충전 모델 [ 애플 에어팟 ] Apple 에어팟 2세대 유선 충전 모델 로켓배송 최저가 리뷰만...    닉네임tkdg****   ',
     '  질문  다이어트하는 여친선물로 가장 특별한것은?   2019.11.14.   다이어트하는 여친선물로 가장 특별한것은? 1.밀크프로틴wph그리2.리치밀데이3.wpa단백질4.스마트프로틴50 5.녹차 6.커피   답변 여자친구분의 체질에 따라 선물이 달라질 수 있지만 제 생각에는 3번 제품도 괜찮은 것 같아요 더 자세한 다이어트 제품에 알고 싶다면 제 닉네임 클릭 하시고 링크부분을 꾹...    닉네임큐티 톡summer0426   ',
     '  질문  15살 여친 선물   2020.01.27.   이거 여친선물로 어떤가요? 15살 중2입니다   답변 조금 유치한 것 같아요. 다른 모양을 생각해보시는 게 어떨까요.    닉네임tjrw****   ',
     '  질문  여친 선물   2020.07.10.   제가 여친이 생겼어요 ^^ 근데 사귄지는 얼마 안 되었구요. 양쪽 엄마에게 말하지 않았아여 근데 여친에게 뭐를 해 주고 싶은데 뭐를 해주면 좋을까요? 중학생이기 때문에...   답변 더운 여름에 보틀은 어떨까요 오늘도사랑해 보틀이 귀엽고 예뻐요 https://smartstore.naver.com/detokmine/products/720956882 오늘도사랑해 국산 트라이탄 보틀...    닉네임leti****   ',
     ' 연관검색어도움말    목걸이 선물   여친 생일선물   18k 목걸이   연인 선물   귀걸이   여자친구 선물     닫기 후 1주일간 유지됩니다. 연관검색어를 다시 보시겠습니까? 열기 ']
    # tqdm_notebook : 진행바 표시
    from tqdm import tqdm_notebook
    
    present_candi_text = []
    
    # 10000 개 자료요청
    for n in tqdm_notebook(range(1, 1000, 10)):
        response = urlopen(html.format(num=n, key_word=urllib.parse.quote('여자 친구 선물')))
    
        soup = BeautifulSoup(response, "html.parser")
    
        tmp = soup.find_all('dl')
    
        for line in tmp:
            present_candi_text.append(line.text)
    
        time.sleep(0.5)
    C:\ProgramData\Anaconda3\envs\r_study\lib\site-packages\ipykernel_launcher.py:7: TqdmDeprecationWarning: This function will be removed in tqdm==5.0.0
    Please use `tqdm.notebook.tqdm` instead of `tqdm.tqdm_notebook`
      import sys
    
    
    
    HBox(children=(FloatProgress(value=0.0), HTML(value='')))
    #present_candi_text
    # 실제는 약 1300개
    len(present_candi_text)
    1300
    present_candi_text[10]
    '  질문  여자친구 선물 추천 바래요   2019.10.02.   여자친구 선물 해주려고 하는데 어떤 게 괜찮을지 몰라서요 화장품을 해줄까... 그러는데 여자친구 선물로 괜찮은 거 추천 좀 해주세요 화장품도 괜찮고 화장품이 아니더라도...   답변 화장품은 여자친구의 피부타입(지성인지 건성인지 지복합성인지 수부지인지 등)을 잘 아셔야 하기 쉬운 선물인거 같아요. 아니면 평소에 늘 즐겨쓰는 화장품...    닉네임무드미   '
    # nltk - https://datascienceschool.net/view-notebook/8895b16a141749a9bb381007d52721c1/
    import nltk
    from konlpy.tag import Okt
    t = Okt()
    present_text = ''
    
    for each_line in present_candi_text[:len(present_candi_text)]:
        present_text = present_text + each_line + '\n'
    # 형태소 분석
    tokens_ko = t.morphs(present_text)
    #tokens_ko
    # 형태소 => 토큰 => 실 토큰 수
    ko = nltk.Text(tokens_ko, name='여자 친구 선물')
    print(len(ko.tokens))
    print(len(set(ko.tokens)))
    85400
    404
    # 빈도수 확인
    ko = nltk.Text(tokens_ko, name='여자 친구 선물')
    ko.vocab().most_common(100)
    [('선물', 5300),
     ('여자친구', 4100),
     ('.', 3500),
     ('...', 2200),
     ('추천', 2000),
     ('로', 1400),
     ('대', 1100),
     ('을', 1100),
     ('답변', 1100),
     ('를', 1000),
     ('질문', 1000),
     ('닉네임', 1000),
     ('여자', 800),
     ('이', 800),
     ('화장품', 800),
     ('가', 700),
     ('20', 600),
     ('요', 600),
     ('좀', 600),
     ('****', 600),
     ('에', 600),
     ('30', 600),
     ('단어', 500),
     ('는', 500),
     ('?', 500),
     ('괜찮은', 500),
     ('도', 500),
     ('해주세요', 500),
     ('검색', 400),
     ('한', 400),
     ('의', 400),
     ('개', 400),
     ('수', 400),
     ('거', 400),
     ('~', 400),
     ('저', 400),
     ('으로', 400),
     (',', 400),
     ('뷰티', 400),
     ('팩트', 400),
     ('하는데', 400),
     ('인지', 400),
     ('입력', 300),
     ('된', 300),
     ('하는', 300),
     ('합니다', 300),
     ('여러', 300),
     ('2020.07', 300),
     ('(', 300),
     ('생일', 300),
     ('적', 300),
     ('것', 300),
     ('같아요', 300),
     ('명품', 300),
     ('은', 300),
     ('!', 300),
     ('어떤', 300),
     ('게', 300),
     ('ysl', 300),
     ('해주려고', 300),
     ('위', 300),
     ('하나', 200),
     ('포함', 200),
     ('때', 200),
     ('뭐', 200),
     ('좋을까요', 200),
     ('꽃', 200),
     ('있는', 200),
     ('있으면', 200),
     ('악세사리', 200),
     (')', 200),
     ('지갑', 200),
     ('향수', 200),
     ('부탁드려요', 200),
     ('종류', 200),
     ('실용', 200),
     ('인', 200),
     ('스킨', 200),
     ('이라고', 200),
     ('!!', 200),
     ('06', 200),
     ('들', 200),
     ('어떤게', 200),
     ('인거', 200),
     ('향', 200),
     ('지', 200),
     ('잊을', 200),
     ('없는', 200),
     ('안녕하세요', 200),
     ('하고', 200),
     ('제', 200),
     ('그', 200),
     ('목걸이', 200),
     ('경우', 200),
     ('더', 200),
     ('02', 200),
     ('포에버', 200),
     ('입니다', 200),
     ('바', 200),
     ('래', 200)]
    # similar 메서드는 같은 문맥에서 주어진 단어 대신 사용된 횟수가 높은 단어들을 찾는다
    ko.similar('여자친구')
    # 제외 단어 처리
    stop_words = ['.','가','요','답변','...','을','수','에','질문','제','를','이','도',
                          '좋','1','는','로','으로','2','것','은','다',',','니다','대','들',
                          '2017','들','데','..','의','때','겠','고','게','네요','한','일','할',
                          '10','?','하는','06','주','려고','인데','거','좀','는데','~','ㅎㅎ',
                          '하나','이상','20','뭐','까','있는','잘','습니다','다면','했','주려',
                          '지','있','못','후','중','줄','6','과','어떤','기본','!!',
                          '단어','선물해','라고','중요한','합','가요','....','보이','네','무지']
    tokens_ko = [each_word for each_word in tokens_ko
                if each_word not in stop_words]
    
    ko = nltk.Text(tokens_ko, name = '여자 친구 선물')
    ko.vocab().most_common(50)
    [('선물', 5300),
     ('여자친구', 4100),
     ('추천', 2000),
     ('닉네임', 1000),
     ('여자', 800),
     ('화장품', 800),
     ('****', 600),
     ('30', 600),
     ('괜찮은', 500),
     ('해주세요', 500),
     ('검색', 400),
     ('개', 400),
     ('저', 400),
     ('뷰티', 400),
     ('팩트', 400),
     ('하는데', 400),
     ('인지', 400),
     ('입력', 300),
     ('된', 300),
     ('합니다', 300),
     ('여러', 300),
     ('2020.07', 300),
     ('(', 300),
     ('생일', 300),
     ('적', 300),
     ('같아요', 300),
     ('명품', 300),
     ('!', 300),
     ('ysl', 300),
     ('해주려고', 300),
     ('위', 300),
     ('포함', 200),
     ('좋을까요', 200),
     ('꽃', 200),
     ('있으면', 200),
     ('악세사리', 200),
     (')', 200),
     ('지갑', 200),
     ('향수', 200),
     ('부탁드려요', 200),
     ('종류', 200),
     ('실용', 200),
     ('인', 200),
     ('스킨', 200),
     ('이라고', 200),
     ('어떤게', 200),
     ('인거', 200),
     ('향', 200),
     ('잊을', 200),
     ('없는', 200)]
    plt.figure(figsize=(15, 6))
    ko.plot(50)
    plt.show()

    # wordcloud 그리기
    from wordcloud import WordCloud, STOPWORDS
    from PIL import Image
    data = ko.vocab().most_common(300)
    
    # for window :  font_path='c:/Windows/Fonts/malgun.ttf'
    wordcloud = WordCloud(font_path='c:/Windows/Fonts/malgun.ttf',
                          relative_scaling = 0.2,
                          #stopwords=STOPWORDS,
                          background_color='white',
                          ).generate_from_frequencies(dict(data))
    plt.figure(figsize=(16, 8))
    plt.imshow(wordcloud)
    plt.axis('off')
    plt.show()

    # 하트 그림으로 마스킹 하기
    mask = np.array(Image.open('DataScience_Ing/data/09. heart.jpg'))
    
    from wordcloud import ImageColorGenerator
    
    image_colors = ImageColorGenerator(mask)
    data = ko.vocab().most_common(200)
    
    # for win : font_path='c:/Windows/Fonts/malgun.ttf'
    wordcloud = WordCloud(font_path='c:/Windows/Fonts/malgun.ttf',
                   relative_scaling = 0.1, mask=mask,
                   background_color = 'white',
                   min_font_size=1,
                   max_font_size=100).generate_from_frequencies(dict(data))
    default_colors = wordcloud.to_array()
    plt.figure(figsize=(12, 12))
    plt.imshow(wordcloud.recolor(color_func=image_colors), interpolation='bilinear')
    plt.axis('off')
    plt.show()

    gensim 사용하기

    # pip install gensim
    # pip 줄 위에 주석이 있으면 작동 안함 그럴땐 앞에 ! 붙여줄 것
    # !pip install ~~
    import gensim
    from gensim.models import word2vec
    #twitter = Twitter()
    twitter = Okt()
    results = []
    lines = present_candi_text
    # 조사 등 제거 작업
    for line in lines:
        malist = twitter.pos(line, norm=True, stem=True)
        r = []
    
        for word in malist:
            if not word[1] in ['Josa', 'Eomi', 'Punctuation']:
                r.append(word[0])
    
        r1 = (' '.join(r)).strip()
        results.append(r1)
        #print(r1)
    # 파일로 저장
    data_file = 'pres_girl.data'
    with open(data_file, 'w', encoding='utf-8') as fp:
        fp.write('\n'.join(results))
    # 모델 만들기
    data = word2vec.LineSentence(data_file)
    model = word2vec.Word2Vec(data, size=200, window=10, hs=1, min_count=2, sg=1)
    model.save('pres_girl.model')
    # 모델 읽기
    model = word2vec.Word2Vec.load('pres_girl.model')
    # 유사 단어 확인하기
    # model.most_similar(positive=['선물'])
    model.wv.most_similar(positive=['선물'])
    [('여자친구', 0.6818892955780029),
     ('여자', 0.41823437809944153),
     ('추천', 0.3493351638317108),
     ('해주다', 0.32824021577835083),
     ('디바이스', 0.3177199065685272),
     ('질문', 0.3141518533229828),
     ('답변', 0.31363531947135925),
     ('안녕하다', 0.3132782578468323),
     ('뷰티', 0.30647075176239014),
     ('거', 0.2876569628715515)]
    model.wv.most_similar(positive=['선물','22'])
    [('2019.08', 0.6876093745231628),
     ('중', 0.6533753871917725),
     ('골', 0.6254662275314331),
     ('여자친구', 0.5970337390899658),
     ('그동안', 0.5817160606384277),
     ('함', 0.5660998821258545),
     ('여러', 0.5035719275474548),
     ('해주다', 0.4883960485458374),
     ('30', 0.48793062567710876),
     ('그', 0.48074793815612793)]
    model.wv.most_similar(positive=['선물','시계'])
    [('함', 0.7223575115203857),
     ('그동안', 0.6664074659347534),
     ('골', 0.65980064868927),
     ('등등', 0.6591075658798218),
     ('중', 0.6404654383659363),
     ('딱하다', 0.6290322542190552),
     ('여자친구', 0.6125046610832214),
     ('향수', 0.5848992466926575),
     ('경우', 0.5846831202507019),
     ('엄청나다', 0.5714918375015259)]
    #model.most_similar(positive=['여자친구'])
    model.wv.most_similar(positive=['여자친구'])
    [('선물', 0.6818892955780029),
     ('추천', 0.4470706582069397),
     ('거', 0.4267238676548004),
     ('생일', 0.40203943848609924),
     ('해주다', 0.38665515184402466),
     ('괜찮다', 0.3856292963027954),
     ('좀', 0.362027645111084),
     ('여자', 0.3514968752861023),
     ('게', 0.3490065336227417),
     ('20', 0.34558093547821045)]
    # 여자친구에 악세사리를 더하면
    model.wv.most_similar(positive=['여자친구','악세사리']) # 여자친구 처음으로 독립? 독립을 축하?
    [('별로', 0.6940656900405884),
     ('안', 0.688794732093811),
     ('알아보다', 0.6881222128868103),
     ('보통', 0.6693837642669678),
     ('분들', 0.6554944515228271),
     ('싫다', 0.6525259017944336),
     ('대다', 0.6513211727142334),
     ('이런', 0.6021952629089355),
     ('신발', 0.5993391275405884),
     ('줄', 0.5820037126541138)]
    # 여자친구에서 악세사리을 빼면
    model.wv.most_similar(positive=['여자친구'], negative=['악세사리']) # 여자친구 처음으로 독립? 독립을 축하?
    [('선물', 0.4398285448551178),
     ('질문', 0.26896005868911743),
     ('좀', 0.25451985001564026),
     ('답변', 0.23579612374305725),
     ('대', 0.2298237830400467),
     ('30', 0.22315742075443268),
     ('게', 0.2223224639892578),
     ('02', 0.19278739392757416),
     ('정성', 0.1851169615983963),
     ('디바이스', 0.1840742826461792)]

    Text_Naver.html
    0.94MB

    'Python' 카테고리의 다른 글

    KoNLP(자연어처리)  (0) 2020.07.22
    Pandas - pivot_table, Seaborn  (0) 2020.07.20
    Pandas 기초  (0) 2020.07.16
    Numpy 기본  (0) 2020.07.16
    OPEN_API를 사용하여 데이터 수집하기  (0) 2020.06.15
Designed by Tistory.