Der Koran als Topic Map

Du hast eine Idee für ein Projekt?
Benutzeravatar
Kai Borrmann
User
Beiträge: 29
Registriert: Sonntag 7. Januar 2007, 09:11
Wohnort: Berlin

Wenn wir uns vergegenwärtigen, daß der Koran ursprünglich die Rezitation von etwas Memoriertem, nicht das Ablesen von etwas Geschriebenem bezeichnete, dann fällt es uns leichter, vom Medium der Schrift abstrahieren zu können. Ob im Gedächtnis, in Form eines Buches, eines Tonbandes oder in einem Hologramm gespeichert, der Inhalt bliebe der gleiche, während sich die Möglichkeiten des Zugriffs auf diesen naturgemäß ändern müßten. Tatsächlich bieten sich im Internet zahlreiche Mischformen und ohne Zweifel wird der technische Fortschritt Medien entwickeln, die heute noch nicht abzusehen sind. Ebenso sicher ist, daß der Koran als Fokus der Verehrung, wissenschaftlichen Beschäftigung und gesellschaftlichen Auseinandersetzung weiter an Bedeutung gewinnen wird.

Ließe sich, um diese Formen der Bezugnahme sowohl zu speichern, als auch voneinander abzugliedern, ein System der Annotation aufstellen?

Im Folgenden wird der Vorschlag gemacht, den Koran in ein Semantisches Netz zu überführen. Hierdurch würde die Möglichkeit geschaffen, beliebig viele, gewissermaßen tomographische, Querschnitte entlang von Blickachsen durchzuführen, die sich etwa auf die metrischen Formen, klanglichen Muster oder gedanklichen Assoziationsstränge richten. Gleichzeitig schüfe dieses Netz Ankerpunkte, an denen das im Internet sedimentierte Wissen über den Koran an diesen selber angebunden werden kann.

Dieses Corpus nähme damit gleichzeitig einen festen und einen „flüssigen“ Aggregatzustand ein. Der Koran enthält eine Fülle von Aussagen, die ohne Kommentar nicht verstanden weren können. Auch die Gleichartigkeit vieler Aussagen, ihre Redundanz und Repetition, sorgt einerseits für eine tiefere und sichere Abspeicherung ihrer Inhalte. Andererseits ist das Textganze stark partitioniert. Die Benennung der Suren zeigt, daß damit der Versuch gemacht wurde, Zugänge über den Weg der Assoziation zu eröffnen. Dies verlangsamt den Zugriff auf seine Inhalte, führt zu Unschärfe und Unsicherheit in Bezug auf das Gesagte.

Diskussionen über den vermeintlichen „Inhalt“ des Korans münden oft in den Vorwurf, der jeweilige Kontrahent zitiere all' jene Passagen, die seine Position stützten, lasse aber gegenteilige Aussagen wohlweislich außer acht. Tatsächlich erschwert die eigentümliche Struktur dieser Schrift nicht nur die flüssige Lektüre, sondern nötigt den Leser, mit dem Abbruch und der Wiederaufnahme thematischer Stränge umgehen zu können, den Text also stets in seiner Gesamtheit im Auge zu behalten. Wissenschaftliche Editionen und Übersetzungen des Korans können daher auf einen umfangreichen Apparat an Querverweisen nicht verzichten. Ihre Darstellung in Buchform aber bedingt es, daß ein mühsames und zeitraubendes Nachschlagen paralleler Passagen oft unterbleibt.

In Python ließen sich nun m.E. Methoden entwickeln, um Ansätze für eine Topic Map zu entwickeln.-

Ist das grundsätzlich vorstellbar?
Dr. Kai Borrmann
Sperlingsgasse 1
10178 Berlin
BlackJack

Vorstellbar ist vieles. ;-)

Ich weiss nicht so recht ob dieses Forum die richtige Anlaufstelle ist. Die Aufgabe erfordert wesentlich mehr Fachwissen, sowohl was die Religionswissenschaft, als auch spezielle Datenstrukturen und Algorithmen für die "sematische" Aufbereitung und Speicherung von Texten betrifft, als spezielles Python-Wissen.
Benutzeravatar
Kai Borrmann
User
Beiträge: 29
Registriert: Sonntag 7. Januar 2007, 09:11
Wohnort: Berlin

