Workshop: Digitale Editionen (in der Patristik)

Annette von Stockhausen

10.11.2018

Was ist eine »Digitale Edition«?

A digitized print edition is not a “digital edition” in the strict sense used here. A digital edition can not be printed without a loss of information and/or functionality. The digital edition is guided by a different paradigm. If the paradigm of an edition is limited to the two-dimensional space of the “page” and to typographic means of information representation, than it’s not a digital edition. (Patrick Sahle, http://www.digitale-edition.de/vlet-about.html)

„Digitale Editionen“ werden nicht nur in digitaler Form publiziert, sondern folgen in ihrer Methodologie einem digitalen Paradigma – so wie traditionelle gedruckte Editionen eine Methodologie verfolgten, die dem Paradigma der Druckkultur entspricht.[1] Damit ist ein enges Verständnis digitaler Editionen abgesteckt. Bei vielen digitalen Ressourcen handelt es sich insofern nicht um digitale Editionen im engeren Sinne. Retrokonvertierte gedruckte Editionen oder vertiefende Digitalisierungs- und Erschließungsprojekte in Bibliotheken und Archiven überschreiten oft nicht die Schwelle zu „digitalen Editionen“ im hier verwendeten Sinne. (Patrick Sahle u.a., Kriterien für die Besprechung digitaler Editionen, Version 1.1, https://www.i-d-e.de/publikationen/weitereschriften/kriterien-version-1-1/)

Digitalisierung ≠ PDF

Konvertierung mit Hilfe des Programms pdftotext:

pdftotext dokumente.pdf dokumente.txt 
Dok. 91 als PDF
Dok. 91 als PDF

Gesetzliches Vorgehen gegen Häretiker im Illyricum
.. Das in Konstantinopel aufgestellte Edikt des Theodosius (formal im Namen aller drei Kaiser formuliert) richtet sich an die Präfektur Illyricum, die zu dieser Zeit Teil des Herrschaftsgebiets des Theodosius
war. Es gehört insofern in die Vorgeschichte der Synode von Aquileia (Dok. ), auf der das illyrische Homöertum synodal in Person des Palladius von Ratiaria und des Secundianus von Singidunum verurteilt wird,
als mit ihm gesetzlich im Sinne der Nizäner auch gegen »arianische« Häretiker vorgegangen wird. Das Edikt
ist keine Reaktion auf die in einer Predigt in Konstantinopel vorgebrachte Aufforderung Gregors, gegen
Häretiker vorzugehen (Greg.Naz., or. , [PG ,], so Bernardi, Prédication, f. und Moreschini/Gallay, SC 318, Paris 1985, 48), sondern steht ganz im Kontext der theodosianischen Kirchenpolitik, wie sie schon im Edikt »Cunctos populos« (Dok. 90) deutlich wird.
Das Gesetz entzieht (wie schon »Cunctos populos«) Häretikern – namentlich sind Photinianer (im Illyricum
wohl besonders verbreitet), Homöer (= Arianer in der Diktion des Gesetzes) und Eunomianer genannt –,
die das nizänische Bekenntnis verweigern, die Versammlungsorte und verbietet generell Zusammenkünfte
(§  f. eher allgemein formuliert, während §  dann konkret wird). Das nizänische Bekenntnis wird in §
 inhaltlich ganz in westlicher Tradition interpretiert und als Glaube an den dreieinigen Gott bestimmt, so
dass im Gegensatz zu »Cunctos populos« und zu Dok. . keine »Normbischöfe« angeführt werden (ob dies
anti-alexandrinisch zu deuten und darin der Einfluß des Meletius zu sehen ist, wie Schwartz, Zur Kirchengeschichte des vierten Jahrhunderts.  f. meint, ist zu bezweifeln). §  fordert eine klare Kennzeichnung
aller Nicht-Nizäner als Häretiker. Als solche sollen sie aus allen Kirchen vertrieben werden, damit diese an
die katholischen = nizänischen Bischöfe zurückgegeben werden. Angesichts möglichen gewaltsamen Widerstands von Seiten der Häretiker droht das Edikt für diesen Fall konkret die Vertreibung aus den Städten an.
Diese Regelung zielt, da sie über das Versammlungsverbot hinaus auch die Enteignung von Kirchengebäuden
fordert (angedeutet wohl bereits zu Beginn von § ), faktisch auf die Beseitigung nichtnizänischer Gruppen
aus dem städtischen (= gesellschaftlichen) Leben.
Überlieferung Das Gesetz ist im Codex Theodosianus XVI , überliefert und von dort (verallgemeinert,
ohne die konkreten Namensnennungen in § ) in den Codex Justinianus (I ,) übernommen worden,
wo es (wohl wegen der Definition nizänischen Glaubens) direkt auf »Cunctos populos« folgt. Es ist auch
zitiert in dem kleinen Auszug aus CTh XVI in der Collectio Quesnelliana  und aus dieser in der Collectio
Colbertina (Cod. Paris. lat. ).
Fundstelle CTh XVI , (Mommsen, Theodosiani libri XVI,  f.)
pr.



Imperatores Gratianus Valentinianus
et Theodosius Augusti Eutropio praefecto
praetorio.
nullus haereticis mysteriorum locus,
nulla ad exercendam animi obstinatioris
dementiam pateat occasio. sciant omnes
etiamsi quid speciali quolibet rescripto
per fraudem elicito ab huiusmodi ho

Die Kaiser und Augusti Gratian, Valentinian
und Theodosius an den Praefectus Praetorio Eutropius.
Den Häretikern soll kein Ort für die Myste rien offenstehen und keine Gelegenheit gegeben
werden, den Wahnsinn ihres allzu hartnäckigen
Geistes wirken zu lassen. Es sollen alle wissen,
dass, auch wenn irgendetwas durch einen belie-

E Coll.Quesn. Coll.Colb. Cod.Just. I ,

 f. Imperatores Gratianus Valentinianus et Theodosius Augusti ] Idem AAA. E
nullos hereticos E  exercendam ] exercend Ea

 nullus haereticis ]

[Entwurf] • @1ef6a7b• Überarbeitung Übersetzung 95.1 und 95.1,1-6• Christian Müller (2018-10-30)

Erstellung der kritischen Edition

Kodierung des textkritischen Apparates

...
<variantEncoding method="parallel-segmentation" location="internal"/>
...
<app type="T">
    <lem wit="#Pc #Pb #Ma #My #Ha #Va">ὥσπερ</lem>
    <rdg wit="#Pt #Pd" cause="omission"/>
</app>
<app type="T">
    <lem wit="#Pc #Pb #Ma #My #Ha #Va">γὰρ εἰς πολλὴν</lem>
    <rdg wit="#Pt #Pd" cause="transposition">εἰς πολλὴν γὰρ</rdg>
</app> κατηνέχθη ταπείνωσιν <app type="T">
    <lem wit="#Pt #Pc #Pb #Pd #Ma #My #Va"/>
    <rdg wit="#Ha" cause="addition">ὁ</rdg>
</app> τὸ πρωτότυπον κάλλος τῆς εὐσεβείας ἀποδυσάμενος, <app type="T">
    <lem wit="#Ha">οὕτως ὁ τῇ εὐσεβείᾳ συζῶν καὶ ταῖς ἀρεταῖς κομῶν
                                    πλουτεῖ καὶ ἀγάλλεται.</lem>
    <rdg wit="#Pb #Va" xml:id="lac-Pb-1">οὕτως</rdg>
    <rdg wit="#Pt #Pc #Pd #My" cause="omission"/>
    <rdg wit="#Ma" cause="omission" xml:id="n-Ma-1">
        <add hand="m2" place="margin">οὕτω διὰ τῆς σωτῆρος υἱοῦ τοῦ θεοῦ
        καὶ λόγου συγκαταβάσεως ἐπλουτίσθη.</add>
    </rdg>
    <rdg resp="#Sav">οὕτω διὰ τῆς σωτῆρος ἡμῶν τοῦ θεοῦ λόγου
    συγκαταβάσεως ἐπλουτίσθη.</rdg>
</app>
...

Auszeichnung von zitierten (Bibel)texten

...
<quote type="unmarked">Πᾶσα γραφὴ θεόπνευστος καὶ ὠφέλιμος
    <ref decls="biblical" cRef="GNT:2 Tm:3:16"/></quote> 
...
<seg type="allusion">θησαυροὶ οὐκ ἐν γῇ κατακρυπτόμενοι
    <ref decls="biblical" cRef="GNT:Mt:13:44"/></seg>
...
<cit>
    <ref decls="biblical" cRef="GNT:1 Co:1:4-5">καὶ μαρτυρεῖ <persName type="biblical" key="Paulus">Παῦλος</persName> ὧδέ πη λέγων·</ref>
    <quote type="marked">εὐχαριστῶ τῷ θεῷ, ὅτι ἐν παντὶ ἐπλουτίσθητε ἐν αὐτῷ, 
    ἐν παντὶ λόγῳ καὶ πάσῃ γνώσει.</quote>
</cit>
...

Auszeichnung von Personennamen und von Orten

<persName type="biblical" key="Paulus">Παῦλος</persName>
...
<persName xml:id="JohChrys">Ἰωάννης</persName>
...
<placeName ref="https://pleiades.stoa.org/places/520998">Κωνσταντινουπόλεως</placeName>

Kollationierung

Erstellung normalisierter Fassungen der Transkriptionen per XSLT-Transformation

u.a. Entfernung der Zeilenumbrüche:

    <xsl:template match="tei:lb">
        <xsl:choose>
            <xsl:when test="(@break='no' or @type='inWord')">
                <xsl:text></xsl:text></xsl:when>
            <xsl:otherwise><xsl:text> </xsl:text></xsl:otherwise>
        </xsl:choose>
    </xsl:template>

Durchführung der Kollation mit CollateX

def transString(string):
        # todo: n-ephelkystikon, missing iota ad/subscriptum; how? morphology needed?
        # deal with Iota adscriptum, todo: alpha, eta
        dict = {"ωι": "ῳ",
               "ῶι": "ῳ"}
        for k, v in dict.items():
            string = string.replace(k, v)
        return string

def ws_tokenize(input):
    word_breaks = RegexpTokenizer(r'\w+') # tokenize by whitespace
    tokenized = " ".join(word_breaks.tokenize(input))
    return tokenized

def cleanup(input):
    clean = ws_tokenize(transString(input))
    return clean

witness_Be = cleanup("ὅσα ἀπόστολοι κηρύττουσι. πάντα ταῦτα τῷ ἁγίῳ πνεύματι ἀληθινῶς")
witness_Ha = cleanup("ὅσα ἀπόστολοι κηρύττουσι, πάντα ταῦτα. τῶ ἁγίῳ πνεύματι, ἀληθινῶς")
witness_Ma = cleanup("ὅσα ἀπόστολοι κηρύττουσι· ταῦτα πάντα τῶ ἁγίω πνεύματι ἀληθινῶς")
witness_My = cleanup("ὅσα ἀπόστολοι κηρύττουσι. ταῦτα πάντα τῶ ἁγίω πνεύματι ἀληθινῶς ")
witness_Pd = cleanup("ὅσα ἀπόστολοι κηρύττουσιν. ταῦτα πάντα τῶ ἁγίω πνεύματι ἀληθινῶς")
witness_Pb = cleanup("ὅσα ἀπόστολοι κηρύττουσι. πάντα ταῦτα τῶι ἁγίωι πνεύματι. ἀληθινῶς")
witness_Pa = cleanup("ὅσα ἀπόστολοι κηρύττουσι. πάντα ταῦτα τῶ ἁγίω πνεύματι. ἀληθινῶς")
witness_Pc = cleanup("ὅσα ἀπόστολοι κηρύττουσιν. ταῦτα πάντα τῶ ἁγίω πνεύματι ἀληθινῶς")
witness_Pt = cleanup("ὅσα ἀπόστολοι κηρύττουσιν. ταῦτα πάντα τῶ ἁγίω πνεύματι ἀληθινῶς")
witness_Va = cleanup("ὅσα ἀπόστολοι κηρύττουσι. πάντα ταῦτα τῶ ἁγίω πνεύματι. ἀληθινῶς")

