检测字符串语言的最佳方法是什么?
如果您的代码的上下文具有互联网访问权限,您可以尝试使用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#链接消失了,这里是它的核心的缓存副本:
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) { } } } }
快速回答: NTextCat(NuGet,在线演示)
答案很长:
目前,最好的方法似乎是使用经过训练的分类器将一段文本分类为预定义集合中的一种(或多种)语言.
有一个名为TextCat的Perl工具.它拥有74种最流行语言的语言模型.这个工具有大量的端口用于不同的编程语言.
.Net中没有端口.所以我在GitHub上写了一篇:NTextCat.
它是纯.NET Framework DLL +命令行界面.默认情况下,它使用14种语言的配置文件.
任何反馈都非常感谢!欢迎新的想法和功能要求:)
另一种方法是使用大量在线服务(例如Google提到的服务,detectlanguage.com,langid.net等).
使用有向图或三字母的统计方法是一个非常好的指标.例如,以下是英语中最常见的有向图:http://www.letterfrequency.org/#digraph-frequency(可以找到更好或更完整的列表).对于短文本片段,此方法可能比单词分析具有更好的成功率,因为文本中的有向图比完整单词更多.
对字符串进行统计分析:将字符串拆分为单词.获取您要测试的每种语言的字典.然后找到具有最高字数的语言.
在C#中,内存中的每个字符串都是unicode,并且不进行编码.同样在文本文件中,不存储编码.(有时仅指示8位或16位).
如果你想区分两种语言,你可能会发现一些简单的技巧.例如,如果您要识别荷兰语的英语,则包含"y"的字符串主要是英语.(不可靠但很快).
如果你的意思是自然(即人类)语言,这通常是一个难题.什么语言是"服务器" - 英语还是土耳其语?什么语言是"聊天" - 英语还是法语?什么语言是"uno" - 意大利语或西班牙语(或拉丁语!)?
没有注意上下文,并做一些艰难的自然语言处理(<-----这是谷歌的短语),你没有机会.
你可能会喜欢Frengly - 这是一个很好的用户界面,可以在Google Translate服务中尝试猜测输入文本的语言......