ultimos - separar letras de una cadena en c#
¿Cómo detectar el lenguaje de una cadena? (8)
¿Cuál es la mejor manera de detectar el lenguaje de una cadena?
Haz un análisis estadístico de la cadena: Divide la cadena en palabras. Obtenga un diccionario para cada idioma que desee probar. Y luego encuentra el idioma que tiene el mayor número de palabras.
En C # todas las cadenas en la memoria serán Unicode, y no están codificadas. También en los archivos de texto la codificación no se almacena. (A veces solo es una indicación de 8 bits o 16 bits).
Si desea hacer una distinción entre dos idiomas, puede encontrar algunos trucos simples. Por ejemplo, si desea reconocer el inglés del holandés, la cadena que contiene la "y" es mayoritariamente el inglés. (No fiable pero rápido).
Podemos usar Regex.IsMatch(text, "[//uxxxx-//uxxxx]+")
para detectar un idioma específico. Aquí xxxx es el ID de Unicode de 4 dígitos de un personaje.
Para detectar el árabe:
bool isArabic = Regex.IsMatch(yourtext, @"[/u0600-/u06FF]+")
Puede usar el paquete C # para la identificación de idioma de Microsoft Research:
Este paquete implementa varios algoritmos para la identificación de idiomas e incluye dos conjuntos de perfiles de idiomas precompilados. Un juego cubre 52 idiomas y se formó en Wikipedia (es decir, un corpus bien escrito); el otro cubre 26 idiomas y se construyó a partir de Twitter (es decir, un corpus altamente coloquial). Los identificadores de idioma se empaquetan como una biblioteca de C # y se integran fácilmente en otros proyectos de C #.
Descarga el paquete desde el enlace de arriba.
Si el contexto de su código tiene acceso a Internet, puede intentar utilizar la API de Google para la detección de idioma. 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 + "";
}
});
Y, como está utilizando c #, eche un vistazo a este artículo sobre cómo llamar a la API desde c #.
ACTUALIZACIÓN: Ese enlace c # se ha ido, aquí hay una copia en caché del núcleo:
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;
Básicamente, necesitas crear un URI y enviarlo a Google que se vea así:
Esto le dice a la API que desea traducir "hola mundo" del inglés al hebreo, a la que se vería la respuesta JSON de Google:
{"responseData": {"translatedText":"שלום העולם"}, "responseDetails": null, "responseStatus": 200}
Elegí hacer una clase base que represente una respuesta típica de Google JSON:
[Serializable]
public class JSONResponse
{
public string responseDetails = null;
public string responseStatus = null;
}
Entonces, un objeto de traducción que hereda de esta clase:
[Serializable]
public class Translation: JSONResponse
{
public TranslationResponseData responseData =
new TranslationResponseData();
}
Esta clase de traducción tiene un objeto TranslationResponseData que se ve así:
[Serializable]
public class TranslationResponseData
{
public string translatedText;
}
Finalmente, podemos hacer la clase 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) { }
}
}
}
Si te refieres al lenguaje natural (es decir, humano), este es en general un problema difícil. ¿Qué idioma es "servidor" - inglés o turco? ¿Qué idioma es "chat" - inglés o francés? ¿Qué idioma es "uno", italiano o español (o latín)?
Sin prestar atención al contexto, y realizar un procesamiento de lenguaje natural difícil (<----- esta es la frase que se busca en google) no tienes una oportunidad.
Puede disfrutar de un vistazo a Frengly : es una buena interfaz de usuario en el servicio de Google Translate que intenta adivinar el idioma del texto de entrada ...
Un enfoque estadístico que utilice dígrafos o trigrafos es un indicador muy bueno. Por ejemplo, aquí están los dígrafos más comunes en inglés en orden: http://www.letterfrequency.org/#digraph-frequency (uno puede encontrar listas mejores o más completas). Este método puede tener una mejor tasa de éxito que el análisis de palabras para fragmentos cortos de texto porque hay más dígrafos en el texto que palabras completas.
Respuesta rápida: NTextCat ( NuGet , demostración en línea )
Respuesta larga:
Actualmente, la mejor manera parece utilizar clasificadores entrenados para clasificar parte del texto en uno (o más) de idiomas de un conjunto predefinido.
Hay una herramienta Perl llamada TextCat . Cuenta con modelos lingüísticos para los 74 idiomas más populares. Hay una gran cantidad de puertos de esta herramienta en diferentes lenguajes de programación.
No había puertos en .Net. Así que he escrito uno: NTextCat .
Es puro .NET Framework DLL + interfaz de línea de comandos para ello. Por defecto, utiliza un perfil de 14 idiomas.
Cualquier comentario es muy apreciado! Nuevas ideas y solicitudes de características son bienvenidas también :)
Alternativa es utilizar numerosos servicios en línea (por ejemplo, uno de Google mencionado, detectlanguage.com, langid.net, etc.).
Biblioteca CLD (Detector de idioma compacto) del navegador Chromium de Google
Usted podría envolver la biblioteca CLD, que está escrita en C ++
http://code.google.com/p/chromium-compact-language-detector/