728x90
반응형

매일 엄청나게 많은 기사와 논문이 쏟아져 나오죠. 그 안에는 어마어마한 지식이 숨어 있지만, 그걸 다 읽는 건 현실적으로 불가능에 가까워요. 특정 분야에만 집중한다고 해도, 관련된 기사를 전부 찾아서 읽고 귀중한 통찰력을 얻는 건 여전히 어려운 일이에요.

하지만! 이런 수동적인 작업을 피하고, 자동으로 통찰력을 추출해주는 멋진 도구들이 있다는 사실! 물론, 여기서 말하는 건 바로 Natural Language Processing (NLP) 도구와 서비스들이에요.

이번 블로그 포스팅에서는 NLP의 강력한 기능과 Knowledge Graph를 결합해서, 관련 기사에서 자동으로 귀중한 통찰력을 뽑아낼 수 있는 솔루션을 소개해 드릴게요.

이 솔루션은 정말 다양한 곳에 적용할 수 있어요. 예를 들어, 비즈니스 모니터링 도구를 사용해서 우리 회사나 경쟁사에 대해 인터넷에서 어떤 이야기가 오가는지 살펴볼 수 있죠. 투자자라면 을 통해 투자할 만한 회사를 찾아낼 수도 있고요. 관심 있는 회사나 암호화폐를 중심으로 뉴스를 분석하는 거죠.

뿐만 아니라, 추출된 정보를 Machine Learning 모델에 넣어서 훌륭한 투자처를 찾아내는 데 도움을 받을 수도 있어요. 주식이든 암호화폐든 말이죠! 아직 우리가 생각하지 못한 더 많은 활용 방법들이 있을 거라고 확신해요.

이전에 제가 쓴 Making Sense of News the Knowledge Graph Way 글에서는 데이터 파이프라인을 직접 개발하는 방법에 대해 다뤘었죠.

뉴스 이해하기, Knowledge Graph 방식

인터넷 기사를 효과적으로 크롤링하고 NLP 모델로 처리하는 데이터 파이프라인을 구축하는 데는 꽤 오랜 시간이 걸릴 수 있지만, 저는 이 문제를 단 몇 시간 만에 해결할 수 있도록 도와주는 Diffbot이라는 솔루션을 발견했어요.

Diffbot | Knowledge Graph, AI 웹 데이터 추출 및 크롤링

Diffbot은 인터넷 전체를 해서 세계 최대 규모의 Knowledge Graph를 구축하는 것을 목표로 하고 있어요. 그리고 나서 관련 기사나 주제를 검색하고 찾을 수 있는 API endpoint를 제공하죠. 원한다면 API를 사용해서 데이터를 보강할 수도 있어요. Knowledge Graph에는 조직, 사람, 제품 등 다양한 정보가 담겨 있거든요.

게다가 텍스트에서 엔티티와 관계를 추출하는 Natural Language Processing API도 제공하고 있어요. 제 이전 블로그 포스팅을 읽어보셨다면 아시겠지만, 저희는 라는 네이티브 Graph Database를 사용해서 추출된 정보를 저장하고 분석하고 있답니다.

목차

  1. 암호화폐 관련 기사 검색
  2. Google Translate API로 외국 기사 번역
  3. Neo4j로 기사 가져오기
  4. Diffbot의 NLP API를 사용해서 항목 및 사실 추출
  5. Neo4j로 항목 및 사실 가져오기
  6. Graph 분석

제가 준비한 Jupyter Notebook에는 이 문서의 단계를 재현할 수 있는 코드가 담겨 있어요.

블로그/DiffbotNLP + 마스터의 Neo4j.ipynb · tomasonjo/블로그

암호화폐 관련 기사 검색

앞서 말씀드린 것처럼, Diffbot API를 사용해서 암호화폐 관련 기사를 검색할 거예요. 이 포스팅을 따라 하시려면 Diffbot 페이지에서 무료 평가판 계정을 만드시면 돼요. 여기에 제시된 모든 단계를 완료하기에 충분할 거예요. 포털에 로그인하면 시각적 Query 작성기 인터페이스를 살펴보고 사용 가능한 항목들을 확인할 수 있어요.

Diffbot의 시각적 Query 빌더. 작성자가 만든 이미지입니다.

Diffbot의 Knowledge Graph API에는 정말 많은 데이터가 준비되어 있어요. 그래서 다양한 기사를 검색할 수 있을 뿐만 아니라, KG API를 사용해서 조직, 제품, 사람, 직업 등에 대한 정보를 검색할 수도 있죠.

이 예시에서는 "암호화폐"라는 태그가 붙은 최신 5000개의 기사를 검색해 볼 거예요.

저는 시각적 빌더에서 검색 Query를 구성하고, 그걸 Python 스크립트에 복사했어요. 이게 바로 여러분의 사용 사례와 관련된 기사를 원하는 만큼 가져오는 데 필요한 코드의 전부랍니다.

Google Translate API로 외국 기사 번역

검색된 기사는 전 세계 다양한 언어로 제공되잖아요. 다음 단계에서는 Google Translate API를 사용해서 영어로 번역할 거예요. Google Translate API를 하고 API 키를 생성해야 해요.

꼭 확인해 보세요. ! Translation API를 사용하는 게 생각보다 비용이 더 나올 수도 있거든요. 다른 사이트에서 가격을 확인해 보니 보통 100만 자 번역하는 데 15달러에서 20달러 정도 하네요.

이제 Natural Language Processing (NLP) 추출 부분으로 넘어가기 전에 기사를 Neo4j로 가져와 볼게요.

기사를 Neo4j로 가져오기

저는 여러분이 Neo4j Desktop이나 무료 Neo4j AuraDB 클라우드 인스턴스를 다운로드하는 걸 추천해요. 5000개 기사 정보를 저장하기에 충분할 거예요. 먼저 Neo4j 인스턴스에 대한 연결을 정의해야겠죠?

가져온 그래프 모델에는 다음과 같은 스키마가 포함돼요.

기사 그래프 스키마. 작성자가 만든 이미지입니다.

기사에 대한 메타데이터가 있는데요. 예를 들어 전체적인 내용을 알 수 있어요. sentiment, 그리고 when 발행되었는지도 알 수 있죠. 게다가 대부분 기사에 대해 who가 썼는지, 그리고 which site인지도 알 수 있어요. 마지막으로 Diffbot API는 기사의 category를 반환해 줘요.

계속하기 전에 Neo4j에서 고유 제약 조건 (Unique Constraint)을 정의해서 가져오기 및 후속 쿼리 속도를 높일 거예요.

이제 Neo4j로 기사를 가져올 수 있어요.

위의 Cypher 쿼리가 어떻게 작동하는지 자세히 설명하진 않을게요. 대신 관심 있으시면 여러 블로그 게시물에서 Cypher 및 그래프 가져오기에 대한 소개를 다루고 있으니 참고해 주세요. 또한 GraphAcademy 과정에서 데이터 가져오기에 대한 기본 사항을 다루고 있답니다.

Neo4j GraphAcademy를 ​​사용하여 Neo4j로 CSV 데이터 가져오기 과정을 수강하세요.

그래프 스키마 모델을 확인하기 위해 샘플 블로그 게시물을 한번 살펴볼까요?

샘플 기사 시각화. 작성자가 만든 이미지입니다.

게시물 분석 부분으로 넘어가기 전에 NLP API를 사용해서 엔터티와 관계를 추출하거나, Diffbot이 팩트라고 부르는 것을 추출해 볼게요.

Diffbot 웹사이트는 온라인 서비스를 제공하는데요. NLP 데모에서 텍스트를 입력하고 결과를 평가할 수 있어요. 방금 Neo4j로 가져온 기사의 샘플 콘텐츠를 입력해 봤어요.

Diffbot NLP 데모. 작성자가 만든 이미지입니다.

NLP API는 본문에 나오는 모든 entity를 식별하고, relationship도 그래프로 표시할 수 있어요. 이 예에서는 Jack Dorsey가 샌프란시스코에 본사를 두고 결제 및 채굴을 담당하는 Block의 CEO라는 것을 알 수 있죠. Block에서 Jack의 동료는 컴퓨터 하드웨어에 대한 배경 지식이 있는 Thomas Templeton이고요.

응답의 엔터티를 처리하고 Neo4j에 저장하기 위해 다음 코드를 사용할 거예요.

이 예에서는 조직, 사람, 제품, 위치 등 허용된 유형이 있고 신뢰 수준이 0.7보다 큰 엔터티만 가져올 거예요. Diffbot의 NLP API에는 제가 보기에는 엔터티가 Wikipedia, Crunchbase 또는 LinkedIn에 연결되는 엔터티 연결 기능도 있어요. 또한 추가 항목 유형을 추가 라벨로 추가할 거예요. Entity 노드에요.