def processToken(inputText):
    return {"t": inputText, "n": unicodedata.normalize("NFKD", inputText).translate({ord(c): None for c in "̓̔́̀͂̈ͅ"})}
def processWitness(inputText):
    siglum, rdg = inputText
    return {"id": siglum, "tokens": \
            [processToken(token) for token in re.findall(r'\S+\s*', rdg)]}
witnesses = [('Be', witness_Be), ('Ha', witness_Ha), ('Ma', witness_Ma), ('My', witness_My), ('Pd', witness_Pd), ('Pb', witness_Pb), ('Pa', witness_Pa), ('Pc', witness_Pc), ('Pt', witness_Pt), ('Va', witness_Va)]
collation = {"witnesses": [processWitness(witness) for witness in witnesses]}

Ausgabe als Tabelle

alignment_table = collate(collation)
print(alignment_table)
+----+---------------+-------------+-------+-------+-------+---------------------------+
| Be | ὅσα ἀπόστολοι | κηρύττουσι  | -     | πάντα | ταῦτα | τῷ ἁγίῳ πνεύματι ἀληθινῶς |
| Ha | ὅσα ἀπόστολοι | κηρύττουσι  | -     | πάντα | ταῦτα | τῶ ἁγίῳ πνεύματι ἀληθινῶς |
| Ma | ὅσα ἀπόστολοι | κηρύττουσι  | ταῦτα | πάντα | -     | τῶ ἁγίω πνεύματι ἀληθινῶς |
| My | ὅσα ἀπόστολοι | κηρύττουσι  | ταῦτα | πάντα | -     | τῶ ἁγίω πνεύματι ἀληθινῶς |
| Pd | ὅσα ἀπόστολοι | κηρύττουσιν | ταῦτα | πάντα | -     | τῶ ἁγίω πνεύματι ἀληθινῶς |
| Pb | ὅσα ἀπόστολοι | κηρύττουσι  | -     | πάντα | ταῦτα | τῳ ἁγίῳ πνεύματι ἀληθινῶς |
| Pa | ὅσα ἀπόστολοι | κηρύττουσι  | -     | πάντα | ταῦτα | τῶ ἁγίω πνεύματι ἀληθινῶς |
| Pc | ὅσα ἀπόστολοι | κηρύττουσιν | ταῦτα | πάντα | -     | τῶ ἁγίω πνεύματι ἀληθινῶς |
| Pt | ὅσα ἀπόστολοι | κηρύττουσιν | ταῦτα | πάντα | -     | τῶ ἁγίω πνεύματι ἀληθινῶς |
| Va | ὅσα ἀπόστολοι | κηρύττουσι  | -     | πάντα | ταῦτα | τῶ ἁγίω πνεύματι ἀληθινῶς |
+----+---------------+-------------+-------+-------+-------+---------------------------+

Ausgabe als Graph

collate(collation, output="svg")
svg
svg

Ausgabe als TEI-XML

tei = collate(collation, output="tei", indent=True)
print(tei)
<?xml version="1.0" ?>
<cx:apparatus xmlns="http://www.tei-c.org/ns/1.0" xmlns:cx="http://interedition.eu/collatex/ns/1.0">
    ὅσα ἀπόστολοι 
    <app>
        <rdg wit="#Be #Ha #Ma #My #Pa #Pb #Va">κηρύττουσι</rdg>
        <rdg wit="#Pc #Pd #Pt">κηρύττουσιν</rdg>
    </app>
     
    <app>
        <rdg wit="#Ma #My #Pc #Pd #Pt">ταῦτα</rdg>
    </app>
     
    πάντα 
    <app>
        <rdg wit="#Be #Ha #Pa #Pb #Va">ταῦτα</rdg>
    </app>
     
    <app>
        <rdg wit="#Be">τῷ ἁγίῳ πνεύματι ἀληθινῶς</rdg>
        <rdg wit="#Ha">τῶ ἁγίῳ πνεύματι ἀληθινῶς</rdg>
        <rdg wit="#Ma #My #Pa #Pc #Pd #Pt #Va">τῶ ἁγίω πνεύματι ἀληθινῶς</rdg>
        <rdg wit="#Pb">τῳ ἁγίῳ πνεύματι ἀληθινῶς</rdg>
    </app>
</cx:apparatus>

Rekonstruktion des Stemmas

XSLT-Transformation: Ausgabe aller Type2-Varianten

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet xmlns="http://www.w3.org/1999/xhtml"           
        xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
        xmlns:tei="http://www.tei-c.org/ns/1.0"
        version="2.0">
    <!-- Transformation für eine Vorlage für stemmatische Überlegungen (ausschließlich type-2-Varianten) -->
    <!-- Format Aktuelle App-Eintrag-Nr./Gesamtzahl der App-Einträge: Lesart lem|Lesart rdg (leer, wenn om.): Handschriften lem|Handschriften rdg -->
    <xsl:output method="text"/>

    <xsl:template match="tei:TEI">
        <xsl:apply-templates select="descendant::tei:app[@type = 'T']"/>
    </xsl:template>

    <!-- Ausschließlich einfache Variationen vom Typ AB:CD, nicht AB:CD:DE, also nur app mit einer rdg neben dem Lemma -->
    <xsl:template match="tei:app[@type='T' and count(tei:rdg|tei:rdgGrp) = 1]">
    <!-- Ausschließlich type-2-Varianten mit mind. 2 Zeugen pro Lesart, sc. in @wit gibt es ein Leerzeichen, weil Einträge durch Leerzeichen getrennt sind, 
    keine rdg, die noch @type haben (= Homoioteleuton, Orthographica)  -->
        <xsl:if test="tei:rdg/@wit[contains(.,' ')] and tei:lem/@wit[contains(.,' ')] and not(tei:rdg/exists(@type))">
            <xsl:value-of select="position()"/>
            <xsl:text>/</xsl:text>
            <xsl:value-of select="count(//tei:app[@type='T'])"/>
            <xsl:text>: </xsl:text>
            <xsl:value-of select="normalize-space(tei:lem)"/>   
            <xsl:text>|</xsl:text>
            <xsl:value-of select="normalize-space(tei:rdg)"/>   
            <xsl:text>: </xsl:text>
            <xsl:value-of select="tei:lem/replace(@wit, '#', '')"/> 
            <xsl:text>|</xsl:text>
            <xsl:value-of select="tei:rdg/replace(@wit, '#', '')"/>     
            <xsl:text>&#10;</xsl:text>
        </xsl:if>
    </xsl:template>

    <xsl:template match="tei:app[@type='T' and count(tei:rdg|tei:rdgGrp) &gt; 1]">  

    </xsl:template>
</xsl:stylesheet>

Transformation durchgeführt:

3/452: εἰς τὸν|: Ha My Pa Be Pb Pc Pd Va|Ma P
9/452: πάντα ταῦτα|ταῦτα πάντα: Pa Be Pb Va Ha|P Pc Pd Ma My
10/452: ἀπεικάζεται καὶ|: Pa Be Pb Va Ha|P Pc Pd Ma My
12/452: διαιροῦν|διαιρῶν: P Pa Be Pb Pd Ma Ha Va|Pc My
13/452: ἀπαστράπτει|ἀ: P Pc Pb Pd My Ma Ha Va|Pa Be
14/452: ὥσπερ|: Pc Pb Ma My Ha Va|P Pd
15/452: γὰρ εἰς πολλὴν|εἰς πολλὴν γὰρ: Pc Pb Ma My Ha Va|P Pd
18/452: πη|πῶς: Pc Pb Ma My Ha Va|P Pd
22/452: ὁ Δαυῒδ|Δαυῒδ ὁ: P Pc Pd Ma My|Pb Ha Va
24/452: καρποῖς|καρποὺς: P Pc Pd Ma My Ha|Pb Va
28/452: ἡ ἄμπελος|: Pb Ha Va|P Pc Pd Ma My
29/452: ἀλλʼ ἐν|ἀλλὰ: P Pb Pd Ha Va|Pc Ma My
30/452: βρύουσα|βρίθουσα: Pc Pb Ma My Ha Va|P Pd
31/452: οὐδὲ|οὐδὲν: P Pb My Ha Va|Pc Pd Ma
34/452: αὐτῶν|: Pb Ha Va|P Pc Pd Ma My
39/452: ποιήσομεν|ποιήσωμεν: Pc Pb Pd Ma Va|P My Ha
41/452: ἐκόμασας|ἐκόμησας: P Pc Pd Ma My|Pb Ha Va
43/452: ἡ|: Pc Pb My Ha Va|P Pd Ma
59/452: |τὴν: Pb Pd My Ha Va|P Pc Ma
61/452: οὐρανῶν|: Pb Ha Va|P Pc Pd Ma My
62/452: παρὰ τῷ φιλανθρώπῳ θεῷ|: Pb Ha Va|P Pc Pd Ma My
64/452: καλῶς|: Pb Ha Va|P Pc Pd Ma My
66/452: μόνον|: Pb Ha Va|P Pc Pd Ma My
67/452: μόνη|: Pb Ha Va|P Pc Pd Ma My
75/452: |θεὸν: Pa Be Pb Va Ha Pd My|P Pc Ma
...

XSLT-Transformation: Ausgabe aller Type2-Varianten im Nexus-Format

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet xmlns="http://www.w3.org/1999/xhtml"           
        xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
        xmlns:tei="http://www.tei-c.org/ns/1.0"
        version="2.0">
    <!-- Transformation für eine Vorlage für stemmatische Überlegungen (ausschließlich type-2-Varianten) -->
    <!-- Format Aktuelle App-Eintrag-Nr./Gesamtzahl der App-Einträge: Lesart lem|Lesart rdg (leer, wenn om.): Handschriften lem|Handschriften rdg -->
    <xsl:output method="text"/>
    <xsl:template match="/">
        <xsl:text>#NEXUS&#10;</xsl:text>
        <xsl:text>begin data;&#10;</xsl:text>     
        <xsl:text>  dimensions ntax=</xsl:text><xsl:value-of select="count(//tei:witness)"/> <xsl:text> nchar=</xsl:text><xsl:value-of select="count(//tei:app[@type='T' and count(tei:rdg|tei:rdgGrp) = 1 and tei:rdg/@wit[contains(.,' ')] and tei:lem/@wit[contains(.,' ')] and not(tei:rdg/exists(@type))])"/><xsl:text>;&#10;</xsl:text>
        <xsl:text>  format symbols = "01" missing=?;&#10;</xsl:text>
        <xsl:text>matrix&#10;</xsl:text>
        <xsl:apply-templates select="tei:TEI"/><xsl:text>;&#10;</xsl:text>
        <xsl:text>end;</xsl:text>
    </xsl:template>    
    <xsl:template match="tei:TEI">
        <xsl:apply-templates select="descendant::tei:text"/>
    </xsl:template>
    <xsl:template match="tei:text">
        <xsl:for-each select="ancestor::tei:TEI/descendant::tei:listWit/tei:witness">
            <xsl:value-of select="@xml:id"/><xsl:text>    </xsl:text>
            <xsl:variable name="wit" select="@xml:id"/>
            <!-- nur type-2-Varianten -->
            <xsl:for-each select="//tei:app[@type='T' and count(tei:rdg|tei:rdgGrp)=1 and tei:rdg/@wit[contains(.,' ')] and tei:lem/@wit[contains(.,' ')] and not(tei:rdg/exists(@type))]">
                <xsl:choose>
                    <xsl:when test="tei:lem/@wit[contains(., $wit )]">
                        <xsl:text>1</xsl:text>
                    </xsl:when>
                    <xsl:when test="tei:rdg/@wit[contains(., $wit )]">
                        <xsl:text>0</xsl:text>
                    </xsl:when>
                    <xsl:otherwise>
                        <xsl:text>?</xsl:text>
                    </xsl:otherwise>
                </xsl:choose>
            </xsl:for-each>
            <xsl:text>&#10;</xsl:text>
        </xsl:for-each>
    </xsl:template>
