web-dev-qa-db-fra.com

Déterminer si le texte est en anglais?

J'utilise à la fois Nltk et Scikit Learn pour effectuer du traitement de texte. Cependant, ma liste de documents contient des documents qui ne sont pas en anglais. Par exemple, ceci pourrait être vrai:

[ "this is some text written in English", 
  "this is some more text written in English", 
  "Ce n'est pas en anglais" ] 

Pour les besoins de mon analyse, je souhaite que toutes les phrases qui ne sont pas en anglais soient supprimées dans le cadre du prétraitement. Cependant, y a-t-il un bon moyen de le faire? Je suis allé sur Google, mais je ne trouve rien de précis qui me permette de savoir si les chaînes sont en anglais ou non. Est-ce quelque chose qui n'est pas offert comme fonctionnalité dans Nltk ou Scikit learnMODIFIER J'ai vu des questions à la fois comme ceci et ceci mais les deux sont pour des mots individuels ... Pas un "document". Devrais-je parcourir chaque mot d'une phrase pour vérifier si toute la phrase est en anglais?

J'utilise Python, donc les bibliothèques qui sont en Python seraient préférables, mais je peux changer de langue si nécessaire, pensant juste que Python serait le meilleur pour cela.

7
ocean800

Il existe une bibliothèque appelée langdetect. Il est porté à partir de la détection de langue de Google disponible ici:

https://pypi.python.org/pypi/langdetect

Il prend en charge 55 langues par défaut.

5
salehinejad

Vous pourriez être intéressé par mon article Le jeu de données de référence WiLI pour l’identification écrite Language. . J'ai également comparé quelques outils.

TL; DR:

  • CLD-2 est très bon et extrêmement rapide
  • lang-detect est un petit peu meilleur, mais beaucoup plus lent
  • langid est bon, mais CLD-2 et lang-detect sont bien meilleurs
  • Textcat de NLTK n'est ni efficace, ni efficace.

Vous pouvez installer lidtk et classer les langues:

$ lidtk cld2 predict --text "this is some text written in English"
eng
$ lidtk cld2 predict --text "this is some more text written in English"
eng
$ lidtk cld2 predict --text "Ce n'est pas en anglais"                  
fra
2
Martin Thoma

Utilisez la bibliothèque enchant

import enchant

dictionary = enchant.Dict("en_US") #also available are en_GB, fr_FR, etc

dictionary.check("Hello") # prints True
dictionary.check("Helo") #prints False

Cet exemple est tiré directement de leur website

1
lordingtar

Si vous voulez quelque chose de léger, les trigrammes de lettre sont une approche populaire. Chaque langue a un "profil" différent de trigrammes communs et peu communs. Vous pouvez faire une recherche sur Google ou coder le vôtre. Voici un exemple de mise en œuvre que j'ai rencontré et qui utilise la "similarité en cosinus" comme mesure de la distance entre le texte de l'échantillon et les données de référence: 

http://code.activestate.com/recipes/326576-language-detection-using-character-trigrams/

Si vous connaissez les langues courantes non anglaises de votre corpus, il est assez facile de transformer cela en un test oui/non. Sinon, vous devez anticiper les phrases de langues pour lesquelles vous ne disposez pas de statistiques de trigrammes. Je voudrais faire quelques tests pour voir la plage normale de scores de similarité pour les textes à phrase unique dans vos documents, et choisir un seuil approprié pour le score en cosinus anglais.

1
alexis