๐Understanding Wikidata -๋ฌด๋ฃ๋ฃ wiki ๋ฐ์ดํฐ ํ์ฉํ๊ธฐ!!
๐ Understanding Wikidata - ๋ฌด๋ฃ๋ก Wiki ๋ฐ์ดํฐ ํ์ฉํ๊ธฐ!!
Wikidata๋ ์ํค๋ฏธ๋์ด ์ฌ๋จ์ด ์ด์ํ๋ ์์ ์ง์ ๊ทธ๋ํ(Open Knowledge Graph)์
๋๋ค.
์ ์ธ๊ณ ์ธ๋ฌผ, ์ฅ์, ๊ฐ๋
๋ฑ์ ๋ํ ์ ๋ณด๋ฅผ ๊ตฌ์กฐํ๋ ๋ฐฉ์์ผ๋ก ์ ๊ณตํฉ๋๋ค.
๐ง โGPT๊ฐ ์ฌ์ฉํ๋ ์ธ๊ณ ์ง์, ์ฐ๋ฆฌ๋ ๋ฌด๋ฃ๋ก ์ธ ์ ์์๊น?โ
๐ ๊ทธ ๋ต์ด ๋ฐ๋ก Wikidata + SPARQL ์กฐํฉ์ ๋๋ค!
๐ Wikidata๋?
- ์ํค๋ฐฑ๊ณผ์ ๋ฐ์ดํฐ ๋ฒ์
- ์ ์ธ๊ณ ๊ฐ์ฒด(Entity)๋ค์ ์์ฑ(Property)๊ณผ ๊ฐ(Value)์ด ์ ๋ฆฌ๋ ๊ฑฐ๋ํ DB
- ์์:
Q937
= Albert EinsteinP31
= instance ofQ5
= human
โ ์ฆ, โQ937์ Q5(human)์ ์ธ์คํด์ค(P31)์ด๋คโ
๐ ๏ธ SPARQL๋ก ๋ฐ์ดํฐ ์ง์ํ๊ธฐ
SPARQL์ RDF ๊ธฐ๋ฐ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ์ํ ์ฟผ๋ฆฌ ์ธ์ด์
๋๋ค.
Wikidata๋ ์์ฒด SPARQL endpoint๋ฅผ ์ด์ํฉ๋๋ค.
โถ ๊ธฐ๋ณธ ์์ : ์์ธ์ํ์ธ์ ์๋ ์์ผ ์ฐพ๊ธฐ
1
2
3
4
5
6
7
SELECT ?person ?personLabel ?birthDate WHERE {
?person wdt:P31 wd:Q5; # ์ธ๊ฐ
rdfs:label "Albert Einstein"@en;
wdt:P569 ?birthDate. # ์๋
SERVICE wikibase:label { bd:serviceParam wikibase:language "en". }
}
LIMIT 1
โถ ํ์ด์ฌ ์ฝ๋๋ก์ ๊ธฐ๋ณธ ์์ : ์์ธ์ํ์ธ์ ์๋ ์์ผ ์ฐพ๊ธฐ
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
import requests
query = """
SELECT ?person ?personLabel ?birthDate WHERE {
?person wdt:P31 wd:Q5;
rdfs:label "Albert Einstein"@en;
wdt:P569 ?birthDate.
SERVICE wikibase:label { bd:serviceParam wikibase:language "en". }
}
LIMIT 1
"""
url = "https://query.wikidata.org/sparql"
headers = {"Accept": "application/sparql-results+json"}
response = requests.get(url, headers=headers, params={"query": query})
data = response.json()
for result in data["results"]["bindings"]:
print(result["personLabel"]["value"], "-", result["birthDate"]["value"])
๊ฒฐ๊ณผ๋!? Albert Einstein - 1879-03-14T00:00:00Z
๐ ์ด๋ค ๋ฐ์ดํฐ๊น์ง ์ป์ ์ ์๋์?
Wikidata๋ ์ํค๋ฐฑ๊ณผ์ ๊ตฌ์กฐํ๋ ๋ฐฑ์๋๋ก, ๋ค์๊ณผ ๊ฐ์ ๋ค์ํ ๋ฐ์ดํฐ๋ฅผ ์ ๊ณตํฉ๋๋ค:
- ๐ค ์ธ๋ฌผ ์ ๋ณด: ์๋ ์์ผ, ์ง์ , ๊ตญ์ , ์ ์ ๋ฑ
- ๐บ๏ธ ๊ตญ๊ฐ ๋ฐ ์ง๋ฆฌ ์ ๋ณด: ์๋, ์ธ๊ตฌ ์, ์์น, ๊ตญ๊ฐ์ฝ๋
- ๐ฌ ์ํ ์ ๋ณด: ๊ฐ๋ , ๊ฐ๋ด์ผ, ๋ฐฐ์ฐ ๋ชฉ๋ก, ์ ์๊ตญ๊ฐ
- ๐ ํ์ ๊ฐ๋ : ์ํ ๊ณต์, ๊ณผํ ์ด๋ก , ์ญ์ฌ์ ์ฌ๊ฑด, ๋ฌธํ์ฌ
- ๐งช ๊ณผํ ๋ฐ์ดํฐ: ํํ ๋ฌผ์ง, ์๋ฌผ ์ข , ์ ์ ์ ์ ๋ณด ๋ฑ
๐ ์ํค๋ฐฑ๊ณผ์ ์์ฝ ์ ๋ณด๋ก ๋ณด์ด๋ ๋๋ถ๋ถ์ structured data๋ Wikidata์ ์กด์ฌํฉ๋๋ค.
โ ์ ์ ์ฉํ๊ฐ?
์ด์ | ์ค๋ช |
---|---|
๐ธ ๋ฌด๋ฃ | CC0 ๋ผ์ด์ ์ค โ ์์ ์ ํ์ฉ ๊ฐ๋ฅ |
๐ ๋ค๊ตญ์ด | 300+ ์ธ์ด ๋ผ๋ฒจ ์ ๊ณต (ex. ํ๊ตญ์ด, ์์ด ๋ฑ) |
๐ ์ฐ๊ฒฐ์ฑ | ๊ฐ์ฒด(Entity) ๊ฐ ๊ด๊ณ(RDF triple)๋ก ์ฐ๊ฒฐ๋จ |
โก ๋น ๋ฆ | SQL์ด ์๋ SPARQL โ ์ํ๋ ๊ด๊ณํ ์ฟผ๋ฆฌ ๊ฐ๋ฅ |
๐ค AI ํ์ฉ | LLM ์ ์ฒ๋ฆฌ, RAG ๋ฌธ์ ์์ฑ, ์ง์ ๊ธฐ๋ฐ ๊ตฌ์ถ์ ์ต์ |
โ ๋จ์ ์?
Wikidata๋ ๊ฐ๋ ฅํ ์คํ ์ง์ ๊ทธ๋ํ์ด์ง๋ง, ์๋์ ๊ฐ์ ์ ์ฝ๋ ์กด์ฌํฉ๋๋ค:
ํนํ SPARQL์ ๋๋ฌด ์ด๋ ค์๋ณด์ฌ์!!
ํ๊ณ | ์ค๋ช |
---|---|
๐งน ์ ๋ณด ์ ํ๋ | ๋๊ตฌ๋ ํธ์ง ๊ฐ๋ฅ โ ์ผ๋ถ ์ ๋ณด๋ ์ค๋ฅ ๋๋ ๊ฒ์ฆ ๋ถ์กฑ |
๐ ๋ฐ์ดํฐ ๋๋ฝ | ํนํ ๋น์์ด๊ถ์ด๋ ์ต์ ์ ๋ณด์ ๋ฐ์์ด ๋ฆ์ ์ ์์ |
๐ฌ ๋น์ ํ ์ ๋ณด ๋ถ์กฑ | ์ค๋ช ํ ๋ฌธ์ฅ์ด๋ ์์ธํ ์์ ์ ํฌํจ๋์ง ์์ (โ Wikipedia ์ฐธ๊ณ ํ์) |
๐ SPARQL ๋ฌ๋์ปค๋ธ | ์ฟผ๋ฆฌ ์ธ์ด๊ฐ ์์ํ ์ ์์ (โ ํ์ต ํ์) |
๐ฆ ์ ๋ณด ๊ฐฑ์ ์ฃผ๊ธฐ | API๋ฅผ ํตํด ์ค์๊ฐ ํธ์ง ์ ๋ณด๋ ๋ฐ์๋์ง๋ง, ๋ฐฐ์น์ฒ๋ฆฌ ๊ธฐ๋ฐ ํ์ฉ ์ ์ง์ฐ ๊ฐ๋ฅ |
๋จ์ ์ ํด๊ฒฐํ๊ธฐ!!! - LLM์ ์ฐ๊ฒฐํด์ ์๋์ผ๋ก SQLRQL์ ์ง๋ฒ๋ ค์!!
ํ์ด์ฌ์ผ๋ก ์์จ!!
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
31
32
33
34
35
36
37
38
39
40
import requests
import json
import openai
openai_client = openai.OpenAI()
user_q = "์ํ์ ์์ธ์ํ์ธ์ ์์ผ์ ์ธ์ ์ผ?"
prompt = f"""
You are a SPARQL expert. Convert the following user question into a valid SPARQL query using Wikidata schema.
Only return the query in SPARQL syntax.
Question: "{user_q}"
"""
response = openai_client.chat.completions.create(
model="gpt-4o-mini", # You can use "gpt-4" or "gpt-3.5-turbo"
messages=[
{"role": "user", "content": prompt}
],
max_tokens=150,
temperature=0.7
)
query = response.choices[0].message.content.strip()
query = query.replace('```','').split('sparql')[-1]
print(f"Generated Query : {query}")
# 2. SPARQL ์ฟผ๋ฆฌ๋ฅผ Wikidata์ ์ ์ก
url = "https://query.wikidata.org/sparql"
headers = {"Accept": "application/sparql-results+json"}
response = requests.get(url, headers=headers, params={"query": query})
data = response.json()
# 3. ๊ฒฐ๊ณผ ์ถ๋ ฅ
bindings = data["results"]["bindings"]
result_lines = []
for b in bindings:
line = " ยท ".join([f"{k}: {v['value']}" for k, v in b.items()])
result_lines.append(line)
print("FINAL RESULTS")
print("\n".join(result_lines))
โจ ๋ง๋ฌด๋ฆฌ
- โํฌ๋กค๋ง ์์ด, ์ ์ธ๊ณ ์ง์ ๊ทธ๋ํ๋ฅผ ๋ค๋ฃจ๋ ๋ฒ!โ
- ๋ฐ๋ก Wikidata + SPARQL ์กฐํฉ์ผ๋ก ๊ฐ๋ฅํฉ๋๋ค.
- llm์ด๋ ์ฐ๊ฒฐ์ํค๋ฉด!! wiki์์ ์ง์์ ์ฐพ์์ ์ ํํ ๋ต๋ณ์ด ๊ฐ๋ฅํด์!!