336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.

네 번째 프로젝트 순서

 

1. 간단한 intro

2. 웹 크롤링 및 전처리

3. 모델 학습 및 평가


팀프로젝트로 진행했기 때문에 각각 팀원들이 직접 크롤링을 해볼 수 있게, 카테고리를 정해서 각자 코드를 만들어서 공유하자고 얘기를 했다. 이전에 했던 네이버 기사랑 비슷한 느낌이라서 우선 빠르게 진행을 하고, 팀원들이 질문을 하면 피드백을 해주는 형식으로 진행했다.

 

 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
import requests
import pandas as pd
from bs4 import BeautifulSoup
 
# 카테고리 설정 및 카테고리 별 url 숫자 지정
Category = ['Furniture','Life','Deco','Kitchen','Food','Baby,Kids','FasihonClothing','FasionGoods','Beauty','Jewelry']
Category_num = ['121','120','122','112','119','115','117','116','118','125']               
 
# 빈 데이터프레임 생성
df_section_title = pd.DataFrame()
 
for j in range(0,10):
    category = Category[j]
    print(category, ' 카테고리 크롤링 시작')
    category_num = Category_num[j]
    key_list = []
    
    #150페이지 크롤링
    for i in range(1,151):
        
        # 제목 추출  
        url = f'https://www.10x10.co.kr/shopping/category_main.asp?rect=&prvtxt=&rstxt=&extxt=&sflag=n&disp={category_num}&cpg={i}&chkr=False&chke=False&mkr=&sscp=Y&psz=40&srm=ne&iccd=0&styleCd=&attribCd=&icoSize=S&arrCate=&deliType=&minPrc=&maxPrc=&lstDiv=list&ab='
        headers = {'user-agent''Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.85 Safari/537.36'}
        html = requests.get(url, headers=headers)
        title = BeautifulSoup(html.text, 'html.parser')        
        keywords = title.select('p.pdtName.tPad07')        
        
        
        #6개는 행사 상품
        for k in keywords[6:78]:
            keyword = k.text
            key_list.append(keyword)        
        if i % 50 == 0:
            print(i,'페이지 완료')
cs

 

 

 

 

제목이 안 그래도 짧은데, 제목에 과적합을 야기할 수 있는 불필요한 단어들이 많이 포함되어 있어서 전처리가 필요했다. 특히 [무료배송], (1+1), ★특가할인★ 등과 같이 특정 문구[],{},()와 그 안에 들어있는 단어들을 제거해야했다.

 

 

 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# [] / () 지우기
key_list2 = []
    
for key in key_list :
    if '[' and '(' in key :
        key = re.sub(r'\[[^)]*\]''', key)
        key_re = re.sub(r'\([^)]*\)''', key)
        key_list2.append(key_re)        
    elif '[' in key :
        key_re = re.sub(r'\[[^)]*\]''', key)
        key_list2.append(key_re)
    elif '(' in key :
        key_re = re.sub(r'\([^)]*\)''', key)
        key_list2.append(key_re)
    elif '★' in key :
        key_re = re.sub(r'\★[^)]*\★''', key)
        key_list2.append(key_re)
    else :
        key_list2.append(key)
print('(),[]삭제 완료')    
cs

이를 제거할 수 있는 코드 

 

 

 

re.sub(r'\([^)]*\)', '', key)

붉은 색 글씨 속에 있는 것들이 제거 됨을 알 수 있다.

개발자에게 쉬는 날은 없다. - 기억하자

 

 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
    #형태소 분류
    titles =[]
    for key in key_list2 :
        titles.append(re.compile('[^가-힣]').sub(' ',key))
        # '가'부터 '힣'빼고 나머지 제외(한글모두)
        # ^:뒤에 붙은 것 제외하고 모두
        #정규표현식 or 점프투파이썬 정규표현식 찾아보기
 
    df_title = pd.DataFrame(titles, columns=['title'])
    df_title['category'= category
    df = pd.concat([df, df_title], axis = 0, ignore_index=True)
    
    print(f'{category} 추가')
    print('-'*30)
 
if 'Unnamed: 0' in df.columns :
    df = df.drop(['Unnamed: 0'], axis=1)   
    df = df.dropna(axis=0)
    
# ' ' 스페이스 공백 지우기 
index_list = []
for i in range(len(df)):
    if df['title'][i].isspace() == True :
        index_list.append(i)
 
df = df.drop(index= index_list, axis = 0)
    
df.to_csv('test_data.csv', encoding='utf-8-sig')    
cs

다른 팀의 경우 조금 더 장문의 글을 형태소 분석을 해야 해서 mecab을 이용했다. 하지만 우리의 경우 제목이 길지 않아서 간단하게 okt로 형태소 분류를 진행했다. 영어의 경우, 대부분 브랜드 네임이라서 따로 카테고리 분류를 진행하지 않았다.

하지만 문제가 생긴 부분은 영어가 사라진 부분이 NaN 값이 아닌 공백으로 존재하고 있었다. 그래서 공백으로만 존재하는 행을 제거했다. isspace()일 경우 따로 리스트를 생성해서 drop하는 방식을 택했다. 

 

 

 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
import sys
from konlpy.tag import Okt
from collections import Counter
from wordcloud import WordCloud
 
def get_noun(category):
    
    okt=Okt()
    noun = okt.nouns(category)
    for i,v in enumerate(noun):
        if len(v) < 2:
            noun.pop(i)
            
    count = Counter(noun)
    noun_list = count.most_common(100)
    
    return noun_list
 
def visualize(noun_list):
    
    wc = WordCloud(font_path='Jalnan.ttf',\
              background_color = "white", \
              width = 1000, \
              height=1000, \
              max_words=100, \
              max_font_size=300)
    
    wc.generate_from_frequencies(dict(noun_list))
    wc.to_file('10x10_WordCloud.png')
    
if __name__=='__main__':
    filename = sys.argv[1]
    
    f= open('10x10(kor2).csv''r', encoding='utf-8')
    category = f.read()
    noun_list = get_noun(category)
    visualize(noun_list)
 
 
print('저장완료')
cs

추가로 모델 학습을 하는데 있어 불필요한 용어들이 너무 많아서 워드클라우딩을 사용하여, 불용어 리스트를 만들어서 제거하였다.  

 

 

+ Recent posts