</xsl:stylesheet>

Transformation durchgeführt

#NEXUS
begin data;
  dimensions ntax=10 nchar=168;
  format symbols = "01" missing=?;
matrix
Pa    11110???????????????????111111111111111111111111111111111111101111111111111111111101111111111111111101111111111111111101111101011111111110111111011111111110111111111111
Be    11110???????????????????1111111111111111111111111111111111111011111111111111111111011111111111111111011111111111111111011111010111111111101111110111110?11101?111???111?
Pb    111111110011111101111111111111111111111111111111101111111111101111111110111101110101111111111111111110111010111110111111111111011101111110111111111000111110111111101111
Va    111111110011111101111111111111111111111111111111101111111111101111111110111111110101111111111111111110111010111110111101111111011111111110111111111000111110111111101111
Ha    1111111101111110011111111111111111101111111111111011111111111011111111111111111111111111110111111111011111111111111111011111011111011111101111110111110?1110111111111111
Pt    000110001101010010000000000000010001010000001000010000000000010000010001000010000010000000000000000011000100000001000010000010100011100001000000000110100001000000010010
Pc    100011111100100111000000000000000001000001000000010000000100011100000001100010001010100000111010100011000100100001000110000011100010000111000100010110100101010001110001
Pd    100110001101000110100000100000010001010000001000010001000000010000010001010010000010000000000000000011000100000001000010000010100011100001000000000110110001000000010010
Ma    00011111110010011000000000000001000101000100100001000100000001110001000100000000101010000000101010001100010?100001000010100011100011100111000100010110100101010000010010
My    100011111100110011100000100000000001000001000000010000000000011100000001100011001010000000111010100011000100100001000110000011100000000111000100000110100101010001110001
;
end;

Verarbeitung in SplitsTree

http://www.splitstree.org/

Ergebnis in SplitsTree
Ergebnis in SplitsTree

Überprüfung stemmatischer Thesen mit Hilfe von XPath-Abfragen

//rdg[parent::app[@type="T"] and contains(@wit,"#Pa") and contains(@wit,"#Be")]

Abfrage in oXygen
Abfrage in oXygen

Digitale Edition

TEI-XML-Datei als Edition

Die TEI-XML-Datei ist die digitale Edition.

Online-Präsentation der digitalen Edition

Beispiele

Was kann man mit einer solchen Edition dann anfangen?

Auswertung mit Voyant-Tools

Öffentlicher Server

Lokaler Server (bei installiertem Server auf Port 8889)

Python-Experimente

Notiz: Verwendete Pakete

import os,sys,glob,re
import unicodedata
import json
import collections
from cltk.corpus.utils.importer import CorpusImporter
from cltk.corpus.multilingual import corpora as cp
from cltk.corpus.utils.formatter import cltk_normalize
from cltk.utils.frequency import Frequency
from cltk.text_reuse.levenshtein import Levenshtein
from MyCapytain.resources.texts.local.capitains.cts import CapitainsCtsText
from MyCapytain.common.constants import Mimetypes, XPATH_NAMESPACES
from lxml.etree import tostring
#import xml.etree.ElementTree as ET
from lxml import etree as ET
from bs4 import BeautifulSoup
from nltk.tokenize import RegexpTokenizer # tokenize
from difflib import SequenceMatcher
from collatex import *
import numpy as np
from matplotlib import pyplot as plt
from matplotlib import font_manager as fm
import pandas as pd 
import folium
from folium.plugins import MarkerCluster

Statistik

word_breaks = RegexpTokenizer(r'\w+') # tokenize by whitespace
inputdir = "/home/stockhausen/cltk_data/multilingual/text/patristic_text_archive_plaintext" 
outputdir = "/home/stockhausen/cltk_data/user_data"
daten = {} # put wordcount in dictionary
wc = []
for file in os.listdir(inputdir):
    if file.endswith('.txt'):
        source = os.path.join(inputdir, file)
        content = open(source).read().lower()
        tokens = word_breaks.tokenize(content)
        wordcount = len(tokens)
        wc.append(wordcount)
        daten[file] = wordcount    

ndaten = collections.OrderedDict(sorted(daten.items(), reverse=True))
# Print accumulated wordcount
print("Number of words in archive: "+str(sum(wc))+"\n")

print('{:<30}{:<10}'.format('Text','Words'))
for text, words in sorted(ndaten.items()):
    print('{:<30}{:<10}'.format(text, words))
Number of words in archive: 123834

Text                          Words     
pta0001.pta001.pta-grc1.txt   3838      
pta0001.pta002.pta-grc1.txt   5935      
pta0001.pta004.pta-grc1.txt   7454      
pta0001.pta005.pta-grc1.txt   4479      
pta0001.pta006.pta-grc1.txt   5384      
pta0001.pta007.pta-grc1.txt   4937      
pta0001.pta009.pta-grc1.txt   7136      
pta0001.pta011.pta-grc1.txt   2677      
pta0001.pta012.pta-grc1.txt   7904      
pta0001.pta013.pta-grc1.txt   1808      
pta0001.pta016.pta-grc1.txt   4535      
pta0001.pta017.pta-grc1.txt   5482      
pta0001.pta018.pta-grc1.txt   6424      
pta0001.pta019.pta-grc1.txt   5802      
pta0001.pta021.pta-grc1.txt   2930      
pta0001.pta023.pta-grc1.txt   5503      
pta0001.pta025.pta-grc1.txt   5472      
pta0001.pta026.pta-grc1.txt   2883      
pta0001.pta027.pta-grc1.txt   2674      
pta0001.pta028.pta-grc1.txt   1923      
pta0001.pta029.pta-grc1.txt   4950      
pta0001.pta030.pta-grc1.txt   2370      
pta0001.pta030.pta-lat1.txt   572       
pta0001.pta035.pta-grc1.txt   523       
pta0001.pta042.pta-grc1.txt   5301      
pta0001.pta043.pta-grc1.txt   4059      
pta0001.pta046.pta-grc1.txt   1716      
pta0001.pta048.pta-grc1.txt   2902      
pta0001.pta049.pta-grc1.txt   6261      

Darstellung als Graphik

fig = plt.figure(figsize=(6,8))
objects = list(ndaten.keys())
y_pos = np.arange(len(objects))
performance = list(ndaten.values())
for i, v in enumerate(performance):
    plt.text(v+.1, i - .25, str(v)) 
plt.barh(y_pos, performance, align='center')
plt.yticks(y_pos, objects)
plt.xlabel('Länge (in Worten)')
plt.title("Länge der Severian zugeschriebenen Homilien")
plt.show()
png
png

KWIC

word_breaks = RegexpTokenizer(r'\w+') # tokenize by whitespace
inputdir = "/home/stockhausen/cltk_data/multilingual/text/patristic_text_archive_plaintext" 

search = "^προκείμενον" # search (only single word, regex possible)

list_count = {}
list_position = {}

for file in sorted(os.listdir(inputdir)):
    if file.endswith('.txt'):
        source = os.path.join(inputdir, file)
        content = open(source).read().lower()
        tokens = word_breaks.tokenize(content)
        indices = [i for i, x in enumerate(tokens) if re.search(cltk_normalize(search),x)] # search string normalized
        counts = []
        count = 0
        positions = []
        for entry in indices:
            count = count+1
            context_before = [tokens[entry-4],tokens[entry-3],tokens[entry-2],tokens[entry-1]]
            context_after = [tokens[entry+1],tokens[entry+2],tokens[entry+3],tokens[entry+4]]
            print('{:<40s}{:>40s}{:^20s}{:<32s}'.format(file[8:14]+" (Pos.: "+str(entry)+" / "+'{:.0%}'.format((entry/len(tokens)))+" des Textes):"," ".join(context_before),tokens[entry]," ".join(context_after)))
            perc = entry/len(tokens)*100
            positions.append(perc)
        list_position[file] = positions            
        list_count[file] = count
        print("---")
