2008-12-21 10 views
7

Plus précisément, j'essaie de vérifier si une chaîne donnée (une phrase) est en turc.Meilleure façon de retourner la langue d'une chaîne donnée

Je peux vérifier si la chaîne a des caractères turcs tels que Ç, Ş, Ü, Ö, Ğ etc. Cependant ce n'est pas très fiable car ceux-ci pourraient être convertis en C, S, U, O, G avant de recevoir le chaîne.

Une autre méthode consiste à avoir les 100 mots les plus utilisés en turc et de vérifier si la phrase contient un/certains de ces mots. Je peux combiner ces deux méthodes et utiliser un système de points.

Selon vous, quel est le moyen le plus efficace de résoudre mon problème en Python?

question connexe: (human) Language of a document (Perl, API Google Traduction)

+0

Dupliquer: http://stackoverflow.com/questions/257125/human-language-of-a-document –

+0

@ S.Lott: J'ai ajouté un lien vers la question. – jfs

Répondre

14

Une option serait d'utiliser un classificateur bayésien tels que Reverend. La page d'accueil donne le révérend cette suggestion pour un détecteur de langage naïf:

from reverend.thomas import Bayes 
guesser = Bayes() 
guesser.train('french', 'le la les du un une je il elle de en') 
guesser.train('german', 'der die das ein eine') 
guesser.train('spanish', 'el uno una las de la en') 
guesser.train('english', 'the it she he they them are were to') 
guesser.guess('they went to el cantina') 
guesser.guess('they were flying planes') 
guesser.train('english', 'the rain in spain falls mainly on the plain') 
guesser.save('my_guesser.bay') 

formation avec des ensembles de jetons plus complexes renforcerait les résultats. Pour plus d'informations sur la classification bayésienne, see here et here.

10

Une méthode statistique simple que je l'ai utilisé avant:

Obtenir une bonne quantité de texte de formation de l'échantillon dans la langue que vous voulez détecter. Divisez-le en trigrammes, par ex. «Hello foobar» dans les trigrammes est: «Hel», «ell», «lo», «lo», «o f», «fo», «foo», «oob», «oba», 'bar'

Pour toutes les données sources, comptez la fréquence d'occurrence de chaque trigramme, vraisemblablement dans un dict où key = trigram et value = frequency. Vous pouvez limiter ceci aux 300 combinaisons les plus fréquentes de 3 lettres ou quelque chose si vous voulez. Pickle le dict quelque part.

Pour savoir si un nouvel échantillon de texte est écrit dans la même langue, répétez les étapes ci-dessus pour l'exemple de texte. Maintenant, tout ce que vous avez à faire est de calculer une corrélation entre les fréquences de trigramme de l'échantillon et les fréquences de trigrammes d'entraînement. Vous aurez besoin de jouer avec un peu pour choisir une corrélation de seuil au-dessus de laquelle vous êtes prêt à considérer que l'entrée est turque ou non.

Cette méthode a été montré très précis, battant des méthodes plus sophistiquées, voir

Cavnar & Trenkle (1994): "N-Gram-Based Text Categorization"

En utilisant trigrammes résout le problème de l'utilisation des listes de mots, car il y a un grand nombre de mots dans une langue donnée, surtout compte tenu des différentes permutations grammaticales. J'ai essayé de chercher des mots communs, le problème est qu'ils donnent souvent un faux positif pour une autre langue, ou eux-mêmes ont beaucoup de permutations. La méthode statistique ne nécessite pas beaucoup d'espace de stockage et ne nécessite pas d'analyse complexe. En passant, cette méthode ne fonctionne que pour les langues avec un système d'écriture phonétique, elle fonctionne mal, voire pas du tout, avec des langages utilisant un langage idéographique (c'est-à-dire chinois, japonais, coréen).

Sinon wikipedia a une section sur la Turquie dans its handy language recognition chart.

-1

Pourquoi ne pas simplement utiliser une bibliothèque de vérification de charme existant? Vérification orthographique pour plusieurs langues, choisissez la langue avec le nombre d'erreurs le plus faible.

Questions connexes