This notebook contains the Pandas instructions to load the a corpus in Pandas.
We perform some simple information extracting on the data.
import os
import pandas as pd
We read exactly the same file as is read by R in bigTablesR.
VERSION = "0.1"
PANDAS_DIR = os.path.abspath("../pandas")
TEXT_DIR = os.path.abspath("../txt")
TABLE_FILE_PD = f"{PANDAS_DIR}/data-{VERSION}.pd"
TABLE_FILE_TXT = f"{TEXT_DIR}/data-{VERSION}.txt"
if not os.path.exists(TEXT_DIR):
os.makedirs(TEXT_DIR)
frame = pd.read_parquet(TABLE_FILE_PD, engine="pyarrow")
print("Done. Size={}".format(frame.size))
Done. Size=7272160
frame.shape
(227255, 32)
frame.head(30)
nd | otype | after | str | in_chapter | in_chunk | chapter | chunk | curr | empty | ... | rend_h2 | rend_h3 | rend_h4 | rend_i | rend_sc | rend_spat | rend_sup | to | type | value | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 218394 | chapter | 218394 | <NA> | TEI header | <NA> | <NA> | ... | <NA> | <NA> | <NA> | <NA> | <NA> | <NA> | <NA> | ||||||
1 | 222327 | fileDesc | 218394 | 218438 | <NA> | <NA> | ... | <NA> | <NA> | <NA> | <NA> | <NA> | <NA> | <NA> | |||||||
2 | 218438 | chunk | 218394 | 218438 | TEI header | -1 | <NA> | ... | <NA> | <NA> | <NA> | <NA> | <NA> | <NA> | <NA> | ||||||
3 | 227248 | titleStmt | 218394 | 218438 | <NA> | <NA> | ... | <NA> | <NA> | <NA> | <NA> | <NA> | <NA> | <NA> | |||||||
4 | 227245 | title | 218394 | 218438 | <NA> | <NA> | ... | <NA> | <NA> | <NA> | <NA> | <NA> | <NA> | <NA> | main | ||||||
5 | 1 | word | De | 218394 | 218438 | <NA> | <NA> | ... | <NA> | <NA> | <NA> | <NA> | <NA> | <NA> | <NA> | ||||||
6 | 2 | word | lotgevallen | 218394 | 218438 | <NA> | <NA> | ... | <NA> | <NA> | <NA> | <NA> | <NA> | <NA> | <NA> | ||||||
7 | 3 | word | van | 218394 | 218438 | <NA> | <NA> | ... | <NA> | <NA> | <NA> | <NA> | <NA> | <NA> | <NA> | ||||||
8 | 4 | word | Ferdinand | 218394 | 218438 | <NA> | <NA> | ... | <NA> | <NA> | <NA> | <NA> | <NA> | <NA> | <NA> | ||||||
9 | 5 | word | Huyck | 218394 | 218438 | <NA> | <NA> | ... | <NA> | <NA> | <NA> | <NA> | <NA> | <NA> | <NA> | ||||||
10 | 218381 | author | 218394 | 218438 | <NA> | <NA> | ... | <NA> | <NA> | <NA> | <NA> | <NA> | <NA> | <NA> | |||||||
11 | 6 | word | Jacob | 218394 | 218438 | <NA> | <NA> | ... | <NA> | <NA> | <NA> | <NA> | <NA> | <NA> | <NA> | ||||||
12 | 7 | word | van | 218394 | 218438 | <NA> | <NA> | ... | <NA> | <NA> | <NA> | <NA> | <NA> | <NA> | <NA> | ||||||
13 | 8 | word | Lennep | 218394 | 218438 | <NA> | <NA> | ... | <NA> | <NA> | <NA> | <NA> | <NA> | <NA> | <NA> | ||||||
14 | 222320 | editionStmt | 218394 | 218438 | <NA> | <NA> | ... | <NA> | <NA> | <NA> | <NA> | <NA> | <NA> | <NA> | |||||||
15 | 223480 | p | 218394 | 218438 | <NA> | <NA> | ... | <NA> | <NA> | <NA> | <NA> | <NA> | <NA> | <NA> | |||||||
16 | 9 | word | GEBRUIKT | 218394 | 218438 | <NA> | <NA> | ... | <NA> | <NA> | <NA> | <NA> | <NA> | <NA> | <NA> | ||||||
17 | 10 | word | EXEMPLAAR | 218394 | 218438 | <NA> | <NA> | ... | <NA> | <NA> | <NA> | <NA> | <NA> | <NA> | <NA> | ||||||
18 | 223481 | p | 218394 | 218438 | <NA> | <NA> | ... | <NA> | <NA> | <NA> | <NA> | <NA> | <NA> | <NA> | |||||||
19 | 11 | word | exemplaar | 218394 | 218438 | <NA> | <NA> | ... | <NA> | <NA> | <NA> | <NA> | <NA> | <NA> | <NA> | ||||||
20 | 12 | word | universiteitsbibliotheek | 218394 | 218438 | <NA> | <NA> | ... | <NA> | <NA> | <NA> | <NA> | <NA> | <NA> | <NA> | ||||||
21 | 13 | word | , | Leiden | 218394 | 218438 | <NA> | <NA> | ... | <NA> | <NA> | <NA> | <NA> | <NA> | <NA> | <NA> | |||||
22 | 14 | word | : | signatuur | 218394 | 218438 | <NA> | <NA> | ... | <NA> | <NA> | <NA> | <NA> | <NA> | <NA> | <NA> | |||||
23 | 15 | word | 1224 | 218394 | 218438 | <NA> | <NA> | ... | <NA> | <NA> | <NA> | <NA> | <NA> | <NA> | <NA> | ||||||
24 | 16 | word | C | 218394 | 218438 | <NA> | <NA> | ... | <NA> | <NA> | <NA> | <NA> | <NA> | <NA> | <NA> | ||||||
25 | 17 | word | 8 | 218394 | 218438 | <NA> | <NA> | ... | <NA> | <NA> | <NA> | <NA> | <NA> | <NA> | <NA> | ||||||
26 | 18 | word | en | 218394 | 218438 | <NA> | <NA> | ... | <NA> | <NA> | <NA> | <NA> | <NA> | <NA> | <NA> | ||||||
27 | 19 | word | 1224 | 218394 | 218438 | <NA> | <NA> | ... | <NA> | <NA> | <NA> | <NA> | <NA> | <NA> | <NA> | ||||||
28 | 20 | word | C | 218394 | 218438 | <NA> | <NA> | ... | <NA> | <NA> | <NA> | <NA> | <NA> | <NA> | <NA> | ||||||
29 | 21 | word | 9 | 218394 | 218438 | <NA> | <NA> | ... | <NA> | <NA> | <NA> | <NA> | <NA> | <NA> | <NA> |
30 rows × 32 columns
columnList = frame.columns.values.tolist()
columnList
['nd', 'otype', 'after', 'str', 'in_chapter', 'in_chunk', 'chapter', 'chunk', 'curr', 'empty', 'empty_lb', 'empty_link', 'empty_pb', 'empty_pb_n', 'is_meta', 'is_note', 'n', 'place', 'rend', 'rend_1tab', 'rend_b', 'rend_bq', 'rend_h2', 'rend_h3', 'rend_h4', 'rend_i', 'rend_sc', 'rend_spat', 'rend_sup', 'to', 'type', 'value']
Let us extract some data. First a list of the book names.
chapters = frame[frame.otype == "chapter"].chapter
for chapter in chapters:
print(chapter)
TEI header 2 interpGrp Brief van den Heer P. aan den Uitgever, tot inleiding dienende. [Woord van de uitgever] Eerste hoofdstuk. Tweede hoofdstuk. Derde hoofdstuk. Vierde hoofdstuk. Vijfde hoofdstuk. Zesde hoofdstuk. Zevende hoofdstuk. Achtste hoofdstuk. Negende hoofdstuk. Tiende hoofdstuk. Elfde hoofdstuk. Twaalfde hoofdstuk. Dertiende hoofdstuk. Veertiende hoofdstuk. Vijftiende hoofdstuk. Zestiende hoofdstuk. Zeventiende hoofdstuk. Achttiende hoofdstuk. Negentiende hoofdstuk. Twintigste hoofdstuk. Een-en-twintigste hoofdstuk. Twee-en-twintigste hoofdstuk. Drie-en-twintigste hoofdstuk. Vier-en-twintigste hoofdstuk. Vijf-en-twintigste hoofdstuk. Zes-en - twintigste hoofdstuk. Zeven-en-twintigste hoofdstuk. Acht-en-twintigste hoofdstuk. Negen-en-twintigste hoofdstuk. Dertigste hoofdstuk. Een-en-dertigste hoofdstuk. Twee-en-dertigste hoofdstuk. Drie-en-dertigste hoofdstuk. Vier-en-dertigste hoofdstuk. Vijf-en-dertigste hoofdstuk. Zes-en-dertigste hoofdstuk. Zeven-en-dertigste hoofdstuk. Acht-en-dertigste hoofdstuk. Negen-en-dertigste hoofdstuk. [Nawoord]
Now the complete text of the whole book.
words = frame.loc[frame.otype == "word"]
text = words.str + words.after
with open(TABLE_FILE_TXT, "w") as pt:
pt.write("".join(text).replace("\\n", "\n"))
pt.write("\n")
!head {TABLE_FILE_TXT}
De lotgevallen van Ferdinand HuyckJacob van LennepGEBRUIKT EXEMPLAARexemplaar universiteitsbibliotheek Leiden, signatuur: 1224 C 8 en 1224 C 9 ALGEMENE OPMERKINGENDit bestand biedt, behoudens een aantal hierna te noemen ingrepen, een diplomatische weergave van de eerste druk van De lotgevallen van Ferdinand Huyck in twee delen, van Jacob van Lennep uit 1840 REDACTIONELE INGREPENdeel 1, p. I: de kop ‘Eerste deel’ is tussen vierkante haken toegeveoegddeel 1, p. VI: het paginanummer IV is verbeterd in VIdeel 1, p. XVII: de kop ‘Woord van de uitgever’ is tussen vierkante haken toegeveoegddeel 2, p. 1: de kop ‘Tweede deel’ is tussen vierkante haken toegeveoegddeel 2, p. 459: de kop ‘Nawoord’ is tussen vierkante haken toegeveoegd Bij de omzetting van de gebruikte bron naar deze publicatie in de dbnl is een aantal delen van de tekst niet overgenomen. Hieronder volgen de tekstgedeelten die wel in het origineel voorkomen maar hier uit de lopende tekst zijn weggelaten. Ook de blanco pagina's (deel 1 p. π1v, π2v en deel 2 p. II, IV) zijn niet opgenomen in de lopende tekst. [deel 1, pagina ongenummerd (p. π1r)]DE LOTGEVALLEN VAN FERDINAND HUYCK. [deel 1,pagina ongenummerd (p. 2πr)]DE LOTGEVALLEN VAN FERDINAND HUYCK, UITGEGEVEN DOOR Mr. J. VAN LENNEP.IN TWEE DEELEN.EERSTE DEEL.Te AMSTERDAM, bijP. MEIJER WARNARS.MDCCCXL. [deel 2, pagina ongenummerd (p. I)]DE LOTGEVALLEN VAN FERDINAND HUYCK. [deel 2, pagina ongenummerd (p. III)]DE LOTGEVALLEN VAN FERDINAND HUYCK, UITGEGEVEN DOOR MR. J. VAN LENNEP.IN TWEE DEELEN TWEEDE DEEL.Te AMSTERDAM, bij P. MEIJER WARNARS MDCCCXL. 2003 dbnl lenn006lotg01_01ebookunicodeJ. van Lennep, De lotgevallen van Ferdinand Huyck. (2 delen). P. Meijer Warnars, Amsterdam 1840 DBNL-TEI 1 De lotgevallen van Ferdinand Huyck Jacob van Lennep De lotgevallen van Ferdinand Huyck Jacob van Lennep 2003-08-14 CB colofon toegevoegd 2006-08-09 IH conversie van het bestand naar teixlite[Eerste deel] Brief van den Heer P. aan den Uitgever, tot inleiding dienende. Amsterdam, den... Ik weet niet, of gij van nabij bekend zijt geweest met de oude Juffrouw Stauffacher, die nu ruim twaalf jaren geleden in den ouderdom van ongeveer drie en tachtig jaren hier ter stede ontslapen is: zoo niet, acht ik zulks uiterst jammer voor iemand als gij, die een liefhebber zijt van onderzoek te doen naar min bekende bijzonderheden, het leven, het karakter, of de lotgevallen betreffende van vermaarde personen; want zij was een levend repertorium van dergelijke aartigheden. Ofschoon zelve, voor zooverre mij bewust is, nooit eenige buitengewone avonturen hebbende gehad, was zij, door de omstandigheden van haar levensloop, in betrekking geweest met een groot aantal van die personaadjen, welke zich in de vorige eeuw in verschillende opzichten vermaardheid hebben verworven: velen hunner had zij zelfs van nabij gekend. Quiconque a beaucoup vûPeut avoir beaucoup retenu,
Let us get the words from the first chunk.
wordIds = frame[(frame.otype == "word") & (frame.in_chunk == 218438)].nd
print(wordIds.values)
<IntegerArray> [ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, ... 290, 291, 292, 293, 294, 295, 296, 297, 298, 299] Length: 299, dtype: Int64
Now the text of the first verse.
words = frame[(frame.otype == "word") & (frame.in_chunk == 218470)]
text = words.str + words.after
print(("".join(text)).replace("\\n", "\n"))
- ‘Hoor! ik heb nooit verlangd mij een naam te maken: en al wat ik begeer is, na mijn dood vergeten te worden.’ -
Let us get the words and text of an arbitrary passage, say chapter "Veertiende hoofdstuk."
, chunk 6
.
First the id of the chunk (i.e. the Text-Fabric node number):
chunk_id = frame[
(frame.otype == "chunk")
& (frame.chapter == "Veertiende hoofdstuk.")
& (frame.chunk == 6)
].nd.iloc[0]
print(chunk_id)
219495
Now the word ids of that chunk:
words = frame[(frame.otype == "word") & (frame.in_chunk == chunk_id)]
print(words.nd.values)
<IntegerArray> [69813, 69814, 69815, 69816, 69817, 69818, 69819, 69820, 69821, 69822, 69823, 69824, 69825, 69826, 69827, 69828, 69829, 69830, 69831, 69832, 69833, 69834, 69835, 69836, 69837, 69838, 69839, 69840, 69841, 69842] Length: 30, dtype: Int64
And, finally, the text of those words.
text = words.str + words.after
print(("".join(text)).replace("\\n", "\n"))
- ‘Nou dat trappie op,’ zeide zij mij, zoodra ik bij haar stond: ‘en dan de derde deur aan je rechterhand; maar pas op! het is wat doister hier.’ -
Now let us organize this in two functions: one that returns the chunk object given a passage, and one that prints the texts of the words in a given object.
def object2text(nd):
otype = frame[frame.nd == nd].otype.iloc[0]
inotype = "in_" + otype
words = frame[(frame.otype == "word") & (frame[inotype] == nd)]
text = words.str + words.after
return ("".join(text)).replace("\\n", "\n")
def chunk2object(chapter, chunk):
return frame[
(frame.otype == "chunk")
& (frame.chapter == chapter)
& (frame.chunk == chunk)
].nd.iloc[0]
def chunk2text(chapter, chunk):
return object2text(chunk2object(chapter, chunk))
def chapter2object(chapter):
return frame[
(frame.otype == "chapter") & (frame.chapter == chapter)
].nd.iloc[0]
def chapter2text(chapter):
return object2text(chapter2object(chapter))
print(chunk2text("Veertiende hoofdstuk.", 6))
- ‘Nou dat trappie op,’ zeide zij mij, zoodra ik bij haar stond: ‘en dan de derde deur aan je rechterhand; maar pas op! het is wat doister hier.’ -
ch14 = chapter2text("Veertiende hoofdstuk.")
print(ch14[0:500])
print("...")
print(ch14[-500:])
Veertiende hoofdstuk. Waarin Ferdinand op cognacq onthaald en tegen wil en dank in nieuwe avonturen gesleept wordt. Ik wandelde dan, niet lang na dat wij van tafel waren opgestaan, naar de Raamgracht, en vond weldra het huis, dat ik zocht, en hetwelk kenbaar was aan het, vrij slecht geschilderd, doch sprekend gelijkend afbeeldsel eener in Amsterdam te dier tijd welbekende groenvrouw, 't welk achter de glasruiten der zijkamer geplaatst was, nevens een bordje, waarop in gekleurde letteren te lezen ... n van beide verdachte personen zijn, noch Mejuffrouw van Beveren, noch ik, zoo raad ik u maar, u daarover niet verder te bekommeren. Er zijn zaken van meer belang, die uw onderzoek kunnen bezig houden.’ - Met deze woorden rees ik op, nam mijn afscheid en verliet het huis, niet weinig ontevreden over het noodlot, dat mij scheen te vervolgen en tegen wil en dank van de eene avontuur in de andere te halen en een rol te doen spelen in allerlei zaken, waarmede ik niet verlangde iets te doen te hebben
We make a column of chunk-bound bi-grams of words. The two words are separated by an underscore _
.
chunkNext = frame[frame.otype == "word"].in_chunk
chunkPrev = frame[frame.otype == "word"].in_chunk.shift(1)
word = frame[frame.otype == "word"].str
wordNext = frame[frame.otype == "word"].str.shift(1)
lastInChunk = chunkPrev != chunkNext
wordNext[lastInChunk] = ""
bigram = ["{}_{}".format(*p) for p in zip(word, wordNext)]
bigram[10_000:10_030]
['Ik_-', 'dank_Ik', 'je_dank', 'zeide_je', 'ik_zeide', 'want_ik', 'ofschoon_want', 'ik_ofschoon', 'later_ik', 'die_later', 'gewoonte_die', 'weder_gewoonte', 'heb_weder', 'aangenomen_heb', 'ik_aangenomen', 'was_ik', 'op_was', 'mijn_op', 'reis_mijn', 'bij_reis', 'mangel_bij', 'aan_mangel', 'goeden_aan', 'tabak_goeden', 'het_tabak', 'roken_het', 'afgewend_roken', 'maar_afgewend', 'ik_maar', 'heb_ik']