728x90
반응형

편집자 주: 이 프레젠테이션은 Greg Roberts가 GraphConnect Europe 2016년 4월에 발표한 내용이에요. 그가 다룬 내용을 간단하게 요약해 볼게요.

    • Stack Overflow 태그 및 주제 키워드를 사용한 자동화된 메타데이터 생성
    • 컨텍스트를 위한 온톨로지 추가
    • 키워드 데이터 및 하위 섹션에 대한 전자책 구문 분석
    • 자동 페이지 순위 및 고객 프로필에 대한 맞춤형 추천


오늘은 메타데이터 생성을 자동화하는 방법에 대해 이야기해볼까 해요.

핵심은 간단해요. 일련의 주제와 그 주제들 간의 관계만 있으면 되죠. 시작하기 좋은 곳이 어디냐구요? 바로 Stack Overflow에요. 여기엔 1,000만 개 이상의 질문과 1,900만 명 이상의 사용자가 있거든요.

모든 질문에는 주제와 관련된 태그가 붙어있고, 이건 커뮤니티에서 관리하고 조정하죠. 하나의 질문에 여러 개의 태그가 붙을 수도 있는데, 이는 태그들 사이에 관계가 있다는 뜻이에요. 또, 주제가 동시에 등장하는 빈도는 간선의 가중치가 되기도 하구요. 이 모든 걸 그래프에 넣을 수 있어요.

다음은 "Graph Database" 주제에 가장 많이 사용되는 태그들의 그래프에요.

프로그래밍 언어처럼 구체적인 주제도 있지만, , NoSQL, 데이터베이스처럼 좀 더 추상적인 주제도 있다는 걸 알 수 있죠. 이걸 보면, 데이터를 통해 통찰력을 얻을 수 있도록 활용할 수 있는 다양한 네트워크 효과가 있다는 게 분명해져요.

다음으로는 이 주제 네트워크를 콘텐츠에 연결해야 해요. Rik Van Bruggen의 책에 대한 페이지에서 키워드가 풍부한 부분을 가져오면 이 작업을 할 수 있어요. Neo4j 배우기 책 말이죠. Stack Overflow 태그를 사용해서 키워드를 필터링하면 콘텐츠에 대해 훨씬 더 명확하게 파악할 수 있어요.

이것도 좋은 시작이긴 하지만, 아직 유용하다고 하기엔 정보가 너무 많죠. 예를 들어 "forloops"라는 용어가 있는데, 이걸 보면 팩트 출판에서 가장 인기 있는 주제 중 하나인 것 같아요. 하지만 지금은 단순히 단어 수만 세고 있을 뿐이라, 문서가 실제로 무엇에 대한 내용인지는 전혀 알 수 없어요.

그렇다면 어떻게 해야 불필요한 정보들을 없애고 맥락을 파악할 수 있을까요? 모든 문서에서 해당 용어의 공통성과 용어 발생의 균형을 맞추는 빈도 역 문서 빈도 알고리즘(tf-idf 알고리즘)을 사용하면 돼요.

예를 들어 "for"처럼 모든 문서에 나타나는 단어가 있다면, 높은 용어 빈도(TF) 점수의 균형을 맞추기 위해 IDF 점수가 매우 낮아지겠죠. 이렇게 하면 이 문서와 관련된 단어를 더욱 명확하게 보여줄 수 있어요.

이 알고리즘을 위의 메타데이터에 적용하면 정확한 가중치를 통해 용어에 대한 훨씬 더 명확한 그림을 얻을 수 있답니다.

이제 시장에 대한 복잡한 그림을 구축했으니, 시각화 제작과 같이 훨씬 더 흥미로운 작업을 시작할 수 있어요. 다음은 Stack Overflow의 상위 1,000개 태그와 태그 간의 관계에 대한 그래프 시각화랍니다.

웹 개발, 데이터베이스, 프로그래밍 등 Stack Overflow 네트워크에 대표되는 커뮤니티는 현실 세계에서 무슨 일이 일어나고 있는지 보여주는 좋은 예시죠. 주요 영향력자, 커뮤니티, 클러스터도 확인할 수 있고요.

이런 정보는 Packt Publishing에 실제 사용 사례를 제공해줘요. Stack Overflow 태그를 우리 제품에 연결하고, 구매를 통해 고객에게 연결하면 고객 목록을 세분화해서 개인화 마케팅 같은 도구를 통해 매출을 늘릴 수 있거든요.

위 그래프 시각화는 이상적인 예시라는 점을 기억해야 해요. 현실 세계에서는 그래프가 명확하게 정의되지 않은 클러스터가 있는 복잡한 형태일 수 있거든요. 그렇다면 어떤 태그가 핵심 개념인지 어떻게 결정할 수 있을까요? 온톨로지를 추가해서 얻을 수 있는 데이터에 대한 컨텍스트가 필요하답니다.

컨텍스트를 위한 온톨로지 추가

온톨로지는 엔터티와 엔터티 간의 관계를 연결하는 공식적인 방법을 말하는데, Property Graph 모델 측면에서 정의하기 쉬워요.

우리는 먼저 `Node`를 추출하고 고객이 정보를 검색할 때 수행한 작업을 기반으로 클래스 구조를 찾는 작은 수동 태깅 연습부터 시작했어요. 프로그래밍 언어, 데이터베이스, 패러다임, 그리고 그래프에 넣을 수 있는 작업들을 포함하는 클래스도 만들었죠.

예를 들어 프로그래밍 언어 Java로 작성된 데이터베이스인 Neo4j가 있답니다.

여기서 가장 중요한 점은 온톨로지 `Node`가 스택 오버플로 `Node`에 연결된다는 거예요. 우리는 본질적으로 이러한 태그를 상승시켜 우리가 관심 있는 주제임을 나타내는 거죠. 이는 스택 오버플로의 모든 네트워크 효과를 사용해서 온톨로지를 알리고 성장시킬 수 있다는 의미이기도 해요.

예를 들어 모든 주제와 이를 연결하는 프로그래밍 `Node`를 요청할 수 있어요. 예를 들어 Python이 Pandas 및 NumPy에 연결되는 결과를 얻을 수 있겠죠. 이와 같은 목록을 통해 Pandas 및 NumPy와 같은 `Node`가 특정 프로그래밍 언어(이 경우 Python)에 대한 프레임워크임이 분명해져요. 그런 다음 온톨로지를 성장시키는 프로세스를 어느 정도 자동화해서 추천을 개인화하는 데 필요한 핵심 개념과 컨텍스트를 제공할 수 있답니다.

데이터에 가치를 추가하는 방법: 책 구문 분석

그렇다면 지금까지 우리는 무엇을 가지고 있을까요? 우리는 대부분의 고객 접점과 주제에 대한 합리적인 관점을 갖고 있고, 이는 아웃바운드 추천 이메일에 대한 세분화 및 그와 비슷한 작업을 수행하는 데 유용해요. 하지만 실제 콘텐츠가 어떻게 소비되고 있는지에 대해서는 아직까지 알려진 바가 많지 않죠.

물론, 주제 Z를 배우고 싶어하는 사람 Y에게 책 X를 판매하는 것에서 멈출 수도 있지만, 고객에게 더 유용하고 우리가 진정으로 가치를 제공할 수 있는 방법은 고객이 콘텐츠를 어떻게 사용하는지, 무엇에 흥미를 느끼는지, 주제에 대한 학습을 어떻게 구성하는지 이해하는 거예요. 이를 위해서는 책의 실제 부분(장과 섹션)과 해당 섹션을 읽는 사람들의 사용 데이터가 필요하답니다.

책 부분은 .epub 형식으로 저장되는데, 이 형식은 장, 섹션 및 하위 섹션을 구문 분석해서 그래프에 배치할 수 있는 XML이에요. 아래 그래프는 네 개의 장으로 구성된 또 다른 Neo4j 책을 나타내고 있어요. 각 장에는 하위 섹션이 있고 스택 오버플로 태그가 첨부되어 있답니다.

