実現したいこと
- 日本語変換エンジンが不安定なので直したい
前提
C++/Win32で自作の日本語IMEの変換エンジンを作成しています。
こちらのリポジトリをダウンロードして、CMakeとVisual C++でビルドして下さい。
https://github.com/katahiromz/mzimeja
「ime/convert.cpp
」が変換エンジンで、「ime/tests.cpp
」がテストコードになっております。
「ime/convert.cpp
」の「MzIme::ConvertMultiClause
」関数が変換処理になります。
「res/basic.dat
」が辞書データとなっております。
コンパイルしてできた「imetests.exe
」がテストプログラムです。
発生している問題・エラーメッセージ
変換アルゴリズムが不安定で困っています。具体的には次のテスト項目の変換において途中で変換が勝手に終了して失敗することがあります。
cxx
1DoEntry(L"とうたつします。とうたつしてください。とうたつしないでください。", 2 L"到達します。到達してください。到達しないでください。"); 3DoEntry(L"とうたつするよ。とうたつしたぞ。とうたつできるな。とうたつしよう。", 4 L"到達するよ。到達したぞ。到達できるな。到達しよう。"); 5DoEntry(L"これをたべないでください。", L"これを食べないでください。"); 6DoEntry(L"わかりづらいので、わかりやすくおねがいします。たべにくいです。たべやすいものがいいです。", 7 L"分かりづらいので、分かりやすくお願いします。食べにくいです。食べやすいものが良いです。"); 8DoEntry(L"わたしがわたしたわたをわたがしみたいにたべないでくださいませんか", 9 L"私が渡した綿を綿菓子みたいに食べないでくださいませんか");
該当のソースコード
cxx
1// 複数文節を変換する。 2BOOL MzIme::ConvertMultiClause(const std::wstring& str, MzConvResult& result, BOOL show_graphviz) 3{ 4 DPRINTW(L"%s\n", str.c_str()); 5 6 // 変換前文字列をひらがな全角で取得。 7 std::wstring pre = lcmap(str, LCMAP_FULLWIDTH | LCMAP_HIRAGANA); 8 9 // ラティスを作成し、結果を作成する。 10 Lattice lattice; 11 lattice.AddNodesForMulti(pre); 12 lattice.AddExtraNodes(); 13 lattice.UpdateLinksAndBranches(); 14 lattice.CutUnlinkedNodes(); 15 lattice.AddComplement(); 16 lattice.MakeReverseBranches(lattice.m_head.get()); 17 18 lattice.m_tail->marked = 1; 19 lattice.CalcSubTotalCosts(lattice.m_tail.get()); 20 21 lattice.m_head->marked = 1; 22 lattice.OptimizeMarking(lattice.m_head.get()); 23 24 MakeResultForMulti(result, lattice); 25 26 if (result.clauses.empty()) { 27 MakeResultOnFailure(result, pre); 28 } 29 30 if (show_graphviz) 31 ShowGraphviz(result); 32 33 return TRUE; 34} // MzIme::ConvertMultiClause
試したこと
テストコードを書き、テストを実施しました。直す方法が分かりませんでした。
外注しようかと思いましたが、解決できる人材が見つかりませんでした。
補足情報(FW/ツールのバージョンなど)
- Visual Studio Community 2019 (with Visual C++)
- CMake
あなたの回答
tips
プレビュー