티스토리 뷰
이번 연재글에서는 전통적인 방법론을 통해 온톨로지를 구축하고 지식그래프를 생성하는 것을 다룹니다.
그리고 지식그래프를 생성하는 과정에서 LLM 을 활용하는 방법에 대해서 다룹니다.
그리고 마지막으로 생성된 결과물에 대해 추론을 적용하여 활용도를 증가시키는 것에 대해 다룹니다.
관련 연재글:
지난 글에서는 주어진 데이터셋에서 주요한 항목을 추출하고, 추출한 항목에 따라 간단한 온톨로지 모델을 구성하였으며, 별다른 처리 없이 인스턴스를 생성하였습니다.
이번 글에서는 간단한 데이터 처리를 통해 좀더 확장성과 활용성을 가질 수 있도록 지식그래프를 구성해보도록 하겠습니다.
주요 항목 중에서는 학술논문의 저자가 직접 입력한 키워드들이 존재합니다. 논문에 대해 파악하거나 구분을 할 때 유용한 정보입니다. 하지만 저자 각자가 아무런 규칙 없이 키워드를 입력하기 때문에 서로 다른 표기 또는 오타가 존재합니다. 비록 다른 표기나 오타가 존재하더라도 사람이 보기에는 큰 어려움이 없지만 기계가 이를 처리할 때는 서로 다른 것으로 인식을 하게 됩니다.
따라서 논문의 키워드에 대해 정제 작업과 식별처리를 하게 되면 키워드와 학술논문이 텍스트 형태가 아니라 하나의 객체 형태로 연결이 됩니다. 그래프 구조에서 연결이 되면 그 자체로 더 좋은 시너지가 발생하기 때문에 단순 문자열로 표기를 해도 무방하거나 재사용을 할 필요가 없는 경우를 제외하면 독립적인 개체로 존재하도록 구축하는게 좋습니다.(이는 각 도메인의 목적에 따라 다를 수 있습니다)
그럼 이 데이터셋에서 식별의 대상으로 삼은 키워드에 대해 살펴보겠습니다.
도시항공교통수단 |
도시 항공 모빌리티 |
도시형 공중모빌리티(UAM) |
도심교통항공 |
도심 비행 모빌리티 |
도심항공교통 |
도심항공교통(UAM) |
도심항공모빌리티(UAM) |
도심 항공 모빌리티(UAM) |
도심 항공 모빌리티(Urban Air Mobility) |
위에서 나열한 키워드 목록은 도심항공모빌티리(UAM)을 나타내는 동일한 키워드들입니다. 하지만 표기 방법, 영문/한글 문자, 띄어쓰기가 각각 달라서 다른 문자열로 해석이 될 수 있습니다.
서로 다른 문자의 표기가 같은 것이라는 식별을 하기 위해 문자열을 비교하는 방법(exact match, 자카드 유사도, 레벤슈테인 유사도 등), refine 도구를 활용하는 방법, 그리고 사람이 식별하는 방법(노동 집약적인...) 등을 통해 대부분 식별을 합니다만 여기서는 식별 사람이 개입해서 식별을 하는 방법으로 진행하도록 하겠습니다.
먼저 모든 키워드들에 대해 고유번호를 부여함으로 상호간의 식별이 될 수 있도록 준비를 해야 합니다.
이제부터는 고유한 숫자를 통해 키워드를 식별하고 이 번호 체계로 대표키워드와 이명키워드를 구분하려고 합니다.
이 데이터셋에는 국문키워드와 영문키워드가 존재합니다. 모든 논문에 존재하는 것은 아니지만 그래도 어느정도 키워드 쌍이 매칭이 되기 때문에 일부 작업의 수고를 덜어낼 수 있을 것으로 보입니다.
전체 1101개의 키워드에 대해 대표키워드와 그 대표키워드와 유사한 다른 키워드를 분류하여 아래와 같은 데이터를 생성할 수가 있습니다.
이제는 이 데이터를 읽어 지식그래프로 생성하는 단계를 거치게 되며, turtle 형태로 파일을 저장할 것입니다.
# 그래프 생성
g = Graph()
# namespace 바인딩
RS = Namespace('http://joyhong.tistory.com/resource/')
ONT = Namespace('http://joyhong.tistory.com/ontology/')
SCHEMA = Namespace("http://schema.org/")
g.bind("rs", RS)
g.bind("ont", ONT)
g.bind("schema", SCHEMA)
g.bind("foaf", FOAF)
g.bind("skos", SKOS)
g.bind("dcterms", DCTERMS)
for row in author_keyword_set:
article = URIRef(RS+'article_'+str(row))
for k in author_keyword_set[row]:
kdf = df_kwd.query(f"키워드=='{k}'")
temp_id = str(kdf['번호'].to_list()[0])
main_id = str(kdf['메인번호'].to_list()[0])
if main_id != "":
# altLabel로 생성
# 메인번호가 uri가 되어야 한다.
kwd = URIRef(RS+'kwd_'+main_id)
g.add((kwd, SCHEMA.altLabel, Literal(k)))
else:
kwd = URIRef(RS+'kwd_'+temp_id)
g.add((kwd, SCHEMA.prefLabel, Literal(k)))
g.add((kwd, RDFS.label, Literal(k)))
g.add((kwd, RDF.type, URIRef(SCHEMA+'DefinedTerm')))
g.add((article, URIRef(SCHEMA+'keywords'), kwd))
g.serialize("./uam_keywords.ttl", format='turtle')
대표가 되는 키워드의 레이블은 prefLabel로 생성하고, 이명은 altLabel로 생성하는 점이 특이점입니다.
동일한 키워드로 식별이 된 키워드는 다른 URI로 생성할 필요가 없기 때문에 대표가 되는 하나의 URI로 개체를 생성하고 이름만 이명으로 만들어주게 되면, 표기된 레이블은 다를지라도 하나의 동일한 자원을 생성하고 사용이 가능합니다.
이렇게 만들어진 결과 파일은 첫번째 글과 동일하게 RDFox에 로딩을 할 것입니다. 첫번째 로딩에서 사용한 named graph와는 다르게, 다른 이름의 named graph에 학술논문과 키워드용어만의 관계를 나타내는 데이터를 로딩하게 합니다.
이는 서로 다른 논리적은 그래프 분할을 유지하면서 필요에 따라서는 다른 named graph의 데이터를 함께 사용할 수 있습니다.
named graph로 서로 나누어 저장을 한다고 해서 완전히 분리가 되는 개념이 아닙니다. 하나의 named graph 안에서만 데이터를 조회하던지, 여러개의 named graph를 통합하여 조회하던지 선택적으로 사용할 수 있습니다.
아래의 그림은 첫번째 글과 이번 글의 데이터가 named graph 로 분리된 개념입니다.
온톨로지와 지식그래프는 URI를 기반으로 모든 개체를 식별하기 때문에 어디에 있더라도 동일한 자원으로 식별이 가능하고, 다른 사람/서비스/시스템이 만들었더라고 URI를 통해 재활용과 참조가 가능합니다.
마지막으로 RDFox에 저장된 데이터를 다시 첫번째 글과 동일하게 접근하면 키워드용어를 통해 동일한 용어를 사용하는 다른 논문들이 1depth의 관계로 식별되어 나타나는 것을 볼 수 있습니다.
첫번째 글에서는 단순히 키워드를 문자열로만 인식하고 저장하였기 때문에 다른 자원과 연결성이 떨어졌음을 알 수 있습니다.
하지만 이번글에서와 같이 하나의 개체로 식별하고 이를 통해 다른 개체와 연결을 하게 되면 공통적으로 활용하거나 연결 관계를 이루고 있는 정보를 한눈에 살펴볼 수가 있습니다.
이를 통해 "'도심 항공 모빌리티' 키워드용어를 가지고 있는 학술논문들"을 손쉽게 탐색하고 활용이 가능해지게 됩니다.
다음 글에서는 LLM을 활용하여 지식그래프를 구축하는데 약간의 용이함을 제공받는 것에 대해 다루려고 합니다. 첫번째와 두번째 글에서는 사람의 직접적인 개입을 통해 온톨로지를 구성하고 데이터를 생성하였습니다만 대량의 작업에 대해 모든 것을 사람이 작업을 하기에는 부담스러울 수 있습니다. 따라서 이를 조금이라도 완화하고자 LLM을 사용할 것입니다.
-끝-
'KnowledgeGraph' 카테고리의 다른 글
지식그래프, LLM 그리고 Reasoning #4 - LLM을 활용한 용어 분류 (0) | 2024.08.02 |
---|---|
지식그래프, LLM 그리고 Reasoning #3 - LLM을 활용한 지식그래프 구축 (0) | 2024.07.31 |
지식그래프, LLM 그리고 Reasoning #1 - 기본 지식그래프 구축 (0) | 2024.07.31 |
[기업 정보] 지식그래프를 활용한 분석 3 (0) | 2023.08.19 |
[기업 정보] 지식그래프를 활용한 분석 2 (0) | 2023.08.14 |
- Total
- Today
- Yesterday
- Ontology
- 지식 그래프
- pyvis
- sparql
- 그래프 데이터베이스
- 트리플
- rdfox
- RDF
- Neo4j
- Knowledge Graph
- Linked Data
- 온톨로지
- cypher
- 타임리프
- 장고
- 지식그래프
- LOD
- 스프링부트
- TBC
- neosemantics
- 사이퍼
- property graph
- networkx
- TopBraid Composer
- TDB
- stardog
- 트리플 변환
- Thymeleaf
- RDF 변환
- django
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |