Detection de langue en NLP (Natural Language Processing)

Hello

le traitement du langage naturel (dit Natural Language Processing) est devenu monnaie courante de nos jours. Les principaux moteurs de recherche l’utilisent pour mieux comprendre ce que veut l’internaute et cela au delà de ce qu’il peut écrire dans le champs de recherche.

Aujourd’hui, je vais vous montrer comment on peut utiliser le module Python appelé NLTK (Natural Language Tool Kit) pour detecter automatiquement la langue d’un contenu. Evidement l’utilisation de NLTK ne se limite pas à ça, loin de là. allez faire un tour sur la doc officielle, vous serez étonnés de ce que vous serez capables de faire en prenant en main ce module. Peut-être qu’il y aura d’autres posts expliquant petit à petit son usage pour le SEO (et dieu sait que son intérêt est grand ;)).

Detection de langue

ok, tu me diras :

oui mais la langue est déclarée dans le code source, dans la search console, dans le nom de domaine ou URL, dans les options de ton navigateur, et implicite via le pays hébergeant le site… je ne comprend pas l’intérêt de ta démarche !

et oui, tu as sans doute raison. Clea dit, si tu vas sur Google.com, avec un navigateur configuré en russe, que tu écris en français, Google doit malgré tout savoir avec quelle langue tu lui parle. Et si j’ai un site FR hébergé sur un serveur AWS basé en Irlande, avec un nom de domaine en .com et que je n’ai pas déclaré la langue dans mon HTML, que doit faire un moteur de recherche ? hein, hein ? tu dis quoi maintenant ;)

Mais non,  ici la démarche est purement intellectuelle. l’idée est d’écrire un programme simple qui permet de reconnaitre automatiquement la langue avec laquelle on lui parle.

Alors il existe plusieurs méthodes permettant de detecter la langue en analysant les contenus. Moi je vais utiliser la méthode des stopwords qui est très simple et simpliste, mais dans la plupart des cas suffira pour donner un résultat satisfaisant.

Traitement naturel des langues ou Naturel Language Processing ou NLP pour les intimes

pour se faire, on va utiliser NLTK. je vous épargne bien volontiers toute la partie “installation”. Il faut aller vois la doc, mais c’est relativement simple à installer sur un système UNIX, si tu es sous windows, alors comme dirait le méchant du film Taken :

bon-chance

 

maintenant que c’est installé, place au code !

La tokenisation

Tout d’abord, nous allons commencer par découper notre text en mots. C’est ce qu’on appelle la tokenisation ou tokenizer en anglais. L’idée est de prendre les phrases puis de les découper en tokens. un token peut être un mot, une ponctuation, un chiffre…etc

from nltk import wordpunct_tokenize
wordpunct_tokenize("tout d'abord, nous allons commencer par découper notre text en mots. C'est ce qu'on appelle la tokenisation ou tokenizer en anglais")
['tout', 'd', "'", 'abord', ',', 'nous', 'allons', 'commencer', 'par', 'découper', 'notre', 'text', 'en', 'mots', '.', 'C', "'", 'est', 'ce', 'qu', "'", 'on', 'appelle', 'la', 'tokenisation', 'ou', 'tokenizer', 'en', 'anglais']

Comme vous pouvez le voir, la phrase a été splitée en plusieurs tokens. c’est exactement ce que nous voulions.

Chargement des stopwords

from nltk.corpus import stopwords
stopwords.fileids()
[u'danish', u'dutch', u'english', u'finnish', u'french', u'german', u'hungarian', u'italian', u'kazakh', u'norwegian', u'portuguese', u'russian', u'spanish', u'swedish', u'turkish']

ici j’ai affiché les différentes langues pour lesquelles NLTK dispose d’une liste de stopwords. Nous y retrouvons les plus importantes.

nous pouvons afficher à l’écran la liste des stopwords disponibles pour une langue en particulier. pour afficher les 10 premiers stopwords français par exemple, il suffit de faire ceci :

stopwords.words('french')[0:10]

[u'au', u'aux', u'avec', u'ce', u'ces', u'dans', u'de', u'des', u'du', u'elle']

Programme de detection de langue

maintenant que nous savons les basiques, il s’agit de chercher les points communs entre les différents stopwrods et le text dont nous essayons d’analyser l’origine. Il suffit de comparer des listes de mots et de faire des intersections (oui, comme à l’école)

ci-dessous le code nous permettant de faire l’analyse :


def _calc_ratios(text):

 ratios = {}

 tokens = wordpunct_tokenize(text)
 words = [word.lower() for word in tokens]

 for lang in stopwords.fileids():
 stopwords_set = set(stopwords.words(lang))
 words_set = set(words)
 common_words = words_set.intersection(stopwords_set)

 ratios[lang] = len(common_words)

 return ratios</pre>
<pre>

cette méthode nous permet de tokeniser notre text, puis de comparer la liste des mots obtenus à la liste des mots contenus dans les différentes listes de stopwords.

Comme le montre le code, ci-dessous, la liste de stopwords ayant le plus de mots en commun avec le texte sera considérée comme la plus proche, la langue lui sera donc associée.

def detect_language(text):

 ratios = _calc_ratios(text)

 most_rated_language = max(ratios, key=ratios.get)
 most_common_words = ratios[most_rated_language]
 del ratios[most_rated_language]
 second_most_rated_language = max(ratios, key=ratios.get)
 second_most_common_words = ratios[second_most_rated_language]

 print("there is %s%% chances for this text to be writen in %s" %(_calc_probability(most_common_words, second_most_common_words), most_rated_language))</pre>

Pour résumer donc :

  • nous stoquons pour chaque liste de stopwords la langue, ainsi que le nombre de mots en commun avec le texte.
  • Ensuite, nous associons la langue de la liste ayant le plus de mots en commun au texte.
  • Et enfin, nous calculons une probabilité d’association qui nous permet de savoir quel est le niveau de fiabilité de l’association (voir code ci-dessous)

def _calc_probability(most, secode_most) :
proba = (float(most) /(most + secode_most) * 100)
return round(proba)

Pour la probabilité, c’est très simple. Nous comparons les deux langues arrivant en haut de la liste. et nous essayons de determiner la disparité entre elles. si la première est très loin de la deuxième, alors nous auront une probabilité forte, si les deux ont presque le même nombre de mots en commun, alors le niveau de fiabilité sera faible. Pour être satisfaisant, le niveau de probabilité doit être supérieur à 60%

Exemple :

pour un texte donné, les deux langues qui arrivent en premier sont :

Français avec 15 mots en commun et l’espagnol avec 8 mots en commun.

Le programme va immédiatement me dire que le texte analysé est le français. le calcul du niveau de fiabilité me permet de savoir à quel point cette affirmation est juste.

donc si j’applique mon taux de probabilité, j’aurais un score de fiabilité de

(15 / (15+8))*100 = 67%

ce qui est pas mal.

Admettant maintenant que l’analyse me donne les chiffres suivants :

FR = 12, ES=9

le score de fiabilité sera de

(12/(12+10))*100= 54%

pas évident n’est-ce pas ? mais c’est intéressant !

Voila, vous savez tout sans rien payer !!

pour avoir le code source complet, il suffit d’aller sur mon github et de télécharger l’ensemble des sources.

enjoy !

geek