Open3
C++ ICUメモ
Windowsでビルドは手間がかかるため、
ビルド済みライブラリと本家Visual Studio Community 2019 MSVCを利用
icu4c-74_2-Win64-MSVC2019.zipをダウンロード
一方IDEとしては、本家ではなく、VS CodeとCMakeを使う
CMakeLists.txtは以下
set(ICU_PREBUID_DIR ${PROJECT_SOURCE_DIR}/icu4c-74_2-Win64-MSVC2019)
set(ICU_INCLUDE_DIR ${ICU_PREBUID_DIR}/include)
set(ICU_LIBRALY_DIR ${ICU_PREBUID_DIR}/lib64)
set(PREBUILT_LIBRARY ${ICU_LIBRALY_DIR}/icuuc.lib ${ICU_LIBRALY_DIR}/icuio.lib)
間違えたポイント
文字列リテラルにはu8 プレフィックスを付ける
auto sentence = icu::UnicodeString::fromUTF8(
u8"京都大学で自然言語処理を[MASK][MASK]する。");
u8 プレフィックスを指定しない場合は、実装定義のマルチバイト文字コードにエンコードされる。その実装定義の文字コードは、ASCII文字コードと互換があることは保証されない。そのため、UTF-8のASCII互換部分が、実装定義の文字コードと互換があることも、保証されない。
参考
std::stringを渡さない、c_str()する
なぜかfromUTF8にわたせてしまう
mapがsize=1から増えないという事態が発生した
std::map<icu::UnicodeString, int32_t> load_vocab(std::string vocab_file)
{
std::map<icu::UnicodeString, int32_t> vocab;
std::ifstream ifs(vocab_file);
if (!ifs) {
throw std::runtime_error("Not found");
}
std::string line;
int32_t index = 0;
while (std::getline(ifs, line, '\n')) {
auto key = icu::UnicodeString::fromUTF8(line.c_str());
vocab[key] = index;
index++;
}
return vocab;
}
文字単位のループ処理
他にもいくつか書き方があるが、以下が丸い
auto text= icu::UnicodeString::fromUTF8(u8"あいうえお");
StringCharacterIterator it(text);
UChar32 cp;
icu::UnicodeString c;
for (cp = it.first32(); it.hasNext(); cp = it.next32()) {
c = icu::UnicodeString(cp);
// 何らかの処理
}
参考