如何检测字符串的语言?

时间:2009-07-28 08:47:01

标签: c# language-detection

检测字符串语言的最佳方法是什么?

9 个答案:

答案 0 :(得分:34)

如果您的代码的上下文具有互联网访问权限,您可以尝试使用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#,请查看this article如何从c#调用API。

更新: 那个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,如下所示:

  

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;
}

然后,继承自此类的Translation对象:

[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) { }
      }
   }
}

答案 1 :(得分:24)

快速回答: NTextCatNuGetOnline Demo

答案很长:

目前,最佳方法似乎是使用训练分类器将一段文本分类为预定义集合中的一种(或多种)语言。

有一个名为TextCat的Perl工具。它拥有74种最流行语言的语言模型。这个工具有大量的端口用于不同的编程语言。

.Net中没有端口。所以我写了一篇:NTextCat on GitHub

它是纯.NET Framework DLL +命令行界面。默认情况下,它使用14种语言的配置文件。

非常感谢任何反馈! 我们也欢迎新的想法和功能要求:)

替代方案是使用大量在线服务(例如Google提到的,detectlanguage.com,langid.net等)。

答案 2 :(得分:7)

使用有向图或三字图的统计方法是一个非常好的指标。例如,以下是英语中最常见的有向图:http://www.letterfrequency.org/#digraph-frequency(可以找到更好或更完整的列表)。对于短文本片段,此方法可能比单词分析具有更好的成功率,因为​​文本中的有向图比完整单词更多。

答案 3 :(得分:6)

对字符串进行统计分析:将字符串拆分为单词。获取您要测试的每种语言的字典。然后找到字数最多的语言。

在C#中,内存中的每个字符串都是unicode,不进行编码。同样在文本文件中,不存储编码。 (有时仅指示8位或16位)。

如果你想区分两种语言,你可能会发现一些简单的技巧。例如,如果您要识别荷兰语的英语,则包含“y”的字符串主要是英语。 (不可靠但很快)。

答案 4 :(得分:6)

如果你的意思是自然(即人类)语言,这通常是一个难题。什么语言是“服务器” - 英语还是土耳其语?什么语言是“聊天” - 英语还是法语?什么语言是“uno” - 意大利语或西班牙语(或拉丁语!)?

没有注意上下文,并且做了一些艰难的自然语言处理(< -----这是google的短语),你没有机会。

您可能会看一下Frengly - 它是Google翻译服务的一个很好的用户界面,它会尝试猜测输入文字的语言......

答案 5 :(得分:2)

来自Google Chromium浏览器的

CLD(精简语言检测器)库

你可以包装用C ++编写的CLD库

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

答案 6 :(得分:2)

您可以使用Microsoft Research的{​​{3}}:

  

该软件包实现了几种语言算法   识别,包括两套预编译语言   配置文件。一套涵盖52种语言,并在维基百科上进行了培训   (即写得很好的语料库);另一种涵盖了26种语言   从Twitter构建(即高度口语化的语料库)。该   语言标识符被打包为C#库,并且很容易   嵌入到其他C#项目中。

从上面的链接下载包。

答案 7 :(得分:0)

我们可以使用Regex.IsMatch(text, "[\\uxxxx-\\uxxxx]+")来检测特定语言。这里xxxx是一个字符的4位Unicode id 检测阿拉伯语:

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

答案 8 :(得分:0)

一种替代方法是使用“ Translator Text API

  

...是计算机的Azure Cognitive Services API集合的一部分   云中的学习和AI算法,并且很容易在   您的开发项目

关于如何使用此API从文本中检测语言的a quickstart guide