pta001 (Pos.: 1389 / 36% des Textes):                         ἅρπαγες ἀλλ εἰς τὸ    προκείμενον     ἐπανέλθωμεν θέλεις ἰδεῖν ἀδελφέ 
pta001 (Pos.: 2158 / 56% des Textes):                          ἀλλὰ πάλιν εἰς τὸ    προκείμενον     ἐπανέλθωμεν ὁ θεὸς ἔκτισε       
---
pta002 (Pos.: 3309 / 56% des Textes):                              ἵνα δὲ εἰς τὸ    προκείμενον     ἐπανέλθωμεν πάλιν ἃ ἤκουσεν     
---
pta004 (Pos.: 1697 / 23% des Textes):                           ἀγάπη ἀλλ εἰς τὸ    προκείμενον     ἐπανέλθωμεν ἔρχεται ἡσαΐας πάλιν
pta004 (Pos.: 1875 / 25% des Textes):                   ἀποκαλύψεως ἀλλὰ πρὸς τὸ    προκείμενον     ἐπανέλθωμεν ὅπου δεῖ μαθεῖν     
pta004 (Pos.: 2297 / 31% des Textes):                          ἀγαθῆς ἀλλ εἰς τὸ    προκείμενον     ἐπανέλθωμεν ἔλαβεν ὁ διδάσκων   
---
---
pta006 (Pos.: 4584 / 85% des Textes):                          τὴν λαμπάδα τὸ δὲ    προκείμενον     καὶ ἦν ἐπὶ τοῦ                  
---
---
pta009 (Pos.: 3638 / 51% des Textes):                     σώματος φύσιν ἐνίκα τὸ    προκείμενον     ὁ μει λέγει πρὸς                
---
pta011 (Pos.: 1975 / 74% des Textes):                       ταμιευέσθω εἰς δὲ τὸ    προκείμενον     ἐπανέλθωμεν ἐπέβαλε τῷ ἀδὰμ     
---
pta012 (Pos.: 381 / 5% des Textes):                        οἰκονομίαν ἀλλ εἰς τὸ    προκείμενον     ἐπανέλθωμεν λέγει τοῖς μαθηταῖς 
pta012 (Pos.: 921 / 12% des Textes):                          φησί τοῦτο πρὸς τὸ    προκείμενον     ἀλλὰ καὶ σφόδρα οἰκειότατον     
pta012 (Pos.: 5431 / 69% des Textes):                            θεός ἀλλ εἰς τὸ    προκείμενον     ἐπανέλθωμεν ὁ δὲ κύριος         
pta012 (Pos.: 5664 / 72% des Textes):                            ἡμεῖς δὲ εἰς τὸ    προκείμενον     ἐπανέλθωμεν γνώτωσαν ὅτι ὄνομά  
pta012 (Pos.: 5876 / 74% des Textes):                             σου ἀλλ ἐπὶ τὸ    προκείμενον     ἐπανέλθωμεν γνώτωσαν ὅτι ὄνομά  
pta012 (Pos.: 6633 / 84% des Textes):               καὶ ἀποκρίσεως σχηματίσαι τὸ    προκείμενον     ταῖς γὰρ τοιαύταις ἀντιθέσεσιν  
---
---
pta016 (Pos.: 381 / 8% des Textes):                     ἐχρήσατο αἴνιγμά ἐστι τὸ    προκείμενον     καὶ ὅπως ἄκουε ἀπ               
pta016 (Pos.: 1099 / 24% des Textes):                        τέως ἀφέντες εἰς τὸ    προκείμενον     ἐπανέλθωμεν ἀπεδήμησεν εἰς χώραν
pta016 (Pos.: 2835 / 63% des Textes):                          ἀλλὰ πάλιν ἐπὶ τὸ    προκείμενον     ἐπανάξω τὸν λόγον ἀδὰμ          
pta016 (Pos.: 2996 / 66% des Textes):                       ὑπεύθυνος ἀλλ ἐπὶ τὸ    προκείμενον     ἐπανέλθωμεν ἡ μὲν ἐξέτασις      
---
---
pta018 (Pos.: 2904 / 45% des Textes):                         ὁμονοίας εἰς δὲ τὸ    προκείμενον     ἔλθωμεν τί ἐροῦμεν μὴ           
---
pta019 (Pos.: 4032 / 69% des Textes):                         ἔχεσθαι καὶ εἰς τὸ    προκείμενον     ἐπανελθεῖν ἀναγκαῖον νόμος οὖν  
---
pta021 (Pos.: 1728 / 59% des Textes):                        ἐνέδωκεν ἀλλ εἰς τὸ    προκείμενον     ἐπανέλθωμεν λέγει ὁ σωτήρ       
---
pta023 (Pos.: 3207 / 58% des Textes):                         ἵνα συντέμω τὸ γὰρ    προκείμενον     οὐ τὴν παροῦσαν ἱστορίαν        
pta023 (Pos.: 3216 / 58% des Textes):                       ἀναπτύξαι ἀλλ ἐπὶ τὸ    προκείμενον     ἐλθεῖν ἠρώτησεν ἐλθεῖν ἠρώτησεν 
---
pta025 (Pos.: 1160 / 21% des Textes):                          οὐκοῦν ἵνα εἰς τὸ    προκείμενον     ἐπανέλθωμεν κἂν τὴν πύλην       
---
---
---
---
pta029 (Pos.: 3284 / 66% des Textes):                         οὐδὲν ἔχων περὶ τὸ    προκείμενον     οὔτε ἵνα τέως τὸν               
---
---
---
---
pta042 (Pos.: 398 / 8% des Textes):                   ἀπέλθωσι καὶ ἴδωσι σκήνωμα    προκείμενον     καὶ δακρυόμενον ὑπὸ τῶν         
pta042 (Pos.: 427 / 8% des Textes):                               ἀλλ οὖν οὐ τὸν    προκείμενον     ἀλλότριος γάρ ἀλλὰ τὸν          
---
pta043 (Pos.: 2839 / 70% des Textes):                         ἀλλ ἔλθωμεν εἰς τὸ    προκείμενον     ἐὰν θέλῃς κύριε δύνασαί         
---
---
pta048 (Pos.: 1261 / 43% des Textes):                       μετάνοιαν ἀλλ ἐπὶ τὸ    προκείμενον     ἐπανέλθωμεν ἐτόλμησεν εἰπεῖν ἄνθρωπος
---
---

Visualisierung

list_count = {k: v for k, v in sorted(list_count.items(), key=lambda x: x[1])}
fig = plt.figure(figsize=(6,7))
objects = list(list_count.keys())
y_pos = np.arange(len(objects))
performance = list(list_count.values())
for i, v in enumerate(performance):
    plt.text(v+.1, i - .25, str(v)) 
plt.barh(y_pos, performance, align='center')
plt.yticks(y_pos, objects)
plt.xlabel('Anzahl')
plt.title("Vorkommen von "+search+" im Korpus (insg. "+str(sum(performance))+" Treffer)")
plt.show()
png
png

Alternative Visualisierung

df = pd.DataFrame(dict([(k,pd.Series(v)) for k,v in sorted(list_position.items(),reverse=True)]))
df1 = df.transpose().dropna(how='all') # transpose and drop empty entries
## plot
fig = plt.figure(1, figsize=(6,6))
for en in df1:
    plt.scatter(df1[en],df1.index,marker=".",s=300)
plt.xlabel('Relative Position im Text')
plt.xticks(np.arange(10, 110, step=10))
plt.title(search)
plt.show()
png
png

Bibelzitate

id = "pta009"
file_name = "pta0001."+id+".pta-grc1.xml"
path = os.path.expanduser('/home/stockhausen/Dokumente/projekte/PatristicTextArchive/Pre-critical_editions/data/pta0001/'+id)
source = os.path.join(path, file_name)
tree = ET.parse(source)
root = tree.getroot()
ns = {'tei': 'http://www.tei-c.org/ns/1.0'}
# title of text
title = root.find('.//tei:title', ns)
quotes = []
# only real quotes (not ref in seg type=allusion)
# case 1: ref in quote
for quote in root.findall('.//tei:p/tei:quote', ns):
    r_q = {}
    ref = quote.find('tei:ref', ns).attrib["cRef"]
    quotation = quote.text
    r_q[ref] = quotation
    quotes.append(r_q)
# case 2: ref in cit
for quote in root.findall('.//tei:cit', ns):
    r_q = {}
    ref = quote.find('tei:ref', ns).attrib["cRef"]
    quotation = quote.find('tei:quote', ns).text
    r_q[ref] = quotation
    quotes.append(r_q)
