IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
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

Python Discussion :

Comment reconnaitre la langue d'un texte ? [Python 3.X]


Sujet :

Python

  1. #1
    Membre averti
    Homme Profil pro
    Etudiant
    Inscrit en
    Décembre 2015
    Messages
    25
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Etudiant

    Informations forums :
    Inscription : Décembre 2015
    Messages : 25
    Par défaut Comment reconnaitre la langue d'un texte ?
    Bonsoir,

    Voilà je cherche à faire un script permettant de reconnaitre la langue d'un texte (français, espagnol allemand ...) et pour l'instant je n'ai aucune idée de ce qu'il faut faire.

    J'essaie de penser aux caractère spéciaux de chaque langue mais c'est pas fiable à 100% quand même.

    Donc voilà j'aimerais avoir votre aide là dessus, si vous avez quelques idées....

    Merci beaucoup

  2. #2
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2009
    Messages
    4 493
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 493
    Billets dans le blog
    1
    Par défaut
    Et quelles idées t'as donné Google ?

    Ici, nous sommes surtout spécialisés en langage C Python. Les idées que nous te donneront ne seront sans doute pas aussi intéressantes que celles données par des compétents en linguistique. La piste des caractères spéciaux permet d'aiguiller mais je suis d'accord, c'est loin d'être infaillible. Une idée est d'avoir à disposition des dictionnaires de chaque langue et de chercher les mots du texte dedans. C'est brutal certes...

  3. #3
    Membre Expert
    Homme Profil pro
    Enseignant
    Inscrit en
    Juin 2013
    Messages
    1 617
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2013
    Messages : 1 617
    Par défaut
    Je dirais plutôt python...
    Je chercherais l'occurrence des lettres, je pense : voir la cryptographie.

  4. #4
    Responsable Arduino et Systèmes Embarqués


    Avatar de f-leb
    Homme Profil pro
    Enseignant
    Inscrit en
    Janvier 2009
    Messages
    13 193
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Janvier 2009
    Messages : 13 193
    Billets dans le blog
    47
    Par défaut
    Bonsoir,

    Par un calcul de fréquence d'apparition des lettres : https://fr.wikipedia.org/wiki/Fr%C3%..._fran%C3%A7ais

  5. #5
    Membre averti
    Homme Profil pro
    Etudiant
    Inscrit en
    Décembre 2015
    Messages
    25
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Etudiant

    Informations forums :
    Inscription : Décembre 2015
    Messages : 25
    Par défaut
    Merci d'avoir répondu aussi rapidement, créer un dictionnaire pour chaque langue serait un travail fastidieux car il faut déjà connaitre les mots les plus utilisés de chaque langue, c'est possible comme script mais c'est encore une fois loin d'être fiable ( pour un texte très ancien avec que des mots improbables ça marchera plus).
    J'ai fait quelques recherches sur Google et je n'ai trouvé rien d'intéressants.

  6. #6
    Membre Expert
    Homme Profil pro
    Enseignant
    Inscrit en
    Juin 2013
    Messages
    1 617
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2013
    Messages : 1 617

  7. #7
    Membre averti
    Homme Profil pro
    Etudiant
    Inscrit en
    Décembre 2015
    Messages
    25
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Etudiant

    Informations forums :
    Inscription : Décembre 2015
    Messages : 25
    Par défaut
    Merci beaucoup de m'avoir apporté de précieuse informations, je vais m'y plonger dès que possible
    Merci !

  8. #8
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 741
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 741
    Par défaut
    Salut,

    Citation Envoyé par tuxedo95 Voir le message
    Voilà je cherche à faire un script permettant de reconnaitre la langue d'un texte (français, espagnol allemand ...) et pour l'instant je n'ai aucune idée de ce qu'il faut faire.

    J'essaie de penser aux caractère spéciaux de chaque langue mais c'est pas fiable à 100% quand même.
    Normalement, c'est le genre de question à poser dans le forum algorithmes et une fois qu'on a arrêté son choix, il est temps de coder çà dans son langage préféré. Posé comme çà, c'est un peu comme si on disait, je n'ai aucune idée de la solution au problème pourvu qu'elle puisse être écrite avec Python...
    En fait, il n'y a qu'un moteur de recherche qui puisse "aider" pourvu qu'on arrive à trouver les mots clés intéressants...
    Essayez avec "NLTK language detection" (et ne me demander pas comment trouver les mots clés)

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  9. #9
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2009
    Messages
    4 493
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 493
    Billets dans le blog
    1
    Par défaut
    Question sur l'analyse de la fréquence d'apparition des lettres : cette méthode peut elle est fiable sur un texte court ? Par exemple, quand tu tapes du texte dans Safari, il change assez vite de langue pour son correcteur d'orthographe, donc je ne pense pas que ça soit la technique utilisée. En revanche, sur un texte long, ça semble une piste très intéressante !


    Citation Envoyé par marco056 Voir le message
    Je dirais plutôt python...
    J'ai tellement l'habitude de répondre sur le forum C :tops:


    Citation Envoyé par wiztricks Voir le message
    Essayez avec "NLTK language detection" (et ne me demander pas comment trouver les mots clés)
    Je ne sais pas qui vient de monter du plus gros cran dans mon estime : wiztricks ou Python ?

  10. #10
    Membre expérimenté Avatar de cervo
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2012
    Messages
    220
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Côte d'Ivoire

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2012
    Messages : 220
    Par défaut

    Pour mieux t'aider je te poserai juste une question. " Comment fais tu pour savoir qu'un texte est ecrit en francais ? " .. retranscris juste la reponse a cette question en langage machine ( en python je devrais dire ) et paf ton systm fontionne. saches avant tout que les programmes que l'on veut realiser sont calques sur notre raisonnement
    Je te dirais de voir diret sur wikipedia un article parlant de la " Morphologie du Francais " , " Morphologie de la Langue francaise " . Tu auras simplment la logique de reconnaissance du francais, je me ferai un reel plaisir de t'aider a transcrire en python cette logique.
    Voila deja un petit PDF pour t'aider :
    Images attachées Images attachées

  11. #11
    Membre averti
    Homme Profil pro
    Etudiant
    Inscrit en
    Décembre 2015
    Messages
    25
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Etudiant

    Informations forums :
    Inscription : Décembre 2015
    Messages : 25
    Par défaut
    Citation Envoyé par cervo Voir le message

    Pour mieux t'aider je te poserai juste une question. " Comment fais tu pour savoir qu'un texte est ecrit en francais ? " .. retranscris juste la reponse a cette question en langage machine ( en python je devrais dire ) et paf ton systm fontionne. saches avant tout que les programmes que l'on veut realiser sont calques sur notre raisonnement
    Je te dirais de voir diret sur wikipedia un article parlant de la " Morphologie du Francais " , " Morphologie de la Langue francaise " . Tu auras simplment la logique de reconnaissance du francais, je me ferai un reel plaisir de t'aider a transcrire en python cette logique.
    Voila deja un petit PDF pour t'aider :
    Merci infiniment Cervo

  12. #12
    Expert confirmé Avatar de BufferBob
    Profil pro
    responsable R&D vidage de truites
    Inscrit en
    Novembre 2010
    Messages
    3 041
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : responsable R&D vidage de truites

    Informations forums :
    Inscription : Novembre 2010
    Messages : 3 041
    Par défaut
    salut,

    +1 pour l'analyse de fréquences, c'est la méthode la plus simple et comme dit précédemment sur un texte suffisament long (et bien écrit) ça marche du tonnerre

    +1 pour l'idée d'utiliser plusieurs dictionnaires de plusieurs langues et chercher à identifier les mots au fur et à mesure qu'ils arrivent en établissant un score, c'est précisément comme ça que fonctionne la méthode à base de nltk, c'est pas très compliqué à mettre en oeuvre, par contre il faut télécharger les dictionnaires au préalable/les avoir à disposition, pour un correcteur orthographique ça va de soi

    -1 pour la solution proposée par cervo qui n'en est pas une, le pdf en question ne traite d'ailleurs même pas de l'analyse de corpus de textes plutôt de la langue telle qu'elle est parlée, le sujet reste intéressant mais suivre cette piste ne mènera absolument à rien dans le cadre du problème tel qu'il est posé

  13. #13
    Membre Expert
    Homme Profil pro
    Enseignant
    Inscrit en
    Juin 2013
    Messages
    1 617
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2013
    Messages : 1 617
    Par défaut
    Un exemple d'analyse fréquentielle. Effectivement, cela fonctionne mieux sur un texte long...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    import numpy as np
    import matplotlib.pyplot as plt
     
    alphabet_min="abcdefghijklmnopqrstuvwxyz"
    alphabet_maj="ABCDEFGHIJKLMNOPQRSTUVWXYZ"
    message1 = "ceciestunpremiermessageatesteryzzzzzzzzy"
     
    #for lettre in alphabet_min:
    #    print(ord(lettre),end=' ')
    #print()
    #
    #for lettre in alphabet_maj:
    #    print(ord(lettre),end=' ')
    #print()
     
    def lecture(fichier):
        with open(fichier,'r') as source:
            resultat = source.read()
        return resultat
     
    freq_francais = [8.40,1.06,3.03,4.18,17.26,1.12,1.27,0.92,7.34,0.31,0.05,\
    6.01,2.96,7.13,5.26,3.01,0.99,6.55,8.08,7.07,5.74,1.32,0.04,0.45,0.30,0.12]
     
    def freq_lettre(texte):
        # conversion en majuscules
        texte_maj=texte.upper()
        # longueur du texte
        long_texte = len(texte_maj)
        # matrices de zéros
        nb_alphabet=np.zeros(26)
        freq_alphabet=np.zeros(26)
        # on parcourt le texte
        for i in range(long_texte):
            # on parcourt l'alphabet
            for k in range(len(alphabet_maj)):
                # test : lettre_alphabet = lettre _texte ?
                if texte_maj[i] == alphabet_maj[k]:
                    # on incrémente nb_alphabet[k]
                    nb_alphabet[k] +=1
                # on passe en fréquences
                freq_alphabet[k] = nb_alphabet[k]*100/long_texte
        return freq_alphabet
     
    freq_message1 = freq_lettre(message1)
    #print(freq_message1)
     
    freq_message2 = freq_lettre(lecture("poeme.txt"))
    #print(freq_message2)
     
    def histo_freq(histo1,histo2=freq_francais,maj_min='maj'):
        largeur=0.4
        plt.figure(figsize=(15,7))
        x = np.array(range(26))
    #    plt.bar (x-largeur,freq1, width=largeur,align='center',color='blue')
        plt.bar (x-largeur,histo1, width=largeur,color='red')
        plt.bar (x,histo2, width=largeur,color='green')
        plt.xlim(-1,26)
        if maj_min == 'min':
            plt.xticks(range(26), [chr(97 + z) for z in range(26)])
        else:
            plt.xticks(range(26), [chr(65 + z) for z in range(26)])
    #    plt.axes().set_aspect('equal')
        plt.show()
     
    histo_freq(freq_message1)
    histo_freq(freq_message2)
    Fichiers attachés Fichiers attachés

  14. #14
    Membre expérimenté Avatar de cervo
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2012
    Messages
    220
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Côte d'Ivoire

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2012
    Messages : 220
    Par défaut
    @BufferBob,
    Voici 2 phrases " I am a farmer who live in england, i love potatoes and eggplants ", " Je suis un fermier vivant au Royaume uni, j'adore les aubergines "...
    Avec analyse fréquentielles des lettres on trouve que ces 2 phrases sont du français. Je prefère la seconde methode utilisant les dictionnaires... le hic c'est qu'il faudrait avoir un assez gros dico pour faire des comparaisons...

  15. #15
    Expert confirmé Avatar de BufferBob
    Profil pro
    responsable R&D vidage de truites
    Inscrit en
    Novembre 2010
    Messages
    3 041
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : responsable R&D vidage de truites

    Informations forums :
    Inscription : Novembre 2010
    Messages : 3 041
    Par défaut
    Citation Envoyé par cervo Voir le message
    Voici 2 phrases " I am a farmer who live in england, i love potatoes and eggplants ", " Je suis un fermier vivant au Royaume uni, j'adore les aubergines "...
    Avec analyse fréquentielles des lettres on trouve que ces 2 phrases sont du français. Je prefère la seconde methode utilisant les dictionnaires... le hic c'est qu'il faudrait avoir un assez gros dico pour faire des comparaisons...
    oui c'est ce qu'on disait plus haut dans la discussion, mais ça se fait bien
    un exemple de détection du pauvre from scratch avec seulement 2 dictionnaires FR et EN récupérés sur le net (en gros ce que fait nltk, mais en nettement plus simpliste et moins propre ) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    # -*- coding: utf-8 -*-
     
    # dico 10K mots EN (75Ko) : http://www.mit.edu/~ecprice/wordlist.10000
    # dico 300K mots FR (3.6Mo) : http://www.pallier.org/ressources/dicofr/liste.de.mots.francais.frgut.txt
     
    import codecs
     
    dico_fr = codecs.open('dico_fr.txt', mode='r', encoding='latin1').read().split('\n')
    dico_en = codecs.open('dico_en.txt', mode='r', encoding='latin1').read().split('\n')
     
    def update_score (word, score):
       w = unicode(word, 'latin1')
       if w in dico_fr:
          score['fr'] += 1
       if w in dico_en:
          score['en'] += 1
       if score['fr'] == score['en']:
          return (score, '-')
       else:
          return (score, max(score, key=lambda x:score[x]))
     
    def check (phrase):
       score = {'fr': 0, 'en': 0}
       lang = '-'
       for mot in phrase.replace(',', '').split():
          score, lang = update_score(mot.lower(), score)
          print '%-15s: fr=%2d, en=%2d, lang=\'%s\'' % ("'" + mot + "'", score['fr'], score['en'], lang)
     
    check('I am a farmer who live in england, i love potatoes and eggplants')
    print '---'
    check("Je suis un fermier vivant au Royaume uni, j'adore les aubergines")
    et le résultat :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    'I'            : fr= 0, en= 1, lang='en'
    'am'           : fr= 0, en= 2, lang='en'
    'a'            : fr= 1, en= 3, lang='en'
    'farmer'       : fr= 1, en= 4, lang='en'
    'who'          : fr= 1, en= 5, lang='en'
    'live'         : fr= 2, en= 6, lang='en'
    'in'           : fr= 3, en= 7, lang='en'
    'england'      : fr= 3, en= 8, lang='en'
    'i'            : fr= 3, en= 9, lang='en'
    'love'         : fr= 4, en=10, lang='en'
    'potatoes'     : fr= 4, en=11, lang='en'
    'and'          : fr= 4, en=12, lang='en'
    'eggplants'    : fr= 4, en=12, lang='en'
    ---
    'Je'           : fr= 1, en= 1, lang='-'
    'suis'         : fr= 2, en= 1, lang='fr'
    'un'           : fr= 3, en= 2, lang='fr'
    'fermier'      : fr= 4, en= 2, lang='fr'
    'vivant'       : fr= 5, en= 2, lang='fr'
    'au'           : fr= 6, en= 3, lang='fr'
    'Royaume'      : fr= 7, en= 3, lang='fr'
    'uni'          : fr= 8, en= 4, lang='fr'
    'j'adore'      : fr= 8, en= 4, lang='fr'
    'les'          : fr= 9, en= 5, lang='fr'
    'aubergines'   : fr=10, en= 5, lang='fr'
    on voit que la détection est quasi immédiate, au bout du 2e mot (quand même ) on est fixé

  16. #16
    Membre expérimenté Avatar de cervo
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2012
    Messages
    220
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Côte d'Ivoire

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2012
    Messages : 220
    Par défaut
    @BufferBob
    Vu sous cet angle ... pas mal l'option... Compare a ca ma methode est plutot barbare

  17. #17
    Membre Expert
    Homme Profil pro
    Enseignant
    Inscrit en
    Juin 2013
    Messages
    1 617
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2013
    Messages : 1 617
    Par défaut
    Merci BufferBob,
    Sur le dictionnaire anglais, il y a un souci : Que signifie "Je" en anglais ?
    J'ai essayé avec le dictionnaire d'openOffice : beaucoup plus concluant.

  18. #18
    Expert confirmé Avatar de BufferBob
    Profil pro
    responsable R&D vidage de truites
    Inscrit en
    Novembre 2010
    Messages
    3 041
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : responsable R&D vidage de truites

    Informations forums :
    Inscription : Novembre 2010
    Messages : 3 041
    Par défaut
    Citation Envoyé par marco056 Voir le message
    Sur le dictionnaire anglais, il y a un souci : Que signifie "Je" en anglais ?
    oui je me suis fait la même réflexion, j'ai pris des dico un peu au hasard sur internet juste pour l'exemple et sans vérifier la pertinence réelle de chacun, ça vient peut-être de là

    J'ai essayé avec le dictionnaire d'openOffice : beaucoup plus concluant.
    oui c'est pas idiot j'ai pas pensé à l'utiliser

  19. #19
    Membre averti
    Homme Profil pro
    Etudiant
    Inscrit en
    Décembre 2015
    Messages
    25
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Etudiant

    Informations forums :
    Inscription : Décembre 2015
    Messages : 25
    Par défaut
    Bonjour,
    Comment puis-je convertir mon texte en majuscule ou en minuscule ?
    Il existe la commande upper (ou lower) mais je ne sais pas l'utiliser pour un fichier .txt

    merci

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 21
    Dernier message: 25/12/2008, 21h44
  2. Comment reconnaitre un fichier texte
    Par Shin no Noir dans le forum C
    Réponses: 11
    Dernier message: 19/12/2005, 21h13
  3. [ThemeEngine] Comment modifier la langue des boites de dialogue ?
    Par piloumoi dans le forum Composants VCL
    Réponses: 3
    Dernier message: 15/08/2005, 11h35
  4. Comment choisir une langue differente de la locale?
    Par julian_ross dans le forum Eclipse Java
    Réponses: 1
    Dernier message: 01/03/2004, 18h08
  5. Comment gérer plusieurs langues ?
    Par InterSQL dans le forum MS SQL Server
    Réponses: 6
    Dernier message: 27/02/2004, 16h12

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo