文字列の言語を検出するための最良の方法は何ですか?
9 に答える
コードのコンテキストにインターネットアクセスがある場合は、言語検出にGoogleAPIを使用してみてください。 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に送信する必要があります。
これは、「helloworld」を英語からヘブライ語に翻訳することをAPIに通知します。これに対して、GoogleのJSON応答は次のようになります。
{"responseData": {"translatedText":"שלום העולם"}, "responseDetails": null, "responseStatus": 200}
典型的なGoogleJSON応答を表す基本クラスを作成することにしました。
[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、オンラインデモ)
長い答え:
現在、最良の方法は、テキストの一部を事前定義されたセットから1つ(または複数)の言語に分類するようにトレーニングされた分類子を使用するようです。
TextCatと呼ばれるPerlツールがあります。74の最も人気のある言語の言語モデルがあります。このツールには、さまざまなプログラミング言語への移植が多数あります。
.Netにはポートがありませんでした。だから私は1つ書いた:GitHubのNTextCat。
これは、純粋な.NET FrameworkDLL +コマンドラインインターフェイスです。デフォルトでは、14言語のプロファイルを使用します。
フィードバックは大歓迎です!新しいアイデアや機能のリクエストも歓迎します:)
別の方法は、多数のオンラインサービス(たとえば、Googleが言及したもの、detectlanguage.com、langid.netなど)を使用することです。
有向グラフまたは三グラフを使用した統計的アプローチは、非常に優れた指標です。たとえば、英語で最も一般的な有向グラフを順番に示します:http: //www.letterfrequency.org/#digraph-frequency(より良いまたはより完全なリストを見つけることができます)。この方法では、完全な単語よりもテキストに有向グラフが多いため、短いテキストスニペットの単語分析よりも成功率が高くなる可能性があります。
文字列の統計分析を行います。文字列を単語に分割します。テストしたいすべての言語の辞書を入手してください。そして、単語数が最も多い言語を見つけます。
C#では、メモリ内のすべての文字列はUnicodeであり、エンコードされません。また、テキストファイルでは、エンコーディングは保存されません。(8ビットまたは16ビットの表示のみの場合もあります)。
2つの言語を区別したい場合は、いくつかの簡単なトリックが見つかるかもしれません。たとえば、オランダ語から英語を認識したい場合、「y」を含む文字列はほとんど英語です。(信頼性は低いが高速)。
あなたが自然な(すなわち人間の)言語を意味するならば、これは一般的に難しい問題です。「サーバー」とは何語ですか?英語またはトルコ語ですか?「チャット」とは何語ですか-英語またはフランス語?「uno」とは何語ですか?イタリア語またはスペイン語(またはラテン語!)?
文脈に注意を払わず、ハードな自然言語処理(<-----これはグーグルで検索するフレーズです)を実行しないと、チャンスがありません。
Frenglyを見て楽しむかもしれません-それは入力テキストの言語を推測しようとするGoogle翻訳サービスへの素晴らしいUIです...
GoogleのChromiumブラウザのCLD3(Compact Language Detector v3)ライブラリ
C++で記述されたCLD3ライブラリをラップすることができます。
Regex.IsMatch(text, "[\\uxxxx-\\uxxxx]+")
特定の言語を検出するために使用できます。ここで、xxxxは文字の4桁のUnicodeIDです。
アラビア語を検出するには:
bool isArabic = Regex.IsMatch(yourtext, @"[\u0600-\u06FF]+")
Microsoft Researchの言語識別にC#パッケージを使用できます。
このパッケージは、言語識別のためのいくつかのアルゴリズムを実装し、2セットのコンパイル済み言語プロファイルを含みます。1セットは52の言語をカバーし、ウィキペディアでトレーニングされました(つまり、よく書かれたコーパス)。もう1つは26の言語をカバーし、Twitter(つまり非常に口語的なコーパス)から構築されました。言語識別子はC#ライブラリとしてパッケージ化されており、他のC#プロジェクトに簡単に埋め込むことができます。
上記のリンクからパッケージをダウンロードします。
1つの代替手段は、「TranslatorTextAPI 」を使用することです。
...クラウド内の機械学習とAIアルゴリズムのAzureCognitiveServices APIコレクションの一部であり、開発プロジェクトですぐに利用できます
このAPIを使用してテキストから言語を検出する方法に関するクイックスタートガイドは次のとおりです