print(quotes)
# TODO: Noch nicht zu Ende
[{'LXX:Ps:118:12': 'Εὐλογητὸς εἶ, κύριε· δίδαξόν με τὰ δικαιώματά σου.'}, {'GNT:Mt:21:23': 'Προσῆλθον '}, {'LXX:Si:10:9': 'τί ἀλαζονεύει γῆ καὶ σποδὸς.'}, {'GNT:Mt:21:23': 'Ἐν ποίᾳ ἐξουσίᾳ ταῦτα ποιεῖς;'}, {'GNT:Mt:21:23': 'Ἐν ποίᾳ ἐξουσίᾳ ταῦτα ποιεῖς;'}, {'GNT:1 Co:3:19': 'τὸν δρασσόμενον τοὺς σοφοὺς ἐν τῇ πανουργίᾳ αὐτῶν'}, {'GNT:Mt:21:23': 'Ἐν ποίᾳ ἐξουσίᾳ ταῦτα ποιεῖς;'}, {'GNT:Jn:10:24': 'Ἕως πότε τὴν ψυχὴν ἡμῶν αἴρεις; Εἰ σὺ εἶ ὁ Χριστός, εἰπὲ ἡμῖν παρρησίᾳ.'}, {'GNT:Jn:9:27': 'Εἶπον ὑμῖν καὶ οὐκ ἠκούσατε· τί πάλιν θέλετε ἀκούειν;'}, {'GNT:Jn:10:25': 'Τὰ ἔργα, ἃ ἐγὼ ποιῶ, ταῦτα μαρτυρεῖ περὶ ἐμοῦ.'}, {'GNT:Jn:10:24': 'Εἰ σὺ εἶ ὁ Χριστός, εἰπὲ ἡμῖν παρρησίᾳ· ἕως πότε τὴν ψυχὴν ἡμῶν αἴρεις;'}, {'GNT:Mt:26:63': 'Ὁρκίζω σε κατὰ τοῦ θεοῦ τοῦ ζῶντος, εἰπὲ ἡμῖν, εἰ σὺ εἶ ὁ υἱὸς τοῦ εὐλογητοῦ.'}, {'GNT:Mt:26:63': 'Εἰπέ '}, {'GNT:Mt:26:64': 'Σὺ εἴπας.'}, {'LXX:Wis:1:3': 'Σκολιοὶ γὰρ λογισμοὶ χωρίζουσιν ἀπὸ θεοῦ.'}, {'LXX:Wis:1:4': 'Εἰς κακότεχνον γὰρ ψυχὴν οὐκ εἰσελεύσεται σοφία.'}, {'GNT:Jn:4:25': 'Οἴδαμεν, ὅτι ὅταν ἔλθῃ μεσσίας ὁ λεγόμενος Χριστός, αὐτὸς ἡμῖν ἅπαντα ἀναγγελεῖ.'}, {'GNT:Jn:4:26': 'Ἐγώ εἰμι ὁ λαλῶν σοι.'}, {'GNT:Mt:21:23': 'Ἐν ποίᾳ ἐξουσίᾳ ταῦτα ποιεῖς; ἢ τίς σοι ἔδωκε τὴν ἐξουσίαν ταύτην;'}, {'GNT:Mt:21:24-25': 'Ἐρωτήσω ὑμᾶς κἀγὼ λόγον, ὃν ἂν εἴπητέ μοι, κἀγὼ ὑμῖν ἀποκρινοῦμαι. Τὸ Ἰωάννου βάπτισμα, φησί, πόθεν ἦν; ἑξ οὐρανοῦ ἢ ἐξ ἀνθρώπων;'}, {'GNT:Mt:21:25': 'Τὸ βάπτισμα Ἰωάννου πόθεν ἦν; ἐξ οὐρανοῦ ἢ ἐξ ἀνθρώπων;'}, {'GNT:Mt:21:25': 'Ἐὰν εἴπωμεν ἐξ οὐρανοῦ, ἐρεῖ ἡμῖν· διὰ τί οὖν μὴ ἐπιστεύσατε;'}, {'GNT:Mt:21:26': 'Ἐὰν δὲ εἴπωμεν ἐξ ἀνθρώπων, φοβούμεθα τὸν ὄχλον, μὴ λιθασθῶμεν.'}, {'GNT:Mt:21:26': 'εἶχε τὸν Ἰωάννην ὡς προφήτην'}, {'GNT:Mt:21:27': 'Οὐκ οἴδαμεν.'}, {'GNT:Mt:21:27': 'Οὐδὲ ἐγὼ λέγω ὑμῖν.'}, {'GNT:He:11:6': 'ὅτι ἔστι καὶ τοῖς ἐκζητοῦσιν αὐτὸν μισθαποδότης γίνεται.'}, {'LXX:Ps:32:4': 'Ὅτι εὐθὺς ὁ λόγος τοῦ κυρίου καὶ πάντα τὰ ἔργα αὐτοῦ ἐν πίστει.'}, {'LXX:Ex:33:12': 'Ἔγνων '}, {'GNT:Ac:9:15': 'Σκεῦος '}, {'LXX:Ex:33:13': 'Δέομαι, κύριε, εἰ εὕρηκα χάριν ἐνώπιόν σου, γνωστῶς ἴδω σε, ἐμφάνισόν μοι σαυτόν.'}, {'GNT:Jn:14:8': 'Δεῖξον ἡμῖν τὸν πατέρα καὶ ἀρκεῖ ἡμῖν.'}, {'LXX:Ex:33:12': 'εὗρες χάριν ἐνώπιόν μου, ἐμφάνισόν μοι σεαυτόν, ὅπως γνωστῶς ἴδω σε'}, {'LXX:Ex:33:20': 'Οὐδεὶς ὄψεται τὸ πρόσωπόν μου καὶ ζήσεται.'}, {'LXX:Ex:33:22-23': 'Τίθημί σε εἰς τὴν πέτραν, καὶ σκεπάζω τῇ χειρί μου· καὶ ἐν τῷ παρέρχεσθαι τὴν δόξαν μου ὄψῃ τὰ ὀπίσθια, τὰ δὲ ἐμπρόσθια οὐκ ὄψῃ.'}, {'LXX:Ex:33:22': 'Ἐν τῷ παρέρχεσθαι'}, {'LXX:Ex:33:23': 'τὴν δόξαν μου'}, {'GNT:Rm:11:36': 'Ὅτι ἐξ αὐτοῦ καὶ δι’ αὐτοῦ καὶ εἰς αὐτὸν τὰ πάντα· αὐτῷ ἡ δόξα εἰς τοὺς αἰῶνας.'}, {'LXX:Ps:18:2': 'οἱ οὐρανοὶ διηγοῦνται'}, {'LXX:Ps:18:2': 'δόξαν θεοῦ'}, {'LXX:Ps:18:2': 'οἱ οὐρανοὶ διηγοῦνται δόξαν θεοῦ'}, {'GNT:Lk:2:14': 'Δόξα ἐν ὑψίστοις θεῷ καὶ ἐπὶ γῆς εἰρήνη, ἐν ἀνθρώποις εὐδοκία.'}, {'LXX:Ps:79:2': 'Ὁ καθήμενος ἐπὶ τῶν χερουβὶμ ἐμφάνηθι.'}, {'LXX:Ez:3:12': 'Εὐλογημένη ἡ δόξα κυρίου ἐκ τοῦ τόπου αὐτῆς.'}, {'LXX:Ez:3:12': 'Εὐλογημένη ἡ δόξα κυρίου.'}, {'LXX:Ez:3:12': 'Ἐκ τοῦ τόπου αὐτῆς'}, {'LXX:Ez:3:12': 'Εὐλογημένη ἡ δόξα κυρίου ἐκ τοῦ τόπου αὐτῆς.'}, {'LXX:Ez:3:12': 'Εὐλογημένη ἡ δόξα κυρίου.'}, {'LXX:Is:6:2': 'Τὰ γὰρ σεραφὶμ εἱστήκει κύκλῳ αὐτοῦ.'}, {'LXX:Is:6:3': 'Ἅγιος, ἅγιος, ἅγιος, κύριος σαβαώθ, πλήρης πᾶσα ἡ γῆ τῆς δόξης αὐτοῦ.'}, {'GNT:1 Tm:2:5': 'μεσίτης θεοῦ καὶ ἀνθρώπων'}, {'LXX:Nm:20:10': 'Ὦ λαὸς σκληρὸς καὶ ἀπειθής, μὴ ἐκ τῆς πέτρας ταύτης δυνήσομαι ὑμῖν δοῦναι ὕδωρ;'}, {'LXX:Nm:20:12': 'Ἆνθ’ ὧν οὐκ ἐδόξασάς με ἐνώπιον τῆς συναγωγῆς, οὐκ εἰσελεύσῃ εἰς τὴν γῆν, ἣν ὤμοσα.'}, {'LXX:Nm:20:12': 'Ἄνθ’ ὧν οὐκ ἐδόξασάς με.'}, {'GNT:Mt:15:8': 'Ὁ λαὸς γὰρ οὗτος τοῖς χείλεσί με τιμᾷ, ἡ δὲ καρδία αὐτοῦ πόρρω ἀπέχει ἀπ’ ἐμοῦ·'}, {'LXX:Ps:105:32': 'δι’ αὐτοὺς'}, {'GNT:Lk:24:39': 'Ψηλαφήσατέ με καὶ βλέπετε ὅτι πνεῦμα σάρκα καὶ ὀστέα οὐκ ἔχει, καθὼς ἐμὲ θεωρεῖτε ἔχοντα.'}, {'GNT:Jn:20:26': 'κεκλεισμένων'}, {'GNT:Ac:12:10': 'ἡ σιδηρᾶ πύλη αὐτομάτη ἠνοίγη αὐτοῖς.'}, {'GNT:Jn:20:26': 'κεκλεισμένων τῶν θυρῶν'}, {'LXX:Gn:3:55': 'Ἧι ἂν ἡμέρᾳ φάγησθε ἀπὸ τοῦ ξύλου, ἔσεσθε ὡς θεοί γινώσκοντες καλὸν καὶ πονηρὸν.'}, {'LXX:Gn:2:17': 'Ἧι ἂν ἡμέρᾳ φάγησθε, θανάτῳ ἀποθανεῖσθε'}, {'GNT:Ac:6:8': 'Στέφανος '}, {'GNT:Lk:4:34': 'Ἔα, τί ἡμῖν καὶ σοί, υἱὲ τοῦ θεοῦ;'}, {'GNT:Jn:17:3': 'Ἵνα γινώσκωσί σε τὸν μόνον ἀληθινόν θεόν'}, {'LXX:Is:45:21': 'Ἐγώ εἰμι πρῶτος καὶ ἐγὼ μετὰ ταῦτα'}, {'LXX:Is:45:21': 'Ἐγώ εἰμι καὶ οὐκ ἔστιν ἄλλος.'}, {'LXX:Is:44:24': 'μόνος'}, {'GNT:Jn:17:3': 'τὸν μόνον ἀληθινὸν θεόν'}, {'LXX:Is:44:24': 'Ἐξέτεινα τὸν οὐρανὸν μόνος.'}, {'LXX:Is:45:22-23': 'ἐγώ εἰμι καὶ οὐκ ἔστιν ἄλλος. Κατ’ ἐμαυτοῦ ὀμνύω.'}, {'LXX:Is:45:22': 'Οὐκ ἔστιν ἄλλος'}, {'LXX:Is:44:24': 'μόνος εἰμὶ'}, {'LXX:Is:45:23': 'καθ’ ἑαυτοῦ ὤμοσα'}, {'LXX:Is:45:23': 'Κατ’ ἐμαυτοῦ ὀμνύω, εἰ μὴ ἐξελεύσεται ἐκ τοῦ στόματός μου δικαιοσύνη, οἱ λόγοι μου οὐκ ἀποστραφήσονται.'}, {'LXX:Is:45:24': 'Ὅτι ἐμοὶ κάμψει πᾶν γόνυ καὶ πᾶσα γλῶσσα ἐξομολογήσεται τὸν θεὸν τὸν ἀληθινόν.'}, {'LXX:Is:45:21-23': 'Ἐγὼ πρῶτον, ἐγὼ καὶ μετὰ ταῦτα, καὶ πλὴν ἐμοῦ θεὸς οὐκ ἔστιν. Κατ’ ἐμοῦ ὀμνύω.'}, {'LXX:Is:45:21': 'ἐγώ εἰμι, καὶ οὐκ ἔστιν ἄλλος'}, {'LXX:Is:45:23': 'ἐκ στόματός μου ἐξελεύσεται δικαιοσύνη'}, {'LXX:Is:45:23': 'οἱ λόγοι μου οὐκ ἀποστραφήσονται· ὅτι ἐμοὶ κάμψει πᾶν γόνυ, καὶ πᾶσα γλῶσσα ἐξομολογήσεται θεὸν τὸν ἀληθινόν'}, {'GNT:2 Co:13:3': 'Εἰ δοκιμὴν ζητεῖτε τοῦ ἐν ἐμοὶ λαλοῦντος Χριστοῦ;'}, {'LXX:Is:45:21': 'ἐγώ εἰμι, καὶ οὐκ ἐστιν ἄλλος'}, {'LXX:Is:45:23': 'κατ’ ἐμαυτοῦ ὀμνύω, ὅτι ἐμοὶ κάμψει πᾶν γόνυ, καὶ πᾶσα γλῶσσα ἑξομολογήσεται τὸν θεὸν τὸν ἀληθινὸν'}, {'LXX:Is:45:23': 'Ἐγώ ειμι καὶ οὐκ ἔστιν ἄλλος· κατ’ ἐμαυτοῦ ὀμνύω, ὅτι ἐμοὶ κάμψει πᾶν γόνυ.'}, {'LXX:Is:45:21': 'Ἐγώ ειμι μόνος καὶ οὐκ ἐστιν ἄλλος'}, {'LXX:Is:45:21': 'ἐγώ εἰμι μόνος'}, {'GNT:Jn:17:3': 'ἵνα γινώσκωσί σε τὸν μόνον ἀληθινόν θεόν'}, {'LXX:Is:45:23': 'Καὶ πᾶσα γλῶσσα ἐξομολογήσεται τὸν θεὸν τὸν ἀληθινόν.'}, {'LXX:Is:45:21': 'ἐγὼ μόνος καὶ ἐγὼ ἀληθινός'}, {'GNT:Jn:17:3': 'Σὲ τὸν μόνον ἀληθινόν θεόν'}, {'GNT:Jn:17:3': 'τὸν ἀληθινὸν καὶ μόνον'}, {'GNT:Jn:17:3': 'καὶ ὃν ἀπέστειλας Χριστόν'}, {'GNT:1 Jn:5:20': 'Οἴδαμέν '}, {'GNT:Jn:17:3': 'μόνος'}, {'LXX:Ps:44:6': 'Τὰ βέλη '}, {'LXX:Ba:3:36': 'Οὗτος ὁ θεὸς ἡμῶν· οὐ λογισθήσεται ἕτερος πρὸς αὐτόν.'}, {'LXX:Ba:3:36-38': 'Οὐ λογισθήσεται ἕτερος πρὸς αὐτόν. Ἐξεῦρε πᾶσαν ὁδὸν ἐπιστήμης καὶ ἔδωκεν αὐτὴν Ἰακὼβ τῷ παιδὶ αὐτοῦ καὶ Ἰσραὴλ τῷ ἠγαπημένῳ ὑπ’ αὐτοῦ. Μετὰ ταῦτα ἐπὶ τῆς γῆς '}, {'LXX:Ba:3:36-38': 'Οὗτος ὁ θεὸς ἡμῶν, πρὸς ὃν οὐ λογισθήσεται ἕτερος πρὸς αὐτόν, ἐπὶ τῆς γῆς ὤφθη, καὶ τοῖς ἀνθρώποις συνανεστράφη μετὰ ταῦτα.'}, {'LXX:Is:42:8': 'Ἑτέρῳ τὴν δόξαν μου οὐ δώσω.'}, {'LXX:Is:42:8': 'τὴν δόξαν μου ἑτέρῳ οὐ δώσω'}, {'LXX:Is:42:8': 'ἑτέρῳ οὐ δώσω'}, {'GNT:Jn:10:30': 'Ἐγὼ γὰρ καὶ ὁ πατὴρ ἓν ἐσμεν.'}, {'GNT:Jn:17:3': 'ἵνα γινώσκωσί σε τὸν μόνον ἀληθινὸν θεόν'}, {'GNT:Mt:26:39': 'εἰ δυνατὸν, παρελθάτω ἀπ’ ἐμοῦ τὸ ποτήριον'}, {'GNT:Jn:10:18': 'Ἐξουσίαν ἔχω θεῖναι τὴν ψυχήν μου, καὶ ἐξουσίαν ἔχω λαβεῖν αὐτήν·'}, {'GNT:Jn:10:18': 'ἔχω'}, {'GNT:Mt:26:39': 'εἰ δυνατόν, παρελθάτω ἀπ’ ἐμοῦ τὸ ποτήριον τοῦτο'}, {'GNT:Mt:26:41': 'Τὸ πνεῦμα πρόθυμον, ἡ δὲ σὰρξ ἀσθενής·'}, {'GNT:Mt:26:39': 'παρελθάτω ἀπ’ ἐμοῦ τὸ ποτήριον'}, {'GNT:Mt:26:41': 'Προσεύχεσθε, ἵνα μὴ εἰσέλθητε εἰς πειρασμόν.'}, {'GNT:Mt:26:41': 'Τὸ γὰρ πνεῦμα πρόθυμον, ἡ δὲ σὰρξ ἀσθενής.'}, {'GNT:Mt:26:39': 'Εἰ δυνατόν, '}, {'GNT:Ac:21:13': 'οὐ μόνον δεθῆναι, ἀλλὰ καὶ ἀποθανεῖν ὑπὲρ τοῦ ὀνόματος τοῦ Χριστοῦ'}, {'GNT:Jn:12:27': 'Νῦν '}, {'GNT:Mt:26:39': 'εἰ δυνατὸν'}, {'GNT:Mt:26:39': 'εἰ δυνατόν, παρελθάτω'}, {'LXX:Dt:5:29': 'Τίς δώσει οὕτως εἶναι τὴν καρδίαν αὐτῶν ἐν αὐτοῖς, ὥστε φοβεῖσθαί με καὶ φυλάξασθαι πάσας τῆς ἡμέρας, ἵνα εὖ ᾖ αὐτοῖς καὶ τοῖς τέκνοις αὐτῶν;'}, {'LXX:Dt:5:29': 'Τίς δώσει τῷ λαῷ τούτῳ καρδίαν;'}, {'LXX:Ps:50:12': 'Καρδίαν καθαρὰν'}, {'LXX:Dt:5:29': 'Τίς δώσει τῷ λαῷ τούτῳ καρδίαν;'}, {'LXX:Dt:5:29': 'Τίς δώσει τῷ λαῷ τούτῳ καρδίαν τοιαύτην;'}, {'LXX:Dt:5:29': 'Τίς δώσει;'}, {'GNT:Jn:10:18': 'ἐξουσίαν ἔχω θεῖναι τὴν ψυχήν μου καὶ ἐξουσίαν ἔχω λαβεῖν αὐτήν'}, {'GNT:Mt:26:39': 'Εἰ δυνατὸν, παρελθάτω ἀπ’ ἐμοῦ τὸ ποτήριον.'}, {'LXX:Hos:14:10': 'Τίς σοφὸς καὶ συνήσει ταῦτα; Καὶ ἀνὴρ φρόνιμος καὶ γνώσεται ταῦτα; Ὁτι εὐθεῖαι αἱ ὁδοί κυρίου, δίκαιοι πορεύσονται ἐν αὐταῖς.'}, {'LXX:Lv:26:23-24': 'Ἐὰν ὑμεῖς πορεύησθε πρός με ὀρθοί, κἀγὼ πρὸς ὑμᾶς ὀρθός. Ἐὰν δὲ ὑμεῖς πλάγιοι, κἀγὼ χρήσομαι ὑμῖν θυμῷ πλαγίῳ.'}, {'GNT:He:11:6': 'Πιστεῦσαι γὰρ δεῖ τὸν προσερχόμενον θεῷ, ὅτι ἐστιν.'}, {'LXX:Ps:32:4': 'Ὅτι εὐθὺς ὁ λόγος τοῦ κυρίου καὶ πάντα τὰ ἔργα αὐτοῦ ἐν πίστει.'}, {'GNT:Rm:11:33-35': 'Ὦ βάθος πλούτου σοφίας καὶ γνώσεως θεοῦ. Ὡς ἀνεξερεύνητα τὰ κρίματα αὐτοῦ καὶ ἀνεξιχνίαστοι αἱ ὁδοὶ αὐτοῦ. Τίς γὰρ ἔγνω νοῦν κυρίου; ἢ τίς σύμβουλος αὐτοῦ ἐγένετο; ἢ τίς προέδωκεν αὐτῷ, καὶ ἀνταποδοθήσεται αὐτῷ;'}, {'LXX:Jr:2:12': 'Ἔφριξεν οὐρανὸς ἐπὶ τοῦτο.'}, {'LXX:Ps:105:32': 'Καὶ παρώργισαν αὐτὸν ἐφ’ ὕδατος ἀντιλογίας, καὶ ἐκακώθη Μωϋσῆς δι’ αὐτούς.'}, {'LXX:Mi:3:9': 'Ἀκούσατέ μου, οἱ μισοῦντες κρίσιν, οἱ πάντα τὰ ὀρθὰ διαστρέφοντες.'}, {'LXX:Is:45:21-23': 'Ἐγώ εἰμι πρῶτος καὶ ἐγὼ μετὰ ταῦτα καὶ ἕτερος πλὴν ἐμοῦ οὐκ ἔστι. Δίκαιος καὶ σωτὴρ παρὲξ ἐμοῦ οὐκ ἔστι. Καὶ ἐπιστράφητε πρός με καὶ σωθήσεσθε ἀπὸ τῶν ἐσχάτων τῆς γῆς. Ἐγώ εἰμι ὁ θεὸς καὶ οὐκ ἔστιν ἄλλος. Κατ’ ἐμαυτοῦ ὀμνύω.'}, {'LXX:Is:45:21': 'Καὶ οὐκ ἔστιν ἕτερος πλὴν ἐμοῦ.'}, {'LXX:Is:44:24': 'Ἐξέτεινα τὸν οὐρανὸν μόνος.'}, {'GNT:He:6:13': 'Ἐπεὶ κατ’ οὐδενὸς εἶχε μείζονος ὀμόσαι, καθ’ ἑαυτοῦ ὤμοσεν.'}, {'GNT:Rm:14:10-11': 'Σὺ δὲ τί κρίνεις τὸν ἀδελφόν σου; ἢ καὶ σὺ τί ἐξουθενεῖς τὸν ἀδελφόν σου; τί ἀλλήλους κρίνετε; Πάντες γὰρ παραστησόμεθα τῷ βήματι τοῦ Χριστοῦ. Γέγραπται γάρ· Ζῶ ἐγώ, λέγει κύριος, ὅτι ἐμοὶ κάμψει πᾶν γόνυ, καὶ πᾶσα γλῶσσα ἐξομολογήσεται τὸν θεὸν τὸν ἀληθινόν.'}, {'GNT:Jn:17:3': 'Ἵνα γινώσκωσί σε τὸν μόνον ἀληθινόν θεόν.'}, {'LXX:Ba:3:32-35': 'Ὁ κατασκευάσας τὴν γῆν εἰς τὸν αἰῶνα χρόνον ἐνέπλησεν αὐτὴν κτηνῶν τε καὶ τετραπόδων· ἀπέστειλε τὸ φῶς καὶ πορεύεται· ἐκάλεσεν αὐτὸ καὶ ὑπήκουσεν αὐτῷ τρόμῳ. Οἱ δὲ ἀστέρες ἔλαμψαν ἐν ταῖς φυλακαῖς αὐτῶν καὶ εὐφράνθησαν. Ἐκάλεσεν αὐτοὺς τοὺς ἀστέρας '}, {'GNT:Mk:8:38': 'Ὅταν ἔλθῃ ὁ υἱὸς τοῦ ἀνθρώπου ἐν τῇ δόξῃ τοῦ πατρὸς αὐτοῦ'}, {'LXX:Ps:50:12': 'Καρδίαν καθαρὰν κτίσον ἐν ἐμοί, ὁ θεός'}, {'LXX:Dt:29:4': 'Ἔδωκεν ὑμῖν κύριος ὁ θεὸς καρδίαν εἰδέναι, καὶ ὀφθαλμοὺς βλέπειν, καὶ ὦτα ἀκούειν, ἕως τῆς ἡμέρας ταύτης.'}, {'LXX:Ez:11:19': 'Καὶ ἐκσπάσω ἐξ αὐτῶν τὴν καρδίαν τὴν λιθίνην καὶ δώσω αὐτοῖς καρδίαν σαρκίνην καὶ γράψω τὸν νόμον μου ἐν ταῖς καρδίαις αὐτῶν'}, {'LXX:Ps:118:134': 'Ῥῦσαί με ἀπὸ συκοφαντίας ἀνθρώπων'}, {'GNT:Rm:3:8': 'Καὶ μὴ καθὼς βλασφημούμεθα, καὶ καθώς φασί τινες ἡμᾶς λέγειν, ὅτι Ποιήσωμεν τὰ κακά, ἵνα ἔλθῃ τὰ ἀγαθά.'}, {'LXX:Wis:9:6': 'Κἂν γὰρ ᾖ τις τέλειος ἐν υἱοῖς ἀνθρώπων τῆς παρὰ σοῦ σοφίας ἀπούσῃς εἰς οὐδὲν λογισθήσεται.'}, {'GNT:Mt:16:6': 'Σὺ εἶ ὁ Χριστὸς ὁ υἱὸς τοῦ θεοῦ τοῦ ζῶντος.'}, {'GNT:He:1:2-3': 'ἐλάλησεν ἡμῖν ὁ θεὸς ἐν υἱῷ, δι’ οὗ καὶ τοὺς αἰῶνας ἐποίησε· ὃς ὢν ἀπαύγασμα τῆς δόξης καὶ χαρακτὴρ τῆς ὑποστάσεως, φέρων τε τὰ πάντα τῷ λόγῳ τῆς δυνάμεως αὐτοῦ'}, {'GNT:Rm:9:5': 'Ὧν οἱ πατέρες ἡμῶν, ἐξ ὧν ὁ Χριστὸς κατὰ σάρκα, ὁ ὢν ἐπὶ πάντων θεὸς εὐλογητὸς εἰς τοὺς αἰῶνας τῶν αἰώνων. Ἀμήν.'}]
id = "pta009"
file_name = "pta0001."+id+".pta-grc1.xml"
path = os.path.expanduser('/home/stockhausen/Dokumente/projekte/PatristicTextArchive/Pre-critical_editions/data/pta0001/'+id)
source = os.path.join(path, file_name)
tree = ET.parse(source)
root = tree.getroot()
ns = {'tei': 'http://www.tei-c.org/ns/1.0'}
# title of text
title = root.find('.//tei:title', ns)
quotes = []
# only real quotes (not ref in seg type=allusion)
# case 1: ref in quote
for quote in root.findall('.//tei:quote/tei:ref', ns):
    ref = quote.attrib["cRef"]
    quotes.append(ref)
