특허 데이터 크롤링 및 관계도 생성하기

안녕하세요, 11기 사무자동화 AI 수강생 박시우입니다.

이번 과정을 수강하게 되면서 제가 일상적으로 진행하는 반복 업무 중 자동화 할 수 있는 업무가 무엇인가 고민하게 되었습니다.

고민하는 과정에서 평범한 엔지니어로서 늘 하는 기술 특허 검색이 생각나게 되었고, 챗지피티와 함께 어떻게 하면 자동화가 가능할지 생각해보게 되었습니다.

어쩌다보니 진도가 쭉쭉 나가 전체 자동화까지 이번주차에 모두 완료하게 되어서, 전체적인 과정과 생각의 흐름을 여러분과 공유하고자 합니다.


기존 업무 과정


  1. 특허 검색은 다양한 방법이 사용 가능하지만 저는 구글 특허 검색을 많이 활용하는 편입니다. 원하는 키워드를 입력해서 검색하면 아래와 같은 검색결과가 나오고, 원하는 아이디어가 있는 특허를 찾을 때 까지 한없이 스크롤을 하거나 검색어를 바꿔가며 추가로 검색을 해야 합니다.

  1. 원하는 내용과 비슷한 특허를 찾은 후에는 관련 특허도 둘러봐야 합니다. 아래 내용과 같이 각 특허 페이지에는 인용/피인용 특허 리스트가 있습니다. 이 리스트를 하나 하나 클릭해서 특허 내용을 확인하고, 그 연관된 특허에 관한 내용을 또 확인하고, 원하는 내용이 나올때까지 끝없이 반복해야 합니다.

  1. 상기의 과정이 도움이 되지 않는 것은 아니지만, 시간이 많이 걸리는 과정이므로 자동화를 적용하여 좀 더 효율적인 방식이 있지 않을까 고민하다 다음과 같이 자동화를 시도해보게 되었습니다.


자동화 계획


  1. 우선 특허간 인용/피인용 관계도를 어떻게 시각화 하면 좋을지 고민하던 중 연구와 지식관리 세션에서 옵시디언에 대해서 알게 되었습니다. 사무자동화와 같은 목요일 수업이라 청강도 어려운것이 아쉽지만, 어쨌든 옵시디언을 사용하면 아래와 같이 노드 연결을 통한 관계도 그래프를 그릴 수 있어 특허 간 관계를 시각화해보자 합니다. 각 특허에 대한 md 파일을 생성 한 후 내용으로 인용 관계를 링크로 넣으면 되겠네요.

  1. 대략적인 방향을 잡았으니 챗지피티에게 방법에 대해 질문해 보도록 하겠습니다. 앞으로 캠프에서 배울 재피어나 메이크 등 다양한 플랫폼 사용 전에 챗지피티의 도움만으로 코딩을 통한 자동화를 시도하는 것도 나쁘지 않겠다 싶어 그냥 질문을 해 봤습니다.


  1. 챗지피티가 파이썬을 사용하여 크롤러를 만들고, 크롤러가 수집한 데이터를 md 파일 형식으로 저장 한 후 옵시디언에서 그래프를 그리는 과정에 대해서 설명 해 주었습니다. 특별히 빠진 내용이나 문제가 없어 보이므로 상기의 절차를 따라 자동화를 진행 해 보겠습니다.


자동화 구현


  1. 자동화 환경 : 챗지피티는 자동화 과정에서 파이썬 사용을 전제로 설명했습니다. 그래서 복잡한 설치 없이 웹 상에서 바로 파이썬을 사용 할 수 있는 구글 코랩을 사용하고자 했습니다. 다만 이 과정에서 문제가 생겼는데, 회사 PC를 사용하다보니 구글 드라이브 접근이 차단되어서 파일 생성 단계를 진행 할 수가 없었습니다. 어쩔 수 없이 로컬 환경에 파이썬을 설치 한 후 이후 과정을 진행하게 되었습니다. 다른 수강생 분들께서는 https://colab.research.google.com/ 에서 부가적인 설치 없이 바로 파이썬을 연습 해 보실수 있으니 추천 드립니다.


  1. 크롤링 : 크롤링 도구 선택으로는 셀레니움과 bs4 파이썬 패키지 중 bs4를 골랐습니다. 챗지피티의 도움을 받아 몇 가지 테스트를 해 보았는데, 구글 특허는 상당히 관대하므로 Requests와 bs4 패키지만으로도 특정 링크에 대한 소스를 충분히 받아 올 수 있었습니다. 제가 원하는 특허의 링크를 주고 인용, 피인용 리스트 추출을 요청해 보았습니다.


상기 코드를 복사해서 실행 해 보았으나, 제대로 된 결과가 출력이 되지 않았습니다. 계속해서 챗지피티와 대화를 나누며 문제점을 찾아보았습니다.


  • 다른 특허의 링크를 주며 동일한 요청 - 실패

  • 특허 내용 중 정확히 원하는 섹션의 구체적인 명칭까지 입력 - 실패

  • 특허 페이지의 html 소스 파일을 통째로 챗지피티에게 업로드 후 요청 - 실패

  • 특허 페이지의 html 소스에서 원하는 내용이 있는 부분 스크린샷을 업로트 - 실패


이 부분이 전체 자동화 과정 중 가장 큰 고비였습니다. 다양한 방법을 시도 해 보았지만 html 소스의 구조가 너무 복잡해서인지 챗지피티가 제가 원하는 부분을 정확하게 찾지 못했습니다. 어쩔 수 없이 html 소스를 직접 읽어서 원하는 데이터가 있는 부분을 지정 해 주어야 했습니다.


좀 더 명확한 지시를 주자 제가 원하는 기능이 성공적으로 구현 됐습니다. 상기 코드를 복사해서 실행하니 원하는대로 인용, 피인용 특허 리스트가 출력이 됩니다.

2. 옵시디언 파일 생성 : 원하는 인용, 피인용 특허 리스트가 나왔으니 옵시디언에서 사용할 .md 마크다운 파일을 생성해야 합니다. 다양한 기능이 있으나 그래프 관계도를 위해서는 링크 기능만 사용하면 됩니다. 링크는 [[내용]]과 같이 이중대괄호 안에 내용을 넣으면 됩니다. 추가로 편의를 위해 (내용)과 같이 괄호안에 웹사이트 주소를 넣으면 하이퍼링크가 생성되는 기능도 넣어놓겠습니다.


재귀 실행 관련하여 챗지피티의 오해가 있었는지 약간의 추가 설명을 거쳤고, 아래는 최종적으로 챗지피티가 생성한 코드입니다.

import os
import requests
from bs4 import BeautifulSoup

path_obsedian = 'C:/Users/Lenovo/Documents/Patent T1/'

def get_list(patent_num):
    url = f'https://patents.google.com/patent/{patent_num}/'
    response = requests.get(url)
    response.raise_for_status()
    
    page_source = response.text
    soup = BeautifulSoup(page_source, 'html.parser')
    
    def extract_patents(soup, itemprop_list):
        patents = []
        for itemprop in itemprop_list:
            section = soup.find_all('tr', {'itemprop': itemprop})
            for tr in section:
                span = tr.find('span', {'itemprop': 'publicationNumber'})
                if span:
                    patents.append(span.get_text())
        return patents
    
    citedby_itemprops = ['backwardReferencesOrig', 'backwardReferencesFamily']
    cited_itemprops = ['forwardReferencesOrig', 'forwardReferencesFamily']
    
    citedby = extract_patents(soup, citedby_itemprops)
    cited = extract_patents(soup, cited_itemprops)
    
    return cited, citedby

def create_md(patent_num, cited, citedby):
    patent_url = f'https://patents.google.com/patent/{patent_num}/'
    file_name = os.path.join(path_obsedian, f"{patent_num}.md")
    content = f'[{patent_num}]({patent_url})\n\n'
    for i in cited:
        content += f'[[{i}]]\n'
    with open(file_name, 'w', encoding='utf-8') as file:
        file.write(content)

    for i in citedby:
        file_name = os.path.join(path_obsedian, f"{i}.md")
        content = f'[{i}]({patent_url})\n\n[[{patent_num}]]\n'
        with open(file_name, 'w', encoding='utf-8') as file:
            file.write(content)

# 루트 특허 번호를 처리하고, 인용 및 피인용 특허에 대해 한 번만 반복
def main():
    root_patent = 'US7504754B2'  # 루트 특허 번호를 여기에 입력
    cited, citedby = get_list(root_patent)
    
    create_md(root_patent, cited, citedby)
    
    # 인용된 특허에 대해 한 번만 반복
    for patent in cited:
        sub_cited, sub_citedby = get_list(patent)
        create_md(patent, sub_cited, sub_citedby)
    
    # 피인용된 특허에 대해 한 번만 반복
    for patent in citedby:
        sub_cited, sub_citedby = get_list(patent)
        create_md(patent, sub_cited, sub_citedby)

if __name__ == "__main__":
    main()

3. 자동화 실행 : 코드가 완성되었으니 실행 해 보도록 하겠습니다. 코드를 실행하면 제가 지정한 폴더에 특허 정보가 담긴 .md파일들이 생성되고, 옵시디언을 통해서 그래프를 생성 할 수 있습니다.

제가 원하는대로 인용 관계가 시각화 된 그래프를 볼 수 있습니다.


개별 파일에서도 하이퍼링크와 연관특허 리스트가 잘 나와있는 것을 볼 수 있습니다. 이제 코드의 정상 작동을 확인 했으니 특허 분석에 활용해보겠습니다. 시작 특허를 제가 관심있는 특허로 지정했기 때문에, 관계도에서 다수의 링크로 연결 된 특허일수록 제가 원하는 주제와 관련이 높다고 생각 할 수 있습니다. 그러므로 관계도에서 눈에 띄는 노드의 특허명을 확인 한 후 반복해서 크롤러를 실행 해 보겠습니다.

(도중에 테마를 제 스타일로 바꿨습니다)

Patents.mp4

서너개 정도의 눈에 띄는 특허에 대한 관련 특허 리스트를 끌어오니 어느 새 파일이 5000개를 넘었습니다. 크롤러와 옵시디언이 열심히 일하고 있고, 저는 그저 커피를 타오면 됩니다.

최종적으로 완성 된 그래프입니다.

총 5253개의 특허 링크가 생성이 됐고 Existing files only 필터를 켜 놓았기 때문에 자동적으로 2개 이상의 링크가 생성된 노드만 보이고 있습니다. 언뜻 보면 복잡해 보이지만 찬찬히 그래프를 보면 여러가지 인사이트를 얻을 수 있습니다. 가령 중앙에 위치한 특허일수록 제가 원하는 키워드에 가까운 특허라고 볼 수 있고, 대다수의 노드를 공유하는 두 특허는 패밀리 특허일 확률이 높습니다. 또한 링크 화살표를 통해 제가 검색하지 않은 특허지만 5개 이상의 링크가 있는 특허를 확인해보니 제가 원하는 주제와 유사성이 상당한 특허였습니다.

상기 과정을 통해서 여러 특허 간 관계 분석과 연관성이 높은 특허를 빠른 시간 내에 찾을 수 있습니다. 현실적으로 자동화가 없다면 5000개 이상의 특허 정보를 열람하는건 불가능에 가깝습니다. 하지만 크롤러의 도움을 받으니 총 실행 시간은 약 5분에 불과했고, 컴퓨터 성능만 받쳐준다면 몇 만개 단위 노드의 그래프도 클릭 몇 번으로 생성 할 수 있습니다. 현재까지는 가장 단순한 형태의 분석만 진행했지만, 익숙해진다면 추가 데이터를 더 끌어와서 옵시디언의 검색 기능을 활용해 좀 더 심도깊은 분석도 가능하다고 생각합니다.


아쉬운 점 및 개선 방향


  • 크롤링 과정에서 html 소스를 챗지피티가 정확하게 인식하지 못해서 시행착오 시간이 좀 길었고, 순수하게 챗지피티만으로는 해결이 어려워서 직접 html 소스를 읽은 후 챗지피티에게 지정해 주어야 했습니다. 따라서 엄밀히 말해 아무런 사전 배경 지식도 없이 모든 과정을 쉽게 진행하기는 어렵다고 생각합니다.

  • 크롤링을 통한 특허 분석은 정량적 분석에 가깝습니다. 초기 특허 분석에서는 정량적 분석도 중요하지만, 특정 방향을 결정 한 이후에는 특허 하나 하나에 대한 정성적 분석이 더 중요합니다. 대량의 특허를 빠르게 훑을 수 있다는 건 장점이지만, 현재까지 정성적 분석에 대한 자동화는 어떻게 접근해야 할지 방향을 잡기 어렵습니다.

  • 추가 개선 사항으로는 구글 특허 페이지에서 좀 더 많은 정보, 특허출원인, 출원년도, 등록년도 등을 가져와 마크다운파일에 정리하면 좀 더 다각적인 분석이 가능하다고 생각합니다.


이상 11기 수강생 박시우였습니다.

많은 의견 공유해 주시면 감사하겠습니다!


#11기사무자동화

11
5개의 답글

👉 이 게시글도 읽어보세요