CLD3はGoogleが提供する、文字列から言語を推測するためのライブラリ。Apache License 2.0。
推測するものなので、例えば「漢字」は中国語として判断される。
サンスクリット語とヒンディー語、ロシア語とウクライナ語など、同じ文字や単語を使っている言語の識別制度は低くなる。
今回はvcpkgでインストールする。
#pragma warning(disable:4996) #ifdef _DEBUG #pragma comment(lib,"libprotobufd.lib") //#pragma comment(lib, "abseil_dll.lib") #else #pragma comment(lib,"libprotobuf.lib") #endif #include <cld3/nnet_language_identifier.h> #pragma comment(lib,"cld3.lib") // SetConsoleOutputCP #include <windows.h> int main() { SetConsoleOutputCP(CP_UTF8); // コンソール出力にUTF8を指定 // 検出器を初期化(最小/最大テキスト長を指定) chrome_lang_id::NNetLanguageIdentifier lang_id(0, 512); std::string text8[] = { u8"日本", u8"你好", u8"汉字", u8"榊峠", // 榊も峠も和製漢字なので、日本語として判断されてほしい。が。。。 u8"中国語では你好", u8"英語ではHello", u8"Hello", u8"Bonjour", // フランス語 u8"안녕하세요", u8"こんにちは", u8"Здравствуйте", // ロシア語 u8"Це моя книга", // ウクライナ語 u8"Это моя книга", // ロシア語 u8"مرحبا", // アラビア語 u8"नमस्ते, आप कैसे हैं?", // ヒンディー語 u8"नमस्ते", // ナマステ(サンスクリット語) u8"नमः सर्वेभ्यः।",// サンスクリット語 u8"Olá" // ポルトガル語 }; std::cout << u8"文,言語,精度" << std::endl; for( const auto& text : text8 ) { // 言語を検出 auto result = lang_id.FindLanguage(text); std::cout << text << ","; std::cout << result.language << ","; std::cout << result.probability << std::endl; } }
文 | 言語 | 精度 |
---|---|---|
日本 | zh | 0.976997 |
你好 | zh | 0.999996 |
汉字 | zh | 0.998365 |
榊峠 | zh | 0.998102 |
中国語では你好 | ja | 0.999899 |
英語ではHello | ja | 0.999996 |
Hello | sr | 0.830728 |
Bonjour | no | 0.933856 |
안녕하세요 | ko | 0.999985 |
こんにちは | ja | 1 |
Здравствуйте | ru | 0.314022 |
Це моя книга | uk | 0.902219 |
Это моя книга | ru | 0.996748 |
مرحبا | fa | 0.996155 |
नमस्ते, आप कैसे हैं? | hi | 0.999293 |
नमस्ते | mr | 0.999077 |
नमः सर्वेभ्यः। | mr | 0.722388 |
Olá | ga | 0.997063 |