• Hallo liebe Userinnen und User,

    nach bereits längeren Planungen und Vorbereitungen sind wir nun von vBulletin auf Xenforo umgestiegen. Die Umstellung musste leider aufgrund der Serverprobleme der letzten Tage notgedrungen vorverlegt werden. Das neue Forum ist soweit voll funktionsfähig, allerdings sind noch nicht alle der gewohnten Funktionen vorhanden. Nach Möglichkeit werden wir sie in den nächsten Wochen nachrüsten. Dafür sollte es nun einige der Probleme lösen, die wir in den letzten Tagen, Wochen und Monaten hatten. Auch der Server ist nun potenter als bei unserem alten Hoster, wodurch wir nun langfristig den Tank mit Bytes vollgetankt haben.

    Anfangs mag die neue Boardsoftware etwas ungewohnt sein, aber man findet sich recht schnell ein. Wir wissen, dass ihr alle Gewohnheitstiere seid, aber gebt dem neuen Board eine Chance.
    Sollte etwas der neuen oder auch gewohnten Funktionen unklar sein, könnt ihr den "Wo issn da der Button zu"-Thread im Feedback nutzen. Bugs meldet ihr bitte im Bugtracker, es wird sicher welche geben die uns noch nicht aufgefallen sind. Ich werde das dann versuchen, halbwegs im Startbeitrag übersichtlich zu halten, was an Arbeit noch aussteht.

    Neu ist, dass die Boardsoftware deutlich besser für Mobiltelefone und diverse Endgeräte geeignet ist und nun auch im mobilen Style alle Funktionen verfügbar sind. Am Desktop findet ihr oben rechts sowohl den Umschalter zwischen hellem und dunklem Style. Am Handy ist der Hell-/Dunkelschalter am Ende der Seite. Damit sollte zukünftig jeder sein Board so konfigurieren können, wie es ihm am liebsten ist.


    Die restlichen Funktionen sollten eigentlich soweit wie gewohnt funktionieren. Einfach mal ein wenig damit spielen oder bei Unklarheiten im Thread nachfragen. Viel Spaß im ngb 2.0.

Ideenfindung Datenkompression

theSplit

1998
Veteran Barkeeper

Registriert
3 Aug. 2014
Beiträge
28.573
  • Thread Starter Thread Starter
  • #41
Es kann daran liegen das ich nicht nach Sonderzeichen trenne:
"<namespace" also, anstelle von "<" und "namespace" als einzelne Einheiten/Wörter.

Wirklich plain und simpel erstmal.
 

Roin

Freier Denker

Registriert
22 Juli 2013
Beiträge
581
Anhang anzeigen 41702

Ich kann die Datei komprimieren (~75-80%) und auch wieder dekomprimieren.
Ich sehe da keinen Unterschied mehr. Die Textverarbeitung sagt aber, dass da nun fast 4 mal so viele Zeichen sind. Sieht für mich optisch aber gleich aus.

Kann mir wer sagen, was da nicht ganz passt?

(Ja, da kann man noch deutlich optimieren, aber immerhin eine Kompression^^)

EDIT:
Da der Link ja irgendwie nicht mehr geht:
Anhang anzeigen test.rar
 
Zuletzt bearbeitet:

Seedy

A.C.I.D

Registriert
13 Juli 2013
Beiträge
22.588
@Roin:
Dein dekompressor baut Mist, fällt sofort bei Sichtprüfung auf:

Original:
Zeile 55: <text xml:space="preserve">#REDIRECT [[Algeria]]{{R from CamelCase}}</text>
Decompressed:
Zeile 55: <text xml:space="preserve">#REDIRECT [[Algeria]]{{R richard

Das zieht sich durch den ganzen Text so weiter...

Original
Zeile 141: Anarchists including the [[The Anarchy Organisation]] and [[Murray Rothbard|Rothbard]] find anarchist attitudes in [[Taoism]] from [[History of
Decompressed:
Zeile 141: Anarchists years [[The Anarchy Organisation]] and [[Murray Rothbard|Rothbard]] find anarchist attitudes in [[Taoism]] from [[Space China|Ancient
 

Roin

Freier Denker

Registriert
22 Juli 2013
Beiträge
581
@Seedy:
Oh, dass ist mir gar nicht aufgefallen.
Liegt wohl an der Reihenfolge, wie ich die einzelnen Wörterbücher durchgehe...
Einen Teil macht er ja richtig, den Rest dann aber nicht mehr, wie es aussieht.
Muss ich demnächst noch mal drübergucken.
 

theSplit

1998
Veteran Barkeeper

Registriert
3 Aug. 2014
Beiträge
28.573
  • Thread Starter Thread Starter
  • #47
Morgen auch hier, ich muß euch mal bemühen, irgendwie hänge ich gerade, ehrlich gesagt, fest.

Ich bin jetzt so weit das ich folgende Informationen über die Wörter gesammelt habe:
1) Anzahl der Vorkommnisse im Text
2) Wichtigkeit eines Wortes basierend auf Anzahl im Fundus aller Wörter (eigentlich ist das ein Statistik Step aber nun ja, irgendwie fand ich das mal wichtig....)
3) Die Feststellungen:
3a) Welche Wörter enthalten sind mit Start und Endposition innerhalb des Wortes
3b) Welche Wörter dieses Wort beinhalten mit Start und Endposition innerhalb des anderen Wortes

Und jetzt kommt der Punkt an dem ich hadere, weil ich nicht weiß wie man am schlausten Vorgehen sollte...

Ich habe nun die 3-4 oberen Infos und will nun die ShortCodes basierend auf HEX als Synonyme für die Wörter einrichten damit ich meine erste "Kompression" überhaupt testen kann. Allerdings scheint mir das gerade schier (un)nötig Komplex.

Sollte ich so vorgehen das ich zum Beispiel, wäre jetzt eine Idee, die meisten Überschneidungen ermittele und daraus versuche die kürzesten Codes für die kleinsten Langformen zu verwenden, oder muß ich eigentlich nur in jedem Wort die größte Übereinstimmung finden und den Code innerhalb des Wortes ersetzen und das kürzende Wort den Ersatzcode zuweisen.

Irgendwie stehe ich gerade auf dem Schlauch was denn genau die beste Vorgehensweise wäre - hat jemand konkrete Ideen?

Eine Beispielausgabe sieht so aus:
Links das aktuelle Wort, rechts die "Wörter" / Bausteine die enthalten sind.
[src=text]<mediawiki <= mediawiki
<mediawiki <= dia
<mediawiki <= wi
<mediawiki <= ia
<mediawiki <= med
<mediawiki <= aw
<mediawiki <= ik
<mediawiki <= ki
<mediawiki <= media
<mediawiki <= wiki
<mediawiki <= ed
<mediawiki <= me
<mediawiki <= di
[/src]

Und irgendwie wäre die Häufigkeit bzw. Anzahl des Wortes "media" eventuell höher als "mediawiki" als Wort. *kopf kratz*

PS: Irgendwie nen Schnitt aus Anzahl des Wortes das einen Teil bildet und natürlich auch die Länge die gekürzt werden kann, irgendwie sowas vielleicht?
 

Roin

Freier Denker

Registriert
22 Juli 2013
Beiträge
581
@theSplit: So als Hilfestellung.
Solang das Wort 2 mal vorkommt und du durch etwas kürzeres ersetzen kannst, solltest du es tun. Anschließend könntest du dein Wörterbuch noch mit ersetzten lassen.
Also in etwa so:

Wörter mit 10+ Zeichen im Wörteruch
Anschließend Wörter mit 5+ Zeichen im Wörterbuch (dabei den Text und das alte Wörterbuch überprüft)
und immer so weiter - solange es sich halt lohnt, etwas zu ersetzen.


Ich habe übrigens bei mir einen Fehler gefunden. Ich suche nach Wörtern und lasse sie im ersten Schritt nur doch #HEX ersetzten. Wenn aber ein Wort mehrfach vorkommt (was ja gewollt ist), zähle ich den Text nur durch, um die Wertigkeit zu bestimmen (Länge * Anzahl).
Problematisch wird es dann beim ersetzten, wenn hinter dem gefundenen Wort noch ein Bestandteil einer HEX-Zahl vorkommt (in meinem Fall ein A).

ersetzen lasse ich mittels

[src=python]text.replace(gefundenes_wort, ersatzzeichen + hex_index_im_woerterbuch)[/src]
Allerdings ersetze ich dann damit so: (" als gefundenes Wort)
"Hallo" Hier steht Text "Alles gute"
zu
#A2Hallo#A2 Hier steht Text#A2Alles gute#A2
Und da ist dann mein Fehler entstanden.
 

theSplit

1998
Veteran Barkeeper

Registriert
3 Aug. 2014
Beiträge
28.573
  • Thread Starter Thread Starter
  • #49
Muss ich mal testen @ Roin - hab gerade auch bei mir nen Bug drin, entweder werden nicht alle Daten ausgelesen, oder meine Ausgaberoutine überspringt Inhalte...

Was auch erklären würde, warum ich weniger Wörter habe als du ;)

Da muß ich also nochmal ran.

Aber deine Idee ist gut, wobei ich mich gerade denke, im Grunde macht auch bei deiner Vorgehensweise der Trick die Häufigkeit aus oder?
Wenn ich 200 mal "[[Teststring" durch "#0A" ersetzen kann, spare ich ja mehr als 240 mal "Then" durch "#0A" zu ersetzen. Es sollte jedenfalls so sein, aber ganz sicher bin ich mir da jetzt nicht; wenn eh alles irgendwie geshortcodet wird so fern der Ersatzstring nicht größer als das Original ist!

Ich schau mal am WE was ich reißen kann und ob ich meine Fehler herausbügeln kann. ;)
 

theSplit

1998
Veteran Barkeeper

Registriert
3 Aug. 2014
Beiträge
28.573
  • Thread Starter Thread Starter
  • #50
Also, ich hab mal meine Kürzungen durchlaufen lassen, das Ergebnis ist leider nur marginal, bei 1.071.610 Bytes komme ich auf 976 Bytes mit meiner Komprimierung, nicht wirklich die Welt und die reine Dauer der Bearbeitung ist schon mehr als 12 Stunden bei 100 MB....

Deßhalb versuche ich jetzt mal neben dieser Methode das ganze nach Tags und Co zu filtern:

Hier mal eine Übersicht von Wiki Markup (Referenz: https://en.wikipedia.org/wiki/Help:Wiki_markup ), das ich beim Durchsehen der Daten gefunden habe:

Folgende Gliederung habe ich mal vorgenommen:
Ersteinmal XML Data Nodes, Array Nodes und Wörter die aus den Inhalten gebildet werden sollen. Wenn ein Tag schließt mit gleichem Namen, können wir das Ende aus dem TagAnfang "<namespace>" "</namespace>" bilden.

Desweiteren habe ich mal die, nach etwas, durchsuchen der Daten häufigsten Tags gesucht die man theoretisch automatisch ergänzen/closen kann, man braucht also nur zu wissen um was es sich handelt und kann dann erweitern.

Hier mal meine Liste die ich jetzt analysieren lassen würden:
[src=c]char formats[8][] = {
"======" // Heading 6 - heading start
"=====",
"====",
"===",
"==", // Heading 2 - heading end
" '''' " // bold italic // " != double '
" ''' ", // blockquote or bold
" '' " // Italized
}

char dataTypes[12][] = {
"*", // List element
"{{", // Definition
"[[", // Link
"Media:" // Media types start
"File:",
"Image:", // [[Image:LeoTolstoy.jpg|thumb|150px|[[Leo Tolstoy|Leo Tolstoy]] 1828-1910]]
"Sound:", // Media types end
"#REDIRECT ", // Redirect #REDIRECT [[United States]] (article) --- #REDIRECT [[United States#History]] (section)
"wiktionary:", // [[wiktionary:terrace|terrace]]s
"Wiktionary:", // [[Wiktionary:Shinjitai|Shinjitai]],
"wikipedia:" // [[Wikipedia:Nupedia and Wikipedia]]
"Wikipedia:"
}[/src]

Darauf basirend, die Liste ist vermutlich noch nicht 100% komplett, will ich Shortcodes bilden
aus
''[[The Bad Sleep Well]]''
soll werden:
*83*The Bad Sleep Well ( 8 = Formatierung in Italic Quotes, 3 Link mit [[ Text ]])

Jetzt muß dann nur noch "The Bad Sleep Well" gekürzt werden. Oder wir nehmen keine Optimierung vor da jede Referenz auf einen anderen Wiki-Artikel nur ein, (höchstens) zwei mal im Text vorkommt - also es sich eventuell gar nicht lohnt hier zu optimieren.


Die Daten will ich in etwa so strukturieren:
[src=c]typedef struct wikiTag {
bool containsFlagChars;
bool containsHTMLEntities;
bool isNamed;
bool hasFormat;
int format;
int dataType;
int followUpLength;
char *followUp;
char *data;
char *name;
} wikiTag;

typedef struct dataWord {
bool hasWikiMarkup;
bool isHTMLEntity;
int markupType;
int length;
int formattingFlag
char *word;
} dataWord;

typedef struct dataKV { // Key Value storage for tags
char *key;
char *value;
} dataKV;

typedef dataXML {
bool isDataNode;
bool isArrayRoot;
int identLevel;
int dataLength;
int keys;
unsigned int dataWords;
unsigned int lineStart; // List elements span multiple lines
unsigned int lineEnd;
char *tagName;
struct *dataKV;
struct dataWord *data;
} dataXML;[/src]


Das erfordert allerdings noch einiges an Optimierung und ist vermutlich fern von perfekt.
Ich bin da noch dran was an Daten gespeichert wird zu optimieren... aber das sind so die groben Wege welche Informationen für XML/Wikitags bereitstehen müssen. :unknown:

Wird noch eine Challenge...
 

theSplit

1998
Veteran Barkeeper

Registriert
3 Aug. 2014
Beiträge
28.573
  • Thread Starter Thread Starter
  • #51
Bin jetzt die letzten Stunden nochmal die Liste der Datenstrukturen, aus dem vorherigen Post, durchgegangen und habe versucht die Daten so gut es geht zu erfassen... bzw. zu ersetzen.

Entschuldigt das dies so umfangreich ist.

[src=c]/*
See https://en.wikipedia.org/wiki/Help:Wiki_markup
and https://en.wikipedia.org/wiki/Help:Cheatsheet
for references on markup of wikipedia
*/

char formats[11][] = {
"*", // List element, multiple levels, "**" Element of element
"#", // Numbered list element, multiple levels = "##" "Element of element"
":", // "indent 1", multiple levels using ":::" = 3
"======" // Heading 6 - heading start
"=====",
"====",
"===",
"==", // Heading 2 - heading end
"'''''" // bold italic
"'''", // bold
"''" // italic
}

char dataTypes[12][] = {
"{{", // Definition => {{Main|autistic savant}}
"[[", // Link => [[Autistic community#Declaration from the autism community|sent a letter to the United Nations]]
"{|", // Table start => ! (headline), |- (seperation, row/border), | "entry/ column data"
"Media:" // Media types start
"File:",
"Image:", // [[Image:LeoTolstoy.jpg|thumb|150px|[[Leo Tolstoy|Leo Tolstoy]] 1828-1910]]
"Sound:", // Media types end
"#REDIRECT", // Redirect #REDIRECT [[United States]] (article) --- #REDIRECT [[United States#History]] (section)
"wiktionary:", // [[wiktionary:terrace|terrace]]s
"Wiktionary:", // [[Wiktionary:Shinjitai|Shinjitai]],
"wikipedia:",
"Wikipedia:" // [[Wikipedia:Nupedia and Wikipedia]]
}

typedef struct dataWord {
bool isHTMLEntity; // Bad to separate html entities if common combos are used?
int markupType;
int length;
int formattingFlag;
unsigned int line;
unsigned int position;
char *word;
} dataWord;

typedef struct wikiTag {
bool containsFlagChars; // Do we really need this?
bool containsHTMLEntities; // Do we really need this?
bool hasFormat;
bool hasFollowUp;
bool hasName;
bool hasAnchor;
bool hasPipes;
unsigned int line;
unsigned int position;
int format;
int dataType;
unsigned int followUpLength;
unsigned int nameLength;
unsigned int anchorLength;
unsigned int dataLength;
unsigned int dataPipes;
unsigned int tagPipes;
char *followUp;
char *name;
char *anchor;
char *data;
struct dataWord *pipes;
struct wikiTag *pipedTags;
} wikiTag;

typedef struct dataKV { // Key Value storage for xml
char *key;
char *value;
} dataKV;

typedef dataXML {
bool isDataNode;
bool isArrayRoot;
bool isClosed;
unsigned int identLevel; // Tabs multiple of 2 in example
unsigned int keyCount;
unsigned int dataLength;
unsigned int tagCount;
unsigned int dataWords;
unsigned int lineStart; // Elements can(!) span multiple lines
unsigned int lineEnd;
char *tagName;
struct dataKV *keyValues;
struct dataWord *data;
struct wikiTag *wikiTags;
} dataXML;[/src]

Hat jemand hierzu vielleicht noch Optimierungsvorschläge/Ergänzungen?



Die Datenstrukturen sollten eigentlich die meisten Use-Cases abdecken, soweit ich eine kleinere Datei etwas intensiver analysiert habe.
Mag jemand Tips/Hinweise/Ideen geben?

Mal meine Gedanken und noch Fragen eingestreut dazu:
Ich glaube eine "on the fly Komprimierung" kann ich, wenn ich so viele Daten berücksichtigen will schon gar nicht mehr sinnvoll und zeitlich vornehmen oder? Also zum Beispiel die LZW-Komprimierung? Gemäß des Falls die Daten sind so eingelesen worden.

Kurz zur generellen Struktur:
Erstmal ist ja alles grundsätzlich in XML verschachtelt, das XML kann dann neben den reinen Wörterdaten noch formatierte WikiMarkup (WikiTags Struktur) enthalten. Letzteres enthält Wörter wie auch unter anderem WikiMarkup bei benannten Links/Definitionen oder in Linktexten mit Referenzen. Das Problem habe ich eigentlich versucht abzubilden, mehr oder minder...

Weitere Angaben wie die Datei aufgebaut ist, finden sich hier: http://mattmahoney.net/dc/textdata.html

Mir kommt das auch ein wenig zu komplex vor die Daten so aufzubauen, weil man dadurch unter anderem das reine "Durchlaufen" der Daten künstlich erschwert, weil der Aufbau ja in Teilstücke gesplittet wird. Speziell der Fall das mal ein Wort, mal Markup vorkommt, mal ein Mix aus beidem, ich dieses aber nicht als eine Einheit speichere/speichern will. Liegt hier ein Fehler vor dies zu unterteilen?
Sollte man nicht besser einen "<text>Mein Wikipedia Artikel [[http://www.link|Name des Links]] und mehr Artikel..</text" als ein Element festhalten und diesen Knoten mit verschiedenen Mustern durchsuchen bzw. formatieren lassen? Aber von einem Block Daten ausgehend und nicht auf einer Wort-Wort, Wort-Markup-Basis zu unterteilen?
Ich habe bisher immer den die Denkweise das ich zusätzlich neben den wichtigen Daten auch so etwas wie "Zeilennummer" + "Wortindex" mitspeichern muß.

---

Zum Output (Komprimiert) kurz, mal was positives zum Thema einsparen:
Was ja schön ist, die Anzahl der Einträge einer möglichen Formatierung, wie auch des Markup/WikiTag Typen sind <= 16 - also kann man HEX für einen Shortcut dafür verwenden, mit immer nur einem Zeichen, was ja wichtig ist! Gibt es keine Formatierung, wird einfach die Zahl weggelassen.
Das funktioniert aber nur als Idee wenn man dabei bleiben würde, Formatierte Wörter ''ItalicText'' gesondert zu behandeln.


----

So unterm Strich, ich weiß nicht ob ich auf dem Holzweg bin oder jetzt anfange dort zu optimieren wo es vielleicht nicht sinnvoll ist - oder es zeitlich gar nicht hinbekomme die Datenmengen zu verarbeiten oder Unmengen an RAM verbrauche.
 

drfuture

Zeitreisender
Teammitglied

Registriert
14 Juli 2013
Beiträge
8.748
Ort
in der Zukunft
Nachdem ihr ja schon Listen habt, mal kurz eine Frage, wie groß (kb) ist die Liste aller Wörter ohne dopplungen?

Edit: zu deinen Befürchtungen,
Ram ist denke ich kein Problem da du bei deinem System ja nicht den Text als ganzes sehen musst, daher den Speicher zwischen drin löschen kannst.
An sich finde ich die Idee gut, was das an CPU braucht oder zum Schluss bringt kann ich nicht einschätzen...

Nachdem es in letzter Zeit so viel deep Learning gibt (quelloffen) evtl. Bekommt man es mit einem der Frameworks hin im Text ein Muster finden zu lassen das nicht so offensichtlich ist, dann nicht das Framework einbinden sondern quasi nur das Ergebnis
 
Zuletzt bearbeitet:

theSplit

1998
Veteran Barkeeper

Registriert
3 Aug. 2014
Beiträge
28.573
  • Thread Starter Thread Starter
  • #53
Deine Frage nach der reinen Wörterbuchgröße kann ich nicht beantworten. Vielleicht hat jemand anderes hier Zahlen?
Roin vielleicht oder der Kapitn der ja auch ein Liste gepostet hatte.

Richtig "sauber" herausgefiltert ohne "[[" oder "]]" usw... hatte ich nicht durchgeführt.

--

Zu deinem Hinweis muß ich aber leider widersprechen: (wobei die Testkiste für die Competition "nur" 2 GB hat)
Ich will die Wörter, als Datensatz ("dataWord"), in den Speicher laden nach meinem Datenaufbau.
Wenn zusätzlich dazu ein Unique Dictionary gepflegt werden soll wäre je nach Aufbau etwa das doppelte an Speicher notwendig (wenn auch dann praktisch weniger) + je ein paar Bytes für zusätzliche Infos wie Wortbreite/Zeichenanzahl.

Das brauche ich, damit der Text später komprimiert für einen Dekompressor ausgegeben werden kann.
Der Text wird ja nicht gelesen und dann während man ein Wort einließt verarbeitet, wobei das natürlich cleverer sein würde als erst die Daten einzulesen, zu verarbeiten (vermutlich mehrmals) und dann ausgeben zu lassen. Ist nur die Frage in wie weit man damit optimieren kann ohne die anderen Wörter zu kennen oder auch um die "optimale" Lösung/Ersatz für ein Wort zu kennen bzw. gleich mehrere Optimierungen/Kürzungen ansetzen zu können.

Eine "on the fly Kodierung" zu nutzen, wie zum Beispiel die LZW-Kompremierung die sich "dynamisch" herausbildet(?) bzw. ein Dictionary parallel zum Einlesen aufbaut, würde ich erst in Angriff nehmen, nachdem die Daten einmal eingelesen sind und mir alles bekannt ist.

Nach XML und Markup-Bearbeitung/Umformatierung wäre dann das Ziel mit reinen Textinformationen zu arbeiten. Aber das hatte vorher viel Rechenpower benötigt aber (bei mir) wenig Resultate gezeigt was eine "Komprimierung" betrifft - vielleicht auch etwas schlecht umgesetzt aber sehr ernüchternd eben.
 

Satinka

gesperrt

Registriert
27 Sep. 2015
Beiträge
202
Ich setze voll auf Microfilm und Tesa-Band. Forscher der Universität Mannhein hatten vor Jharen ein Verfahren .....
 

Roin

Freier Denker

Registriert
22 Juli 2013
Beiträge
581
Deine Frage nach der reinen Wörterbuchgröße kann ich nicht beantworten. Vielleicht hat jemand anderes hier Zahlen?
Roin vielleicht oder der Kapitn der ja auch ein Liste gepostet hatte.

Anhang anzeigen enwik8_100000-woerter.txt
Das sind mal alle (fast) alle Wörter, die ich ersetzten lassen habe. Zeichenketten und Co noch nicht enthalten. Die Datei ist ca. 800kB groß (wobei ich diese als Array-Ausgabe gespeichert habe --> also nur etwa 600kB).
Die Wörter sind, wie man dem Dateinamen entnehmen kann, lediglich aus den ersten 100.000 Zeilen gesucht worden.
Eine vollständige Liste habe ich derzeit nicht, da mein Compressor noch nicht überarbeitet ist (Fehler habe ich weiter oben beschrieben, doch noch keine Zeit zum Beheben gefunden).
Ich hatte ja bisher auch ein wenig Probleme mit einem Speicherüberlauf von der ein oder anderen Variable in Python --> Daher gibt es noch nichts Vollständiges.

So als kleiner Anhaltspunkt:
Dateigröße: 1.071.610 Bytes
Zeilen: 13163
Wörterbuch-Größe in der Komprimierten Datei: 64,2 kB
Hier habe ich keine entsprechende Wörter-Array-Größe gespeichert.
Komprimierung ~ 74%

Dateigröße: 4.421.707 Bytes
Zeilen: 50.000
WörterArray-Dateigröße: 449 kB
Komprimierung ~ 74%

Dateigröße: 8.733.077 Bytes
Zeilen: 100.000
WörterArray-Dateigröße: 806 kB
Komprimierung ~ 87%


Wörterbuchgröße liegt bei mir also etwa bei 8% der Ursprungsdatei (nach ein paar Optimierungen).

P.S.:
Zu beachten ist, dass ich an meinem Programm bisher nicht weiter gepfeilt habe und die Dateien nicht der aktuellen Ausgabe meines Programms aufgrund von Rechenleistungsmangel entsprechen.

EDIT:
Winrar auf bester Komprimierung im .rar-Format schafft übrigens eine Komrpimierung auf etwa 29%.

EDIT2:
@Split:
Ich denke eine Trennung von Markup und Wörtern macht nur bis zu einem gewissen Grad Sinn. Verschachteltes Markup 1:1 wieder herzustellen kann sehr schwierig werden, wenn beispielsweise ein Tag auf geht, ein weiterer, der erste wieder schließt und dann erst der zweite.
Beispiel:
<b><i>Text</b>und so weiter</i>
Ich bin mir nicht sicher, ob solch ein Markup bei Wikimedia überhaupt vorkommt, doch möglich ist dieser und schwierig in deine Zerlegung zu zwingen. Falls der aber nicht vorkommt, könntest du schauen, ob du in deinen HTML-Markup-Objekten nicht statt einem Text auch ein weiteres Markup-Objekt übergeben lassen können solltest (ist der Satz so überhaupt noch richtig? :unknown: ).
Ansonsten wäre ich gespannt, wie deine Daten bezüglich Testläufen und Komprimierung am Ende ausfallen.

EDIT3:
Ich habe nun mal versucht meinen Compressor etwas zu verbessern, ich bin mir allerdings nicht 100% sicher, ob das so geklappt hat, wie ich gewollt habe. Die Kompression ist dabei nämlich bereits von 74% auf 67 % gestiegen und dabei habe ich kein Wörterbuch oder so verändert.
Ich habe gerade allerdings eine kleine Denkblokade. Durch meine Korrektur in meinem Code bin ich auf ein Problem gestoßen: Die Laufzeit hat sich etwa verfünffacht.
Hier mal ein paar Auszüge:
[src=python]
def replace_words(self, txt, replace_list, word_replace_char, dic_sep_char, dic_space_char, surround_chars = False):
for idx, w in enumerate(reversed(replace_list)):
w_esc = re.escape(w)

# klein-geschrieben
if surround_chars:
txt = re.sub('(' + w_esc + ')', word_replace_char + self.dezToHexStr(i) + word_replace_char, txt)
else:
txt = re.sub('(' + w_esc + ')[^0-9A-F]{1}', word_replace_char + self.dezToHexStr(i), txt)
#txt = txt.replace(w, word_replace_char + self.dezToHexStr(i))
# Überprüfen, ob das Wort verwendet wurde
if txt != txt2:
if len(txt) + len(w) <= len(txt2):
printit = True
txt2 = txt
else:
txt = txt2

if not surround_chars:
w_capital = w_esc[:1].upper() + w_esc[1:]
w_upper = w_esc[:].upper()
#w_capital = w[:1].upper() + w[1:]
#w_upper = w[:].upper()

# Capital-geschrieben
txt = re.sub('(' + w_capital + ')[^0-9A-F]{1}', word_replace_char + word_replace_char + self.dezToHexStr(i), txt)
#txt = txt.replace(w_capital, word_replace_char + word_replace_char + self.dezToHexStr(i))
# Überprüfen, ob das Wort verwendet wurde
if txt != txt2:
#ggf wieder kürzen
if len(txt) + len(w_capital) <= len(txt2):
printit = True
txt2 = txt
else:
txt = txt2

# GROß-geschrieben
txt = re.sub('(' + w_upper + ')[^0-9A-F]{1}', word_replace_char + word_replace_char + word_replace_char + self.dezToHexStr(i), txt)
#txt = txt.replace(w_upper, word_replace_char + word_replace_char + word_replace_char + self.dezToHexStr(i))
# Überprüfen, ob das Wort verwendet wurde
if txt != txt2:
#ggf wieder kürzen
if len(txt) + len(w_upper) <= len(txt2):
printit = True
txt2 = txt
else:
txt = txt2

# Wörterbuch schreiben (mit dic_sep)
# ...

[/src]

Kann mir jemand sagen, wie ich in einem Regex zum Replacen folgendes schreiben kann:
Finde Wort1 und ersetzte mit #_1
Finde Wort2 und ersetzte mit #_2 ...
Finde erneut Wort1 und ersetzte weiterhin mit #_1 und nicht mit #_1564 (weil es das 1564 Wort ist, was gefunden wurde)
Ich habe etwas gelesen, dass man in Python mit der re-Klasse Gruppen benennen kann und so weiter. Ich steige da aber einfach 0 durch...
Damit könnte ich vermutlich die Laufzeit auf wenige Sekunden, statt einigen Minuten, für sehr kleine Dateien, optimieren. Ich würde dann aus der Wortliste einfach ein Pattern und ein Replace-String machen und diese dann einmalig über den Text laufen lassen. Damit würde ich viel erneutes Suchen und zwischenspeichern sparen.

Neue Daten hier im Anhang: Mag die vielleicht jemand auf Ungereimtheiten prüfen? Ich habe bisher noch nicht meinen Decompressor angepasst, der Macht gerade noch ziemlich viel Mist. Wird wohl in nächster Zeit auch so bleiben...
Anhang anzeigen compression_2.rar
 
Zuletzt bearbeitet:

theSplit

1998
Veteran Barkeeper

Registriert
3 Aug. 2014
Beiträge
28.573
  • Thread Starter Thread Starter
  • #56
Moin Roin!

Danke für die Zahlen. Ich bin wieder bei square one... aber rein vom Ergebnis scheinst du eher auf dem Holzweg zu sein als ich mit meinen Versuchen bisher.

Zu deinem Edit2:
Der Fall den du beschreibst sollte so nicht auftreten, in der Regel ist das WikiMarkup sauber und unverschachtelt gegliedert.
Für einen Link auf eine andere Wiki-Seite mit "Linktext":
[[Autistic community#Declaration from the autism community|sent a letter to the United Nations]]

In diesem Fall also ein Link auf "Autistic community" mit dem Anchor/Sprung auf Textsektion "Declaration from the autism community" und als Linktext "sent a letter to the United Nations". Als Beispiel.


Zu Edit3:
Ich verstehe nicht ganz woher du in dem von dir geposteten Code die Übergabe von i auf die Funktion self.dezToHexStr(i) erfolgt.
Im Grunde müsste du anstelle eines Counters der die aktuelle Wörterbuchgröße/Index angibt und als HEX Replacement eingefügt wird immer neu ermitteln, heißt:
Immer über die bereits ersetzen Wörter iterieren und den passen "Shortcode" ermitteln lassen. Eine andere Herangehensweise fällt mir nicht ein.

Zu Regex, meinst du "Grouping" zufällig? Damit wirst du aber nicht direkt drum herumkommen zu ermitteln ob ein HEX-Ersatz/"Shortcode" vorliegt.

Ich hab mal ein Beispiel für Grouping gebastelt, geht auch online im Regex Tester: http://pythex.org/?regex=([\w\d\-]*...m&ignorecase=0&multiline=0&dotall=0&verbose=0

Hoffe das hilft dir etwas :)
 

theSplit

1998
Veteran Barkeeper

Registriert
3 Aug. 2014
Beiträge
28.573
  • Thread Starter Thread Starter
  • #57
So, an dieser Stelle auch nochmal, ich hab noch nicht aufgegeben - ich komme aller höchstens nur sehr langsam voran. Und irgendwie ist mein Versuch, das ganze Markup zu identifizieren, XML mit Key/Values zu parsen, die Wikitags auszulesen, Formatierungen zu erkennen, HTML Entities zu klassifizieren - also lange Rede kurzer Sinn, das "Parsen" der Daten richtig zu managen, schon eine Bärenaufgabe. :)

Aber es gibt Fortschritte!

Bisher wird nur ausgegeben was wie klassifiziert ist und bis auf die XML-Nodes werden noch keine Daten weiter verarbeitet, es wird nur kräftig geprintet ;)

Ich poste mal Ausschnitte von den Daten die verarbeitet werden, und wie das Ergebnis des Parsers/Verarbeitung bisher aussieht:

Das was geparsed wird:
[src=xml]<mediawiki xmlns="http://www.mediawiki.org/xml/export-0.3/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.mediawiki.org/xml/export-0.3/ http://www.mediawiki.org/xml/export-0.3.xsd" version="0.3" xml:lang="en">
<siteinfo>
<sitename>Wikipedia</sitename>
<base>http://en.wikipedia.org/wiki/Main_Page</base>
<generator>MediaWiki 1.6alpha</generator>
<case>first-letter</case>
<namespaces>
<namespace key="-2">Media</namespace>
<namespace key="-1">Special</namespace>
<namespace key="0" />
<namespace key="1">Talk</namespace>
<namespace key="2">User</namespace>
<namespace key="3">User talk</namespace>
<namespace key="4">Wikipedia</namespace>
<namespace key="5">Wikipedia talk</namespace>
<namespace key="6">Image</namespace>
<namespace key="7">Image talk</namespace>
<namespace key="8">MediaWiki</namespace>
<namespace key="9">MediaWiki talk</namespace>
<namespace key="10">Template</namespace>
<namespace key="11">Template talk</namespace>
<namespace key="12">Help</namespace>
<namespace key="13">Help talk</namespace>
<namespace key="14">Category</namespace>
<namespace key="15">Category talk</namespace>
<namespace key="100">Portal</namespace>
<namespace key="101">Portal talk</namespace>
</namespaces>
</siteinfo>
<page>
<title>AaA</title>
<id>1</id>
<revision>
<id>32899315</id>
<timestamp>2005-12-27T18:46:47Z</timestamp>
<contributor>
<username>Jsmethers</username>
<id>614213</id>
</contributor>
<text xml:space="preserve">#REDIRECT [[AAA]]</text>
</revision>
</page>
<page>
<title>AlgeriA</title>
<id>5</id>
<revision>
<id>18063769</id>
<timestamp>2005-07-03T11:13:13Z</timestamp>
<contributor>
<username>Docu</username>
<id>8029</id>
</contributor>
<minor />
<comment>adding cur_id=5: {{R from CamelCase}}</comment>
<text xml:space="preserve">#REDIRECT [[Algeria]]{{R from CamelCase}}</text>
</revision>
</page>
<page>
<title>AmericanSamoa</title>
<id>6</id>
<revision>
<id>18063795</id>
<timestamp>2005-07-03T11:14:17Z</timestamp>
<contributor>
<username>Docu</username>
<id>8029</id>
</contributor>
<minor />
<comment>adding to cur_id=6 {{R from CamelCase}}</comment>
<text xml:space="preserve">#REDIRECT [[American Samoa]]{{R from CamelCase}}</text>
</revision>
</page>
<page>
<title>AppliedEthics</title>
<id>8</id>
<revision>
<id>15898943</id>
<timestamp>2002-02-25T15:43:11Z</timestamp>
<contributor>
<ip>Conversion script</ip>
</contributor>
<minor />
<comment>Automated conversion</comment>
<text xml:space="preserve">#REDIRECT [[Applied ethics]]
</text>
</revision>
</page>
<page>
<title>AccessibleComputing</title>
<id>10</id>
<revision>
<id>15898945</id>
<timestamp>2003-04-25T22:18:38Z</timestamp>
<contributor>
<username>Ams80</username>
<id>7543</id>
</contributor>
<minor />
<comment>Fixing redirect</comment>
<text xml:space="preserve">#REDIRECT [[Accessible_computing]]</text>
</revision>
</page>
<page>
<title>AdA</title>
<id>11</id>
<revision>
<id>15898946</id>
<timestamp>2002-09-22T16:02:58Z</timestamp>
<contributor>
<username>Andre Engels</username>
<id>300</id>
</contributor>
<minor />
<text xml:space="preserve">#REDIRECT [[Ada programming language]]</text>
</revision>
</page>
<page>
<title>Anarchism</title>
<id>12</id>
<revision>
<id>42136831</id>
<timestamp>2006-03-04T01:41:25Z</timestamp>
<contributor>
<username>CJames745</username>
<id>832382</id>
</contributor>
<minor />
<comment>/* Anarchist Communism */ too many brackets</comment>
<text xml:space="preserve">{{Anarchism}}
'''Anarchism''' originated as a term of abuse first used against early [[working class]] [[radical]]s including the [[Diggers]] of the [[English Revolution]] and the [[sans-culotte|''sans-culottes'']] of the [[French Revolution]].[http://uk.encarta.msn.com/encyclopedia_761568770/Anarchism.html] Whilst the term is still used in a pejorative way to describe ''"any act that used violent means to destroy the organization of society"''<ref>[http://www.cas.sc.edu/socy/faculty/deflem/zhistorintpolency.html History of International Police Cooperation], from the final protocols of the "International Conference of Rome for the Social Defense Against Anarchists", 1898</ref>, it has also been taken up as a positive label by self-defined anarchists.

The word '''anarchism''' is [[etymology|derived from]] the [[Greek language|Greek]] ''[[Wiktionary:&#945;&#957;&#945;&#961;&#967;&#943;&#945;|&#945;&#957;&#945;&#961;&#967;&#943;&#945;]]'' ("without [[archon]]s (ruler, chief, king)"). Anarchism as a [[political philosophy]], is the belief that ''rulers'' are unnecessary and should be abolished, although there are differing interpretations of what this means. Anarchism also refers to related [[social movement]]s) that advocate the elimination of authoritarian institutions, particularly the [[state]].<ref>[http://en.wikiquote.org/wiki/Definitions_of_anarchism Definitions of anarchism] on Wikiquote, accessed 2006</ref> The word "[[anarchy]]," as most anarchists use it, does not imply [[chaos]], [[nihilism]], or [[anomie]], but rather a harmonious [[anti-authoritarian]] society. In place of what are regarded as authoritarian political structures and coercive economic institutions, anarchists advocate social relations based upon [[voluntary association]] of autonomous individuals, [[mutual aid]], and [[self-governance]].

While anarchism is most easily defined by what it is against, anarchists also offer positive visions of what they believe to be a truly free society. However, ideas about how an anarchist society might work vary considerably, especially with respect to economics; there is also disagreement about how a free society might be brought about.

== Origins and predecessors ==

[[Peter Kropotkin|Kropotkin]], and others, argue that before recorded [[history]], human society was organized on anarchist principles.[/src]


Die geparsten Daten:
[src=text]NODE1 1 mediawiki
KEYVAL 1 xmlns => http://www.mediawiki.org/xml/export-0.3/
KEYVAL 1 xmlns:xsi => http://www.w3.org/2001/XMLSchema-instance
KEYVAL 1 xsi:schemaLocation => http://www.mediawiki.org/xml/export-0.3/ http://www.mediawiki.org/xml/export-0.3.xsd
KEYVAL 1 version => 0.3
KEYVAL 1 xml:lang => en
NODE1 2 siteinfo
NODE1 3 sitename
WORD 3 sitename --- Wikipedia
NODE1 4 base
WORD 4 base --- http://en.wikipedia.org/wiki/Main_Page
NODE1 5 generator
WORD 5 generator --- MediaWiki
WORD 5 generator --- 1.6alpha
NODE1 6 case
WORD 6 case --- first-letter
NODE1 7 namespaces
NODE1 8 namespace
KEYVAL 8 key => -2
WORD 8 namespace --- Media
NODE1 9 namespace
KEYVAL 9 key => -1
WORD 9 namespace --- Special
NODE1 10 namespace
KEYVAL 10 key => 0
NODE1 11 namespace
KEYVAL 11 key => 1
WORD 11 namespace --- Talk
NODE1 12 namespace
KEYVAL 12 key => 2
WORD 12 namespace --- User
NODE1 13 namespace
KEYVAL 13 key => 3
WORD 13 namespace --- User
WORD 13 namespace --- talk
NODE1 14 namespace
KEYVAL 14 key => 4
WORD 14 namespace --- Wikipedia
NODE1 15 namespace
KEYVAL 15 key => 5
WORD 15 namespace --- Wikipedia
WORD 15 namespace --- talk
NODE1 16 namespace
KEYVAL 16 key => 6
WORD 16 namespace --- Image
NODE1 17 namespace
KEYVAL 17 key => 7
WORD 17 namespace --- Image
WORD 17 namespace --- talk
NODE1 18 namespace
KEYVAL 18 key => 8
WORD 18 namespace --- MediaWiki
NODE1 19 namespace
KEYVAL 19 key => 9
WORD 19 namespace --- MediaWiki
WORD 19 namespace --- talk
NODE1 20 namespace
KEYVAL 20 key => 10
WORD 20 namespace --- Template
NODE1 21 namespace
KEYVAL 21 key => 11
WORD 21 namespace --- Template
WORD 21 namespace --- talk
NODE1 22 namespace
KEYVAL 22 key => 12
WORD 22 namespace --- Help
NODE1 23 namespace
KEYVAL 23 key => 13
WORD 23 namespace --- Help
WORD 23 namespace --- talk
NODE1 24 namespace
KEYVAL 24 key => 14
WORD 24 namespace --- Category
NODE1 25 namespace
KEYVAL 25 key => 15
WORD 25 namespace --- Category
WORD 25 namespace --- talk
NODE1 26 namespace
KEYVAL 26 key => 100
WORD 26 namespace --- Portal
NODE1 27 namespace
KEYVAL 27 key => 101
WORD 27 namespace --- Portal
WORD 27 namespace --- talk
NODE1 30 page
NODE1 31 title
WORD 31 title --- AaA
NODE1 32 id
WORD 32 id --- 1
NODE1 33 revision
NODE1 34 id
WORD 34 id --- 32899315
NODE1 35 timestamp
WORD 35 timestamp --- 2005-12-27T18:46:47Z
NODE1 36 contributor
NODE1 37 username
WORD 37 username --- Jsmethers
NODE1 38 id
WORD 38 id --- 614213
NODE1 40 text
KEYVAL 40 xml:space => preserve
WORD 40 text --- #REDIRECT
WIKITAG 40 text --- [[AAA]] *1
NODE1 43 page
NODE1 44 title
WORD 44 title --- AlgeriA
NODE1 45 id
WORD 45 id --- 5
NODE1 46 revision
NODE1 47 id
WORD 47 id --- 18063769
NODE1 48 timestamp
WORD 48 timestamp --- 2005-07-03T11:13:13Z
NODE1 49 contributor
NODE1 50 username
WORD 50 username --- Docu
NODE1 51 id
WORD 51 id --- 8029
NODE1 53 minor
NODE1 54 comment
WORD 54 comment --- adding
WORD 54 comment --- cur_id5:
WIKITAG 54 comment --- {{R from CamelCase}} *0
NODE1 55 text
KEYVAL 55 xml:space => preserve
WORD 55 text --- #REDIRECT
WIKITAG 55 text --- [[Algeria]] *1
WIKITAG 55 text --- {{R from CamelCase}} *0
NODE1 58 page
NODE1 59 title
WORD 59 title --- AmericanSamoa
NODE1 60 id
WORD 60 id --- 6
NODE1 61 revision
NODE1 62 id
WORD 62 id --- 18063795
NODE1 63 timestamp
WORD 63 timestamp --- 2005-07-03T11:14:17Z
NODE1 64 contributor
NODE1 65 username
WORD 65 username --- Docu
NODE1 66 id
WORD 66 id --- 8029
NODE1 68 minor
NODE1 69 comment
WORD 69 comment --- adding
WORD 69 comment --- to
WORD 69 comment --- cur_id6
WIKITAG 69 comment --- {{R from CamelCase}} *0
NODE1 70 text
KEYVAL 70 xml:space => preserve
WORD 70 text --- #REDIRECT
WIKITAG 70 text --- [[American Samoa]] *1
WIKITAG 70 text --- {{R from CamelCase}} *0
NODE1 73 page
NODE1 74 title
WORD 74 title --- AppliedEthics
NODE1 75 id
WORD 75 id --- 8
NODE1 76 revision
NODE1 77 id
WORD 77 id --- 15898943
NODE1 78 timestamp
WORD 78 timestamp --- 2002-02-25T15:43:11Z
NODE1 79 contributor
NODE1 80 ip
WORD 80 ip --- Conversion
WORD 80 ip --- script
NODE1 82 minor
NODE1 83 comment
WORD 83 comment --- Automated
WORD 83 comment --- conversion
NODE1 84 text
KEYVAL 84 xml:space => preserve
WORD 84 text --- #REDIRECT
WIKITAG 84 text --- [[Applied ethics]] *1
NODE1 88 page
NODE1 89 title
WORD 89 title --- AccessibleComputing
NODE1 90 id
WORD 90 id --- 10
NODE1 91 revision
NODE1 92 id
WORD 92 id --- 15898945
NODE1 93 timestamp
WORD 93 timestamp --- 2003-04-25T22:18:38Z
NODE1 94 contributor
NODE1 95 username
WORD 95 username --- Ams80
NODE1 96 id
WORD 96 id --- 7543
NODE1 98 minor
NODE1 99 comment
WORD 99 comment --- Fixing
WORD 99 comment --- redirect
NODE1 100 text
KEYVAL 100 xml:space => preserve
WORD 100 text --- #REDIRECT
WIKITAG 100 text --- [[Accessible_computing]] *1
NODE1 103 page
NODE1 104 title
WORD 104 title --- AdA
NODE1 105 id
WORD 105 id --- 11
NODE1 106 revision
NODE1 107 id
WORD 107 id --- 15898946
NODE1 108 timestamp
WORD 108 timestamp --- 2002-09-22T16:02:58Z
NODE1 109 contributor
NODE1 110 username
WORD 110 username --- Andre
WORD 110 username --- Engels
NODE1 111 id
WORD 111 id --- 300
NODE1 113 minor
NODE1 114 text
KEYVAL 114 xml:space => preserve
WORD 114 text --- #REDIRECT
WIKITAG 114 text --- [[Ada programming language]] *1
NODE1 117 page
NODE1 118 title
WORD 118 title --- Anarchism
NODE1 119 id
WORD 119 id --- 12
NODE1 120 revision
NODE1 121 id
WORD 121 id --- 42136831
NODE1 122 timestamp
WORD 122 timestamp --- 2006-03-04T01:41:25Z
NODE1 123 contributor
NODE1 124 username
WORD 124 username --- CJames745
NODE1 125 id
WORD 125 id --- 832382
NODE1 127 minor
NODE1 128 comment
WORD 128 comment --- /*
WORD 128 comment --- Anarchist
WORD 128 comment --- Communism
WORD 128 comment --- */
WORD 128 comment --- too
WORD 128 comment --- many
WORD 128 comment --- brackets
NODE1 129 text
KEYVAL 129 xml:space => preserve
WIKITAG 129 text --- {{Anarchism}} *0
WORD 130 text --- Anarchism
WORD 130 text --- originated
WORD 130 text --- as
WORD 130 text --- a
WORD 130 text --- term
WORD 130 text --- of
WORD 130 text --- abuse
WORD 130 text --- first
WORD 130 text --- used
WORD 130 text --- against
WORD 130 text --- early
WIKITAG 130 text --- [[working class]] *1
WIKITAG 130 text --- [[radical]] *1
WORD 130 text --- s
WORD 130 text --- including
WORD 130 text --- the
WIKITAG 130 text --- [[Diggers]] *1
WORD 130 text --- of
WORD 130 text --- the
WIKITAG 130 text --- [[English Revolution]] *1
WORD 130 text --- and
WORD 130 text --- the
WIKITAG 130 text --- [[sans-culotte|sans-culottes]] *1
WORD 130 text --- of
WORD 130 text --- the
WIKITAG 130 text --- [[French Revolution]] *1
WORD 130 text --- .[http://uk.encarta.msn.com/encyclopedia_761568770/Anarchism.html]
WORD 130 text --- Whilst
WORD 130 text --- the
WORD 130 text --- term
WORD 130 text --- is
WORD 130 text --- still
WORD 130 text --- used
WORD 130 text --- in
WORD 130 text --- a
WORD 130 text --- pejorative
WORD 130 text --- way
WORD 130 text --- to
WORD 130 text --- describe
[ENTITY] 130 text --- "
ENTITY 130 text --- " => [0,5] '7
WORD 130 text --- any '7
WORD 130 text --- act '7
WORD 130 text --- that '7
WORD 130 text --- used '7
WORD 130 text --- violent '7
WORD 130 text --- means '7
WORD 130 text --- to '7
WORD 130 text --- destroy '7
WORD 130 text --- the '7
WORD 130 text --- organization '7
WORD 130 text --- of '7
[ENTITY] 130 text --- society"
ENTITY 130 text --- " => [7,12] '7
SUB WORD 130 text --- society '7 => [0,6]
[ENTITY] 130 text --- <
ENTITY 130 text --- < => [0,3]
[ENTITY] 130 text --- ref>
ENTITY 130 text --- > => [3,6]
SUB WORD 130 text --- ref => [0,2]
WORD 130 text --- [http://www.cas.sc.edu/socy/faculty/deflem/zhistorintpolency.html
WORD 130 text --- History
WORD 130 text --- of
WORD 130 text --- International
WORD 130 text --- Police
WORD 130 text --- Cooperation]
WORD 130 text --- ,
WORD 130 text --- from
WORD 130 text --- the
WORD 130 text --- final
WORD 130 text --- protocols
WORD 130 text --- of
WORD 130 text --- the
[ENTITY] 130 text --- "
ENTITY 130 text --- " => [0,5]
WORD 130 text --- International
WORD 130 text --- Conference
WORD 130 text --- of
WORD 130 text --- Rome
WORD 130 text --- for
WORD 130 text --- the
WORD 130 text --- Social
WORD 130 text --- Defense
WORD 130 text --- Against
[ENTITY] 130 text --- Anarchists"
ENTITY 130 text --- " => [10,15]
SUB WORD 130 text --- Anarchists => [0,9]
WORD 130 text --- ,
[ENTITY] 130 text --- 1898<
ENTITY 130 text --- < => [4,7]
SUB WORD 130 text --- 1898 => [0,3]
[ENTITY] 130 text --- /ref>
ENTITY 130 text --- > => [4,7]
SUB WORD 130 text --- /ref => [0,3]
WORD 130 text --- ,
WORD 130 text --- it
WORD 130 text --- has
WORD 130 text --- also
WORD 130 text --- been
WORD 130 text --- taken
WORD 130 text --- up
WORD 130 text --- as
WORD 130 text --- a
WORD 130 text --- positive
WORD 130 text --- label
WORD 130 text --- by
WORD 130 text --- self-defined
WORD 130 text --- anarchists.
WORD 132 text --- The
WORD 132 text --- word
WORD 132 text --- anarchism
WORD 132 text --- is
WIKITAG 132 text --- [[etymology|derived from]] *1
WORD 132 text --- the
WIKITAG 132 text --- [[Greek language|Greek]] *1
WIKITAG 132 text --- [[Wiktionary:&#945;&#957;&#945;&#961;&#967;&#943;&#945;|&#945;&#957;&#945;&#961;&#967;&#943;&#945;]] *1 '7
[ENTITY] 132 text --- ("
ENTITY 132 text --- " => [1,6]
SUB WORD 132 text --- ( => [0,0]
WORD 132 text --- without
WIKITAG 132 text --- [[archon]] *1
WORD 132 text --- s
WORD 132 text --- (ruler,
WORD 132 text --- chief,
[ENTITY] 132 text --- king)"
ENTITY 132 text --- " => [5,10]
SUB WORD 132 text --- king) => [0,4]
WORD 132 text --- ).
WORD 132 text --- Anarchism
WORD 132 text --- as
WORD 132 text --- a
WIKITAG 132 text --- [[political philosophy]] *1
WORD 132 text --- ,
WORD 132 text --- is
WORD 132 text --- the
WORD 132 text --- belief
WORD 132 text --- that
WORD 132 text --- rulers
WORD 132 text --- are
WORD 132 text --- unnecessary
WORD 132 text --- and
WORD 132 text --- should
WORD 132 text --- be
WORD 132 text --- abolished,
WORD 132 text --- although
WORD 132 text --- there
WORD 132 text --- are
WORD 132 text --- differing
WORD 132 text --- interpretations
WORD 132 text --- of
WORD 132 text --- what
WORD 132 text --- this
WORD 132 text --- means.
WORD 132 text --- Anarchism
WORD 132 text --- also
WORD 132 text --- refers
WORD 132 text --- to
WORD 132 text --- related
WIKITAG 132 text --- [[social movement]] *1
WORD 132 text --- s)
WORD 132 text --- that
WORD 132 text --- advocate
WORD 132 text --- the
WORD 132 text --- elimination
WORD 132 text --- of
WORD 132 text --- authoritarian
WORD 132 text --- institutions,
WORD 132 text --- particularly
WORD 132 text --- the
WIKITAG 132 text --- [[state]] *1
[ENTITY] 132 text --- .<
ENTITY 132 text --- < => [1,4]
SUB WORD 132 text --- . => [0,0]
[ENTITY] 132 text --- ref>
ENTITY 132 text --- > => [3,6]
SUB WORD 132 text --- ref => [0,2]
WORD 132 text --- [http://en.wikiquote.org/wiki/Definitions_of_anarchism
WORD 132 text --- Definitions
WORD 132 text --- of
WORD 132 text --- anarchism]
WORD 132 text --- on
WORD 132 text --- Wikiquote,
WORD 132 text --- accessed
[ENTITY] 132 text --- 2006<
ENTITY 132 text --- < => [4,7]
SUB WORD 132 text --- 2006 => [0,3]
[ENTITY] 132 text --- /ref>
ENTITY 132 text --- > => [4,7]
SUB WORD 132 text --- /ref => [0,3]
WORD 132 text --- The
WORD 132 text --- word
[ENTITY] 132 text --- "
ENTITY 132 text --- " => [0,5]
WIKITAG 132 text --- [[anarchy]] *1
[ENTITY] 132 text --- ,"
ENTITY 132 text --- " => [1,6]
SUB WORD 132 text --- , => [0,0]
WORD 132 text --- as
WORD 132 text --- most
WORD 132 text --- anarchists
WORD 132 text --- use
WORD 132 text --- it,
WORD 132 text --- does
WORD 132 text --- not
WORD 132 text --- imply
WIKITAG 132 text --- [[chaos]] *1
WORD 132 text --- ,
WIKITAG 132 text --- [[nihilism]] *1
WORD 132 text --- ,
WORD 132 text --- or
WIKITAG 132 text --- [[anomie]] *1
WORD 132 text --- ,
WORD 132 text --- but
WORD 132 text --- rather
WORD 132 text --- a
WORD 132 text --- harmonious
WIKITAG 132 text --- [[anti-authoritarian]] *1
WORD 132 text --- society.
WORD 132 text --- In
WORD 132 text --- place
WORD 132 text --- of
WORD 132 text --- what
WORD 132 text --- are
WORD 132 text --- regarded
WORD 132 text --- as
WORD 132 text --- authoritarian
WORD 132 text --- political
WORD 132 text --- structures
WORD 132 text --- and
WORD 132 text --- coercive
WORD 132 text --- economic
WORD 132 text --- institutions,
WORD 132 text --- anarchists
WORD 132 text --- advocate
WORD 132 text --- social
WORD 132 text --- relations
WORD 132 text --- based
WORD 132 text --- upon
WIKITAG 132 text --- [[voluntary association]] *1
WORD 132 text --- of
WORD 132 text --- autonomous
WORD 132 text --- individuals,
WIKITAG 132 text --- [[mutual aid]] *1
WORD 132 text --- ,
WORD 132 text --- and
WIKITAG 132 text --- [[self-governance]] *1
WORD 132 text --- .
WORD 134 text --- While
WORD 134 text --- anarchism
WORD 134 text --- is
WORD 134 text --- most
WORD 134 text --- easily
WORD 134 text --- defined
WORD 134 text --- by
WORD 134 text --- what
WORD 134 text --- it
WORD 134 text --- is
WORD 134 text --- against,
WORD 134 text --- anarchists
WORD 134 text --- also
WORD 134 text --- offer
WORD 134 text --- positive
WORD 134 text --- visions
WORD 134 text --- of
WORD 134 text --- what
WORD 134 text --- they
WORD 134 text --- believe
WORD 134 text --- to
WORD 134 text --- be
WORD 134 text --- a
WORD 134 text --- truly
WORD 134 text --- free
WORD 134 text --- society.
WORD 134 text --- However,
WORD 134 text --- ideas
WORD 134 text --- about
WORD 134 text --- how
WORD 134 text --- an
WORD 134 text --- anarchist
WORD 134 text --- society
WORD 134 text --- might
WORD 134 text --- work
WORD 134 text --- vary
WORD 134 text --- considerably,
WORD 134 text --- especially
WORD 134 text --- with
WORD 134 text --- respect
WORD 134 text --- to
WORD 134 text --- economics;
WORD 134 text --- there
WORD 134 text --- is
WORD 134 text --- also
WORD 134 text --- disagreement
WORD 134 text --- about
WORD 134 text --- how
WORD 134 text --- a
WORD 134 text --- free
WORD 134 text --- society
WORD 134 text --- might
WORD 134 text --- be
WORD 134 text --- brought
WORD 134 text --- about.
WORD 136 text --- Origins '4
WORD 136 text --- and '4
WORD 136 text --- predecessors '4
WIKITAG 138 text --- [[Peter Kropotkin|Kropotkin]] *1
WORD 138 text --- ,
WORD 138 text --- and
WORD 138 text --- others,
WORD 138 text --- argue
WORD 138 text --- that
WORD 138 text --- before
WORD 138 text --- recorded
WIKITAG 138 text --- [[history]] *1
WORD 138 text --- ,
WORD 138 text --- human
WORD 138 text --- society
WORD 138 text --- was
WORD 138 text --- organized
WORD 138 text --- on
WORD 138 text --- anarchist
[ENTITY] 138 text --- principles.<
ENTITY 138 text --- < => [11,14]
SUB WORD 138 text --- principles. => [0,10]
[/src]

Legende:
1 Angabe: "Datentyp"
2 Angabe: Zeilenummer
3 Angabe: Node-Name bzw. bei Key/Value der Schlüssel, dann immer der Wert
* Angabe: WikiTag Format
' Angabe: Bold/Italic oder Bold-Italic oder eine Überschrift

NODE1/2 - XML Nodes
KEYVAL - Schlüssel und Wert eines Key/Value Pairs
WORD - Wortdaten
WIKITAG - Halt Wiki-Markup (ein solcher Textblock wird aktuell komplett eingelesen)
[ENTITY] - Ein String in der sich mindestens ein HTML-Entity befindet
ENTITY - eine Identifizierte Entity mit Start und Endpunkt im [ENTITY]-String (diese werden immer vor den Wörtern herausgelesen/aufgelistet)
SUB WORD - Wort aus einem [ENTITY]-String herausgelöst mit Start und Endposition im String
SUB WIKITAG - WikiTag innerhalb eines [ENTITY]-Strings ebenfalls mit Start und Endposition im String


Ein kleiner Nachtrag/Hinweis:

Problematisch sind leider aber derartige "Formatierungen" wie:
"*", // List element, multiple levels, "**" Element of element
"#", // Numbered list element, multiple levels = "##" "Element of element"
":", // "indent 1", multiple levels using ":::" = 3

Bei einem Stern und einer Raute bin ich mir nicht sicher ob die nicht auch im normalen Text platziert werden können wie auch ein Doppelpunkt.
Ich bin soweit noch nicht dazu gekommen dies weiter zu untersuchen, aber mir ist gerade ein Rätsel nach welcher Regeln das bei Wikipedia "geparsed" wird und wann ein Doppelpunkt wirklich ein Ident bedeutet und wann nicht, ob ein "#REDIRECT" nur in "comment" - Nodes auftaucht oder ob es auch andere Stellen gibt.

Edit2:
Ich sehe gerade es ist noch nicht fehlerfrei.
"[[Peter Kropotkin|Kropotkin]]" sollte kein Format besitzen, da muß ich wohl nochmal ran. ;)
Daher werden diese aktuell nicht als Formatierungszeichen beachtet und würden normal in den Text einfließen, so fern vorhanden.


Bei der Raute ist auch das Problem, es kann ein "REDIRECT" folgen, muß aber nicht - das ließe sich notfalls aber auch nochmal behandeln meine ich da hier der Fall relativ eindeutig ist.

Edit3:
Habe mal die Veränderungen vorgenommen das WikiTags eine höhere Priorität als Entity-Filtering bekommen haben.
Jetzt sollte es besser passen.
 
Zuletzt bearbeitet:

Roin

Freier Denker

Registriert
22 Juli 2013
Beiträge
581
@theSplit: Gibt es inzwischen erste Ergebnisse deiner Kompression? Was erreichst du so? Wie groß ist dein Compressor-Programm? Wie lange dauert ein vollständiger Durchlauf?
Ich hatte in letzter Zeit nicht die Zeit, um hier weiterzumachen. Ich überlege mir gerade in den nächsten Tagen mein Programm noch einmal neu zu schreiben - dann sollte auch der ein oder andere Fehler verschwinden.
 

theSplit

1998
Veteran Barkeeper

Registriert
3 Aug. 2014
Beiträge
28.573
  • Thread Starter Thread Starter
  • #59
Also um ganz ehrlich zu sein, ich hab noch keine Erfolge erzielt.

Die meiste Zeit innerhalb der letzten Wochen ist für den Datenparser draufgegangen.

Aber das ist leider eine doch sehr zermürbende Aufgabe da ich immer wieder auf Stolpersteine getroffen bin und irgendwas dann letzten Endes nicht richtig klassifiziert wurde, falsch Formatiert gesetzt - weil vorher eine Formatierung genutzt wird oder ähnliches, Kleinigkeiten die aber Fehler/Sonderfälle sind.

Ein weiteres Problem ist auch das Tags innerhalb von Tags auftauchen können mit gleichen Tagstart, also ganz markant [[ und {{ ineinander geschachtelt.

Die Behandlung vom XML wiederum war ziemlich einfach.
 
Zuletzt bearbeitet:

Roin

Freier Denker

Registriert
22 Juli 2013
Beiträge
581
@theSplit: Ich wäre zumindest echt gespannt, wie viel Speicherplatz du damit einsparen kannst. Immerhin ist der Parser für das ganze Ding ja auch einige KB schon groß (denke ich zumindest?).
 
Oben