Comment détecter la langue d'une chaîne de caractères?

Quelle est la meilleure façon de détecter le langage d'une chaîne?

18
demandé sur Alon Gubkin 2009-07-28 12:47:00

8 réponses

si le contexte de votre code a accès à internet, vous pouvez essayer D'utiliser L'API Google pour la détection de langue. http://code.google.com/apis/ajaxlanguage/documentation /

var text = "¿Dónde está el baño?";
google.language.detect(text, function(result) {
  if (!result.error) {
    var language = 'unknown';
    for (l in google.language.Languages) {
      if (google.language.Languages[l] == result.language) {
        language = l;
        break;
      }
    }
    var container = document.getElementById("detection");
    container.innerHTML = text + " is: " + language + "";
  }
});

et, puisque vous utilisez c#, jetez un oeil à cet article sur la façon d'appeler L'API à partir de c#.

mise à jour: Ce lien c# est parti, voici une copie mise en cache du cœur de celui-ci:

string s = TextBoxTranslateEnglishToHebrew.Text;
string key = "YOUR GOOGLE AJAX API KEY";
GoogleLangaugeDetector detector =
   new GoogleLangaugeDetector(s, VERSION.ONE_POINT_ZERO, key);

GoogleTranslator gTranslator = new GoogleTranslator(s, VERSION.ONE_POINT_ZERO,
   detector.LanguageDetected.Equals("iw") ? LANGUAGE.HEBREW : LANGUAGE.ENGLISH,
   detector.LanguageDetected.Equals("iw") ? LANGUAGE.ENGLISH : LANGUAGE.HEBREW,
   key);

TextBoxTranslation.Text = gTranslator.Translation;

fondamentalement, vous devez créer un URI et l'Envoyer à Google qui ressemble à:

http://ajax.googleapis.com/ajax/services/language/translate?v=1.0&q=hello%20worled&langpair=en%7ciw&key=your_google_api_key_goes_here

indique L'API que vous souhaitez traduire "hello world" de l'Anglais à l'hébreu, à laquelle la réponse JSON de Google ressemblerait:

{"responseData": {"translatedText":"שלום העולם"}, "responseDetails": null, "responseStatus": 200}

j'ai choisi de faire une classe de base qui représente une réponse typique de Google JSON:

[Serializable]
public class JSONResponse
{
   public string responseDetails = null;
   public string responseStatus = null;
}

ensuite, un objet de traduction qui hérite de cette classe:

[Serializable]
public class Translation: JSONResponse
{
   public TranslationResponseData responseData = 
    new TranslationResponseData();
}

cette classe de traduction a un objet TranslationResponseData qui ressemble à ceci:

[Serializable]
public class TranslationResponseData
{
   public string translatedText;
}

enfin, nous pouvons faire la classe GoogleTranslator:

using System;
using System.Collections.Generic;
using System.Text;

using System.Web;
using System.Net;
using System.IO;
using System.Runtime.Serialization.Json;

namespace GoogleTranslationAPI
{

   public class GoogleTranslator
   {
      private string _q = "";
      private string _v = "";
      private string _key = "";
      private string _langPair = "";
      private string _requestUrl = "";
      private string _translation = "";

      public GoogleTranslator(string queryTerm, VERSION version, LANGUAGE languageFrom,
         LANGUAGE languageTo, string key)
      {
         _q = HttpUtility.UrlPathEncode(queryTerm);
         _v = HttpUtility.UrlEncode(EnumStringUtil.GetStringValue(version));
         _langPair =
            HttpUtility.UrlEncode(EnumStringUtil.GetStringValue(languageFrom) +
            "|" + EnumStringUtil.GetStringValue(languageTo));
         _key = HttpUtility.UrlEncode(key);

         string encodedRequestUrlFragment =
            string.Format("?v={0}&q={1}&langpair={2}&key={3}",
            _v, _q, _langPair, _key);

         _requestUrl = EnumStringUtil.GetStringValue(BASEURL.TRANSLATE) + encodedRequestUrlFragment;

         GetTranslation();
      }

      public string Translation
      {
         get { return _translation; }
         private set { _translation = value; }
      }

      private void GetTranslation()
      {
         try
         {
            WebRequest request = WebRequest.Create(_requestUrl);
            WebResponse response = request.GetResponse();

            StreamReader reader = new StreamReader(response.GetResponseStream());
            string json = reader.ReadLine();
            using (MemoryStream ms = new MemoryStream(Encoding.Unicode.GetBytes(json)))
            {
               DataContractJsonSerializer ser =
                  new DataContractJsonSerializer(typeof(Translation));
               Translation translation = ser.ReadObject(ms) as Translation;

               _translation = translation.responseData.translatedText;
            }
         }
         catch (Exception) { }
      }
   }
}
32
répondu Magnus Johansson 2013-05-27 21:56:00