Danke für die rasche Antwort, Blackjack.

Ich will mal ein Beispiel geben.

Die 114. Sure lautet:


114. Die Menschheit - An-Nas
Im Namen Gottes, des Erbarmers, des Barmherzigen.

114:1
Sprich: Ich suche Zuflucht beim Herrn der Menschen,
114:2
Dem König der Menschen,
114:3
Dem Gott der Menschen,
114:4
Vor dem Unheil des Einflüsterers, des Heimtückischen,
114:5
Der da in die Brust der Menschen einflüstert,
114:6
Sei es einer von den Djinn oder von den Menschen.



Quelle: http://de.knowquran.org/koran/114/

In einem anderen Projekt hat ein Team den arabischen Text
in lateinische Buchstaben umgewandelt und jeweils immer daneben
grammatikalische Informationen gesetzt, die zwar sehr nützlich sind, aber manchmal auch stören.

In einem ersten Schritt möchte ich diese annotierte Korandatei in zwei zerlegen, brauche also ein Programm, welches die langen Wörter mit der Form x+y+z+ von den kurzen trennt.

'a&uu(dh)-u &w(dh)+Verb+Stem1+Imp+Act+1P+Sg+Masc/Fem+NonEnergicus+Indic


also Datei 1: 'a&uu(dh)-u
Datei 2: &w(dh)+Verb+Stem1+Imp+Act+1P+Sg+Masc/Fem+NonEnergicus+Indic

So sieht die 114. Sure annotiert aus:


qul qwl+Verb+Stem1+Imperative+2P+Sg+Masc+NonEnergicus
'a&uu(dh)-u &w(dh)+Verb+Stem1+Imp+Act+1P+Sg+Masc/Fem+NonEnergicus+Indic
bi-rabb-i b+Prep+rbb+fa&l+Noun+Triptotic+Masc+Sg+Gen
l-naas-i Def+'insaan=nws+fa&l+Noun+Triptotic+Masc+BrokenPl+Gen
malik-i mlk+fa&il+Noun+Triptotic+Adjective+Masc+Sg+Gen
l-naas-i Def+'insaan=nws+fa&l+Noun+Triptotic+Masc+BrokenPl+Gen
'ilaah-i 'lh+fi&aal+Noun+Triptotic+Masc+Sg+Gen
l-naas-i Def+'insaan=nws+fa&l+Noun+Triptotic+Masc+BrokenPl+Gen
min min+Prep
(sh)arr-i (sh)rr+fa&l+Noun+Triptotic+Adjective+Masc+Sg+Gen
l-waswaas-i Def+wsws+fa&laal+Noun+Triptotic+Adjective+Masc+Sg+Gen
l-xannaas-i Def+xns+fa&&aal+Noun+Triptotic+Adjective+Masc+Sg+Gen
lla(dh)ii lla(dh)ii+Pron+Relative+Sg+Masc
yuwaswis-u wsws+Verb+Stem2+Imp+Act+3P+Sg+Masc+NonEnergicus+Indic
fii fii+Prep
Suduur-i Sadr=Sdr+fu&uul+Noun+Triptotic+Masc+BrokenPl+Gen
l-naas-i Def+'insaan=nws+fa&l+Noun+Triptotic+Masc+BrokenPl+Gen
min-a min+Prep+HelpingVowel
l-jinnat-i Def+jnn+fi&lat+Noun+Triptotic+Fem+Sg+Gen
wa-l-naas-i
wa+Particle+Conjunction+Def+'insaan=nws+fa&l+Noun+Triptotic+Masc+BrokenPl+Gen


Quelle: cl.haifa.ac.il/projects/quran/qorout.txt.gz



Anders gesagt, ich habe eine Datei von ca. 7 MB mit abwechselnd kurzen Wörtern und langen, in denen das"+"-Zeichen vorhanden ist und diese will ich entmischen und in zwei Dateien tun, um sie dann weiterzuverarbeiten.

Das wird wohl mit "Regex" gehen. Hat vielleicht jemand Erfahrung?

Gruß, Kim
Dr. Kai Borrmann
Sperlingsgasse 1
10178 Berlin
skypa
User
Beiträge: 97
Registriert: Freitag 5. Januar 2007, 03:13

Nunja, es hat zwar was mit Programmierung zu tun, aber ich bin nicht bereit teilzunehmen an diesem Religionskram.
Alleine der erste Post hat mir gereicht.

"Das könnte in Zukunft durchaus wichtig werden in Deutschland, zu wissen wie man ein Turban trägt!", Harald Schmidt.

Entschuldigung für das offtopic geharse!
MfG
BlackJack

@Kai Borrmann: Reguläre Audrücke sind da wohl noch etwas übertrieben. Die Datei enthält das Wort durch ein Tab ('\t') getrennt vom Rest der Zeile, da dürfte also auch ein ``line.split('\t', 1)`` ausreichen um so eine Zeile in die beiden Bestandteile zu zerlegen. Man muss nur auf die Leerzeilen achten, die in der Datei verstreut sind.
Zuletzt geändert von BlackJack am Montag 17. März 2008, 16:01, insgesamt 1-mal geändert.
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

skypa hat geschrieben:Entschuldigung für das offtopic geharse!
Sag mal hast du einen schlechten Tag heute? Das ist schon der zweite Post den du dir hättest völlig sparen können.

Ich bin auch kein großer Religionsfan, eigentlich gar keiner, aber das Projekt an sich ist durchaus ambitioniert.

Kai Bormann, den Text kannst du natürlich mit Regulären Ausdrücken splitten, aber ein ``.split('+')`` könnte ja schon durchaus reichen. Das erstellt eine Liste mit den Wörtern.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Benutzeravatar
Kai Borrmann
User
Beiträge: 29
Registriert: Sonntag 7. Januar 2007, 09:11
Wohnort: Berlin

Danke für die Tipps!

Mit dem Folgenden komme ich schon ein Stück weiter:


sequenz = open("C:\qorout.txt","r").read()
text = sequenz.split()

for word in text[-42:-1]:
if len(word) < 20:
print word,


qul 'a&uu(dh)-u bi-rabb-i bi-rabb-i l-naas-i malik-i l-naas-i 'ilaah-i l-naas-i min min+Prep (sh)arr-i l-waswaas-i l-xannaas-i lla(dh)ii yuwaswis-u fii fii+Prep Suduur-i l-naas-i min-a l-jinnat-i wa-l-naas-i
Dr. Kai Borrmann
Sperlingsgasse 1
10178 Berlin
BlackJack

Damit werden Worte mit mehr als 19 Zeichen nicht berücksichtigt, dafür aber unter Umständen welche von den "Annotationen" wenn sie kürzer als 20 Zeichen sind.

Wie gesagt, das erste Wort ist vom Rest der Zeile jeweils durch einen Tabulator getrennt, damit lässt sich die Datei sicherer verarbeiten, als mit dieser 20-Zeichen-Grenze.
Benutzeravatar
Kai Borrmann
User
Beiträge: 29
Registriert: Sonntag 7. Januar 2007, 09:11
Wohnort: Berlin

Tut mir leid Blackjack,

ich stehe auf dem Schlauch.

Wo muß ich das line.split("\t",1) einsetzen?

Wenn ich es nämlich oben anstatt sequenz.split() einsetze, dann passiert nichts (sinnvolles).
Dr. Kai Borrmann
Sperlingsgasse 1
10178 Berlin
Benutzeravatar
Rebecca
User
Beiträge: 1662
Registriert: Freitag 3. Februar 2006, 12:28
Wohnort: DN, Heimat: HB
Kontaktdaten:

Das erste split ist ja dazu da, die einzelnen Zeilen zu trennen, das sollte so bleiben, bzw. du kannst es weglassen, wenn du stattdessen den text mir readlines einliest. Die einzelnen Zeilen willst du jetzt ja noch weiter aufdroeseln. Etwa so:

Code: Alles auswählen

text = open("C:\qorout.txt","r").readlines()

for line in text:
    (word, stuff) = line.split('\t', 1)
    print word
Offizielles Python-Tutorial (Deutsche Version)

Urheberrecht, Datenschutz, Informationsfreiheit: Piratenpartei
Benutzeravatar
Kai Borrmann
User
Beiträge: 29
Registriert: Sonntag 7. Januar 2007, 09:11
Wohnort: Berlin

Dankeschön, Rebecca.

Mit

text = open("C:\qorout.txt","r").readlines()

for line in text:
(word) = line.split('\t', 1)
print word[0],

bekomme ich dann den Koran mit jeweils einem Wort pro Zeile auf den Bildschirm.
Das ist schon mal prima.

Aber darin sind dann noch Dubletten enthalten,
die ich wohl herausschaffe, indem ich diesen Text in ein Set überführe.

Aber die Methode, den Bildschirminhalt als Datei abzuspeichern, diese
neu zu öffnen, und dann weiterzuverarbeiten, ist doch umständlich.

Könnte ich nicht das erste Wort in jeder Zeile gleich in eine andere Datei umlenken?
Dr. Kai Borrmann
Sperlingsgasse 1
10178 Berlin
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Kai Borrmann hat geschrieben:Könnte ich nicht das erste Wort in jeder Zeile gleich in eine andere Datei umlenken?
Ja. Aber lies dir doch ein Tutorial durch, da wird das beschrieben.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Benutzeravatar
Kai Borrmann
User
Beiträge: 29
Registriert: Sonntag 7. Januar 2007, 09:11
Wohnort: Berlin

O.K., ich habe das Problem lösen können.

Das folgende Manuskript scheint mir ein sehr guter Einstieg in die Arbeit mit Texten zu sein.

Erstaunlich, daß die Autoren eine Arbeit von ca. 260 Seiten frei zur Verfügung stellen.


Bird, Klein & Loper: Introduction to Natural Language Processing /
Computational Linguistics. Draft 2006.

http://www.ldc.upenn.edu/sb/nltk-book-part1.pdf
Dr. Kai Borrmann
Sperlingsgasse 1
10178 Berlin
Benutzeravatar
Kai Borrmann
User
Beiträge: 29
Registriert: Sonntag 7. Januar 2007, 09:11
Wohnort: Berlin

Durch eines der vielen Programmbeispiele läßt sich eine Liste über die Häufigkeit der im
Text vorhandenen Wortformen in alphabetischer Reigenfolge ausgeben.

An den Stellen 183-206
ist dies das Verb "alima" ("er lehrte") mit seinen verschiedenen Personalendungen:

Code: Alles auswählen

sequenz  = open("C:\Koran Umschrift.txt","r").read()
text = sequenz.split()

counts = {}

for word in sequenz.split():
    if word not in counts:
        counts[word] = 0
    counts[word] += 1

for word in sorted(counts)[183:206]:
    print counts[word], word,


Ergebnis:

9 &alima 2 &alimat 1 &alimat-i 6 &alimnaa 3 &alimta 1 &alimta-hu 1 &alimtu 3 &alimtum 2 &alimtum-u 1 &alimtum-uu-hunna 1 &alimuu 3 4 &allaam-u 3 &allama 3 &allama-hu 1 &allama-kum 3 &allama-kum-u 1 &allama-nii 2 &allamnaa-hu 1 &allamta-naa 1 &allamtu-ka 1 &allamtum

Edit (BlackJack): Code in Tags gesetzt.
Dr. Kai Borrmann
Sperlingsgasse 1
10178 Berlin
BlackJack

Dateien nicht wieder zu schliessen ist kein guter Stil. Bei kleinen "Wegwerfskripten" ist das in Ordnung, aber alles was einmal ein Programm werden könnte, sollte IMHO sauberer mit Ressourcen umgehen.

Der Name `text` wird an eine Liste mit Worten gebunden, dann aber gar nicht verwendet.

Ab Python 2.5 gibt's `collections.defaultdict` um so ein Histogramm etwas einfacher zu schreiben. Ungetestet:

Code: Alles auswählen

from __future__ import with_statement
from collections import defaultdict

with open(r'C:\Koran Umschrift.txt') as text_file:
    words = text_file.read().split()

histogram = defaultdict(int)
for word in words:
    histogram[word] += 1

for word, count in sorted(histogram.iteritems())[183:206]:
    print count, word,
print
Benutzeravatar
Kai Borrmann
User
Beiträge: 29
Registriert: Sonntag 7. Januar 2007, 09:11
Wohnort: Berlin

