Как определить язык строки?
Какой лучший способ определить язык строки?
9 ответов
Если в контексте вашего кода есть доступ к Интернету, вы можете попробовать использовать Google API для определения языка. 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 + "";
}
});
И, так как вы используете C#, взгляните на эту статью о том, как вызывать API из C#.
ОБНОВЛЕНИЕ: Эта ссылка на C# исчезла, вот ее кэшированная копия:
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;
По сути, вам нужно создать URI и отправить его в Google, который выглядит следующим образом:
Это говорит API, что вы хотите перевести "hello world" с английского на иврит, на что ответ Google JSON будет выглядеть так:
{"responseData": {"translatedText":"שלום העולם"}, "responseDetails": null, "responseStatus": 200}
Я решил создать базовый класс, представляющий типичный ответ Google JSON:
[Serializable]
public class JSONResponse
{
public string responseDetails = null;
public string responseStatus = null;
}
Затем объект перевода, который наследуется от этого класса:
[Serializable]
public class Translation: JSONResponse
{
public TranslationResponseData responseData =
new TranslationResponseData();
}
Этот класс Translation имеет объект TranslationResponseData, который выглядит следующим образом:
[Serializable]
public class TranslationResponseData
{
public string translatedText;
}
Наконец, мы можем сделать класс 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) { }
}
}
}
Быстрый ответ: NTextCat ( NuGet, Online Demo)
Длинный ответ:
В настоящее время наилучшим способом представляется использование классификаторов, обученных для классификации фрагмента текста на один (или несколько) языков из предопределенного набора.
Существует инструмент Perl под названием TextCat. Он имеет языковые модели для 74 самых популярных языков. Существует огромное количество портов этого инструмента на разные языки программирования.
В.Net не было портов. Итак, я написал один: NTextCat на GitHub.
Это чистый.NET Framework DLL + интерфейс командной строки к нему. По умолчанию используется профиль из 14 языков.
Любая обратная связь очень ценится! Новые идеи и пожелания приветствуются тоже:)
Альтернативой является использование многочисленных онлайн-сервисов (например, один из упомянутых Google, detectlanguage.com, langid.net и т. Д.).
Статистический подход с использованием орграфов или триграфов является очень хорошим показателем. Например, вот самые распространенные диграфы на английском языке по порядку: http://www.letterfrequency.org/ (можно найти лучшие или более полные списки). Этот метод может иметь лучший показатель успеха, чем анализ слов для коротких фрагментов текста, поскольку в тексте больше орграфов, чем целых слов.
Сделайте статистический анализ строки: разбейте строку на слова. Получить словарь для каждого языка, который вы хотите проверить. А затем найдите язык с наибольшим количеством слов.
В C# каждая строка в памяти будет unicode и не будет закодирована. Также в текстовых файлах кодировка не сохраняется. (Иногда только указание 8-бит или 16-бит).
Если вы хотите провести различие между двумя языками, вы можете найти несколько простых приемов. Например, если вы хотите распознать английский с голландского, строка, которая содержит "y", в основном английская. (Ненадежно, но быстро).
Если вы имеете в виду естественный (то есть человеческий) язык, это, как правило, трудная проблема. Какой язык "сервер" - английский или турецкий? Какой язык "чат" - английский или французский? Какой язык "уно" - итальянский или испанский (или латинский!)?
Не обращая внимания на контекст и выполняя некоторую сложную обработку естественного языка (<----- это фраза для Google), у вас нет шансов.
Возможно, вам понравится взглянуть на Frengly - это приятный интерфейс службы Google Translate, который пытается угадать язык ввода текста...
Библиотека CLD (Compact Language Detector) из браузера Google Chromium
Вы можете обернуть библиотеку CLD, которая написана на C++
http://code.google.com/p/chromium-compact-language-detector/
Мы можем использовать Regex.IsMatch(text, "[\\uxxxx-\\uxxxx]+")
обнаружить определенный язык. Здесь xxxx - это 4-значный код Unicode символа.
Чтобы обнаружить арабский язык:
bool isArabic = Regex.IsMatch(yourtext, @"[\u0600-\u06FF]+")
Вы можете использовать пакет C# для идентификации языка из Microsoft Research:
Этот пакет реализует несколько алгоритмов идентификации языка и включает в себя два набора предварительно скомпилированных языковых профилей. Один набор охватывает 52 языка и прошел обучение в Википедии (т. Е. Хорошо написанный корпус); другой охватывает 26 языков и был создан из Твиттера (то есть очень разговорный корпус). Идентификаторы языка упакованы как библиотека C# и могут быть легко встроены в другие проекты C#.
Скачайте пакет по ссылке выше.
Одной из альтернатив является использование " Translator Text API", который
... входит в набор API машинного обучения и алгоритмов искусственного интеллекта Azure Cognitive Services в облаке и легко используется в ваших проектах разработки
Вот краткое руководство по обнаружению языка из текста с помощью этого API