réponse rapide: NTextCat ( NuGet , Online Demo )

longue réponse:

actuellement, la meilleure façon semble d'utiliser les classificateurs formé pour classer morceau de texte dans un (ou plusieurs) des langues de l'ensemble prédéfini.

il y a un outil Perl appelé TextCat . Il a des modèles linguistiques pour 74 langues les plus populaires. Il y a un grand nombre de ports de cet outil dans différents langages de programmation.

il n'y avait pas de ports.Net. J'en ai donc écrit un: NTextCat sur GitHub .

It is pure .net Framework DLL + interface en ligne de commande. Par défaut, il utilise un profil de 14 langues.

tout feedback est très apprécié! De nouvelles idées et demandes de fonctionnalités sont également les bienvenues:)

Alternative est d'utiliser de nombreux services en ligne (par exemple un de Google mentionné, detectlanguage.com, langid.net, etc.).

23
répondu Ivan Akcheurov 2017-01-02 03:52:56

une approche statistique utilisant des digraphes ou des trigraphes est un très bon indicateur. Par exemple, voici les digraphes les plus courants en anglais dans l'ordre: http://www.letterfrequency.org/#digraph-frequency (on peut trouver des listes meilleures ou plus complètes). Cette méthode peut avoir un meilleur taux de réussite que l'analyse de mots pour de courts extraits de texte parce qu'il y a plus de digraphes dans le texte qu'il n'y a de mots complets.

7
répondu Greg Hewgill 2009-07-28 08:51:57

si vous voulez parler du langage naturel (c'est-à-dire humain), c'est en général un problème difficile. Quelle langue est "serveur" - anglais ou Turc? Quelle langue est "chat" - anglais ou français? Quelle langue est "uno" - italien ou espagnol (ou Latin!) ?

Sans prêter attention au contexte, et en faisant quelques dur traitement du langage naturel (<----- c'est la phrase à google de), vous n'avez pas de chance.

vous pourriez apprécier un regardez Frengly - c'est une belle interface utilisateur sur le service Google Translate qui tente de deviner la langue du texte d'entrée...

6
répondu AakashM 2009-07-28 08:51:21

faites une analyse statistique de la chaîne: divisez la chaîne en mots. Obtenez un dictionnaire pour chaque langue que vous souhaitez tester. Et ensuite trouver la langue qui a le plus grand nombre de mots.

en C # chaque chaîne en mémoire sera unicode, et n'est pas encodée. Le codage n'est pas non plus stocké dans les fichiers texte. (Parfois seulement une indication de 8 bits ou 16 bits).

si vous voulez faire une distinction entre deux langues, vous pourriez trouver des trucs simples. Par exemple, si vous voulez reconnaître l'anglais du néerlandais, la chaîne qui contient le "y" est principalement l'anglais. (Peu fiable mais rapide).

6
répondu GvS 2009-07-28 09:48:21

CLD (Compact Langue Détecteur) de la bibliothèque de Google Chrome navigateur

vous pouvez envelopper la bibliothèque CLD, qui est écrite en C++

http://code.google.com/p/chromium-compact-language-detector/

2
répondu f3lix 2012-01-30 12:41:31

vous pouvez utiliser le paquet C# pour l'identification de la langue de Microsoft Research:

ce paquet implémente plusieurs algorithmes pour la langue identification, et comprend deux ensembles de pré-langage compilé profil. Un ensemble couvre 52 langues et a été formé sur Wikipedia (c'est-à-dire un corpus bien écrit); l'autre couvre 26 langues et a été construit à partir de Twitter (c'est-à-dire un corpus très familier). Le les identificateurs de langue sont empaquetés comme une bibliothèque C#, et sont facilement intégré à d'autres projets c#.

Téléchargez le paquet à partir du lien ci-dessus.

2
répondu Reg Edit 2015-07-11 11:02:36

nous pouvons utiliser Regex.IsMatch(text, "[\uxxxx-\uxxxx]+") pour détecter un langage spécifique. Ici, xxxx est l'id Unicode à 4 chiffres d'un caractère.

Pour détecter l'arabe:

bool isArabic = Regex.IsMatch(yourtext, @"[\u0600-\u06FF]+")
0
répondu ariful islam 2015-06-11 01:40:26