Commit 6d3bcf1d authored by Morgane Pica's avatar Morgane Pica
Browse files

Adding readmes and scripts to new-corrections

parent 3cc3d466
Loading
Loading
Loading
Loading
+21 −0
Changes for new-corrections/add-Sineux-Rouille-notes/readme.md: 21 added lines, 0 removed lines.
Original line number Diff line number Diff line
# Quelles étapes reste-t-il pour ajouter les notes manuscrites du Rouillé de Pierre Sineux au XML ?
### 1 - Vérifications codicologiques
* S'agit-il bien exactement de la même édition ?
* **Si oui**, pas besoin de se poser de questions, les notes pourront aller dans le même fichier et on peut ajouter dans `//bibl[att.xml:id='temoin']/att.corresp` une espace puis le lien vers la notice du scd d'UniCaen. **Sinon**, vérifier si le texte imprimé auquel se réfèrent les notes est identique à notre version éditée. Si c'est le cas, on peut procéder pareil. Si les changements sont minimes, on peut procéder comme pour Morisse avec des `<quote>` pour préciser le texte exact en début de note.
* **Autrement** : Si ce n'est pas la même édition exactement et que le texte diffère, on devra procéder comme pour le Morisse : un fichier à part, et on transcrit aussi le texte référé (à quelle échelle ? à décider).
* **Déterminer les différentes mains** et potentiellement créer un identifiant pour chaque (quitte à écrire "hand1" etc) pour différencier les notes. Il faudra aussi déclarer ces mains (cf plus loin).

### 2 - Terminer la transcription
* Si la collection a un problème sur Transkribus, les données actuelles sont inclues dans ce dossier au format Transkribus. Il faudra redonner à Transkribus ce dossier.
* Terminer la transcription sur Transkribus.
* Vérifier les lignes et leur ordre, enlever toutes les lignes inutiles, refaire les identifiants (onglet Layout, bouton "Assign unique IDs to all elements according to their current sorting".

### 3 - Exporter la transcription
* "Export document" (barre du haut)
* Dans la fenêtre d'export, prenez l'onglet "Client export" tout en haut, choisissez un chemin local pour l'export et un nom pour le dossier qui sera créé.
* Colonne de gauche ("choose export formats") : cochez *uniquement* `TEI`.
* Colonne du milieu ("Export options") : cochez `Zone per region`, `Zone per line`, `Use bounding box coordinates` et `Line tags (<l>...</l>)`.
* Ok.

### 4 - Convertir la sortie TEI-Transkribus en TEI-ConDÉ.
[À suivre.]
 No newline at end of file
+144 −0
Changes for new-corrections/lemmatize-latin-text/extraction_tokens.ipynb: 144 added lines, 0 removed lines.
Original line number Diff line number Diff line
%% Cell type:markdown id: tags:

# Version du 3 avril 2020, prenant en compte les éléments choice (ajoutés entre-temps)

%% Cell type:code id: tags:

``` python
#Revue le 15 avril. Options pour fichier déjà lemmatisé ajoutées.

def export_tokens_to_csv(chemin_entree, chemin_sortie):

    """
    Fonction récupérant les éléments <w> d'un fichier XML-TEI
    avec leurs @n pour les exporter dans un fichier CSV à
    deux colonnes, l'une pour le numéro, l'autre pour le texte.
    Si l'élément <w> comporte des enfants <height> pour les initiales
    hautes, ou <choice> pour des modernisations/abréviations,
    la fonction compilera une version complète, résolue et modernisée
    pour le logiiel Analog.

    :param chemin_entree: Le chemin local vers un fichier en XML-TEI
        dont on souhaite extraire les tokens pour Analog.
    :param chemin_sortie: L'emplacement local dans lequel on souhaite
        écrire le fichier CSV à donner à Analog.
    """

    import xml.etree.ElementTree as ET
    import csv

    # Le dictionnaire dans lequel seront stockés les token avant écriture en CSV.
    # dico_tokens = {}
    # Les colonnes du futur fichier CSV.
    # colonnes = ['ID', 'TOKEN']
    colonnes = ['ID', 'TOKEN']

    # Pour que Python comprenne les éléments dont on parlera,
    # il faut lui donner la déclaration TEI, mais comme c'est
    # la seule qu'on utilisera, pas besoin de lui donner un préfixe.
    # ET.register_namespace('', "http://tei-c.org/ns/1.0")

    # On va chercher le fichier XML-TEI et on le lit.
    tree = ET.parse(chemin_entree)
    root = tree.getroot()

    # On ouvre le CSV de sortie en mode "écriture", on y écrit le nom des colonnes.
    with open(chemin_sortie, 'w') as csv_file:
        csv_contenu = csv.DictWriter(csv_file, fieldnames = colonnes, delimiter=";")
        csv_contenu.writeheader()

        # On boucle sur les éléments <w> du XML, dans l'ordre du fichier.
        for word in root.findall('.//w'):

            # On récupère le @n dans la variable "numero"
            # et on crée la chaîne "texte", pour l'instant vide.
            numero = str(word.get('n'))
            texte = ""

            # Si <w> n'a pas d'enfant, on récupère le texte tel-quel.
            if word.find('.') == None :
                texte = str(word.text)

            # Sinon, on compile.
            else:

                # S'il y a du texte avant le premier enfant, on l'ajoute.
                if word.text:
                    texte += str(word.text)

                # On boucle sur les enfants du <w> actuel.
                for item in word:

                    # Si l'enfant est un <height>, on récupère son texte.
                    if item.tag == 'height' or item.tag == 'supplied':
                        texte += str(item.text)
                        # S'il y a du texte après la balise fermante et avant
                        # le prochain enfant ou la balise fermante du <w>,
                        # on l'ajoute.
                        if item.tail:
                            texte += str(item.tail)

                    elif item.tag == 'lb':
                        if item.tail:
                            texte += str(item.tail)

                    # Si l'enfant est un <choice>, on récupère le texte de son
                    # second enfant et on vérifie s'il y a du texte après le <choice>.
                    elif item.tag == 'choice':
                        texte += str(item[1].text)
                        if item.tail:
                            texte += str(item.tail)

                    elif item.tag == 'c':
                        texte += item.text
                        if item.tail:
                            texte += str(item.tail)

                    elif item.tag == 'hi':
                        texte += item.text
                        if item.tail:
                            texte += item.tail

                    elif item.tag == 'add':
                        # On refait tous les tests.
                        if item.find('.') == None :
                            texte = str(item.text)

                        else:

                            if item.text:
                                texte += str(item.text)

                            for subitem in item:
                                if subitem.tag == 'lb':
                                    if subitem.tail:
                                        texte += str(subitem.tail)
                                elif subitem.tag == 'choice':
                                    texte += str(subitem[1].text)
                                    if subitem.tail:
                                        texte += str(subitem.tail)


            # Une fois le mot copié ou compilé, on ajoute une unité au dictionnaire de tokens,
            # dont la clé est le numéro (le @) et la valeur est la chaîne copiée ou compilée.
            # dico_tokens[str(numero)] = str(texte)

        # Puis on écrit les valeurs du mot dans les colonnes appropriées.

            csv_contenu.writerow(
                {
                    "ID" : numero,
                    "TOKEN" : str(texte),
                }
            )
```

%% Cell type:code id: tags:

``` python
# Pour exécuter la fonction, remplacer les chemins par les chemins actuels,
# d'abord le XML, ensuite le chemin pour créer le CSV.

export_tokens_to_csv('/home/erminea/Documents/CONDE/Morisse-TS-XML/2021-06-07_morisse_w_REnumerotes.xml',
                 '/home/erminea/Documents/CONDE/Morisse-TS-XML/2021-06-07_morisse_pour_analog.csv')
```
+111 −0
Changes for new-corrections/lemmatize-latin-text/re-id_tokens.ipynb: 111 added lines, 0 removed lines.
Original line number Diff line number Diff line
%% Cell type:code id: tags:

``` python
def id_tokens_in_tei(chemin_entree, chemin_sortie):

    """
    Fonction permettant de lire un fichier XML-TEI pour cibler les
    éléments <w> et leur ajouter un @n unique, numéroté à partir de 1.
    Si on souhaite utiliser des entités, elles sont résolues dans le
    fichier de sortie, mieux vaut donc les installer ensuite.

    :param chemin_entree: Le chemin local du fichier XML-TEI tokenisé
        aux éléments <w> duquel on souhaite ajouter des numéros.
    :param chemin_sortie: Le chemin local auquel on souhaite écrire le
        fichier XML-TEI de sortie avec ses @n ajoutés.

    """

    import xml.etree.ElementTree as ET

    ET.register_namespace('', 'http://www.tei-c.org/ns/1.0')


    # On crée un compteur pour les numéros des tokens.
    counter = 1

    # On donne au module XML le namespace de la TEI, sans préfixe car ce sera le seul.
    # ET.register_namespace('', "http://tei-c.org/ns/1.0")

    # On importe le XML-TEI d'entrée et on le lit.
    tree = ET.parse(chemin_entree)
    root = tree.getroot()

    # On boucle sur les éléments <w> dans l'ordre du fichier.
    for word in root.findall('.//{http://www.tei-c.org/ns/1.0}w'):
    # for word in root.findall('.//w'):
        # Si l'élément <w> a déjà un numéro, on l'enlève pour le remplacer.
        if word.get('n'):
            del word.attrib['n']
        # On crée un attribut "n" avec, comme valeur, l'état actuel du compteur.
        word.set('n', str(counter))
        # On ajoute 1 au compteur pour le prochain <w>.
        counter += 1

    # On écrit le TEI obtenu dans le fichier spécifié en second paramètre.
    tree.write(chemin_sortie, xml_declaration=True, encoding="unicode")
```

%% Cell type:code id: tags:

``` python
# Pour exécuter la fonction, on remplace les deux chemins par ceux souhaités.
id_tokens_in_tei(
    '/home/erminea/Documents/CONDE/editions/base-version/gc_base.xml',
    '/home/erminea/Documents/CONDE/nov-21_renum/gc_base.xml'
    )

id_tokens_in_tei(
    '/home/erminea/Documents/CONDE/editions/base-version/morisse_base.xml',
    '/home/erminea/Documents/CONDE/nov-21_renum/morisse_base.xml'
    )

"""id_tokens_in_tei(
    '/home/erminea/Documents/CONDE/editions/base-version/basnage_base.xml',
    '/home/erminea/Documents/CONDE/nov-21_renum/basnage_base.xml'
    )

id_tokens_in_tei(
    '/home/erminea/Documents/CONDE/editions/base-version/berault_base.xml',
    '/home/erminea/Documents/CONDE/nov-21_renum/berault_base.xml'
    )

id_tokens_in_tei(
    '/home/erminea/Documents/CONDE/editions/base-version/merville_base.xml',
    '/home/erminea/Documents/CONDE/nov-21_renum/merville_base.xml'
    )

id_tokens_in_tei(
    '/home/erminea/Documents/CONDE/editions/base-version/pesnelle_base.xml',
    '/home/erminea/Documents/CONDE/nov-21_renum/pesnelle_base.xml'
    )

id_tokens_in_tei(
    '/home/erminea/Documents/CONDE/editions/base-version/ruines_base.xml',
    '/home/erminea/Documents/CONDE/nov-21_renum/ruines_base.xml'
    )

id_tokens_in_tei(
    '/home/erminea/Documents/CONDE/editions/base-version/tac_base.xml',
    '/home/erminea/Documents/CONDE/nov-21_renum/tac_base.xml'
    )

id_tokens_in_tei(
    '/home/erminea/Documents/CONDE/editions/base-version/terrien_base.xml',
    '/home/erminea/Documents/CONDE/nov-21_renum/terrien_base.xml'
    )

id_tokens_in_tei(
    '/home/erminea/Documents/CONDE/editions/base-version/instructions_base.xml',
    '/home/erminea/Documents/CONDE/nov-21_renum/instructions_base.xml'
    )

id_tokens_in_tei(
    '/home/erminea/Documents/CONDE/editions/base-version/rouille_base.xml',
    '/home/erminea/Documents/CONDE/nov-21_renum/rouille_base.xml'
    )"""
```

%% Output

    "id_tokens_in_tei(\n    '/home/erminea/Documents/CONDE/editions/base-version/basnage_base.xml',\n    '/home/erminea/Documents/CONDE/nov-21_renum/basnage_base.xml'\n    )\n\nid_tokens_in_tei(\n    '/home/erminea/Documents/CONDE/editions/base-version/berault_base.xml',\n    '/home/erminea/Documents/CONDE/nov-21_renum/berault_base.xml'\n    )\n\nid_tokens_in_tei(\n    '/home/erminea/Documents/CONDE/editions/base-version/merville_base.xml',\n    '/home/erminea/Documents/CONDE/nov-21_renum/merville_base.xml'\n    )\n\nid_tokens_in_tei(\n    '/home/erminea/Documents/CONDE/editions/base-version/pesnelle_base.xml',\n    '/home/erminea/Documents/CONDE/nov-21_renum/pesnelle_base.xml'\n    )\n\nid_tokens_in_tei(\n    '/home/erminea/Documents/CONDE/editions/base-version/ruines_base.xml',\n    '/home/erminea/Documents/CONDE/nov-21_renum/ruines_base.xml'\n    )\n\nid_tokens_in_tei(\n    '/home/erminea/Documents/CONDE/editions/base-version/tac_base.xml',\n    '/home/erminea/Documents/CONDE/nov-21_renum/tac_base.xml'\n    )\n\nid_tokens_in_tei(\n    '/home/erminea/Documents/CONDE/editions/base-version/terrien_base.xml',\n    '/home/erminea/Documents/CONDE/nov-21_renum/terrien_base.xml'\n    )\n\nid_tokens_in_tei(\n    '/home/erminea/Documents/CONDE/editions/base-version/instructions_base.xml',\n    '/home/erminea/Documents/CONDE/nov-21_renum/instructions_base.xml'\n    )\n\nid_tokens_in_tei(\n    '/home/erminea/Documents/CONDE/editions/base-version/rouille_base.xml',\n    '/home/erminea/Documents/CONDE/nov-21_renum/rouille_base.xml'\n    )"
+30 −0
Changes for new-corrections/lemmatize-latin-text/readme.md: 30 added lines, 0 removed lines.
Original line number Diff line number Diff line
# Comment lemmatiser les textes latins

### 1 - Vérifications d'équipe
* S'assurer qu'on est le⋅a seul⋅e à travailler sur ce fichier, qu'on travaille sur la version la plus récente ([branche ameliorations du corpus](https://github.com/RIN-ConDE/editions/tree/ameliorations)) et que personne n'a de modifications à ajouter.
* Informer tout le monde qu'on s'apprête à travailler sur un témoin et qu'on doit être le⋅a seul⋅e à le modifier pendant ce temps.
* Git clone/pull sur la branche ameliorations du corpus.

### 2 - Marquer les emplacements du texte latin
* Il faut **manuellement repérer** tous les fragments latins. Certains sont déjà marqués (dans le Rouillé, les notes latines étaient clairement distinctes et ont été marquées avec un `att.xml:lang="la"`, mais il peut y avoir des fragments latins dans le texte français non repérés) mais la plupart ne le sont pas.
* On peut s'aider des informations de lemmatisation quand un `//w/att.pos='Xe'`.
* Si le fragment est une note entière ou un paragraphe entier, ou correspond entièrement à un élément structurel déjà présent, il faut ajouter un attribut `att.xml:lang="la"` à cet élément structurel.
* Si le fragment ne correspond pas exactement à un tel élément structurel, il faut ajouter un élément `<seg>` avec un attribut `att.xml:lang="la"`.

### 3 - Revoir la tokenisation
* Une fois tous les mots bien retokénisés, il faut refaire la numérotation de tous les tokens. Pour cela, on utilise le script `re-id_tokens.ipynb` sur Jupyter Notebook.

### 4 - Lemmatisation etc
* À décider : le jeu d'étiquettes utilisé. Il devra être déclaré dans le `/TEI/teiHeader/encodingDesc` en français et en anglais.
* Si on lemmatise à la main, cela se fait sur le modèle des autres témoins : un attribut lemma pour le lemme, un attribut pos pour les catégories grammaticales.
* Si on le souhaite, on peut faire une lemmatisation automatique.
* Le script `extraction_tokens.ipynb` permet de sortir les mots-formes et leurs numéros en tableau CSV.
* Le script `resync_tokens.ipynb` permet de donner aux tokens du XML les POS et lemmes déduits par le lemmatiseur. Attention à ce que les mots soient tous bien alignés avec leurs numéros et que rien ne soit décalé. Ce script est fait pour produire un fichier séparé en sortie, pour pouvoir faire les vérifications sans toucher au fichier d'origine. Donc si les modifications conviennent, on peut remplacer l'élément `<text>` de l'ancien par celui du nouveau.

### 5 - Déclarer les modifications
* Il faut ajouter un élément `/TEI/revisionDesc/listChanges/change` (cf [doc. TEI](https://www.tei-c.org/release/doc/tei-p5-doc/en/html/HD.html#HD6)) dans chaque fichier modifié pour décrire les changements opérés.
* Il faut se déclarer comme contributeurice : si on est déjà déclaré dans un `/TEI/teiHeader/fileDesc/editionStmt/respStmt/resp`, il faut mettre à jour les textes français/anglais décrivant nos rôles. Sinon, on se crée un élément `<resp>` à cet endroit sur le modèle des personnes déjà déclarées.

### 6 - Mettre la nouvelle version du fichier sur GitHub
* Si vous maîtrisez Git, vous pouvez faire un git push *sur la branche ameliorations*.
* Sinon, contactez l'équipe du projet pour que le nouveau fichier soit vérifié et changé.
 No newline at end of file