Come rilevare la lingua di una stringa?

Qual è il modo migliore per rilevare la lingua di una stringa?

Se il contesto del tuo codice ha accesso a Internet, puoi provare a utilizzare l’API di Google per il rilevamento della lingua. 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 + ""; } }); 

E, dal momento che stai usando c #, dai un’occhiata a questo articolo su come chiamare l’API da c #.

AGGIORNAMENTO: il collegamento c # è sparito, ecco una copia cache del nucleo di esso:

 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; 

Fondamentalmente, devi creare un URI e inviarlo a Google che assomiglia a:

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

Questo dice all’API che vuoi tradurre “hello world” dall’inglese all’ebraico, a cui la risposta JSON di Google sarebbe simile:

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

Ho scelto di creare una class base che rappresenta una tipica risposta JSON di Google:

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

Quindi, un object Translation che eredita da questa class:

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

Questa class di traduzione ha un object TranslationResponseData simile al seguente:

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

Infine, possiamo creare la class 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) { } } } } 

Risposta veloce: NTextCat ( NuGet , Demo online )

Risposta lunga:

Attualmente il modo migliore sembra usare classificatori addestrati per classificare una porzione di testo in una (o più) lingue da una serie predefinita.

C’è uno strumento Perl chiamato TextCat . Dispone di modelli linguistici per 74 lingue più diffuse. Esiste un numero enorme di porte di questo strumento in diversi linguaggi di programmazione.

Non c’erano porte in .Net. Quindi ne ho scritto uno: NTextCat su GitHub .

È pura interfaccia di riga di comando DLL + .NET Framework ad esso. Per impostazione predefinita, utilizza un profilo di 14 lingue.

Qualsiasi feedback è molto apprezzato! Nuove idee e richieste di funzionalità sono benvenute 🙂

In alternativa è ansible utilizzare numerosi servizi online (ad esempio uno di Google menzionato, detectlanguage.com, langid.net, ecc.).

Un approccio statistico che utilizza digraphs o trigraphs è un ottimo indicatore. Per esempio, ecco i digrammi più comuni in inglese in ordine: http://www.letterfrequency.org/#digraph-frequency (si possono trovare liste migliori o più complete). Questo metodo può avere una percentuale di successo migliore rispetto all’analisi di parole per brevi frammenti di testo, perché ci sono più digrammi nel testo che parole complete.

Se intendi la lingua naturale (cioè umana), questo è in generale un problema difficile. Che lingua è “server” – inglese o turco? Che lingua è “chat” – inglese o francese? Che lingua è “uno” – italiano o spagnolo (o latino!)?

Senza prestare attenzione al contesto e facendo un duro lavoro di elaborazione del linguaggio naturale (<----- questa è la frase su google per) non hai possibilità.

Potresti dare un’occhiata a Frengly : è una bella interfaccia utente sul servizio Google Translate che tenta di indovinare la lingua del testo di input …

Effettua un’analisi statistica della stringa: dividi la stringa in parole. Ottieni un dizionario per ogni lingua che desideri testare. E poi trova la lingua che ha il conteggio delle parole più alto.

In C # ogni stringa in memoria sarà unicode e non codificata. Anche nei file di testo la codifica non è memorizzata. (A volte solo un’indicazione di 8-bit o 16-bit).

Se vuoi fare una distinzione tra due lingue, potresti trovare alcuni trucchi semplici. Ad esempio, se si desidera riconoscere l’inglese dall’olandese, la stringa che contiene la “y” è prevalentemente inglese. (Inaffidabile ma veloce).

Libreria CLD (Compact Language Detector) dal browser Chromium di Google

Si può avvolgere la libreria CLD, che è scritta in C ++

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

È ansible utilizzare il pacchetto C # per l’identificazione della lingua da Microsoft Research:

Questo pacchetto implementa diversi algoritmi per l’identificazione della lingua e include due set di profili linguistici precompilati. Un set copre 52 lingue ed è stato formato su Wikipedia (cioè un corpus ben scritto); l’altro copre 26 lingue ed è stato costruito da Twitter (cioè un corpus altamente colloquiale). Gli identificatori di lingua sono impacchettati come una libreria C # e possono essere facilmente incorporati in altri progetti C #.

Scarica il pacchetto dal link sopra.

Possiamo usare Regex.IsMatch(text, "[\\uxxxx-\\uxxxx]+") per rilevare una lingua specifica. Qui xxxx è l’id Unicode a 4 cifre di un carattere.
Per rilevare l’arabo:

 bool isArabic = Regex.IsMatch(yourtext, @"[\u0600-\u06FF]+")