Outil intelligent pour détecter paragraphes dupliqués dans un texte

Tags: #<Tag:0x00007fc9e2157da0>

Bonjour,
J’ai un problème d’édition de texte, j’ai un fichier de 6000 lignes de tailles variées, avec beaucoup de paragraphes dupliquées. Je connais l’outil « uniq » bien sûr, mais ce n’est pas du tout ce qu’il me faut. Il me faudrait la même chose mais avec la possibilité de n’enlever que les lignes duppliquées au-dessus d’une certaine taile, disons 400 caractères.
Une idée ?

1 J'aime

uniq permet soit de ne pas compùarer les N premiers caractè-res, ou de ne comparer que les N premiers caractères.
Mais il ne permet pas de traiter les lignes de plus de N caractères u niquement.

les lignes de plus de 400 caractères peuvent être sélectionnée de la façon suivante:

grep -E '^.{400,}' fichier.txt

J’imagine que tu veux conserver l’ordre de toutes les lignes?

en effet. tout doit rester identique, sauf les lignes enlevées.

ok dans ce cas il faut passer par plusieurs étapes :slight_smile:

  1. transformer le texte en lignes numérotées.
  2. extraire de 1 les lignes de plus de 400 caractères
  3. extraire de 1 les lignes de moins de 400 caractères
  4. dédupliquer 2. sans tenir compte des numéros de lignes (i.e.: des 8 premiers caractères : 2 espaces mini, 1 à 4 chiffres complété par des espaces devant, 2 caractères)
  5. copier 3 et 4 dans le même fichier
  6. trier 5 par numéro de ligne et supprimer les numéros de lignes.

Ce qui donne:

# 1
cat -n fichier.txt > fichier01.txt

# 2
grep -E '^\s+[0-9]{1,4}\s+.{400,}' fichier01.txt > fichier02.txt

# 3
grep -E '^\s+[0-9]{1,4}\s+.{,399}' fichier01.txt > fichier03.txt

# 4
cat fichier02.txt | uniq -s 8 > fichier04.txt

# 5
cat fichier03.txt fichier04.txt > fichier05.txt

# 6
sort -bug fichier05.txt > fichier_trié.txt

# Fin
rm -f fichier01.txt fichier02.txt fichier03.txt fichier04.txt fichier05.txt

Il est sûrement possible de faire moins d’étape, mais l’idée ci-dessus c’est de bien montrer le découpage des actions. A chaque fois, les numérotations de lignes sont exclues du comptage ou de la déduplication. Elles ne servent en fait qu’à réordonner le texte correctement.

1 J'aime

Bonjour.
Avec python je ferais :

def supprime_doublons(fichier_entree, fichier_sortie, limite_caracteres=400):
    lignes_vues = list()
    
    with open(fichier_entree, 'r', encoding='utf-8') as fichier:
        lignes = fichier.readlines()
    
    with open(fichier_sortie, 'w', encoding='utf-8') as fichier:
        for ligne in lignes:
            if len(ligne) > limite_caracteres:
                if ligne not in lignes_vues:
                    lignes_vues.append(ligne)
                    fichier.write(ligne)
            else:
                fichier.write(ligne)

# Utilisation de la fonction
fichier_entree = 'chemin/fichier_entree.txt'
fichier_sortie = 'chemin/fichier_sortie.txt'
limite_caracteres = 400

supprime_doublons(fichier_entree, fichier_sortie, limite_caracteres)
1 J'aime

Mince, c’est vrai, j’avais oublié cette solution, j’ai assez de connaissance en Ada pour faire programmer quelque chose ! Pas nécessaire de passer par un interprète de commande pour tout.

Si tu forces l’utf-8 assures-toi du type du fichier au préalable, car le fichier d’origine n’est pas en UTF-8 tu vas avoir des soucis.
Dans:

Pas de risques de soucis avec les espaces ou autres caractères particulier et/ou de contrôles?

Avec python3, si tu ne précises pas l’encodage du fichier, sera par défaut utilisé UTF-8. Il est cependant de bonne pratique d’être explicite sur le sujet. Dans mon exemple, l’encodage est utf-8…

aucun soucis …

(Note: On pourrait optimiser le code(rapidité) en utilisant un set au lieu d’une liste.)

Et si le fichier est en UTF-16 par exemple?

et bien tu l’explicites :yum:

