如何检测一个string的语言?
检测string语言的最佳方法是什么?
如果您的代码的上下文可以访问Internet,则可以尝试使用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#,所以看看这篇关于如何从c#调用API的文章 。
更新:该C#链接消失了,这是它的核心的caching副本:
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;
基本上,您需要创build一个URI并将其发送给Google,如下所示:
这告诉API,你想把“hello world”从英文翻译成希伯来文,Google的JSON响应看起来像这样:
{"responseData": {"translatedText":"שלום העולם"}, "responseDetails": null, "responseStatus": 200}
我select了一个代表典型Google JSON响应的基类:
[Serializable] public class JSONResponse { public string responseDetails = null; public string responseStatus = null; }
然后,从这个类inheritance的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) { } } } }
快速回答: NTextCat ( NuGet , 在线演示 )
很长的回答:
目前最好的方法似乎是使用分类器来训练分类器将文本分类为来自预定义集合的一种(或多种)语言。
有一个叫做TextCat的Perl工具。 它有74种最stream行语言的语言模型。 这个工具的端口有很多不同的编程语言。
.Net中没有端口。 所以我写了一个: GitHub上的NTextCat 。
它是纯粹的.NET Framework DLL +命令行界面。 默认情况下,它使用14种语言的configuration文件。
任何反馈非常感谢! 新的想法和function要求也欢迎:)
另一种方法是使用众多的在线服务(例如Google提到的一个,detectlanguage.com,langid.net等)。
使用有向图或三元组的统计方法是一个非常好的指标。 例如,以下是英文中最常见的二合字母: http : //www.letterfrequency.org/#digraph-frequency (可以find更好或更完整的列表)。 这种方法可能比文本短片段的词分析具有更好的成功率,因为文本中有更多的有向图比有完整的词。
如果你的意思是自然的(即人类的)语言,这通常是一个难题。 什么语言是“服务器” – 英语还是土耳其语? 什么语言是“聊天” – 英语还是法语? 什么语言是“uno” – 意大利语还是西class牙语(或拉丁语!)?
没有关注上下文,并做了一些自然语言处理 (<—–这是谷歌的短语),你没有机会。
你可能喜欢看Frengly – 这是一个很好的用户界面到谷歌翻译服务,试图猜测input文字的语言…
对string进行统计分析:将string拆分为单词。 获取您想要testing的每种语言的字典。 然后find具有最高字数的语言。
在C#中,每个内存中的string都是unicode,而不是编码。 同样在文本文件中,编码不被存储。 (有时只有8位或16位的指示)。
如果你想区分两种语言,你可能会发现一些简单的技巧。 例如,如果您要识别荷兰语的英语,那么包含“y”的string大部分是英语。 (不可靠但很快)。
来自Google Chromium浏览器的CLD(压缩语言检测器)库
你可以包装用C ++编写的CLD库
http://code.google.com/p/chromium-compact-language-detector/
您可以使用Microsoft Research的C#软件包进行语言识别 :
这个包实现了几种语言识别algorithm,并且包含两套预编译的语言configuration文件。 一组涵盖了52种语言,并在维基百科上进行了培训(即写得很好的语料库)。 另一个涵盖26种语言,并由Twitter(即高度口语化的语料库)构build。 语言标识符打包成一个C#库,并可以很容易地embedded到其他C#项目。
从上面的链接下载软件包。
我们可以使用Regex.IsMatch(text, "[\\uxxxx-\\uxxxx]+")
来检测特定的语言。 这里xxxx是一个字符的4位Unicode编号。
检测阿拉伯语:
bool isArabic = Regex.IsMatch(yourtext, @"[\u0600-\u06FF]+")