#26 Le 24/02/2010, à 21:27
- magestik
Re : [Python] lang : Script pour déterminer la langue d'un fichier texte
Et pour distinguer FR-SPA tu pourrais utiliser les caractères spéciaux (je sais j'insiste trop^^). C'est deux langues qui en utilisent beaucoup !
Sinon bon travail
Hors ligne
#27 Le 24/02/2010, à 21:27
- Abu
Re : [Python] lang : Script pour déterminer la langue d'un fichier texte
>nesthib :
Je viens de lire l'article de wikipedia sur les n-grammes. Effectivement ça me plait bien ça
edit :
>magestik : Vi c'est clair, mais pour l'instant ma question est : "Quand est-on sûr du résultat ?". Une fois que je saurai quand le résultat est moyen, alors je lancerai d'autres tests
Dernière modification par Abu (Le 24/02/2010, à 21:30)
Hors ligne
#28 Le 24/02/2010, à 22:46
- Airballman
Re : [Python] lang : Script pour déterminer la langue d'un fichier texte
Salut,
Je viens de tomber sur ton ost. Le script est tout simplement génial.
Je n'ai pas essayé, mais se prendre la tête (avec plaisir) sur un truc pas essentiel, s'amuser à le coder et en plus le faire propre j'approuve totalement!
Merci beaucoup, je recupere. Je sais pas encore a quoi ca va me servir mais je recupere
airballman@jabber.ubuntu-fr.org
Traitement d'images, systèmes embarqués et autres astuces Linux!
Hors ligne
#29 Le 25/02/2010, à 09:00
- Abu
Re : [Python] lang : Script pour déterminer la langue d'un fichier texte
Merci ça fait hyper plaisir
C'est pas grand chose non plus, mais ça faisait longtemps que j'avais pas codé, et comme j'ai un peu de temps... (en plus c'est une petite appli dont je ressentais le besoin depuis un certain temps, elle m'a bien servi déjà )
J'ai eu quelques idées :
(désolé je vais me servir de ce post comme post-it pour mes idées ^^)
Idée 1 (de la bonne vieille algèbre linéaire) :
On obtient ce genre de résultat (valeurs arrondies pour simplifier) :
ENG : [3, 10, 11, 10]
FR : [9, 2, 8, 7]
Où les valeurs donnent respectivement la distance (euclidienne) du texte à ENG, FR, GER et SPA
Donc j'ai pensé, dans un premier temps à un indice de "certitude" calculé comme ça :
C=1-N*(meilleure distance)/(somme des distances à chaque langue), où N est le nombre de langues étudiées.
Par ex :
ENG : [3, 10, 11, 10] : C=1-(4*3)/(3+10+11+10)=0.61
FR : [9, 2, 8, 7] : C=1-(4*2)/(9+2+8+7)=0.63
A côté de ça j'en ai trouvé un bizarre :
SPA : [10, 9, 13, 6] : C=0.37
En l'ouvrant je pense fortement que c'est du portugais (mais je ne parle ni l'un ni l'autre)
Donc le problème est : Et si la langue n'est pas connue du programme ? Comment arriver à le détecter ?
Appelons L0 la langue réelle du texte et L1, L2,..Ln les autres langues (N=n+1), X le texte
Dans ce calcul je parts du principe que d(X,L0) doit être très petite et d(X,Li),i=1..n, très grandes.
C=1-N*d(X,L0)/Somme(d(X,Lk),k=0..n), où d(X,L0)=min(d(X,Lk),k=0..n)
Avantage : 0<=C<=1. Cool. Si C=0.9 youpi !!, si C=0.03 pas youpi !!
Grosso modo, C tourne autour de 0.6 sur mon échantillon de textes.
Mais on peut encore affiner :
Je connait d(L0,L1), d(L0,L2),...,d(L0,Ln)
Donc si X est dans la langue L0, alors non seulement d(X,L0)~0, mais aussi d(X,L1)~d(L0,L1), d(X,L2)~d(L0,L2), ..., d(X,Ln)~d(L0,Ln)
Résumons :
On travaille dans R^26
A un texte, ou une langue, on associe un vecteur de taille 26 avec les fréquences des lettres. Assimilons vecteur, texte et langue.
X le texte étudié
L0 la langue de X
L1,...,Ln les autres langues
d(U,V) la distance euclidienne usuelle dans R^26
Le résultat du programme est un vecteur R=[d(X,L0),d(X,L1),...,d(X,Ln)] de R^N (N=n+1)
On récupère min(d(X,Lk))
Par ailleurs il faut que R soit proche de R0=[d(L0,L0),d(L0,L1),...,d(L0,Ln)] connu (d(ENG,FR)=9.4, ..., je me suis même demandé si certaines langues étaient orthogonales...à mon avis il y a un truc à creuser là aussi...^_^)
Pour ça il suffit de calculer D'=d'(R,R0), où d' est la distance euclidienne dans R^N
Est-ce que d' est une distance sur R^(26*N) ? Je pense que oui, mais bon à démontrer.
La question est : Quelles sont les valeurs acceptables de D' ?
Adaptation possible : On ne travaille plus avec 26 lettres mais avec l'ensemble des caractères des langues "latines" (j'entends par là celles qui utilisent l'alphabet latin + certains caractères et accents) que l'on veut étudier. Soir dans R^(plus que 26)
Reste plus qu'à coder ça....
Idée 2 (en terme de code) :
Créer un classe "Langue". A voir pour le contenu, mais déjà :
Propriétés :
- Alphabet (liste des caractères) et substitutions possibles pour se ramener à 26 lettres
- Répartition théorique des caractères
- Répartition doublons,... typiques
- Liste et fréquences de mots clefs courts typiques
L'idée étant d'avoir quelque chose d'homogène, pouvant être adaptable à toutes les langues ou presque
Idée 3 :
En fait des problèmes techniques :
Pb 1 : Supprimer du fichier texte ce qui n'est pas du texte à proprement parler (tags de sous-titres, balises HTML, etc...). Ca fait désordre.
Pb 2 : Vérifier qu'on a bien un fichier texte en entrée :
Pour l'instant je teste l'extension, mais c'est pas top je trouve. J'ai cherché du côté des types MIME mais ça donne rien. Comme savoir qu'un fichier est un fichier texte et pas u binaire ?
A confirmer : La fonction de renommage. A priori elle me semble bonne, j'ai testé un peu tous les cas de figure, mais si quelqu'un pouvait me confirmer qu'il n'y a pas d'effet inattendu. Quand on joue avec les fichiers ça rigole plus...
Un autre café et au boulot
Abu(ntu)
Dernière modification par Abu (Le 25/02/2010, à 20:31)
Hors ligne
#30 Le 25/02/2010, à 23:40
- Abu
Re : [Python] lang : Script pour déterminer la langue d'un fichier texte
Oups petite maladresse, j'ai viré mon dernier post
Bon ben j'en profite pour mettre une nouvelle version (v1.06)
Ajout de langues et divers indicateurs pour tester la qualité du résultat.
Je fais des tas de tests avec plein de fichiers et plein de stats sur calc et j'en viens à la conclusion que si le programme connait la langue il la trouve à 100%.
Par contre c'est plus délicat si la langue lui est inconnue. Ca va si c'est une langue "éloignée" de ce qu'il connait (comme le polonais), ça se voit vite, mais si c'est une langue proche (comme le néerlandais est proche de l'allemand), c'est plus délicat de déterminer que le résultat est faux et que la langue lui est inconnue (c'est pour ça que j'ai rajouté l'italien et le portugais, trop proches de l'espagnol, ça m'énervait)
Sinon j'ai toujours deux problèmes techniques tous bêtes (j'aurais besoin d'aide pour ça) :
1) Supprimer les textes entre <...>
2) Déterminer qu'un fichier est un fichier texte sans utiliser son extension
Si une bonne âme a une solution à l'un de ces problème...
Abu(ntu)
Hors ligne
#31 Le 28/02/2010, à 09:28
- Abu
Re : [Python] lang : Script pour déterminer la langue d'un fichier texte
Nouvelle version 1.09 en 1er post
Ajout de la suppression des tags et balises
Je ne sais pas si c'est la méthode standard (ou la plus efficace) mais ça marche bien :
def suppr_tag(texte,delimitateurs=[('<script','</script>'),('{','}'),('<','>')]):
# Supprime les parties de texte comprises les delimitateurs (compris)
for (debut,fin) in delimitateurs:
i0=len(texte)
while i0!=-1 :
i0=texte.rfind(debut,0,i0)
i1=texte.find(fin,i0)
if i1!=-1:
texte=texte[:i0]+texte[i1+len(fin):]
else:
i0=max(-1,i0-1)
return texte
Abu(ntu)
Dernière modification par Abu (Le 28/02/2010, à 09:29)
Hors ligne
#32 Le 01/03/2010, à 20:03
- Abu
Re : [Python] lang : Script pour déterminer la langue d'un fichier texte
Nouvelle version 1.11 toute chaude sortie du four
Gestion des caractères spéciaux avec l'option -x pour l'instant (à tester et à terme ce sera par défaut)
A tester à fond, mais d'après mes 1ers tests ça donne des résultats un peu moins bons sur l'anglais (qui n'a pas de caractères particuliers) et meilleurs sur les autres langues. Ca accroit également les différences avec les langues inconnues.
J'ai dû prendre une autre répartition pour FR (pour avoir les accents) et c'est un peu moins bon. Si quelqu'un a une autre répartition ça m'arrangerait...
J'ai passé le plus de temps à résoudre un problème pénible : les caractères spéciaux sont codés sur 2 octets et pas les autres ( avec t='ça', len(t)=3 et pas 2 car 'ç' compte pour 2)
Du coup, le temps que je comprenne, j'ai dû bidouillé un truc pas hyper clean mais qui marche (je saute soit de 1, soit de 2 caractères quand je parcours mon texte)
J'ai également rajouté à la fin une sortie adaptée pour tracer les résultats avec gnuplot (faut jouer avec les commentaires)
J'ai 4 indicateurs qualité :
- m : La plus petite distance avec les langues. Jusqu'à 5 c'est nickel, après 6 ça peut être faux
- C : Compris entre 0 et 1. Proche de 1=bon. C<0.4 le résultat est faux, C>0.5 il est juste
- D=d(R,R0) : Doit être petit.
- M=m*(1-c)*D : Un mix des 3 indicateurs précédents. Doit être petit. Jusq'à 10 c'est nickel. Jusqu'à 20 ça va (encore que ça fait haut et c'est exceptionnel). A partir de 30 le résultat est faux. Sachant que j'en ai beaucoup où M<5
Ce qui est bizarre c'est que certains résultats sont anormalement haut par rapport aux autres, sans raison particulière (pas de fote d'aurtôgraf flagrantes)
Je dois encore faire des tests pour voir comment interpréter plus précisément ces indicateurs en terme de qualité.
En tous cas (sur ~1000 fichiers de sous-titres, donc des 'gros' fichiers ce qui était mon objectif principal) quand la langue est connue ça marche tout le temps, et ça c'est cool
Il me reste à voir 2 choses :
- Valeurs seuils de mes indicateurs qui permettent d'affirmer que la langue est bonne ou non (et éventuellement mise en place d'autres indicateurs)
- Voir suivant la longueur du texte comment affiner mes résultats via d'autres méthodes
Abu(ntu)
Hors ligne
#33 Le 03/03/2010, à 21:20
- Abu
Re : [Python] lang : Script pour déterminer la langue d'un fichier texte
Dernière version 1.13 en 1er post
Nettoyage du code et des commentaires (ça commençait à être le bazar)
Suppression de toute la partie ne gérant pas les caractères spéciaux
Changements dans les options (voir -h)
Est-ce que quelqu'un aurait une idée pour intégrer ça dans nautilus ?
Genre en faisant un clic droit sur un .srt, la langue (le résultat de "lang -Am fichier.srt") s'affiche dans le menu contextuel (par exemple en dessous de "Créer une archive" on aurait "Langue : FR", avec pourquoi pas un pitit drapeau ^_^. Mieux !! : remplacer les icônes des srt par un drapeau). Ce serait excellent... (mais là ça dépasse mes compétences...)
Dans le todo j'ai listé quelques petite choses (techniques et minimes) qui m'ennuient et que je ne sais pas résoudre donc si vous avez des idées... (comme par ex les accents dans l'aide avec optparse)
A part ça vos remarques, commentaires,... sur les choses à améliorer sont les bienvenus
Abu(ntu)
Hors ligne
#34 Le 04/03/2010, à 16:07
- magestik
Re : [Python] lang : Script pour déterminer la langue d'un fichier texte
Le mieux ce serait pas d'afficher un drapeau complet ... mais d'afficher l'icone "document texte" avec une petite miniature (dans un coin) du drapeau de la langue. Ce serait plus classe, et plus simple je pense ... enfin je crois
Hors ligne