이제 책 내용을 페이지 수준까지 훨씬 더 정확하게 표현할 수 있게 되었어요. 다시 말해, 책에서 모든 Stack Overflow 태그를 가져와서 Rik의 책에 대해 훨씬 더 구체적인 정보를 반환하는 TF-IDF 알고리즘을 적용하는 거죠.

이 방법이 훨씬 더 정확하긴 하지만, 다른 책에는 잘 적용되지 않았어요.

다음 예를 한번 살펴볼까요? 최근에 출간된 또 다른 인기 책이 있는데요, 바로 이에요. 검색 결과로 Perceptron, Scikit-Learn, Eigen, Flask 및 ADA와 같이 책에서 다루는 많은 세부 사항들이 나오네요.

하지만 여기서 눈에 띄게 빠진 것이 하나 있죠. 바로 Python이에요. 이 책은 분명히 Python에 관한 책인데 왜 검색 결과에 포함되지 않았을까요?

이 책에서 Python의 TF-IDF 점수는 0.03으로, 설정해둔 컷오프 값보다 낮아요. 핵심 용어는 포함되어 있지 않지만 Flask, Lasagne 및 gamma와 같은 Python과 관련된 용어가 많이 포함되어 있죠. 그렇다면 어떻게 이 정보를 바탕으로 Python을 다시 연결할 수 있을까요?

인지 심리학에서 유래한 확산 활성화(Spreading Activation)라는 또 다른 알고리즘을 사용해서 기억이 뇌 주위로 흐르는 방식, 즉 뉴런이 다른 뉴런을 활성화하는 방식을 모델링해야 해요. 하지만 이는 정보 검색에도 사용되며 일반적으로 모든 종류의 Neural Network 또는 연관 네트워크에 적용될 수 있어요.

이전에 봤던 그림, 즉 활성화된 콘텐츠 및 관련 주제부터 시작해볼게요.

그 다음엔, 해당 가중치로 활성화된 모든 주제를 반복하면서 해당 주제와 다른 주제 사이의 연결을 추가하는 거예요. 즉, 해당 가중치를 네트워크를 통해 분산시키는 거죠. 이 경우에는 Keras 및 Scikit-Learn에서 Python으로 확산되는 걸 볼 수 있어요.

새로운 더 높은 점수를 받게 되면 Python이 다시 상위권으로 돌아올 거예요 (점수가 0.2에서 0.8로 증가한 것을 참고하세요!).

모델 퍼즐의 마지막 조각은 실제 도서 소비인데요. 구독 라이브러리가 모든 페이지 보기를 관계형 데이터베이스에 저장하고 있다는 점이에요.

아래 그래프는 시간이 지남에 따라 특정 책과 상호 작용하는 사람을 보여주고 있어요. 사람은 그래프 중앙에 있고 다른 Nodes는 섹션과 챕터를 나타내죠. 읽은 섹션은 직접 첨부되어 있답니다.

여러 사용자의 데이터를 보기 시작하면, 어떤 챕터는 완료하는 데 시간이 오래 걸리고 어떤 챕터는 아무도 읽지 않는다는 걸 알 수 있어요. 이런 정보는 정말 중요하죠.

다음은 Rik의 책을 읽은 모든 사람들의 프로필을 모아놓은 거예요. X축은 챕터를, Y축은 챕터 완료율을 나타내요. 파란색 선은 해당 챕터에 있는 섹션당 조회수, 즉 "사람들이 해당 챕터를 얼마나 자주 다시 방문하는가?"를 보여줘요.

이 그래프를 보면, 소개 부분은 많이 사용되지만, 사람들은 책의 내용을 파악하기 위해 2, 3, 4 챕터를 건너뛰고 대부분의 시간을 보내는 경향이 있다는 걸 알 수 있어요. 또한 다른 관련 도구는 많이 사용되지만 시각화 챕터는 그렇지 않다는 것도 알 수 있고요.

이 정보는 책을 챕터 수준에서 검토하고, 제품 개발에 다시 반영하고, 책의 구성 방법을 결정하는 데 매우 유용해요.

