检测字符串语言的最佳方法是什么?
9 回答
如果您的代码上下文可以访问互联网,您可以尝试使用 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,如下所示:
这告诉 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) { }
}
}
}
长答案:
目前最好的方法似乎是使用经过训练的分类器将一段文本从预定义的集合中分类为一种(或多种)语言。
有一个名为TextCat的 Perl 工具。它具有适用于 74 种最流行语言的语言模型。该工具有大量移植到不同的编程语言。
.Net 中没有端口。所以我写了一个:NTextCat on GitHub。
它是纯 .NET Framework DLL + 命令行接口。默认情况下,它使用 14 种语言的配置文件。
任何反馈都非常感谢!也欢迎新的想法和功能请求:)
另一种方法是使用众多在线服务(例如,Google 提到的一项,detectlanguage.com、langid.net 等)。
使用二合字母或三合字母的统计方法是一个非常好的指标。例如,以下是英语中最常见的二合字母:http: //www.letterfrequency.org/#digraph-frequency(可以找到更好或更完整的列表)。对于短文本片段,这种方法可能比单词分析具有更好的成功率,因为文本中的有向图比完整的单词多。
对字符串进行统计分析:将字符串拆分为单词。为您要测试的每种语言获取字典。然后找到字数最高的语言。
在 C# 中,内存中的每个字符串都是 unicode,并且没有被编码。同样在文本文件中,不存储编码。(有时仅表示 8 位或 16 位)。
如果您想区分两种语言,您可能会发现一些简单的技巧。例如,如果您想从荷兰语中识别英语,则包含“y”的字符串主要是英语。(不可靠但很快)。
如果您指的是自然(即人类)语言,这通常是一个难题。“服务器”是什么语言——英语还是土耳其语?“聊天”是什么语言——英语还是法语?“uno”是什么语言——意大利语或西班牙语(或拉丁语!)?
不注意上下文,做一些困难的自然语言处理(<----- 这是谷歌的短语)你没有机会。
您可能会喜欢看一下Frengly - 它是 Google 翻译服务上的一个不错的 UI,它试图猜测输入文本的语言......
来自 Google 的 Chromium 浏览器的CLD3(Compact Language Detector v3)库
您可以包装用 C++ 编写的CLD3 库。
我们可以Regex.IsMatch(text, "[\\uxxxx-\\uxxxx]+")
用来检测特定的语言。这里 xxxx 是一个字符的 4 位 Unicode id。
检测阿拉伯语:
bool isArabic = Regex.IsMatch(yourtext, @"[\u0600-\u06FF]+")
您可以使用 Microsoft Research 的C# 包进行语言识别:
该软件包实现了多种语言识别算法,并包括两组预编译的语言配置文件。一组涵盖 52 种语言,并在 Wikipedia 上进行了训练(即编写良好的语料库);其他涵盖 26 种语言,是从 Twitter(即高度口语化的语料库)构建的。语言标识符被打包为 C# 库,并且可以轻松嵌入到其他 C# 项目中。
从上面的链接下载包。
一种替代方法是使用“ Translator Text API ”,即
...云中机器学习和 AI 算法的 Azure 认知服务 API 集合的一部分,可在您的开发项目中轻松使用
这是有关如何使用此 API 从文本中检测语言的快速入门指南