Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Algorithmes et structures de données Discussion :

Problèmes dans l'écriture d'un algorithme à partir d'une entrée texte (débutant)


Sujet :

Algorithmes et structures de données

  1. #1
    Candidat au Club
    Problèmes dans l'écriture d'un algorithme à partir d'une entrée texte (débutant)
    Salut la communauté

    J'aimerai créer un algorithme à partir d'un fichier texte, mais étant débutant je rencontre des difficultés dans l'élaboration de l'algorithme, j'en suis pour l'instant seulement à la rédaction manuscrite.

    Je vous explique l'idée :

    J'aimerai extraire d'un fichier texte (en l’occurrence un fichier de sous-titrage vidéo au format srt.), uniquement les parties qui m'intéresse (à savoir les dialogues) qui sont entrecoupées par les marqueurs temporels pour indiquer le timing des sous-titres lors de la lecture vidéo. Je cherche donc à récupérer toutes les phrases du fichier et les remettre dans l'ordre, à la suite.

    ---
    Petit exemple :

    94
    00:06:08,076 --> 00:06:11,021
    J'ai pris soin
    de préciser l'heure et le lieu

    95
    00:06:11,188 --> 00:06:12,956
    lors de mon appel anonyme.
    ---

    Du coup, j'aimerai que mon résultat final soit : "J'ai pris soin de préciser l'heure et le lieu lors de mon appel anonyme."

    L'idée la plus simple serait peut-être de supprimer tous les nombres, mais c'est pas très satisfaisant car si il y a des nombres dans le dialogue que j'aimerais garder. Est-ce que je pourrais faire en sorte de ne pas supprimer les nombres qui sont insérés dans une chaîne de caractères ? Ex : " Il est partit à 11h du matin". Est-ce que je pourrais par exemple faire comprendre à l'ordinateur : 1) ceci est une phrase 2) tous les chiffres doivent être supprimés sauf ceux qui sont insérés dans une phrase ??

    Aussi, vous me recommandez d'utiliser quel langage pour faire ça ? Python ?

    En tout cas merci d'avance pour votre aide je vous serais infiniment reconnaissant ! Clem.

  2. #2
    Membre actif
    Tu peux supprimer les lignes qui contiennent ' --> ', ou mieux, utiliser une expression régulière.

  3. #3
    Candidat au Club
    Citation Envoyé par CliffeCSTL Voir le message
    Tu peux supprimer les lignes qui contiennent ' --> ', ou mieux, utiliser une expression régulière.
    Merci de ta réactivité ! Est-ce que tu sais ou est-ce que je pourrais trouver un petit tuto sur les expressions régulières ? J'ai trouvé quelques trucs intéressants (sur la purge) mais j'arrive pas à trouver exactement ce que je veux. J'ai cru comprendre que pour bosser sur la base d'un fichier texte, je devrais utiliser Javascript, tu me conseillerai quoi ? En fait j'ai deux problèmes, j'arrive pas à trouver comment faire pour dire à mon code : 1) j'ai un fichier texte à tel emplacement et je veux l'exploiter et 2) quelle code j'utilise pour ne garder que les phrases...

    Merci en tout cas

  4. #4
    Rédacteur/Modérateur

    Tu as plein de questions... parce que tu pars de 0.

    ici, on est dans la section algorithme.
    Donc ici, on va dire : ouvrir le fichier pour le lire Et on va considérer que c'est une instruction suffisamment claire.

    Comment cette instruction se traduit en Python ??? les spécialistes du Python savent ça, et ils interviennent dans le sous-forum Python : ici

    Mais en fait, ce qu'ils vont te dire, (et ils oauront tout à fait raison), c'est de lire un tuto. Il y en a plein ici
    Un tuto complet, c'est le Swinnen . C'est la bible. Support de cours, la référence.
    Pour un ultra débutant comme toi, c'est peut-être mieux de commencer par des tutos d'initiation, puis de passer au Swinnen. Je pense que le premier tuto sur la page précédente correspond assez bien à ton profil.

    Les expressions régulières : c'est bien, c'est génial. Mais si tu ne sais pas ouvrir un fichier texte en Python, c'est ridicule de parler des expressions régulières à ce stade. Rendez-vous dans 1 an.
    N'oubliez pas le bouton Résolu si vous avez obtenu une réponse à votre question.

  5. #5
    Candidat au Club
    Citation Envoyé par tbc92 Voir le message
    Tu as plein de questions... parce que tu pars de 0.

    ici, on est dans la section algorithme.
    Donc ici, on va dire : ouvrir le fichier pour le lire Et on va considérer que c'est une instruction suffisamment claire.

    Comment cette instruction se traduit en Python ??? les spécialistes du Python savent ça, et ils interviennent dans le sous-forum Python : ici

    Mais en fait, ce qu'ils vont te dire, (et ils oauront tout à fait raison), c'est de lire un tuto. Il y en a plein ici
    Un tuto complet, c'est le Swinnen . C'est la bible. Support de cours, la référence.
    Pour un ultra débutant comme toi, c'est peut-être mieux de commencer par des tutos d'initiation, puis de passer au Swinnen. Je pense que le premier tuto sur la page précédente correspond assez bien à ton profil.

    Les expressions régulières : c'est bien, c'est génial. Mais si tu ne sais pas ouvrir un fichier texte en Python, c'est ridicule de parler des expressions régulières à ce stade. Rendez-vous dans 1 an.
    Ouais je m'en doutais un peu mais j'espérais justement trouver des tutos pour m'exercer sur un truc directement avec un objectif, plutôt que d'apprendre vraiment les bases petits à petit, mais j'avoue c'est peut-être un peu ambitieux haha clairement si j'ai même pas le vocabulaire ça va être compliqué mais merci de ton conseil en tout cas !

  6. #6
    Membre confirmé
    Si tu es sous linux, essaie de jouer avec la commande sed.
    Sinon, passe sous linux et essaie de jouer avec la commande sed .

  7. #7
    Expert éminent sénior
    Bonjour

    c'est ridicule de parler des expressions régulières à ce stade. Rendez-vous dans 1 an.
    Pardon, mais un linuxien bon teint fait ça naturellement, sans python, avec sed, totalement zen.

    1
    00:00:05,040 --> 00:00:06,439
    Très bien.
    
    2
    (...)
    que tu nous as promis.
    
    772
    00:41:44,654 --> 00:41:46,087
    Voici ton prototype.
    
    Code bash :Sélectionner tout -Visualiser dans une fenêtre à part
    tac fichier.srt | sed '/[0-9]\+:[0-9]\+:[0-9]\+,[0-9]\+ --> [0-9]\+:[0-9]\+:[0-9]\+,[0-9]\+/{N;d}' | tac


    Très bien.
    
    Au revoir.
    
    Je vais faire la première garde.
    (...)
    
    Mais n'oublie pas ce
    que tu nous as promis.
    
    Voici ton prototype.
    
    Pour des raisons évidentes, j'ai coupé le milieu de ce fichier srt récupéré au hasard sur internet.

    Bonne chance
    Cette réponse vous apporte quelque chose ? Cliquez sur en bas à droite du message.

  8. #8
    Membre actif
    L'expression régulière est peut-être pas utile ici, le test sur '-->' est suffisant : https://www.onlinegdb.com/S1WAtv_qL

  9. #9
    Candidat au Club
    Je suis un peu jaloux hahaha tu n'aurais pas ce même code sous python ? Bon je galère mais j'ai réussi à lire mon fichier texte sous python. Une fois ceci fait si j'ai bien compris je suis passé en chaine de caractère ? Faut-il du coup que je passe en binaire pour pouvoir après faire mes calculs et dire que je veux supprimer telle caractère ?

    J'ai peur de me mettre sous Linux et de rien comprendre. C'est vraiment mieux pour la programmation ?

  10. #10
    Candidat au Club
    Citation Envoyé par CliffeCSTL Voir le message
    L'expression régulière est peut-être pas utile ici, le test sur '-->' est suffisant : https://www.onlinegdb.com/S1WAtv_qL

    J'étais partis sur autre chose j'avais pas vu ton message

    J'ai copié le code, mais il il y a ce message qui s'affiche :

    Je suppose que c'est à cause du fait que "le chemin d'accès n'est pas le même ?"

    Mon code ressemble à ça :


    Est-ce que tu vois ce qui pourrait clocher ? Merci en tout cas vous êtes top

  11. #11
    Responsable Qt & Livres

    Citation Envoyé par pinçon Voir le message
    J'ai peur de me mettre sous Linux et de rien comprendre. C'est vraiment mieux pour la programmation ?
    [troll]Ah, il est possible de comprendre quelque chose de Linux ?[/troll] Plus sérieusement, l'important est surtout d'avoir des outils et de bien savoir les utiliser. Des outils comme sed ne sont pas indispensables, si tu peux y aller avec autre chose (pour mes besoins, Notepad++ et ses expressions régulières est souvent suffisant ; sinon, Python).

    Citation Envoyé par pinçon Voir le message
    Est-ce que tu vois ce qui pourrait clocher ? Merci en tout cas vous êtes top
    Évite les captures d'écran pour du code… Là, je suis en train de te répondre, je ne vois que ce texte à la place de ton code : "Pièce jointe 565106". Pas très pratique .

    Sinon, c'est que tu utilises une variable robot qui n'existe pas dans ton code : quand tu ouvres ton fichier, tu crées une variable fic. Par ailleurs, ce n'est pas plus mal, dans un code, de te fixer à une seule langue : là, tu mélanges du français (fic) et de l'anglais (lines, new_length, etc.). Ça pose surtout des problèmes pour les gens qui cherchent à comprendre ton code, mais aussi pour toi, quand tu auras plus de code ("tiens, j'ai nommé ma variable en anglais ou en français ?" : avoir des conventions, ça sert à éviter une partie de ces raisonnements improductifs !).
    Vous souhaitez participer aux rubriques Qt ou PyQt (tutoriels, FAQ, traductions), HPC ? Contactez-moi par MP.

    Créer des applications graphiques en Python avec PyQt5
    Créer des applications avec Qt 5.

    Pas de question d'ordre technique par MP !

  12. #12
    Membre actif
    Voilà le code pour lire dans un fichier :

    Code Python :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    with open("robot.srt", "r") as file:
        lines = file.read().split("\n")
     
        i = 0; new_lines = []; n = len(lines) - 1
        for i, line in enumerate(lines):
            if i == n or ('-->' not in line and '-->' not in lines[i + 1]):
                if line:
                    new_lines.append(line)
     
        print(*new_lines)

  13. #13
    Candidat au Club
    Citation Envoyé par dourouc05 Voir le message
    [troll]Ah, il est possible de comprendre quelque chose de Linux ?[/troll] Plus sérieusement, l'important est surtout d'avoir des outils et de bien savoir les utiliser. Des outils comme sed ne sont pas indispensables, si tu peux y aller avec autre chose (pour mes besoins, Notepad++ et ses expressions régulières est souvent suffisant ; sinon, Python).



    Évite les captures d'écran pour du code… Là, je suis en train de te répondre, je ne vois que ce texte à la place de ton code : "Pièce jointe 565106". Pas très pratique .

    Sinon, c'est que tu utilises une variable robot qui n'existe pas dans ton code : quand tu ouvres ton fichier, tu crées une variable fic. Par ailleurs, ce n'est pas plus mal, dans un code, de te fixer à une seule langue : là, tu mélanges du français (fic) et de l'anglais (lines, new_length, etc.). Ça pose surtout des problèmes pour les gens qui cherchent à comprendre ton code, mais aussi pour toi, quand tu auras plus de code ("tiens, j'ai nommé ma variable en anglais ou en français ?" : avoir des conventions, ça sert à éviter une partie de ces raisonnements improductifs !).
    Hm je vois merci je vais faire attention à la langue et utiliser les balises

  14. #14
    Candidat au Club
    Citation Envoyé par CliffeCSTL Voir le message
    Voilà le code pour lire dans un fichier :

    Code Python :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    with open("robot.srt", "r") as file:
        lines = file.read().split("\n")
     
        i = 0; new_lines = []; n = len(lines) - 1
        for i, line in enumerate(lines):
            if i == n or ('-->' not in line and '-->' not in lines[i + 1]):
                if line:
                    new_lines.append(line)
     
        print(*new_lines)
    Bon bah ça marche merci ! Mais ce n'est pas tout à fait ce que je veux haha. En fait avec ce code tu dis à Python d'enlever des lignes c'est bien ça ? Comme un con j'ai oublié de vous préciser : il y a aussi des éléments à supprimer sur les lignes des phrases que je cherche à réccupérer :

    1
    00:00:00,899 --> 00:00:02,002
    <i>Salut, mon ami.</i>

    2
    00:00:02,794 --> 00:00:04,003
    <i>Mon ami ?</i>

    J'ai donc besoin de supprimer les "<i>" et les "</>".

    J'ai l'impression que je vais être obligé d'utiliser les expressions régulières non ? (Je commence à regarder des tutos en même temps). Est-ce que je peux travailler les expressions régulières à partir de ton code pour supprimer ces balises ?

    Aussi, l'idéal serait de pouvoir faire des retours à la ligne à chaque fin de phrases parce que là j'ai tout mon bloque texte qui est collé. Bon chaque chose en son temps haha. Ah oui ! Si je veux bosser sur les expression régulières à partir de mon fichier, dans quel mode de lecture dois-je me mettre ?

    En tout cas merci mille fois vous êtes super sur ce forum

  15. #15
    Rédacteur/Modérateur

    S'il y a <i> sur une ligne, puis </i> sur la ligne suivante,
    tu veux que le programme sache gérer cela ?
    Ou tu considères que cette configuration n'arrivera jamais ?
    N'oubliez pas le bouton Résolu si vous avez obtenu une réponse à votre question.

  16. #16
    Candidat au Club
    Citation Envoyé par tbc92 Voir le message
    S'il y a <i> sur une ligne, puis </i> sur la ligne suivante,
    tu veux que le programme sache gérer cela ?
    Ou tu considères que cette configuration n'arrivera jamais ?
    Je suis pas sûr de t'avoir compris. En gros, dès qu'il y a ces balises dans mon texte (<i> et </i>, je veux qu'elles soient supprimées :

    1
    00:00:00,899 --> 00:00:02,002
    <i>Salut, mon ami.</i>

    2
    00:00:02,794 --> 00:00:04,003
    <i>Mon ami ?</i>

    deviendrait : Salut, mon ami. Mon ami ?

    Et, à terme, ça prendrait la forme (bien que je sois pas sûr que les retours à la ligne soient réellement utiles) :

    Salut, mon ami.
    Mon ami ?

    En fait, une fois mon texte épuré de tous les caractères-signes qui gênent la lecture, j'aimerai après pouvoir trouver un moyen pour que toutes les phrases soient identifiées comme phrases numérotées par ordre croissant, un peu comme le fait déjà mon fichier sous-titre. Je m'explique :
    Salut, mon ami. (phrase 1)
    Mon ami ? (phrase 2)
    dernière phrase du texte (phrase 245)

    En fait je pense qu'il est pas très important d'avoir des retours à la ligne à partir du moment où Python comprend bien l'ordre de chaque phrases, puisque je vais par la suite travailler les phrases une à une. Je sais pas si c'est très clair haha

  17. #17
    Membre actif
    Code python :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    with open("robot.srt", "r") as file:
        lines = file.read().split("\n")
     
        i = 0; new_lines = []; n = len(lines) - 1
        for i, line in enumerate(lines):
            if i == n or ('-->' not in line and '-->' not in lines[i + 1]):
                if line:
                    new_lines.append(line)
        text = " ".join(new_lines)
     
        for sub_str in ("<i>", "</i>"):
            text = text.replace(sub_str, "")
     
        text = text.replace(". ", ".\n").replace("? ", "?\n").replace("! ", "\n")
        print(text)

  18. #18
    Candidat au Club
    ça marche plutôt bien merci ! (bon forcément ça me fait des défauts, il y a notamment des tirets à supprimer pour le début de certaines phrases, sachant qu'il ne faut pas supprimer les tirets de mots tels que rendez-vous....). Par contre, si je comprends bien, pour pouvoir sauvegarder ces modifications sur mon fichier texte, il faut que je mette un autre mode de lecture que reading non ? j'ai essayé plein de trucs mais j'ai à chaque fois des messages d'erreurs..

  19. #19
    Candidat au Club
    Ah, et aussi, c'est normal que lorsque je l’exécute dans l'invite de commande, mon texte n'est pas en entier ? C'est parce qu'il y a trop de lignes et que ça n'affiche pas ?

  20. #20
    Rédacteur/Modérateur

    De manière générale, un traitement ne peut pas lire un fichier, et écrire dans ce même fichier. Il y a peut-être quelques exceptions, dans des cas très particuliers (si la taille du fichier ne change pas du tout), mais très galère à programmer.

    On lit un fichier A, et on écrit dans un fichier B.
    Et si nécessaire, à la fin du traitement, on supprime le fichier A, et on renomme le fichier B en A.
    N'oubliez pas le bouton Résolu si vous avez obtenu une réponse à votre question.