한 단계 더 들어가서 고객의 다양한 하위 섹션에 대해 이야기해 볼 수도 있어요. 숙련된 독자와 초보자의 프로필을 비교하면 책을 소비하는 방식이 다를까요? 둘 중 하나가 다른 것보다 챕터를 더 많이 훑어보나요? 그리고 그게 제품 개발에 실행 가능한 정보를 제공할까요?

또는 한 단계 위로 올라가서 사람들이 특정 유형의 책과 일반적으로 상호 작용하는 방식을 살펴볼 수도 있어요. 예를 들어, 사람들은 요리책의 소개 부분을 읽나요? 그렇지 않다면 포함시킬 이유가 없을 수도 있겠죠.

지금까지 개발한 모델을 한번 살펴볼까요?

페이지 수준까지 콘텐츠가 있지만, 책이 XML 형식으로 저장되어 있기 때문에 더 나아가서 코드 조각, 제목, 색인 등을 얻는 데 아무런 문제가 없어요. 코드 조각을 가져와서 여기에 컨텍스트를 추가하면 "이것은 무언가를 설정하고 그에 따라 수행하는 것에 대한 조각입니다."라는 것을 알 수 있는 거죠.

이제 다음 프로덕션 다이어그램을 검토해서 이걸 프로덕션에 적용한 방법을 간단하게 설명하고 싶어요.

AWS에는 Neo4j, 특히 EC2 마이크로 인스턴스가 있어요. 저희는 전체 웹사이트에 1GB의 RAM을 제공하고 있는데, 성능 저하를 전혀 느끼지 못했어요. 이건 정말 Neo4j의 강력함을 보여주는 증거죠.

이건 서버 주변의 얇은 래퍼인 Rails API 뒤에 있고, 저희가 사용하는 다양한 쿼리에 대한 모든 모델은 Cypher 쿼리로 저장돼요. API는 요청을 받고, Cypher 쿼리를 살펴보고, Neo4j에서 쿼리를 실행하고, 프런트엔드에서 렌더링할 일부 표현을 다시 반환해요.

이 강연을 시작하면서 저는 개인화된 추천에 대해 이야기하러 온 것이 아니라고 말했었죠. 음, 저희가 하는 모든 일이 추천과 관련되어 있어서 결국 거짓말을 한 셈이 됐네요. 사람들의 장바구니에서 책을 구입할 수 있도록 불안정한 VBA 스크립트에서 정말 많이 발전했어요. 하지만 궁극적으로 저희가 하는 모든 일은 일종의 추천 형태로 그래프에 표현된다고 볼 수 있어요.

저희는 어떤 종류의 맞춤형 추천을 해왔을까요? 아래에서 다룰 두 가지는 기술 페이지와 고객 프로필이에요.

개인화된 추천 사용 사례

자동 순위

기술 페이지는 온톨로지의 주요 주제를 중심으로 모든 콘텐츠와 도서 콘텐츠(주로 도서가 아닌 콘텐츠)를 분류하는 방법이에요. 다음은 Python 페이지인데, 가장 인기 있는 항목이 맨 위에 표시돼요.

이게 실제로 어떻게 만들어질까요? Cypher 쿼리를 실행하는 주요 Python 콘텐츠를 요청하는 요청이 API에 들어와요. 이는 절과 함께 RCMS에 완전히 결합된 Node ID를 반환하죠.

그래프를 데이터 표현으로 사용할 때, 실제 렌더링은 프론트엔드의 CMS에 의해 처리되는 ID 목록으로 전달돼요.

이 방식은 여러 이유로 정말 강력하죠. 예를 들어, 새로운 기사나 블로그가 게시되자마자 (데이터 분석을 위한 Python과 R에 대한 기사처럼) Python, 데이터 분석, 그리고 Machine Learning에 관한 기사로 분류되어 주제 페이지에 자동으로 게시될 수 있다는 뜻이에요.