Blackjack,

das Schließen der Dateien werde ich nach Möglichkeit beherzigen und dein Beispiel habe ich erfolgreich getestet.

Das Stichwort "Histogramm" ist sicher für die Map sehr wichtig.

Untenstehend noch ein paar Zählungen, um mal zu zeigen, was
man alles so machen kann.






>>> sequenz = open("C:\Koran Umschrift.txt","r").read()
>>> len(sequenz)
745103 # Die Koran-Datei, inclusive Leerzeichen, hat eine Länge von 745,103 Zeichen
>>> text = sequenz.split()
>>> len(text)
78464 # Unterteilt man den Text an den Leerzeichen, dann erhält man 78,464 Wörter.
Nach anderen Berechnungen sind dies 78,679 Wörter: http://www.mghamdi.com/AD.pdf

>>> len(set(text))
17648 # Die mehrmals vorkommenden Wörter lassen sich auf 17,648 Token reduzieren
>>> 745103/78464
9
>>> 78464/17648
4 # Durchschnittlich besteht ein Wort aus 9 Zeichen + Leerzeichen und kommt 4 * vor.
Diese beiden Werte sind auf ganze Zahlen auf/abgerundet.

>>> Menge = set(text)

>>> print Menge, # Die (zufällig geordnete) Menge der Token beginnt dann so:

set(['wa-rasuul-un', 'xalq-u', 'sa&y-a-hu', 'tusiim-uuna', 'baddala', 'wa-ta(th)biit-an', '(sh)ajar-in', "wa-saa'at", 'wa-Hamalnaa-hum', 'wa-rasuul-u-hu',.......])
Dr. Kai Borrmann
Sperlingsgasse 1
10178 Berlin
Benutzeravatar
Kai Borrmann
User
Beiträge: 29
Registriert: Sonntag 7. Januar 2007, 09:11
Wohnort: Berlin

Durch "regular expressions" kann man vom konkreten Wort
abstrahieren und nach bestimmten Wortformen suchen.

Möchte man alle Worte der Form "fa'ala" finden, dann
ist dies eine Folge von Konsonanten, also nicht "^" a, i oder u
(andere kennt das Arabische nicht) und eben den Vokalen.


import re

from nltk_lite.utilities import re_show

text = open("C:\Koran Umschrift.txt","r").read()

re_show("[^aiu][a][^aiu][a][^aiu][a]",text)


suurat-u
l-{baqara}t-i
Dr. Kai Borrmann
Sperlingsgasse 1
10178 Berlin
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Kai Borrmann hat geschrieben:Durch "regular expressions" kann man vom konkreten Wort
abstrahieren und nach bestimmten Wortformen suchen.
Bei Regular-Expressions ist es Sinnvoll, die Strings als Raw-Strings zu markieren, also ein ``r`` vor die Quotes zu setzen, damit man die Backslashes in den Regulären Ausdrücken vorkommen können, nicht mehrfach escapen muss.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Benutzeravatar
Kai Borrmann
User
Beiträge: 29
Registriert: Sonntag 7. Januar 2007, 09:11
Wohnort: Berlin

Der automatisierten morphologischen Analyse des Korans gelingt es bisher,

ca. 70 % aller Worte eindeutig einzuordnen.

http://cs.haifa.ac.il/~shuly/publications/quran.pdf



>>> sequenz = open("C:\Koran mit Dubletten.txt","r").read()
>>> text = sequenz.split()
>>> len(text)
99004
>>> 99004-78464
20540


20,540 Fälle müßten also "von Hand" ausgewählt werden.
Dr. Kai Borrmann
Sperlingsgasse 1
10178 Berlin
Benutzeravatar
Kai Borrmann
User
Beiträge: 29
Registriert: Sonntag 7. Januar 2007, 09:11
Wohnort: Berlin

Setzt man in der Kommandozeile eine Zuordnung zwischen der lateinischen Buchstabenfolge „Allah“
und deren Äquivalent im Unicodesystem, so läßt sich damit im Folgenden operieren:

>>> Allah = u" \uFDF2 "
>>> print Allah
Dr. Kai Borrmann
Sperlingsgasse 1
10178 Berlin
Antworten