다음으로 관계를 정리하고 Neo4j로 가져오는 기능을 준비해야 해요.

다음에 정의된 속성의 가져오기를 생략했어요. skipProperties 목록에요. 저에게는 엔터티 간의 관계보다는 노드 속성으로 저장하는 게 더 합리적이에요. 하지만 이 예에서는 가져오는 동안 이를 무시할 거예요.

이제 엔터티와 관계를 가져오는 기능이 준비되었으니 계속해서 기사를 처리할 수 있어요. 단일 요청으로 여러 기사를 보낼 수 있는데요. 저는 요청을 콘텐츠 50개 단위로 일괄 처리하기로 했어요.

NLP 기술로 구성된 Knowledge Graph의 하위 그래프 시각화. 작성자가 만든 이미지입니다.

NLP 추출에서는 Jack Dorsey가 Block의 CEO이며 Alex Morcos, Martin White 등과 협력 관계를 맺고 있다는 사실이 포착되었네요. 물론 추출된 모든 정보가 완벽하지는 않아요.

NLP가 Elon Musk를 Dogecoin의 직원으로 식별한 게 재미있다고 생각하는데, 이는 어쨌든 진실과 그리 멀지 않죠? 사실의 신뢰 수준을 가지고 놀지는 않았지만 노이즈를 줄이기 위해 임계값을 높일 수 있어요. 하지만 이는 정밀도와 재현율 사이의 게임이에요.

이건 단지 샘플 하위 그래프일 뿐이에요. 정보가 너무 많아서 정확히 무엇을 보여줄지 결정하기가 어렵네요.

그래프 분석

이 게시물의 마지막 부분에서는 이와 같은 Knowledge Graph와 함께 사용할 수 있는 몇 가지 예제 애플리케이션을 안내해 드릴게요. 먼저, 기사의 타임라인을 평가해 볼게요.

MATCH (a:Article) RETURN date(a.date) AS date, count(*) AS count ORDER BY date DESC LIMIT 10 결과 전 세계적으로 암호화폐에 관한 기사가 하루에 150~450개 정도나 된다니, 정말 많죠? 제가 처음에 읽기에 너무 많다고 말한 게 맞았네요. 다음으로는 기사에서 가장 자주 언급되는 항목이 뭔지 한번 살펴볼까요? MATCH (e:Entity) RETURN e.name AS entity, size((e)<-[:MENTIONS]-()) AS articles ORDER BY articles DESC LIMIT 5 결과 암호화폐에 관한 기사에서 예상할 수 있듯이 가장 자주 언급되는 항목은 다음과 같아요. * 암호화폐 * 비트코인 * 이더리움 * 블록체인 감정은 항목 수준뿐만 아니라 기사 수준에서도 분석할 수 있어요. 예를 들어, 지역별로 그룹화된 비트코인에 대한 정서를 조사해 볼 수 있겠죠. MATCH (e:Entity {name:'bitcoin'})<-[m:MENTIONS]-()-[:ON_SITE]->()-[:HAS_REGION]->(region) WITH region.name AS region, m.sentiment AS sentiment RETURN region, avg(sentiment) AS avgSentiment, stdev(sentiment) AS stdSentiment, max(sentiment) AS maxSentiment, min(sentiment) AS minSentiment, count(*) AS articles ORDER BY articles DESC LIMIT 5 결과 감정은 평균적으로 긍정적이지만, 표준 편차 값을 보면 기사 간에 변동이 꽤 심한 걸 알 수 있어요. 비트코인 정서를 좀 더 자세히 살펴볼 수도 있겠지만, 대신에 어떤 사람이 북미에서 가장 높은 평균 감정과 가장 낮은 평균 감정을 갖고 있고, 또 가장 많은 기사에 등장하는지 한번 조사해 볼게요. MATCH (e:Person)<-[m:MENTIONS]-()-[:ON_SITE]->()-[:HAS_REGION]->(region) WHERE region.name = "North America" RETURN e.name AS entity, count(*) AS articles, avg(m.sentiment) AS sentiment ORDER BY sentiment * articles DESC LIMIT 5 UNION MATCH (e:Person)<-[m:MENTIONS]-()-[:ON_SITE]->()-[:HAS_REGION]->(region) WHERE region.name = "North America" RETURN e.name AS entity, count(*) AS articles, avg(m.sentiment) AS sentiment ORDER BY sentiment * articles ASC LIMIT 5 결과 이제 예를 들어 다음과 같은 기사 제목들을 살펴볼 수 있어요. MATCH (site)<-[:ON_SITE]-(a:Article)-[m:MENTIONS]->(e:Entity {name: 'Mark Cuban'}) RETURN a.title AS title, a.language AS language, m.sentiment AS sentiment, site.name AS site ORDER BY sentiment DESC LIMIT 5 결과 제목 자체가 딱 와닿지 않을 수도 있지만, 언급된 기사에서 자주 함께 나타나는 다른 개체가 무엇인지 조사해볼 수도 있겠죠. MATCH (o:Entity)<-[:MENTIONS]-(a:Article)-[m:MENTIONS]->(e:Entity {name: 'Mark Cuban'}) WITH o, count(*) AS countOfArticles ORDER BY countOfArticles DESC LIMIT 5 RETURN o.name AS entity, countOfArticles 결과 역시나 다양한 암호화폐 토큰들이 등장하네요. 그리고 Mark Cuban이 소유한 NBA 클럽인 댈러스 매버릭스도 보여요. Dallas Mavericks가 암호화폐를 지지하는 걸까요, 아니면 기자들이 Mark Cuban이 Dallas Mavericks를 소유하고 있다는 사실을 언급하고 싶어하는 걸까요? 이런 식으로 분석을 더 깊게 진행할 수도 있지만, 여기서는 Natural Language Processing 처리 중에 어떤 사실들이 추출되었는지 한번 살펴볼게요. MATCH p=(e:Entity {name: "Mark Cuban"})--(:Entity) RETURN p 결과

