검색 키워드와 데이터 독점 문제, 오픈API로 키워드 추출 방법 #1

우리들은 하루에도 수십 번씩 인터넷을 검색하죠. 스마트폰을 이용하건, 노트북이나 PC를 이용하건 간에 말이죠. 우리가 입력하는 검색어는 직접 혹은 간접적 필터링을 통해 검색어 또는 검색 키워드로 데이터화 됩니다. 이번 글에서는 이러한 검색 키워드에 대해 이야기를 해 보겠습니다.

검색 키워드와 데이터 독점 문제, 오픈API로 키워드 추출 방법
검색 키워드와 데이터 독점 문제, 오픈API로 키워드 추출 방법


검색 키워드와 데이터 독점 문제

예전에는 포털 사이트에서 실시간 검색어나 급상승 검색어 등을 공개했습니다. 하지만 지금, 네이버, 구글 같은 대형 포털들은 검색 키워드와 관련한 데이터를 공개하지 않고 있죠. 일부 광고용 데이터와 관련한 키워드만을 오픈하고 있어요.

그러면 이런 검색 키워드는 검색 포털과 같은 대기업의 소유일까요? 검색어를 입력할 때 포털에서 제공하는 단어를 선택하거나 그 중 몇 개를 조합하는 것이 아니라 사용자가 개인의 아이디어를 통해 검색어를 만들어 냅니다. 이때 이 검색어는 누구의 것일까요?

기업이 검색 데이터를 폐쇄적으로 운영하는 가장 큰 이유는 검색 트렌드 데이터를 공개하면 특정 키워드가 얼마나 인기 있는지를 누구나 파악할 수 있고, 경쟁 기업들이 이를 활용해 효과적인 마케팅 전략을 수립할 수 있을 거예요. 뿐만 아니라, 데이터를 독점하면 검색 광고 및 기타 비즈니스 모델을 통해 수익을 극대화할 수도 있겠죠.

즉, 검색어 데이터는 단순한 정보가 아니라 기업의 수익과 직결되는 전략적 자산으로 인식되었고, 그 결과, 일반 사용자들은 검색 트렌드를 쉽게 확인할 수 없으며, 검색 데이터는 특정 기업의 이익을 위해 제한적으로 활용되고 있는 거예요.


검색 키워드 독점이 미치는 영향

  1. 일반 사용자:
    • 검색 트렌드를 쉽게 파악할 수 없어 정보 접근성이 낮아짐.
    • 검색 알고리즘이 점점 더 불투명해지면서 신뢰성이 떨어짐.
  2. 중소기업 및 자영업자:
    • 키워드 기반 마케팅이 어려워지고, 유료 광고에 대한 의존도가 높아짐.
    • 검색 데이터를 활용한 소비자 분석이 제한됨.
  3. 언론 및 블로거:
    • 실시간 검색어가 사라지면서 뉴스 및 콘텐츠 기획이 어려워짐.
    • 키워드 트렌드를 활용한 정보 생산이 제한됨.
  4. 기술적 문제:
    • 검색 알고리즘이 불투명해지고, 데이터 독점이 심화됨.
    • 오픈소스 및 연구 목적의 데이터 활용이 어려워짐.


오픈API로 키워드 추출 방법

그러면 개인은 어떻게 할 수 있을까?

현재까지 우리나라는 아무런 생각이 없죠. 너무 큰 일이 많자나요. 입만 열면 거짓말만 하는 것이 아직도 있고, 그것을 추종하는 것들도 아직 상당합니다. 너무 혼란스럽죠. 또, 이와는 별개로 오래전부터 쌓여온 대기업 중심의 사회 인식은 아직도 없어지지 않고 있어요.

이러한 가운데, 어느날 갑자기 정보 공유에 대한 사회인식이 깊어지고, 즉시 데이터가 공개될 거라는 기대를 함부로 할 수 없죠. 때문에 현재 할 수 있는 방법 중 뭐가 있을까 고민할 수 밖에 없습니다.


크롤링과 오픈API

검색 키워드를 찾기 위해 우선 먼저, 생각해 볼 수 있는 것은 뉴스를 크롤링해서 키워드를 찾아볼 수 있을 거예요. (크롤링은 문제가 될 수 있는 부분이므로 상용화나 개인용이라고 해도 해당 서버에 무리를 줄 정도가 되어서는 안될 거예요.) 그럼에도 아래와 같이 파이썬 코드를 구성해 볼 수 있을 거예요.

url = "https://news.com/section/IT&기술"
headers = {"User-Agent": "Mozilla/5.0"}
response = requests.get(url, headers=headers)
soup = BeautifulSoup(response.text, "html.parser")

titles = []  # 뉴스 제목 저장 리스트
for item in soup.select(".sa_list li a"):
    title = item.get_text(strip=True)
    title = re.sub(r'\[.*?\]', '', title)  # 괄호 안의 문자 제거
    titles.append(title)
    
