Analyse der bereits nach Wikidata verlinkten Gartenlaube Artikel

Dieses Skript soll verschiedene Analysen der bereits in Wikidata verlinkten Gartenlaube Artikel vor allem hinsichtlich der Verbesserung der Datenqualität und ihrere Homogenisierung ermöglichen.

Die bereits vorhandenen WD-Items wurden über ein Parsing aller Gartenlaube-Artikel auf de.wikisource via der Media-Wiki-API durch Extraktion der gegebenfalls hinterlegaten Wikibase-ID definiert. Die hier verwendete Liste an QIDs stammt aktuell von 09. März 2019 20.00 Uhr UTC.

1. Zählung aller vorhandenen Properties

Es werden die Properties aller Wikidata-Items ausgelesen und deren Vorkommen gezählt. In einer Tabelle werden sortiert nach ihren Vorkommen die häufigsten Properties dargestellt.

2. Verteilung der verwendeten P31 Objekt-Items

Auch um die Datenqualität der vorhandenen Items analysieren zu können, ist eine Auswertung der verwendeten Objekte im Statement P31 (instance of) interessant. Graphik zeigt die Häufigkeit der verwendeten Items in Gartenlaube-Artikel als Statement mit Property P31.

3. Verteilung der Anzahl an Items zu Gartenlaube-Artikel nach Anzahl an Statements.

In allen ca. 7.700 angelegten Items befinden sich in Summe 16.142 Statements, das sind durchschnittlich nur 2 Statements je Item. Das Diagramm zeigt die Verteilung genauer an. Items mit sehr hoher Anzahl an Statements weisen wieder auf eine wahrscheinlich falsche Verlinkung (bspw. an ein geographisches oder biographisches Item) hin.

In [1]:
import requests
import re
import json
import urllib
import collections, numpy

S = requests.Session()
URL = "https://de.wikisource.org/w/api.php"
def parseWikiAPI(URL,PARAMS):
    R = S.get(url=URL, params=PARAMS)
    DATA = R.json()
    return DATA


def countStatements(wdataClaims,qid):
    stmSum = 0
    for claim in wdataClaims:
        stmSum = stmSum + len(wdataClaims[claim])
    return stmSum


lines = [line.rstrip('\n') for line in open('existQID.txt')]
wbapi = "https://www.wikidata.org/w/api.php?action=wbgetentities&format=json&ids="

newlist = [[],[],[],[0],[]]
newlistC = list()
artikelCounter = 0
p31d = dict()
default_data = {}
for qid in lines:
    url = wbapi+qid
    #print(url)

    params=""
    wbjson = (parseWikiAPI(url,params))
    labels = wbjson["entities"][qid]["labels"].keys()
    for key in labels:
       # print(key)
    #print (labels)
        newlist[0].append(key)

    #print(newlist)

    labelList = numpy.array(newlist[0])

    claims = wbjson["entities"][qid]["claims"].keys()
    
    for key in claims:
        newlist[1].append(key)

    try:
        for P31 in wbjson["entities"][qid]["claims"]["P31"]:
            #p31d[P31["mainsnak"]["datavalue"]["value"]["id"]] = qid
            #p31d[str(P31["mainsnak"]["datavalue"]["value"]["id"])]
            if P31["mainsnak"]["datavalue"]["value"]["id"] not in p31d:
                p31d.update({P31["mainsnak"]["datavalue"]["value"]["id"]:[qid]})
            else:
                p31d[P31["mainsnak"]["datavalue"]["value"]["id"]].append(qid)

            #p31d.update({P31["mainsnak"]["datavalue"]["value"]["id"]: qid})
    except KeyError:
        if "noP31" not in p31d:
            p31d.update({"noP31":[qid]})
        else:
            p31d["noP31"].append(qid)

    #print(p31d)
    
    #claimList = numpy.array(newlist[1])
    #print(a)
    #print(collections.Counter(labelList))
    #print(collections.Counter(claimList))
    #p31qList = numpy.array(newlist[2])
    #print (p31qList)
    #print(collections.Counter(p31qList))
    newlist[3][0] = newlist[3][0]+1
    #print(newlist[3][0])

    newlist[4].append({"'"+qid+"'":countStatements(wbjson["entities"][qid]["claims"],qid)})

In [45]:
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

claimList = numpy.array(newlist[1])
listClaimCount  = collections.Counter(claimList).most_common()

s = pd.Series(listClaimCount)
#with pd.option_context('display.max_rows', None, 'display.max_columns', None):
    #print(s)

df = pd.DataFrame(listClaimCount,columns=["Prop","Count"])