donc tu le vérifies avant :wink:

Je pars du principe que je connais l’encodage des fichiers sur lesquels je travaille. Mais si tel n’est pas le cas, j’utiliserais une bibliothèque comme ‹ chardet › pour le déterminer.

édit: orthographe

Bon, je sais que ça va faire hurler les moins flemmards, mais ça ne serait pas une solution simple de demander à chatGPT d’enlever du texte toutes les parties de plus de 4 mots qui sont des répétitions ?
Je dis ça… :laughing:

J’ai une opposition féroce contre tout outil qui rend les gens cons.
De plus, les lignes ne sont pas exactement identique, l’heure d’enregistrement change.
J’ai programmé ce qu’il me fallait, c’est bon :wink:
Pour ceux qui aiment l’Ada:

pragma Ada_2022;
pragma Extensions_Allowed (On);
with Ada.strings.fixed, Ada.Text_IO, Ada.Containers.Indefinite_Vectors;
use Ada.Text_IO, Ada.strings.fixed;

procedure Main is
   package vp is new ada.containers.indefinite_vectors (Positive,String);
   use vp;
   vector : vp.Vector;
   File1: File_Type;
begin
   Open (File1, In_File, "Essai.txt");
   while not File1.End_Of_File loop
      Append (Vector,Get_Line (File1));
   end loop;
   Close(file1);
   for I in reverse First_Index(Vector)..Last_Index(Vector) loop
      if Element(vector,I)'Length > 150 then
         for J in reverse I+1..Last_Index(Vector) loop
            if Element(Vector,J) = Element(Vector,I) then
               Delete(vector,J);
            end if;
         end loop;
      end if;
   end loop;
   open (File1, out_file, "Essai.txt");
   for A of Vector loop
      Put_line(File1,A);
   end loop;
   close(file1);
end Main;

[HS]
Je ne crois pas que chatGPT rende les gens cons.
Je crois qu’il attire les gens qui espèrent devenir plus intelligents avec.

Concernant les outils qui rendent les gens cons, je n’ai aucun a priori du moment qu’ils font les choses efficacement.

Et bravo pour ce bout d’ADA, même si ça me rappelle des trucs désagréables.
[/HS]

Ce sont les smatphones qui rendent les personnes un peu moins intelligentes, en tout cas pour ceux qui en abusent.
En programmation, Chat GPT peut aider à découvrir de nouveaux algorithmes, de les étudier. Si c’est pour obtenir un résultat sans comprendre la démarche, c’est sur que ça peut faciliter la paresse sauf si ça libère du temps pour se consacrer réellement à étudier un sujet particulier. Malheureusement l’expérience nous le montre au quotidien, on veut que les personnes travaillent de plus en plus vite, aussi vite que les machines ! On ne leur laisse quasiment plus le temps de réfléchir et c’est là le réel problème mais heureusement de plus en plus de consciences se réveillent. Pourquoi ne pas utiliser chatGPT pour créer des clients virtuels ? Comme ça il y aura du travail pour tout le monde, ou du moins de nouveaux utilisateurs de chatGPT pour répondre à ces clients virtuels. Plus sérieusement, chatGPT est un outil et ce qui est le plus important, c’est de l’usage que l’on en fait. Ceci dit, l’un des risques est « l’évolution » de chat GPT. On le voit par exemple avec Google qui donne de moins en moins de résultats pertinents en faveur du commerce à outrance !

Je vais continuer à diverger du sujet avec toi:
je fais du référencement, donc c’est ma faute si google fournit de la daube, c’est la daube qu’on demande à l’IA de produire et qu’on force google à mettre en avant qui te donne l’impression qu’il donne des résultats peu pertinents.
C’est à tel point de plus en plus gavé de texte autogénéré depuis un an que dans notre métier on s’inquiète que les gens finissent par quitter google pour aller chercher leurs réponses sur… je te le donne en mille… chatGPT ! :rofl:
Heureusement, ce n’est pas encore fait, et pas très difficile de manipuler l’IA pour qu’elle donne le résultat qu’on souhaite qu’elle donne, donc c’est juste un glissement du métier (si le basculement arrive).

Même pas. Les gens sont juste fainéants, et les nouvelles générations ont une vision de la triche quasi inexistante (lié pour une grande partie aux jeux vidéos). et c’est plus facile de tricher avec chatgpt que de faire le travail soi-même.