Mark Cuban에 대해 검색된 사실. 작성자가 만든 이미지입니다.

다음으로, 평균 감정이 상당히 낮게 나타나는 Floyd Mayweather 관련 기사 제목들을 빠르게 한번 살펴볼게요. MATCH (a:Article)-[m:MENTIONS]->(e:Entity {name: 'Floyd Mayweather'}) RETURN a.title AS title, a.language AS language, m.sentiment AS sentiment ORDER BY sentiment ASC LIMIT 5 결과 암호화폐 사기 혐의로 고소당하고 있는 것 같네요. Natural Language Processing 처리는 또한 다양한 토큰과 주식 시세를 식별하기 때문에, 현재 인기가 많은 토큰과 그 정서를 분석하는 것도 가능해요.

MATCH (e:Entity)<-[m:MENTIONS]-()
WHERE (e)<-[:STOCK_SYMBOL]-()
RETURN e.name AS stock, 
       count(*) as mentions, 
       avg(m.sentiment) AS averageSentiment,
       min(m.sentiment) AS minSentiment,
       max(m.sentiment) AS maxSentiment
ORDER BY mentions DESC
LIMIT 5

제가 보여드린 건 정말 얕은 부분일 뿐이에요. 이제 마지막으로 시각화 자료 두 개를 더 보여드리고, 앞으로 개발할 수 있는 몇 가지 애플리케이션에 대해 이야기해볼게요.

시장 구조를 평가합니다. 작성자가 만든 이미지입니다.

예를 들어, 다음과 같은 관계를 살펴보면서 시장을 분석할 수 있어요: COMPETITOR, ACQUIRED_BY, SUPPLIER 등. 반대로, 그래프에 있는 인물에 더 집중해서 분석을 수행하고 이들의 영향력이나 연관성을 평가할 수도 있겠죠.

사람 간의 연결을 평가합니다. 작성자가 만든 이미지입니다.

결론

이런 유형의 데이터 파이프라인으로 가능한 분석은 정말 무궁무진해요. 언급했듯이 회사, 경쟁사, 업계 전체에 관한 뉴스를 모니터링할 수도 있고, 인수와 같은 미래 이벤트를 예측하는 데 활용할 수도 있죠. 뿐만 아니라, 추출된 데이터를 사용해서 암호화폐 추세 예측과 같이 원하는 사용 사례에 맞게 Machine Learning 모델을 강화하는 데도 도움이 될 거예요.

언제나 그렇듯이, 코드는 에서 확인하실 수 있습니다.


  • diffbot
  • nlp

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

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

728x90
반응형

+ Recent posts