什么是检测一个字符串的语言的最佳方法是什么?
Answer 1:
如果你的代码的情况下能上网,你可以尝试使用谷歌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。
UPDATE:那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,并将其发送给谷歌,看起来像:
http://ajax.googleapis.com/ajax/services/language/translate?v=1.0&q=hello%20worled&langpair=en%7ciw&key=your_google_api_key_goes_here
这告诉你要翻译的“Hello World”从英语到希伯来语的API,谷歌的JSON响应看起来像到:
{"responseData": {"translatedText":"שלום העולם"}, "responseDetails": null, "responseStatus": 200}
我选择了做一个代表典型的谷歌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) { }
}
}
}
Answer 2:
快速回答: NTextCat ( 的NuGet , 在线演示 )
长一点的回答:
目前最好的办法似乎使用训练一段文字分成从预定义的语言之一(或更多)的分类。
有一个叫Perl的工具TextCat 。 它有语言模型74种最流行的语言。 有一个巨大的这个工具为不同的编程语言的端口数量。
有在.NET没有端口。 :所以我写了一个GitHub上NTextCat 。
它是纯粹的.NET Framework DLL +命令行界面给它。 默认情况下,它使用14种语言的轮廓。
任何反馈非常赞赏! 新思路和功能要求的欢迎太:)
另一种方法是使用大量的在线服务(例如,一个从谷歌中提到,detectlanguage.com,langid.net等)。
Answer 3:
使用二合字母或三合统计方法是一个很好的指标。 例如,下面是英文中最常见的有向图依次为: http://www.letterfrequency.org/#digraph-frequency (一个可以找到更好,更完整的列表)。 因为有文字更比有向图有完整的单词这种方法可能具有更好的成功率比文字的简短片段词分析。
Answer 4:
如果你指的是天然的(即人类)的语言,这是一般的一个难题。 什么语言是“服务器” - 英语或土耳其? 什么语言是“聊天” - 英语或法语? 什么语言是“UNO” - (!或拉丁美洲),意大利语,西班牙语?
如果不关注背景下,并做一些艰苦的自然语言处理 (<-----这是谷歌的短语)你没有机会。
你可能会喜欢看看Frengly -这是一个很好的用户界面上谷歌翻译服务,它试图猜测输入文本的语言...
Answer 5:
使字符串的统计分析:分割字符串成单词。 找一本字典你要测试每一种语言。 然后找到具有最高字数语言。
在C#在内存中的字符串将是unicode的,而不是编码。 此外,在文本文件的编码不存储。 (有时仅8位或16位的指示)。
如果你想使两种语言之间的区别,你可能会发现一些简单的窍门。 例如,如果你想认识英语从荷兰,包含“Y”主要是英语的字符串。 (不可靠但快)。
Answer 6:
CLD(简洁的语言,探测器)从谷歌的Chromium浏览器库
你可以包住CLD库,它是用C ++
http://code.google.com/p/chromium-compact-language-detector/
Answer 7:
您可以使用C#封装了语言识别来自微软研究院:
这个包实现了几个算法语言识别,并包括两组的预编译语言轮廓。 一组涵盖52种语言,并在维基百科上被训练(即写得很好的语料库); 其他涵盖26种语言和来自Twitter构建(即,高度口语语料库)。 语言标识符打包为一个C#库,并可以方便地嵌入到其他C#项目。
从上面的链接下载程序包。
Answer 8:
我们可以用Regex.IsMatch(text, "[\\uxxxx-\\uxxxx]+")
来检测特定的语言。 这里xxxx是一个字符的4位的Unicode ID。
为了检测阿拉伯语:
bool isArabic = Regex.IsMatch(yourtext, @"[\u0600-\u06FF]+")
Answer 9:
一种选择是使用“ 翻译文本API ”,这是
...机器学习和云AI算法的Azure的认知服务API集合的一部分,而且是在你的开发项目容易耗材
这里有一个快速入门指南如何从文本使用此API检测语言