이때 관련성, 게시 날짜, 추천 여부, 그리고 한 달 동안의 조회수를 기준으로 정렬이 되는데요. 인기가 많고 조회수가 높으면 페이지 상단으로 올라가고, 추천 페이지에도 올라갈 수 있어요. 이 모든 작업은 동적 필터링을 통해 자동으로 이루어지기 때문에 고객 참여도가 높아지고 콘텐츠 검색이 훨씬 편리해진답니다.

고객 프로필

저희는 확산 활성화 알고리즘(직간접적으로 활성화되는 개념) 아이디어를 고객에게도 적용하고 있어요. 고객 중 Greg가 Python, VBA, Sigma.js, Neo4j, 그리고 Excel에 관심이 있다면:

고객과의 모든 접점에 대해 확산 활성화를 수행하고 Greg의 고객 프로필에 있는 다양한 주제에 가중치를 추가해요. 시간이 지나면서 프로필이 점점 더 정확해지고, 오래 전에 발생한 일은 뒤로 밀려나면서 사람들이 지금 무엇을 하고 있는지에 대한 역동적인 뷰를 얻을 수 있게 되죠.

온톨로지에서 나온 이러한 관계에는 사람들이 다음에 배울 내용을 파악하는 데 도움이 되는 모든 컨텍스트가 포함되어 있어요.

Greg와 비슷한 프로필을 갖고 있으며 VBA와 Excel에도 관심이 있는 다른 사용자 Ted(아래)를 한번 살펴볼까요? 그는 R, RStudio, Apache Spark를 사용하고 있네요.

저희는 이러한 각 주제에 대한 맥락을 알고 있기 때문에 Ted가 그래프 데이터베이스를 다루는 데이터 분석가라는 것을 알 수 있어요. 그는 최근 Apache Spark를 살펴보기 시작했으므로, 저(Greg)에게 Apache Spark를 살펴보도록 권장하는 것이 도움이 될 거라고 판단할 수 있는 거죠.

다음은 무엇일까요?

이 강력한 모델은 그래프 기반 검색, 모듈화된 콘텐츠, 그리고 기술 매핑을 포함해서 Packt의 미래에 많은 기회를 제공해 줄 거예요.

사람들이 실제로 사용하고 인지하는 용어를 사용해서 검색을 만들 수 있어요. 처음에는 해당 용어에 대한 콘텐츠가 없더라도, 네트워크 효과를 이용해서 정보를 크롤링하고 가져올 수 있죠. 게다가 사용자를 기반으로 검색을 개인화하는 것도 가능하고요.

모듈화된 콘텐츠는 꽤 광범위한 개념인데, 책이 꼭 책일 필요는 없다는 아이디어에서 출발해요. 예를 들어, A권의 1장, B권의 3장, C권의 5장이 특정 주제에 대해 필요한 모든 정보를 담고 있다면, 이건 정말 간결한 학습 경로가 될 수 있겠죠?

요즘 보이는 또 다른 애플리케이션은 책을 직업에 매핑하는 기술 매핑이에요. 사람들을 한 곳에 모아서 자신의 경력을 추적하고, 다른 데이터와 연결하고 비교할 수 있도록 하는 거죠.

Packt에서는 그래프가 문제를 생각하고 해결하는 정말 자연스러운 방법을 제공해줬어요. 확장성 또한 우리에게 아주 중요했고요. 더 많은 데이터 계층을 추가해서 지속적으로 더 복잡하게 만든 하나의 데이터 모델을 가지고 있는데, 이건 정말 Neo4j에서만 가능한 일이죠. 도구를 작동시키는 방법 같은 기술적인 측면에 집중하는 대신, 비즈니스 과제를 해결하는 데 집중할 수 있게 됐어요.

Greg의 강연에서 영감을 받으셨나요? 아래를 클릭해서 백서와 함께 개인화된 추천에 대해 더 자세히 알아보세요.그래프 데이터베이스로 추천 강화.

  • tf-idf 알고리즘

에이치시스템즈LogTree는 Neo4j 기반 GraphRAG 플랫폼으로, 데이터를 자동으로 지식그래프화하고 자연어 질의로 즉시 답을 제공합니다.

👉 에이치시스템즈 홈페이지

728x90
반응형

+ Recent posts