Comment puis-je savoir dans quelle langue est écrit un fichier en texte brut? [fermé]
Supposons que nous ayons un fichier texte avec le contenu: "Je suis un beau homme ..."
Un autre avec: "Je suis un homme courageux"
Le troisième avec un texte en allemand: "Guten morgen. Wie geht est ?"
Comment écrire une fonction qui nous dirait: avec une telle probabilité le texte dans le premier le fichier est en anglais, dans la seconde nous avons le français etc?
Les liens vers des livres / des solutions prêtes à l'emploi sont les bienvenus. J'écris en Java, mais je peux apprendre Python si nécessaire.
Mon commentaires
- Il y a un petit commentaire que je dois ajouter. Le texte peut contenir des phrases dans différentes langues, en tant que partie intégrante ou à la suite d'une erreur. Dans la littérature classique, nous avons beaucoup d'exemples, parce que les membres de l'aristocratie étaient multilingues. Ainsi, la probabilité décrit mieux la situation, car la plupart des parties du texte sont dans une langue, tandis que d'autres peuvent être écrites dans une autre.
- Google API-connexion Internet. Je préférerais ne pas utiliser à distance fonctions / services, comme je dois le faire moi-même ou utiliser une bibliothèque téléchargeable. Je voudrais faire une recherche sur le sujet.
10 réponses
Il y a un paquet appelé JLangDetect, qui semble faire exactement ce que vous voulez:
langof("un texte en français") = fr : OK
langof("a text in english") = en : OK
langof("un texto en español") = es : OK
langof("un texte un peu plus long en français") = fr : OK
langof("a text a little longer in english") = en : OK
langof("a little longer text in english") = en : OK
langof("un texto un poco mas largo en español") = es : OK
langof("J'aime les bisounours !") = fr : OK
langof("Bienvenue à Montmartre !") = fr : OK
langof("Welcome to London !") = en : OK
// ...
Edit: comme Kevin l'a souligné, il existe des fonctionnalités similaires dans le projet Nutch fourni par le paquet org.Apache.nutch.analyse.lang.
Détection de langue par Google: http://code.google.com/apis/ajaxlanguage/documentation/#Detect
Pour les gros corpi de textes, vous utilisez généralement la distribution des lettres, des digraphes et même des trigraphes et vous comparez avec les distributions connues pour les langues que vous souhaitez détecter.
Cependant, une seule phrase est très probablement trop courte pour donner des mesures statistiques utiles. Vous pouvez avoir plus de chance avec des mots individuels correspondant à un dictionnaire, puis.
NGramJ semble être un peu plus à jour:
Http://ngramj.sourceforge.net/
Il a également des profils orientés caractères et octets, il devrait donc être capable d'identifier le jeu de caractères aussi.
Pour les documents en plusieurs langues, vous devez identifier le jeu de caractères ( ICU4J a un CharsetDetector qui peut le faire), puis diviser le texte sur quelque chose de resonable comme plusieurs sauts de ligne, ou des paragraphes si le texte est marqué jusqu'.
Essayez L'identifiant de langue de Nutch . Il est formé avec des profils n-gram de langues et le profil des langues disponibles est apparié avec le texte d'entrée. Chose intéressante est que vous pouvez ajouter plus de langues, si vous avez besoin.
Regardez les chaînes de Markov.
Fondamentalement, vous aurez besoin d'échantillons statistiquement significatifs des langues que vous voulez reconnaître. Lorsque vous obtenez un nouveau fichier, voyez quelles sont les fréquences de syllabes ou de phonèmes spécifiques et comparez l'échantillon pré-calculé. Choisissez le plus proche.
Bien qu'une solution plus compliquée que celle que vous recherchez, vous pouvez utiliser Vowpal Wabbit et l'entraîner avec des phrases de différentes langues.
, En théorie, vous pourriez récupérer une langue pour chaque phrase dans vos documents.
(Ne vous laissez pas berner par le "en ligne" dans le sous-titre du projet-c'est juste mathspeak pour apprendre sans avoir à avoir tout le matériel d'apprentissage en mémoire)
Si vous êtes intéressé par le mécanisme par lequel la détection du langage peut être effectuée, je vous renvoie à l'article suivant (Basé sur python) qui utilise une méthode (très) naïve mais qui est une bonne introduction à ce problème en particulier et Machine learning (juste un gros mot) en général.
Pour les implémentations java, JLangDetect et Nutch comme suggéré par les autres affiches sont plutôt bons. Jetez aussi un oeil à Lingpipe, JTCL et NGramJ.
Pour le problème où vous avez plusieurs langues dans la même page, vous pouvez utiliser un détecteur de limite de phrase pour couper une page en phrases, puis tenter d'identifier la langue de chaque phrase. En supposant qu'une phrase ne contient qu'une seule langue (principale), vous devriez toujours obtenir de bons résultats avec l'une des implémentations ci-dessus.
Note: un détecteur de limite de phrase (SBD) est théoriquement spécifique à la langue (problème de poulet-oeuf puisque vous avez besoin d'un pour l'autre). Mais pour les langues à base de caractères latins (Anglais, Français, allemand, etc.) qui utilisent principalement des périodes (en dehors des exclamations, etc.) pour la délimitation des phrases, vous obtiendrez des résultats acceptables même si vous utilisez un SBD conçu pour l'anglais. J'ai écrit un SBD anglais basé sur des règles qui a très bien fonctionné pour le texte français. Pour les implémentations, jetez un oeil à OpenNLP.
Une option alternative à l'utilisation du SBD consiste à utiliser une fenêtre coulissante de 10 jetons (délimités par des espaces) pour créer un pseudo-phrase (PS) et essayez d'identifier la bordure où la langue change. Cela a l'inconvénient que si votre document entier a n jetons, vous effectuerez environ N-10 opérations de classification sur des chaînes de longueur 10 jetons chacune. Dans l'autre approche, si la phrase moyenne a 10 jetons, vous auriez effectué environ n/10 opérations de classification. Si n = 1000 mots dans un document, vous comparez 990 opérations contre 100 opérations: un ordre de différence de grandeur.
Si vous avez des phrases courtes (moins de 20 caractères), la précision de la détection de la langue est médiocre dans mon expérience. En particulier dans le cas des noms propres ainsi que des noms qui sont les mêmes dans toutes les langues comme "chocolat". Par exemple," New York " est-il un mot anglais ou un mot français s'il apparaît dans une phrase française?
Avez-vous une connexion à internet si vous le faites, L'API Google Language serait parfaite pour vous.
// This example request includes an optional API key which you will need to
// remove or replace with your own key.
// Read more about why it's useful to have an API key.
// The request also includes the userip parameter which provides the end
// user's IP address. Doing so will help distinguish this legitimate
// server-side traffic from traffic which doesn't come from an end-user.
URL url = new URL(
"http://ajax.googleapis.com/ajax/services/search/web?v=1.0&"
+ "q=Paris%20Hilton&key=INSERT-YOUR-KEY&userip=USERS-IP-ADDRESS");
URLConnection connection = url.openConnection();
connection.addRequestProperty("Referer", /* Enter the URL of your site here */);
String line;
StringBuilder builder = new StringBuilder();
BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream()));
while((line = reader.readLine()) != null) {
builder.append(line);
}
JSONObject json = new JSONObject(builder.toString());
// now have some fun with the results...
Si vous ne le faites pas, il existe d'autres méthodes.
Les modèles Bigram fonctionnent bien, sont simples à écrire, simples à former et ne nécessitent qu'une petite quantité de texte pour la détection. L'identifiant de langage nutch est une implémentation java que nous avons trouvée et utilisée avec un wrapper mince.
Nous avons eu des problèmes avec un modèle bigram pour le CJK mixte et le texte anglais (c'est-à-dire qu'un tweet est principalement japonais, mais a un seul mot anglais). Ceci est évident rétrospectivement en regardant les mathématiques (le japonais a beaucoup plus de caractères, donc les probabilités d'une paire donnée sont bas). Je pense que vous pourriez résoudre cela avec une comparaison log-linéaire plus compliquée, mais j'ai triché et utilisé un filtre simple basé sur des jeux de caractères uniques à certaines langues (c'est-à-dire s'il ne contient que du Han unifié, alors C'est Chinois, s'il contient du kana japonais et du Han unifié, alors C'est japonais).