To get started: consult start
Search in Text-Fabric is a template based way of looking for structural patterns in your dataset.
Within Text-Fabric we have the unique possibility to combine the ease of formulating search templates for complicated syntactical patterns with the power of programmatically processing the results.
This notebook will show you how to get up and running.
Search is as simple as saying (just an example)
results = A.search(template)
A.show(results)
See all ins and outs in the search template docs.
The ins and outs of installing Text-Fabric, getting the corpus, and initializing a notebook are explained in the start tutorial.
%load_ext autoreload
%autoreload 2
from tf.app import use
A = use("CLARIAH/descartes-tf", hoist=globals())
Locating corpus resources ...
Name | # of nodes | # slots/node | % coverage |
---|---|---|---|
volume | 8 | 85241.88 | 100 |
letter | 725 | 940.60 | 100 |
page | 2884 | 236.45 | 100 |
postscriptum | 56 | 46.79 | 0 |
opener | 545 | 1.97 | 0 |
closer | 541 | 13.10 | 1 |
address | 86 | 15.22 | 0 |
head | 725 | 23.37 | 2 |
p | 8438 | 80.82 | 100 |
sentence | 13074 | 50.14 | 96 |
hi | 5972 | 4.63 | 4 |
formula | 6200 | 1.21 | 1 |
figure | 319 | 1.00 | 0 |
word | 681935 | 1.00 | 100 |
We start with the most simple form of issuing a query. Let's look for the 16th sentence of the paragraphs that have that many sentences.
Note that sentences are numbered within paragraphs and that the sentence number is in feature n
.
template = """
sentence n=16
"""
results = A.search(template)
0.01s 10 results
We see the amount of results, but how do we get the results?
results
[(709049,), (709186,), (710254,), (712431,), (713741,), (716957,), (717009,), (717350,), (719832,), (720490,)]
Nice try. These are indeed the results, but they are just the nodes, i.e. meaningless numbers (to us).
We get more flesh and blood by displaying the results.
A.table(results)
n | p | sentence |
---|---|---|
1 | 1 1027:3 | Ce n'est pas que je ne l'aime et que je ne le tienne pour un homme tout plein d'honneur et de bonté; mais parce que je ne connais que deux personnes, avec qui il ait jamais eu quelque chose à démêler, qui sont M. Mydorge et M. Morin, et qu'il se plaint de tous les deux, je ne saurais que je ne juge qu'il tient quelque chose de cette humeur, où il faut dire qu'il est bien malheureux. |
2 | 1 1032:4 | Quâ tamen in re non judico te satis prudenter cavere tuis rebus: quid enim si de istius manuscripti fide dubitatur? nunquid tutius esset testes adhibere vel tabulis publicis confirmare? Sed profecto, ut verum loquar, istae divitiae, quae fures timent et tantâ cum sollicitudine debent asservari, miserum te reddunt potius quàm beatum; nec, si mihi credis, te pigebit illa amittere simul cum morbo. |
3 | 1 1116:3 | Opinor autem quod, sicuti apud Poetam consessus Didonianus, conticebunt omnes intentique ora tenebunt. Precor autem te et obtestor ut eodem tenore caetera quae in manibus habes prosequaris et aliquando proferas, meque subinde epistolio tuo bees. |
4 | 3 3174:23 | Je m'étonne aussi de ce que, nonobstant que j'aie clairement démontré tout ce que j'ai dit devoir être corrigé en sa règle, et qu'il n'aît donné aucune raison à l'encontre, il ne laisse pas de dire que j'y ai mal réussi, au lieu de quoi je me persuade qu'il m'en devrait remercier; et même il ajoute que j'ai failli pour avoir dit qu'il fallait donner deux noms à la ligne qu'il nomme B etc., ce qui ne réussit, dit-il, qu'aux questions qui sont aisées, au lieu qu'il devrait dire que c'est donc lui-même qui avait failli, à cause que j'ai suivi en cela son texte de mot à mot, ainsi que j'ai dû faire pour le corriger. |
5 | 3 3220:3 | Je suis, Monsieur, Votre très obéissant et très obligé serviteur, DESCARTES. De Leyde le lundi au soir [12 décembre 1639]. Monsieur, |
6 | 6 6391:3 | Maer niet-te-min dewijl al de Werelt oordeelt, dat hy de voornaemste autheur is vande lasteringhen die in het ghemelt fameux boeck teghens my worden ghevonden, versoeck ick U. Ed. |
7 | 6 6396:3 | Je vous assure qu'elles ne me touchent guère, et ne m'ont point emmaigri, comme Voetius, à qui on dit qu'elles ont ôté treize livres de chair, mais non pas de graisse, à cause qu'il n'en eut jamais tant. |
8 | 6 6425:9 | Quin etiam nullum ea de re scriptum peculiare composui, sed obiter tantum in epistola in qua de Patre quodam Societatis conquerebar, et quam tunc commodam sub praelo habebam, paucas de illo paginas inserui. |
9 | 7 7601:6 | Lorsque l'écriture sainte parle en divers endroits de la multitude innombrable des Anges, elle confirme entièrement cette opinion: car nous jugeons que les moindres Anges sont incomparablement plus parfaits que les hommes. |
10 | 8 8650:3 | Cependant je puis vous assurer que cette Princesse, qui n'estime rien au monde que la vérité et la vertu, fait un grand jugement de vous pour l'amour de l'une et de l'autre. |
In front of each result you see the volume number, letter id, and paragraph number of the result.
Let's look for all sentences with an illustration in it.
query = """
sentence
figure
"""
results = A.search(query)
0.00s 319 results
A.table(results, end=3)
n | p | sentence | figure |
---|---|---|---|
1 | 1 1001:4 | Unum autem est, quod, opinor, non satis meditate scripsisti: nempe omnes saltus in unicâ voce fieri ![]() | ![]() |
2 | 1 1002:3 | Atque hac arte quadruplo plures quaestiones et longe difficiliores solvi poterunt, quàm communi Algebrâ; 13 enim diversa genera aequationum cubicarum numero, qualia tantùm sunt tria aequationum communium: nempe inter 1 ![]() ![]() ![]() ![]() | ![]() |
3 | 1 1002:3 | Atque hac arte quadruplo plures quaestiones et longe difficiliores solvi poterunt, quàm communi Algebrâ; 13 enim diversa genera aequationum cubicarum numero, qualia tantùm sunt tria aequationum communium: nempe inter 1 ![]() ![]() ![]() ![]() | ![]() |
Note that there are two columns: 1 for the sentence node in each result, and 2 for the figure node in each result.
The display of the second column does not add much here, so we can skip it:
A.table(results, end=3, skipCols={2})
n | p | sentence | figure |
---|---|---|---|
1 | 1 1001:4 | Unum autem est, quod, opinor, non satis meditate scripsisti: nempe omnes saltus in unicâ voce fieri ![]() | |
2 | 1 1002:3 | Atque hac arte quadruplo plures quaestiones et longe difficiliores solvi poterunt, quàm communi Algebrâ; 13 enim diversa genera aequationum cubicarum numero, qualia tantùm sunt tria aequationum communium: nempe inter 1 ![]() ![]() ![]() ![]() | |
3 | 1 1002:3 | Atque hac arte quadruplo plures quaestiones et longe difficiliores solvi poterunt, quàm communi Algebrâ; 13 enim diversa genera aequationum cubicarum numero, qualia tantùm sunt tria aequationum communium: nempe inter 1 ![]() ![]() ![]() ![]() |
We can make the display richer: instead of a plain table, we can unfold the sentences in the results. We only show the second result:
A.show(results, start=2, end=2)
result 2
Now let's look for formulas that have a square root in them.
Note that in TeX a square root is written as \sqrt
.
The TeX source of a formula is contained in the tex
feature of a formula node, provided
the formula is written in TeX. Not all formulas are written in TeX.
query = """
sentence
formula tex~sqrt
"""
results = A.search(query)
0.00s 54 results
A.table(results, end=3, skipCols={2})
n | p | sentence | formula |
---|---|---|---|
1 | 2 2152:4 | Or par cette seule équation de la page 326, à savoir: y ![]() | |
2 | 3 3174:14 | Je cherche la tangente FE ou CB parallèle au diamètre AK, ![]() | |
3 | 3 3174:15 | Puisque y est égal à x − v et que v vient d'être trouvé, nous avons aussi y=16n±√136nn+13nx−xx ce qui étant substitué au lieu d' y, et son cube au lieu d' y 3 en la première équation, on trouve en la démêlant qu'elle se réduit à ces termes: x4..−19n3x+154n4=0. Et par la règle qui est en ma Géométrie, page 383, j'écris en leur place: z6.−227n4zz−181n6=0. Puis (par la page 381) je trouve la valeur de zz, qui est 13nn et z=n√13 Au moyen de quoi (par la page 385), je divise l'équation x4−19n3x+154n4=0 en deux autres qui sont xx−nx√13+16nn−nn6√3=0 et xx+nx√13+16nn+nn6√3=0. Et par la première de ces deux équations, je connais la valeur d' x, qui est x=n√112±√nn6√3−112nn. Enfin, à cause que, cherchant en même façon la ligne AB par la tangente CB, il vient une équation toute semblable, on apprend de là que la ligne AG est n√112+√nn6√3−112nn et que AD est n√112−√nn6√3−112nn et par conséquent que DG est √2nn3√3−13nn et que CF est √4nn3√3−23nn. Ce qui est la plus grande largeur de la feuille qu'on demandait, en sorte que, si la ligne n est 9, CF sera √36√3−54 et si n est 3, CF sera √4√3−6 et ainsi des autres. |
A.show(results, end=1)
result 1
We can get rid of the TeX codes.
We see them because our query mentioned the feature tex
, but we can turn that off (showing the 3rd result only)
A.show(results, end=1, condensed=True, queryFeatures=False)
sentence 1
We gather the formulas not written in TeX:
query = """
formula notation#TeX
"""
results = A.search(query)
0.01s 5981 results
The majority is not written in TeX, let's sample a few:
from random import seed, sample
seed(42)
selected = sample(results, 20)
A.table(selected)
n | p | formula |
---|---|---|
1 | 7 7538:6 | IN |
2 | 2 2122:12 | G |
3 | 1 1020:7 | ZZ |
4 | 2 2164:25 | GR |
5 | 2 2159:5 | g |
6 | 2 2156:9 | C in A + C in E − Aq − A in E bis − Eq |
7 | 2 2126:16 | AO |
8 | 1 1f1b:3 | DE |
9 | 7 7547:12 | S |
10 | 4 4303:13 | BG |
11 | 1 1063:9 | B |
12 | 6 6408:5 | x |
13 | 3 3198:15 | FL |
14 | 1 1020:12 | Q |
15 | 1 1020:10 | LD |
16 | 1 1066:7 | B |
17 | 2 2156:6 | DN |
18 | 2 2156:15 | EO |
19 | 4 4289:9 | AC |
20 | 6 6467:5 | g |
These formulas are all so simple that TeX was not needed to display them.
Let's see the first 2 of them in context:
A.show(selected[0:2], condensed=True)
sentence 1
sentence 2
Advanced
CC-BY Dirk Roorda