# case 2: ref in cit
for quote in root.findall('.//tei:cit/tei:ref', ns):
    ref = quote.attrib["cRef"]
    quotes.append(ref)
print("Datei "+file_name+" ("+title.text+") enthält "+str(len(quotes))+" biblische Zitate.")
Datei pta0001.pta009.pta-grc1.xml (Digital text of Severianus Gabalensis, In illud: In qua potestate haec facis) enthält 150 biblische Zitate.

Extract all AT quotes

AT = [s for s in quotes if "LXX" in s]
regex=re.compile("LXX:([0-9A-Za-z ]*:.*)")
AT = [a.group(1) for b in AT for a in [regex.search(b)] if a]
print("Anzahl der AT-Zitate: "+(str(len(AT))))
## extract from this list only book names and write to new list
regex=re.compile("([0-9A-Za-z ]*):.*")
AT_books = [a.group(1) for b in AT for a in [regex.search(b)] if a]
## extract from this list only book names and chapters and write to new list
regex=re.compile("([0-9A-Za-z ]*?:[0-9]+?):.*")
AT_bkch = [a.group(1) for b in AT for a in [regex.search(b)] if a]
Anzahl der AT-Zitate: 78

Extract all NT quotes

NT = [s for s in quotes if "GNT" in s]
regex=re.compile("GNT:([0-9A-Za-z ]*:.*)")
NT = [a.group(1) for b in NT for a in [regex.search(b)] if a]
print("Anzahl der NT-Zitate: "+(str(len(NT))))
## extract from this list only book names and write to new list
regex=re.compile("([0-9A-Za-z ]*):.*")
NT_books = [a.group(1) for b in NT for a in [regex.search(b)] if a]
## extract from this list only book names and chapters and write to new list
regex=re.compile("([0-9A-Za-z ]*?:[0-9]+?):.*")
NT_bkch = [a.group(1) for b in NT for a in [regex.search(b)] if a]
Anzahl der NT-Zitate: 72