df
Out[45]:
Prop Count
0 P31 7671
1 P1433 1151
2 P407 940
3 P1476 636
4 P577 536
5 P6216 504
6 P921 493
7 P50 383
8 P18 301
9 P361 137
10 P179 99
11 P1680 98
12 P304 96
13 P433 33
14 P2093 21
15 P478 11
16 P373 8
17 P155 8
18 P156 8
19 P276 8
20 P227 6
21 P646 6
22 P214 5
23 P527 5
24 P268 4
25 P244 4
26 P949 4
27 P1343 4
28 P17 4
29 P51 3
... ... ...
180 P580 1
181 P4983 1
182 P2047 1
183 P272 1
184 P5327 1
185 P5925 1
186 P190 1
187 P1036 1
188 P439 1
189 P94 1
190 P982 1
191 P1465 1
192 P1464 1
193 P1082 1
194 P281 1
195 P242 1
196 P473 1
197 P421 1
198 P1813 1
199 P485 1
200 P402 1
201 P4005 1
202 P1792 1
203 P2046 1
204 P1376 1
205 P948 1
206 P5573 1
207 P1456 1
208 P47 1
209 P3722 1

210 rows × 2 columns

In [9]:
import numpy as np
import matplotlib.pyplot as plt

#Analyzing P31
#print(p31d)

labels = list()
values = list()
solitP31 = list()

w = 7195
h = 3841


for p31q in p31d:
    if len(p31d[p31q]) > 1:
        labels.append(p31q)
        values.append(len(p31d[p31q]))
    else:
        solitP31.append(p31q)
    
#print(labels)
#print(values)

fig = plt.figure(num=None, figsize=(8, 6), dpi=200,  facecolor='w', edgecolor='k')
ax = fig.add_subplot(111)

indexes = np.arange(len(labels))
width = 0.75
rects1 = ax.bar(indexes, values )
for rect in rects1:
        height = rect.get_height()
        ax.text(rect.get_x() + rect.get_width()/2., 1.005*height,
                '%d' % int(height),
                ha='center', va='bottom')


     
        
bars = plt.bar(indexes, values, width,alpha=0.3)

plt.xticks(indexes + width*0.1 , labels,rotation='vertical',)
plt.yticks([0,50,100,500,1000,8000])
plt.yscale('log')
plt.ylabel('Number of Records')
plt.title('Items (n=7736) verlinkt als P31 in Gartenlaube Artikel')


plt.show()
In [10]:
solitList = []
solitListwikitable = []
for item in solitP31:
    solitListwikitable.append(("[[d:"+item+"]]","[[d:"+p31d[item][0]+"]]"))
    solitList.append((item,p31d[item][0]))

df = pd.DataFrame(solitList,columns=["P31-Objectitem","Wikidata-Item für Gartenlaube-Artikel"])

df
Out[10]:
P31-Objectitem Wikidata-Item für Gartenlaube-Artikel
0 Q19362971 Q19153764
1 Q18352980 Q25180
2 Q41298 Q19131716
3 Q184511 Q2499583
4 Q1347298 Q19166127
5 Q861911 Q19231366
6 Q472808 Q61647254
7 Q79007 Q15106492
8 Q7725310 Q19156053
9 Q280783 Q574362
10 Q2804589 Q461613
11 Q1372064 Q27899289
12 Q856713 Q27899289
13 Q5398426 Q1304666
14 Q262166 Q262669
15 Q42744322 Q262669

In [53]:
sum = 0
#print(newlist[4])
statLen = []
for item in newlist[4]:
    #print(item)
    for key in item:
        #print(key)
        sum = sum + item[key]
        statLen.append(item[key])
    
print("Summe aller Statements: "+str(sum))
print("Durchschnittliche Anzahl an Statements je Item: "+str(sum/len(newlist[4])))

statCount = numpy.array(statLen)
listClaimCount  = collections.Counter(statCount)
listClaimCount=sorted(listClaimCount.items())
#print(listClaimCount)
values = []
labels = []
for index in listClaimCount:
    labels.append(index[0])
    values.append(index[1])

fig = plt.figure(num=None, figsize=(8, 6), dpi=200,  facecolor='w', edgecolor='k')
ax = fig.add_subplot(111)

indexes = np.arange(len(labels))
width = 0.75

rects1 = ax.bar(indexes, values )
for rect in rects1:
        height = rect.get_height()
        ax.text(rect.get_x() + rect.get_width()/2., 1.005*height,
                '%d' % int(height),
                ha='center', va='bottom')

bars = plt.bar(indexes, values, width,alpha=0.3)

plt.xticks(indexes + width*0.1 , labels,)
plt.yticks([0,50,100,500,1000,8000])
plt.yscale('log')
plt.ylabel('Number of Items')
plt.xlabel('Number of Statements')
plt.title('Verteilung der Anzahl an Items je Anzahl an Statements der Gartenlaube Artikel')


plt.show()
Summe aller Statements: 16142
Durchschnittliche Anzahl an Statements je Item: 2.086877828054299