Подтвердить что ты не робот

Как определить язык строки?

Какой лучший способ определить язык строки?

4b9b3361

Ответ 1

Если контекст вашего кода имеет доступ в Интернет, вы можете попробовать использовать API Google для определения языка. 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 + "";
  }
});

И, поскольку вы используете С#, посмотрите эту статью о том, как вызвать API из С#.

UPDATE: Это соединение С# исчезло, вот кешированная копия его ядра:

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, который выглядит следующим образом:

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

Это говорит 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();
}

Этот класс перевода имеет объект 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) { }
      }
   }
}

Ответ 2

Быстрый ответ: NTextCat (NuGet, Online Demo)

Длинный ответ:

В настоящее время наилучшим способом представляется использование классификаторов, обученных для классификации фрагмента текста на один (или несколько) языков из предопределенного набора.

Существует инструмент Perl под названием TextCat. Он имеет языковые модели для 74 самых популярных языков. Существует огромное количество портов этого инструмента на разные языки программирования.

В .Net не было портов. Итак, я написал один: NTextCat на GitHub.

Это чистый .NET Framework DLL + интерфейс командной строки к нему. По умолчанию используется профиль из 14 языков.

Любая обратная связь очень ценится! Новые идеи и пожелания приветствуются тоже :)

Альтернативой является использование многочисленных онлайн-сервисов (например, один из упомянутых Google, detectlanguage.com, langid.net и т.д.).

Ответ 3

Статистический подход с использованием орграфов или триграфов является очень хорошим показателем. Например, вот наиболее распространенные диграфы на английском языке, чтобы: http://www.letterfrequency.org/#digraph-frequency (можно найти лучшие или более полные списки). Этот метод может иметь лучший успех, чем анализ слов для коротких фрагментов текста, потому что в тексте больше орграфов, чем полных слов.

Ответ 4

Сделайте статистический анализ строки: разделите строку на слова. Получить словарь для каждого языка, который вы хотите проверить. И затем найдите язык с наивысшим количеством слов.

В С# каждая строка в памяти будет unicode и не закодирована. Также в текстовых файлах кодировка не сохраняется. (Иногда только указание 8-бит или 16-бит).

Если вы хотите провести различие между двумя языками, вы можете найти несколько простых трюков. Например, если вы хотите распознать английский язык на голландском языке, строка, содержащая "y", в основном является английским. (Ненадежный, но быстрый).

Ответ 5

Если вы имеете в виду естественный (то есть человеческий) язык, это, как правило, трудная проблема. Какой язык "сервер" - английский или турецкий? На каком языке "чат" - английский или французский? Какой язык "uno" - итальянский или испанский (или латинский!)?

Не обращая внимания на контекст и делая сложную обработку естественного языка (< ----- это фраза для google для), у вас нет шанса.

Вам может понравиться Frengly - это хороший пользовательский интерфейс на службе Google Translate, который пытается угадать язык ввода текст...

Ответ 7

Вы можете использовать пакет С# для идентификации языка в Microsoft Research:

Этот пакет реализует несколько алгоритмов для языка идентификация и включает в себя два набора предварительно скомпилированных языков профили. Один набор охватывает 52 языка и прошел обучение в Википедии (т.е. хорошо написанный корпус); другой охватывает 26 языков и построенный из Twitter (т.е. очень разговорный корпус). языковые идентификаторы упаковываются как библиотека С# и легко встроен в другие проекты С#.

Загрузите пакет из приведенной выше ссылки.

Ответ 8

Мы можем использовать Regex.IsMatch(text, "[\\uxxxx-\\uxxxx]+") для определения определенного языка. Здесь xxxx является 4-значным идентификатором Unicode символа.
Чтобы обнаружить арабский язык:

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

Ответ 9

Одной из альтернатив является использование " Translator Text API ", который

... входит в набор API машинного обучения и алгоритмов искусственного интеллекта Azure Cognitive Services в облаке и легко используется в ваших проектах разработки

Вот краткое руководство о том, как определить язык из текста с помощью этого API