Ratio of AT/NT-quotes of all quotations

anteil_nt = '{:.0%}'.format(len(NT)/len(quotes))
print("Anteil der NT-Zitate an allen Zitaten: "+str(anteil_nt))
anteil_at = '{:.0%}'.format(len(AT)/len(quotes))
print("Anteil der AT-Zitate an allen Zitaten: "+str(anteil_at))
# Remove duplicates from list and count instances of quotes
# AT
at = {x:AT.count(x) for x in sorted(AT, reverse=True)} # all single quotes
at_books = {x:AT_books.count(x) for x in AT_books} # all quotes (book)
at_bkch = {x:AT_bkch.count(x) for x in sorted(AT_bkch, reverse=True)} # all books with chapter
# NT
nt = {x:NT.count(x) for x in sorted(NT, reverse=True)} # all single quotes
nt_books = {x:NT_books.count(x) for x in NT_books} # all quotes (book)
nt_bkch = {x:NT_bkch.count(x) for x in sorted(NT_bkch, reverse=True)} # all books with chapter
Anteil der NT-Zitate an allen Zitaten: 48%
Anteil der AT-Zitate an allen Zitaten: 52%

Plot AT quotations (books)

fig = plt.figure(1, figsize=(6,6))
ax = fig.add_axes([0.1, 0.1, 0.8, 0.8])
plt.title('AT-Zitate in '+title.text)
colors = list(plt.cm.tab20(np.arange(20)))
labels = list(at_books.keys())
values = list(at_books.values())
patches, texts, autotexts = ax.pie(values, labels=labels, colors=colors, autopct='%.0f%%')
proptease = fm.FontProperties()
proptease.set_size('medium')
plt.setp(autotexts, fontproperties=proptease)
plt.setp(texts, fontproperties=proptease)
plt.show()
png
png
# AT-Zitate (Buch Kapitel) und mit absoluten Zahlen
fig = plt.figure(figsize=(6,8))
objects = list(at_bkch.keys())
y_pos = np.arange(len(objects))
performance = list(at_bkch.values())
plt.barh(y_pos, performance, align='center')
plt.yticks(y_pos, objects)
plt.xlabel('Anzahl')
plt.title('AT-Zitate (Buch und Kapitel) in '+title.text)
plt.show()
png
png

Zitatgenauigkeit

# Texts
# Mt 22,42
a='Τίνα λέγετε εἶναι τὸν Χριστόν; τίνος ἐστὶν ὁ υἱός; Λέγουσιν οἱ γραμματεῖς καὶ οἱ φαρισαῖοι· Τοῦ Δαυίδ.'
b='λέγων· τί ὑμῖν δοκεῖ περὶ τοῦ χριστοῦ; τίνος υἱός ἐστιν; λέγουσιν αὐτῷ· τοῦ Δαυίδ.'
from cltk.corpus.utils.formatter import cltk_normalize
a = cltk_normalize(a.lower())
b = cltk_normalize(b.lower())
# using difflib
word_breaks = RegexpTokenizer(r'\w+') # whitespace

x = word_breaks.tokenize(a)
y = word_breaks.tokenize(b)

for tag, i, j, k, l in SequenceMatcher(None, x, y).get_opcodes():
  if tag == 'equal': print('Words in common:  ', " ".join(x[i:j]))
  if tag in ('delete', 'replace'): print('  Citation only:  ', " ".join(x[i:j]))
  if tag in ('insert', 'replace'): print('  Cited text only:', " ".join(y[k:l]))
  Citation only:   τίνα λέγετε εἶναι τὸν χριστόν
  Cited text only: λέγων τί ὑμῖν δοκεῖ περὶ τοῦ χριστοῦ
Words in common:   τίνος
  Citation only:   ἐστὶν ὁ
Words in common:   υἱός
  Cited text only: ἐστιν
Words in common:   λέγουσιν
  Citation only:   οἱ γραμματεῖς καὶ οἱ φαρισαῖοι
  Cited text only: αὐτῷ
Words in common:   τοῦ δαυίδ

Darstellung von kodierten Orten auf einer Karte

Extract places from file

file_name = "pta0022.pta010.pta-grc1.xml"
path = os.path.expanduser('/home/stockhausen/Dokumente/projekte/PatristicTextArchive/Pre-critical_editions/data/pta0022/pta010')
source = os.path.join(path, file_name)
with open(source) as file_open:
    soup = BeautifulSoup(file_open, 'lxml')
    strip_tags = ['cit', 'ref', 'quote', 'said', 'gap'] # remove not needed tags to avoid problems
    for tag in strip_tags: 
        for match in soup.find_all(tag):
            match.replaceWithChildren()
    body = soup.find("text")
    title = soup.find('title')
    places = []
    for place in body.find_all('placename'):
        place_entry = {}
        refs = place["ref"]
        place_name = place.text
        p = place.parent
        div = p.parent
        chapter = div["n"] 
        ct_before = place.previous_siblings
        context_before_list = []
        for context_b in ct_before:
            context_before_list.append(context_b.string)
        context_before = " ".join(context_before_list[::-1]).split()[-5:]
        ct_after = place.next_siblings
        context_after_list = []
        for context_a in ct_after:
            context_after_list.append(context_a.string)
        context_after = " ".join(context_after_list).split()[:5]
        context = chapter+" "+" ".join(context_before)+" <b>"+place_name+"</b> "+" ".join(context_after)
        if not any(d['ID'] == refs for d in places):
            place_entry["ID"] = refs
            place_entry["Context"] = context
            place_entry["Count"] = 1
            places.append(place_entry)
        else:
            matches = next(d for d in places if refs == d["ID"])
            tc = matches["Count"]
            myid = matches["ID"]
            mycontext = matches["Context"]
            place_entry["ID"] = myid
            place_entry["Context"] = mycontext+"<br/>"+context
            place_entry["Count"] = tc+1
            places.remove(matches)
            places.append(place_entry)
places_count = [d['Count'] for d in places]
places_count = sum(places_count)
print("Datei "+file_name+" ("+title.text+") enthält "+str(places_count)+" Ortsnennungen und "+str(len(places))+" Orte.")
print(places)
Datei pta0022.pta010.pta-grc1.xml (Apologia ad Constantium) enthält 59 Ortsnennungen und 27 Orte.
[{'ID': 'http://pleiades.stoa.org/places/197446', 'Context': '3 περὶ Θάλασσον ἦλθον εἰς τὴν <b>Πιτυβίωνα</b> καὶ ἡμεῖς ἐν τῇ Ἀκυληίᾳ', 'Count': 1}, {'ID': 'http://pleiades.stoa.org/places/393473', 'Context': '3 εἰπεῖν καὶ Κρισπῖνος ὁ τῆς <b>Πατάβων</b> καὶ Λούκιλλος ὁ ἐν Βερωνὶ', 'Count': 1}, {'ID': 'http://pleiades.stoa.org/places/383816', 'Context': '3 Πατάβων καὶ Λούκιλλος ὁ ἐν <b>Βερωνὶ</b> καὶ Διονύσιος ὁ ἐν Ἤλιδι', 'Count': 1}, {'ID': 'http://pleiades.stoa.org/places/570220', 'Context': '3 Βερωνὶ καὶ Διονύσιος ὁ ἐν <b>Ἤλιδι</b> καὶ Βικέντιος ὁ ἐν Καμπανίᾳ', 'Count': 1}, {'ID': 'http://pleiades.stoa.org/places/383706', 'Context': '3 Τριβέρεως καὶ Προτάσιος ὁ τῆς <b>Μεδιολάνου</b> , δύναται καὶ Εὐγένιος ὁ<br/>4 αὐτόν· ἦν δὲ ἐν τῇ <b>Μεδιολάνῳ</b> . ἐγὼ δὲ διερωτῶν τὴν<br/>4 ψεύδομαι. κατελθὼν τοίνυν εἰς τὴν <b>Μεδιόλανον</b> εἶδον πολλὴν φιλανθρωπίαν· κατηξίωσε γὰρ', 'Count': 3}, {'ID': 'http://pleiades.stoa.org/places/207439', 'Context': '4 –, ἵνα ἐκεῖθεν εἰς τὴν <b>Σαρδικὴν</b> ὁδεύσωμεν. μετὰ δὲ τὴν σύνοδον', 'Count': 1}, {'ID': 'http://pleiades.stoa.org/places/207303', 'Context': '4 δὲ τὴν σύνοδον ἐν τῇ <b>Ναισσῷ</b> μοι διάγοντι γράφει, καὶ ἀνελθὼν', 'Count': 1}, {'ID': 'http://pleiades.stoa.org/places/207549', 'Context': '5 με – πρῶτον μὲν ἐν <b>Βιμινακίῳ</b> , δεύτερον δὲ ἐν Καισαρείᾳ', 'Count': 1}, {'ID': 'http://pleiades.stoa.org/places/629035', 'Context': '5 Βιμινακίῳ , δεύτερον δὲ ἐν <b>Καισαρείᾳ τῆς Καππαδοκίας</b> καὶ τρίτον ἐν Ἀντιοχείᾳ –,', 'Count': 1}, {'ID': 'http://pleiades.stoa.org/places/658381', 'Context': '5 τῆς Καππαδοκίας καὶ τρίτον ἐν <b>Ἀντιοχείᾳ</b> –, εἰ κἂν τῶν περὶ', 'Count': 1}, {'ID': 'http://pleiades.stoa.org/places/108894', 'Context': '3 καὶ ἐπειδὴ τετελευτήκασι Μαξιμῖνος ὁ <b>Τριβέρεως</b> καὶ Προτάσιος ὁ τῆς Μεδιολάνου<br/>15 τῆς οἰκοδομῆς. τοῦτο καὶ ἐν <b>Τριβέροις</b> καὶ ἐν Ἀκυληΐᾳ γενόμενον ἑώρακα·', 'Count': 2}, {'ID': 'http://pleiades.stoa.org/places/981508', 'Context': '22 καὶ Ἀστέριος ὁ γενόμενος δοὺξ <b>Ἀρμενίας</b> . τὸ δὲ ἀντίγραφον τῆς', 'Count': 1}, {'ID': 'http://pleiades.stoa.org/places/423025', 'Context': '4 τινὰς ἢ μόνον εἰς τὴν <b>Ῥώμην</b> ἀνῆλθον καὶ τῇ ἐκκλησίᾳ τὰ<br/>6 θαυμάζομέν σε σφάξαντα τοὺς ἐν <b>Ῥώμῃ</b> γνησίως ἡμᾶς ὑποδεξαμένους, τὴν μακαρίαν<br/>27 πανταχοῦ, ὅτι Λιβέριος ὁ τῆς <b>Ῥώμης</b> ἐπίσκοπος καὶ ὁ τῶν Σπανίων', 'Count': 3}, {'ID': 'http://pleiades.stoa.org/places/1027', 'Context': '27 Ῥώμης ἐπίσκοπος καὶ ὁ τῶν <b>Σπανίων</b> Ὅσιος ὁ μέγας, Παυλῖνός τε', 'Count': 1}, {'ID': 'http://pleiades.stoa.org/places/993', 'Context': '4 πόλει μετεπέμψατο πάλιν εἰς τὰς <b>Γαλλίας</b> – ἐκεῖ γὰρ καὶ ὁ<br/>4 μακαρίτου καὶ ἀνελθὼν εἰς τὰς <b>Γαλλίας</b> οὕτως ἦλθον παρὰ τὴν σὴν<br/>27 μέγας, Παυλῖνός τε ὁ τῶν <b>Γαλλίων</b> καὶ Διονύσιος καὶ Εὐσέβιος οἱ', 'Count': 3}, {'ID': 'http://pleiades.stoa.org/places/1052', 'Context': '19 ἐμοῦ γράψαντος, ἵνα εἰς τὴν <b>Ἰταλίαν</b> ἔλθω καὶ ἃ νομίζω λείπειν<br/>27 Διονύσιος καὶ Εὐσέβιος οἱ τῆς <b>Ἰταλίας</b> , Λουκίφερός τε ἀπὸ Σαρδανίας', 'Count': 2}, {'ID': 'http://pleiades.stoa.org/places/472014', 'Context': '27 Ἰταλίας , Λουκίφερός τε ἀπὸ <b>Σαρδανίας</b> καὶ ἄλλοι τινὲς ἐπίσκοποι καὶ', 'Count': 1}, {'ID': 'http://pleiades.stoa.org/places/432754', 'Context': '3 Ἤλιδι καὶ Βικέντιος ὁ ἐν <b>Καμπανίᾳ</b> ἐπίσκοπος. καὶ ἐπειδὴ τετελευτήκασι Μαξιμῖνος<br/>27 ἐξωρίσθησαν, Οὐικέντιος δὲ ὁ τῆς <b>Καπύης</b> καὶ Φουρτουνατιανὸς ὁ τῆς Ἀκυληίας', 'Count': 2}, {'ID': 'http://pleiades.stoa.org/places/187290', 'Context': '3 Πιτυβίωνα καὶ ἡμεῖς ἐν τῇ <b>Ἀκυληίᾳ</b> διετρίβομεν –, μάρτυς ὁ κύριος,<br/>3 ἀνεχωροῦμεν. δύναται Φουρτουνατιανὸς ὁ τῆς <b>Ἀκυληίας</b> ἐπίσκοπος μαρτυρῆσαι περὶ τούτου, ἱκανός<br/>4 διάγοντι γράφει, καὶ ἀνελθὼν ἐν <b>Ἀκυληίᾳ</b> λοιπὸν διέτριβον, ἔνθα με τὰ<br/>15 καὶ ἐν Τριβέροις καὶ ἐν <b>Ἀκυληΐᾳ</b> γενόμενον ἑώρακα· κἀκεῖ γὰρ ἐν<br/>15 ὁ μακαρίτης σου ἀδελφὸς ἐν <b>Ἀκυληΐᾳ</b> τοιαύτης οὔσης συνάξεως συνήχθη. οὕτω<br/>27 Καπύης καὶ Φουρτουνατιανὸς ὁ τῆς <b>Ἀκυληίας</b> , Ἠρέμιός τε ὁ τῆς', 'Count': 6}, {'ID': 'http://pleiades.stoa.org/places/491740', 'Context': '27 , Ἠρέμιός τε ὁ τῆς <b>Θεσσαλονίκης</b> καὶ πάντες οἱ κατὰ τὴν', 'Count': 1}, {'ID': 'http://pleiades.stoa.org/places/727070', 'Context': '4 Ἐξελθὼν ἀπὸ τῆς <b>Ἀλεξανδρείας</b> οὐκ εἰς τὸ στρατόπεδον τοῦ<br/>4 ἔσχον ἔτι ὢν ἐν τῇ <b>Ἀλεξανδρείᾳ</b> ἀπολογήσασθαι, καὶ ὅτε πυκτία τῶν<br/>15 οἰκοδομῶν τὴν τότε μείζονα νομιζομένην <b>ἐκκλησίαν τὴν καλουμένην Θεωνᾶ</b> συνῆγεν ἐκεῖ διὰ τὸ πλῆθος<br/>22 ὁ στρατηλάτης εἰσῆλθεν εἰς τὴν <b>Ἀλεξάνδρειαν</b> , ἐπειδὴ παρὰ τῶν Ἀρειανῶν<br/>26 σῆς εὐσεβείας οὔτε νῦν εἰς <b>Ἀλεξάνδρειαν</b> εἰσελθεῖν πειράσω, ἕως ἡ σὴ<br/>27 ἐλέγετο διωγμὸς ἐκεῖ, ὡς ἐν <b>Ἀλεξανδρείᾳ</b> εὐχομένων τῶν ἀδελφῶν ἐν τῷ<br/>30 Νικητὴς Κωνστάντιος Μέγιστος Σεβαστὸς <b>Ἀλεξανδρεῦσιν</b> .', 'Count': 7}, {'ID': 'http://pleiades.stoa.org/places/766', 'Context': '10 Φιληκήσιμος ὁ γενόμενος δοὺξ τῆς <b>Αἰγύπτου</b> καὶ Ῥουφῖνος καὶ Στέφανος ,<br/>22 Συριανὸν ἢ τὸν ἔπαρχον τῆς <b>Αἰγύπτου</b> Μάξιμον γράψαι μοι περὶ τούτου.<br/>24 ἦν καὶ ὁ ἔπαρχος τῆς <b>Αἰγύπτου</b> Μάξιμος · ἡ δὲ ἀξίωσις<br/>24 ἡ τάξις τοῦ ἐπάρχου τῆς <b>Αἰγύπτου</b> . καὶ ὁ πρύτανις δὲ<br/>27 κατέλαβεν ἀκοὴ περὶ τῶν κατ’ <b>Αἴγυπτον</b> καὶ τὰς Λιβύας , ὅτι<br/>31 ἐπίσκοπον ἐκπέμπετε τὴν ταχίστην εἰς <b>Αἴγυπτον</b> παρὰ τὸν σεμνότατον Γεώργιον τὸν<br/>31 καὶ τοὺς ἄλλους τοὺς κατ’ <b>Αἴγυπτον</b> , οἳ τοῦ χειροτονεῖν καὶ', 'Count': 7}, {'ID': 'http://pleiades.stoa.org/places/39303', 'Context': '29 ἀκοὴ ὅτι γέγραπται τοῖς ἐν <b>Αὐξούμει</b> τυράννοις, ὥστε Φρουμέντιον τὸν ἐπίσκοπον<br/>29 ὥστε Φρουμέντιον τὸν ἐπίσκοπον τῆς <b>Αὐξούμεως</b> ἐκεῖθεν ἀχθῆναι καὶ ἐμὲ μὲν<br/>31 Φρουμεντίου χάριν τοῦ ἐπισκόπου τῆς <b>Αὐξούμεως</b> γέγραπται τοῖς ἐκεῖ τυράννοις ἔστι<br/>31 καὶ δέος μὴ διαβὰς εἰς <b>Αὔξουμιν</b> διαφθείρῃ τοὺς παρ’ ὑμῖν, λόγους', 'Count': 4}, {'ID': 'http://pleiades.stoa.org/places/776210', 'Context': '32 ἀπὸ τῆς Λιβύης εἰς τὴν <b>μεγάλην Ὄασιν</b> , οἱ δὲ ἀπὸ τῆς', 'Count': 1}, {'ID': 'http://pleiades.stoa.org/places/991398', 'Context': '32 , οἱ δὲ ἀπὸ τῆς <b>Θηβαίδος</b> εἰς τὴν Ἀμμωνιακὴν τῆς Λιβύης', 'Count': 1}, {'ID': 'http://pleiades.stoa.org/places/716520', 'Context': '32 ἀπὸ τῆς Θηβαίδος εἰς τὴν <b>Ἀμμωνιακὴν</b> τῆς Λιβύης ἀπεστάλησαν. καὶ οὐ', 'Count': 1}, {'ID': 'http://pleiades.stoa.org/places/991375', 'Context': '9 τοὺς περὶ Βάλεντα διὰ τῆς <b>Λιβύης</b> ἐλθόντας ἐφοβούμην, μὴ κἀκεῖνος περάσαι<br/>27 τῶν κατ’ Αἴγυπτον καὶ τὰς <b>Λιβύας</b> , ὅτι οἱ μὲν ἐπίσκοποι<br/>32 οἱ μὲν γὰρ ἀπὸ τῆς <b>Λιβύης</b> εἰς τὴν μεγάλην Ὄασιν ,<br/>32 Θηβαίδος εἰς τὴν Ἀμμωνιακὴν τῆς <b>Λιβύης</b> ἀπεστάλησαν. καὶ οὐ δεδιὼς πάλιν', 'Count': 4}]

Show on map

# Pleiades data from https://github.com/pelagios/recogito2-places-pleiades -> pleiades-20170403.jsonl
contents = open('pleiades-20170403.jsonl', "r").read() 
data = [json.loads(str(item)) for item in contents.strip().split('\n')]
# base map
# http://a.tiles.mapbox.com/v3/isawnyu.map-knmctlkh/{z}/{x}/{y}.png
# Tiles: <a href="http://www.awmc.unc.edu" target="_blank">AWMC<\/a> (CC-BY-NC)
m = folium.Map(location=[40.4285312, 29.715356500000002],
               zoom_start=4,
               tiles = 'stamenwatercolor',
              control_scale=True)

folium.TileLayer(tiles = 'http://a.tiles.mapbox.com/v3/isawnyu.map-knmctlkh/{z}/{x}/{y}.png',
                attr = '<a href="http://www.awmc.unc.edu" target="_blank">AWMC</a> (CC-BY-NC)',
                name = 'AWMC').add_to(m)

folium.TileLayer(
              tiles = 'http://pelagios.org/tilesets/imperium/{z}/{x}/{y}.png',
              attr = '<a href="http://dare.ht.lu.se">DARE 2015</a> (CC-BY-SA)',
               name = 'DARE').add_to(m)
                                

folium.LayerControl().add_to(m)
map_data = []
for place in range(len(places)):
    entries = []
    for key in places[place]:
        entries.append(places[place][key])
    entries = (entries)
    map_data.append(entries)
for place in map_data:
    location = next(item for item in data if item["uri"] == place[0])
    lc = location.get("reprPoint")
    lat = lc[1]
    long = lc[0]
    place_name = location.get("title")
    popup_entry = place[1]
    mult = place[2]
    # Add marker to map
    folium.CircleMarker(
    radius=2*mult,
    location=[lat,long],
    tooltip=place_name,
    popup=popup_entry,
    color='crimson',
    fill=True,
    ).add_to(m)
    #folium.Marker([lat,long]).add_to(m)
# show map
print("Places mentioned in "+file_name)
m
#m.save('ApolConst-map.html')
Places mentioned in pta0022.pta010.pta-grc1.xml