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

목차

1. SKT-AI/KoGPT2와 자연처(NLP)

2. 데이터 전처리 (나무위키, 블로그)

3. KoGPT2와 기능구현 (인풋 아웃풋 조정)

4. 짧은 텍스트 / 문장유사도

5. 배포 (구글 애즈, GA, AWS)

 


 

[네이버 어벤저스] 내가 보는 상품 홍보문구, 실은 AI가 썼다고?

국민 포털로 출발한 네이버가 다양한 플랫폼과 서비스들로 영역을 대폭 확장하고 있다. 이용자 경험을 위한 체질 개선뿐만 아니라, 중소상공인(SME) 및 창작자들과 이용자들을 연결해 디지털 비

n.news.naver.com

[네이버 어벤저스] 내가 보는 상품 홍보문구, 실은 AI가 썼다고?

뭔가 우리 팀에서 진행했던 파이널프로젝트 결과가 나오고 나서 부랴부랴 기사를 낸 것 같은 착각이 들어서 뿌듯했다. 기업에서도 이런 생각을 하고 있었고, 우리가 이걸 해냈구나? 하는 느낌.. 빨리 파이널 프로젝트 글을 쓰고 나서 다른 글도 올려야 하는데, 추가로 gpt3와 자연어 공부를 같이 하고 있어서 글 쓰는 시간도 부족한 것 같다. 그리고 정리를 해놨던 파일이 갑자기 증발이 되는 바람에 목차도 많이 줄였다.

 

우리가 필요한 데이터는 기업 설명(단순 기업명 가지고는 안 됐다)과 슬로건, 광고 문구였다. 하지만 온라인 상에는 그러한 데이터셋이 존재하지 않았다. 슬로건, 광고문구 데이터를 어떻게 모았는가 하면, 블로그에서 기업명과 함께 크롤링을 하고, 기업명을 네이버, 나무위키, 사람인 등에 다시 검색해서 기업의 정보를 모았다. 사람인에서 기업 설명이 깔끔하게 입력이 됐으면 이를 사용했을텐데 이상하게 분류된게 많아서 결국 손으로 데이터 전처리를 진행했다.

 

(* 잡담 : 도전하자. 프로젝트에 올라온 글들의 제목이 매력이 없어 보인다. 추후에 구글에서 검색이 되면서 사람들이 클릭하게끔 또 만들어야할 듯 싶다)

 

 

 

 

출처 : python awesome

어떻게 프로젝트를 진행했는지 다시 생각해보니, 다양한 시도를 하긴 했구나 하는 느낌? style gan을 사용해서 로고생성까지 시도하려고 했으나 생각보다 결과가 좋지 않고 비효율적이었다. 그래서 새로운 캐릭터를 생성하자는 느낌으로 해볼까 했는데, 캐릭터를 크롤링하고 찾는 것도 일일 것 같아서 우선 할 수 있는 부분에 더욱 중점을 뒀다.

 

 

 

 

출처 : 금강일보

네이버 블로그 크롤링의 문제점

1. 우선 java script로 구성이 돼서 동적 크롤링을 사용해야 한다. 2. iframe으로 둘러 쌓여서 크롤링이 쉽지 않았다그리고 스마트 에디터 one과 2.0 버전에 따라 크롤링 해야하는 방법이 다르다.

 

동적 크롤링인 셀레니움이 속도도 느리고 중간중간 빠지는 데이터들도 있어서 사용하는 것을 별로 안 좋아해서 어떻게 하면 beautiful soup으로 할까 하다가.. 네이버 블로그 검색창에 제목을 검색해서 하니까 잘 진행이 됐다. link가 포함된 부분을 크롤링하고 get('href')로 링크만 크롤링을 했다.

 

 

 

1
2
3
4
5
6
7
8
9
10
11
12
# 네이버 블로그 iframe 제거 함수
def delete_iframe(url):
    headers = {
        "User-Agent""Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.93 Safari/537.36"}
   req = requests.get(url, headers=headers)
   req.raise_for_status()  # 문제시 프로그램 종료
    soup = BeautifulSoup(res.text, "lxml")
 
    src_url = "https://blog.naver.com/" + soup.iframe["src"]  # iframe 안에 있는 src 부분을 가져옴
 
    return src_url
 
cs

출처 : https://github.com/tiger-beom/naverblog_scraping

 

iframe 제거 함수를 미리 정의해놓으면 나중에 네이버 블로그 크롤링하는데 편리할 것이다. 2.0 -> 3.0 -> one 다 써봤었는데 2.0보다는 one이 더 깔끔하긴 하지만.. 정말 초반에는 오류 투성이었다. 글을 써야 하는데 평상시보다 몇 배가 더 걸렸던 기억이 있다. 투데이 2만이 넘었던 블로그였는데 ..

 

 

 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# 네이버 블로그 글 크롤링 함수
def text_scraping(url):
    headers = {
        "User-Agent""Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.93 Safari/537.36"}
    req = requests.get(url, headers=headers)
    req.raise_for_status()  # 문제시 프로그램 종료
    soup = BeautifulSoup(res.text, "lxml")
 
    if soup.select_one('div.se-main-container'):
        text = soup.select_one('div.se-main-container').text
        text = text.replace('\n''')
        # print("블로그")
        return text
    elif soup.select_one('div#postViewArea'):
        text = soup.select_one('div#postViewArea').text
        text = text.replace('\n''')
        # print('블로그 2.0')
        return text
    else:
        return "오류"
cs

div.se-main-container가 포함되면 스마트에디터-one, div#postViewArea가 포함이 되면 2.0 버전이라고 생각하면 된다. 네이버 포스트의 경우 또 다른 방식으로 글을 크롤링해야 한다. 궁금하면 위의 깃허브로 들어가시면 됩니다.

 

 

 

 

나무위키 크롤링 문제점

동적, 정적 크롤링이 모두 안 됐다! 왜 그런가 찾아보니 나무위키에서 크롤링 하는 것을 원천 차단한 모양이다. 트래픽 과부하를 막기 위해서 그런 것으로 보인다. 그래서 봇으로 인식을 하면 아예 창이 들어가지지 않았다. 

 

우선 코드를 짜봤는데 진행이 되지 않았고, 내 문제인가 싶어서 위키독스에 나와있던 코드를  따라했는데도 되지 않았다. 결국 구글링을 열심히 해서 봇이 아닌 사람으로 인식하는 코드를 추가로 넣어줘야 했다

 

 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#봇이 아닌 사람으로 인식하는 코드 / 자신의 크롬 위치 입력
subprocess.Popen(r'C:\Program Files (x86)\Google\Chrome\Application\chrome.exe --remote-debugging-port=9222 --user-data-dir="C:\chrometemp"')
 
options = webdriver.ChromeOptions()
options.add_experimental_option("debuggerAddress""127.0.0.1:9222")
 
chrome_ver = chromedriver_autoinstaller.get_chrome_version().split('.')[0]
try:
    driver = webdriver.Chrome(f'./{chrome_ver}/chromedriver.exe', options=options)
except:
    chromedriver_autoinstaller.install(True)
    driver = webdriver.Chrome(f'./{chrome_ver}/chromedriver.exe', options=options)
 
driver.implicitly_wait(3)
start = time.time()
cs

첫번째 줄에 있는 코드는 컴퓨터마다 크롬 위치가 다를 수 있기 때문에 확인해야 한다. 그리고 나서 크롬드라이버를 아예 새로 설치하는 것 같았다. import chromedriver_autoinstaller 를 통해서 패키지를 추가하자.

 

이렇게 코드를 입력하면 이제 본격적으로 셀레니움을 통해서 검색을 하면 된다고 생각했지만... 또 문제가 있었다. 어떤 정보를 긁어와야 하는지? 동음이의어가 존재할 때 어떻게 처리를 할지? 그리고 기업명이 단순히 기업명만 있으면 좋겠지만, 슬로건이나 광고문구를 가져오다 보니 지역명이나, 캠페인도 포함이 돼서 이를 먼저 처리해야했다. 그리고 no_search 리스트를 만들어서 제외했다.

 

 

 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
            same = driver.find_element_by_xpath('//*[@id="app"]/div/div[2]/article/div[3]/div[1]/ul/li/a').text
 
            #동음이의어가 존재할 경우 원하는 정보를 긁어오지 않음, 예외로 뺴기 (분류에 동음이의어/* 여부)
            if '동음이의어' in same:
                explane = 'same'
                explanes.append(explane)
 
            #아닐 경우 그대로 진행
            else :
               try:
                    explane = driver.find_element_by_css_selector('div.wiki-heading-content').text
                    explanes.append(explane)
                    #print(explane)
 
                except:
                    explane = 'NaN'
                    explanes.append(explane)
cs

간단하게 접근을 했다. 개요에서 회사에 대한 설명을 긁어오기 전에 우선 동음이의어가 검색이 되는지 파악을 하고, 검색이 되는 경우 크롤링을 진행하지 않았다. 그리고 사람인, 네이버 뉴스 검색에서 회사 설명을 찾았다. 예전에 기사를 써본적이 있는데, 처음에 회사나 제품, 서비스에 대한 설명을 간단하게 적어놓는다는 점을 착안했다.

 

이렇게 크롤링을 하면 되겠다 싶었는데... 결과를 비교하니 참담했다. 그래서 손크롤링을 진행했다고 한다. ㅠㅠㅠ

+ Recent posts