df = pd.DataFrame({"뉴스 제목": titles})
df.to_excel("IT뉴스_제목.xlsx", index=False, engine="openpyxl")
  • BeautifulSoup은 파이썬에서 웹 크롤링을 위한 라이브러리입니다. HTML이나 XML 같은 구조화된 데이터를 가져와서 우리가 원하는 정보를 뽑아내기 쉽게 만들어주는 도구 정도로 생각할 수 있습니다.
  • BeautifulSoup를 이용해서 임의의 “https://news.com/”이라는 뉴스 사이트(가상의 URL입니다.)에서 특정 카테고리의 뉴스들을 읽어 옵니다.
  • 데이터가 많을 수 있으므로 뉴스의 제목들만 가져와서 엑셀 파일에 기록합니다.

뉴스의 제목만 사용하는 이유는 뉴스의 헤드라인 즉 중요한 키워드를 제목으로 사용하기 때문이죠. 본문을 다 확인하지 않아도 해당 뉴스의 주요 키워드는 대부분 제목으로 나타나기 때문이에요.


이제, 저장한 엑셀 파일에서 뉴스 제목을 읽어 와서 핵심 키워드를 추출하는 코드를 구성해 보죠.

from konlpy.tag import Okt

df = pd.read_excel(file_path)
df.dropna(inplace=True)  # NaN 값 제거
    
okt = Okt()
stopwords = {"속보","관련","뉴스","보기","동영상기사","신고","기사","관련뉴스"} # 제외 문자
keyword_list = []
    
for title in df["뉴스 제목"]:
    title = re.sub(r'\[.*?\]', '', title)  # 괄호 안 문자 제거
    nouns = okt.nouns(title)  # 명사만 추출
    nouns = [word for word in nouns if word not in stopwords and len(word) > 1]  # 불용어 및 한 글자 제외
    keyword_list.extend(nouns)
    
keyword_counts = Counter(keyword_list).most_common(5)
trending_keywords = [keyword for keyword, _ in keyword_counts]
  • Konlpy는 한국어 자연어 처리(NLP, Natural Language Processing)를 위한 파이썬 라이브러리입니다.
  • Okt()는 Open Korean Text의 약자로, 한국어 텍스트를 빠르고 정확하게 분석해주는 도구입니다.
  • okt.nouns(title)은 뉴스 제목(title)에서 명사만 뽑아내 줍니다. 예를 들어, “애플 신제품 출시”라는 제목이 있으면 “애플”, “신제품”, “출시” 이렇게 명사만 리스트로 만들어 주죠. 그리고 또, 불용어(예: “뉴스”, “속보” 같은 의미 없는 단어)를 걸러내서 중요한 키워드만 남겨줍니다.


여기까지 추출한 키워드만으로 어떤 의미가 있을까요? 물론 이미 그 자체로 의미를 갖을수도 있어요. 뉴스 데이터가 매우 많고, 중복되는 특정 키워드가 눈에 띄게 분명하다면 그건 그대로 의미를 부여할 수 있을 거예요.

하지만 그럼에도 조금 더 정량적인 데이터를 기반으로 해당 키워드에 대해 분석해 보고 싶다면 네이버 개발자 센터에서 제공하는 API를 활용할 수 있을 거예요. 물론 API를 활용하기 위해서는 사전에 사용자 등록이 되어야 합니다.

다음과 같이 코드를 구현해 볼 수 있어요. 코드 구성 방법은 위 네이버 개발자 센터에서 API 가이드와 예제를 보면 쉽게 알 수 있어요.

url = "https://openapi.naver.com/v1/datalab/search"
data = {
    "startDate": start_date,
    "endDate": end_date,
    "timeUnit": "date",
    "keywordGroups": [
        {
            "groupName": kw, 
            "keywords": [kw] + expanded_keywords.get(kw, [])[:max(0, 19 - len([kw]))]
        }
         for kw in trending_keywords
    ],
    # "device": "pc",
    "ages": ["3", "4", "5", "6", "7", "8", "9", "10"]
}
headers = {
    "X-Naver-Client-Id": CLIENT_ID,
    "X-Naver-Client-Secret": CLIENT_SECRET,
    "Content-Type": "application/json"
}
response = requests.post(url, headers=headers, data=json.dumps(data))
result = response.json()
print(json.dumps(result, indent=4, ensure_ascii=False))
  • CLIENT_ID는 네이버 개발자 센터에 등록하면 알려줍니다. CLIENT_SECRET도 마찮가지고요.
  • startDate와 endDate로 해당 키워드의 통계 기간을 설정할 수 있고, timeUnit로 일별로 볼지, 월별로 또는 주별로 볼지를 설정합니다.

이렇게 코드를 구성하는 이유는 앞서 추출한 키워드가 상당히 많을 경우 네이버 데이터 랩을 통해서 얻는 결과를 빠르게 얻기 위해서 입니다. 다시 말하면 아래와 같은 화면에 일일이 검색 키워드를 직접 넣어야 하는 것을 자동화 한다고 볼 수 있습니다.

네이버 데이터 랩 화면
네이버 데이터 랩 화면


위와 같이 코드를 실행하면 뉴스 제목에서 추출한 검색 키워드를 네이버 데이터 랩에서 제공하는 키워드 조회 점수를 확인해 볼 수 있습니다. 결국 뉴스에 나온 수많은 키워드 중 사용자가 가장 많이 검색한 키워드가 무엇인지 찾을 수 있겠죠.






답글 남기기